Tutoriais

Como parte da documentação do Drupal Brasil disponibilizamos alguns tutoriais. Abaixo eles estão separados por área.

Como Criar um Tema Para Drupal 6 - Parte 01

Nota: Vou utilizar termos originais em inglês do Drupal

Neste sequência de tutoriais vamos criar um tema para um site em Drupal 6 e entender várias questões relacionadas à tema.

Um tema para Drupal 6 possui algumas diferenças em relação ao Drupal 5.

Como não é o objetivo deste tutorial trabalhar com outra versão do Drupal que não seja a versão 6, então vamos focar a criação de temas para Drupal 6 como se não tivéssemos qualquer conhecimento do assunto e começaremos do zero.

Vamos iniciar criando um template sem pensar no Drupal ainda, para termos uma noção de como adaptaremos futuros templates nossos ou de terceiros.

Por isto, caso você já tenha conhecimento de como o Drupal trabalha com os temas, e como são feitas as nominações dos arquivos, lembre-se que estamos apenas criando o que seria um "template" para o site primeiro, assim como você encontra nos sites de templates ou como você pode receber pronto de seu cliente.

Sempre gosto de citar algo importante quando trabalhamos com algo "OPENSOURCE":

Ao utilizar uma tecnologia OpenSource, sempre que possível "SOBREESCREVA" ou "EXTENDA" os recursos da mesma; nunca modifique!

E no Drupal encontrei muita flexibilidade considerando isto. Até mesmo os recursos usados pelos temas podem ser extendidos ou sobreescritos sem precisar mexer no código original do sistema.

O Que é um Tema?

Um tema é uma coleção de arquivos utilizados para criar uma interface para o usuário final do site ou aplicação.

Nele encontramos vários componentes de acordo com as necessidades desta interface.

Num tema para página HTML temos basicamente: uma arquivo HTML, um ou mais arquivos CSS, um ou mais arquivos Javascript e uma ou mais Imagens.

Todo tema possui um Layout que é a forma como os componentes ou elementos de um tema são distribuitos num espaço limitado e definido previamente.

Definindo o Layout de Nosso Tema

Todo site precisa de um Layout, é claro! E esta definição pode poupar em muito o trabalho, pois o fato do Layout possuir 2 ou 3 colunas, navegação na esquerda ou na direita e assim por diante, torna mais rápido o desenvolvimento de um projeto.

Com o Drupal é possível ativar ou desativar as colunas esquerda ou direita , por isto, caso seu Layout precise usar 3 colunas, ou 2 colunas em alguma página ou seção do site, então é preciso projetar o site com suporte à 3 colunas.

Vamos pensar então que nosso site é um blog, e que o mesmo possui apenas 2 colunas, mas... que futuramente você planeja adicionar mais recursos ao seu site e precise ativar outra nevegação, então vamos deixar isto já preparado para que futuras modificações no seu Layout não se tornem um pesadelo!

Definido o Layout de 3 colunas, vamos pensar na estrutura HTML do mesmo.

Um Layout para uma página HTML possui várias camadas, que já veremos como são definidas.

Todo Layout possui 2 camadas que compoem desde já a estrutura do site ou aplicação e que fazem parte do documento HTML em si, e são: "HTML" e "BODY".

Estas TAG's tanto podem ser usadas para auxiliar no Layout de seu site, como também podem ser utilizados para estilizar seu site ou aplicação.

Em um site de 3 colunas, além delas temos o "CABEÇALHO" e o "RODAPÉ".

Nosso Layout está retido por um divisor (DIV) no documento que decidi nomear como "EXTERNO".

Dentro dele vamos então ter a estrutura que desejamos, ou seja "CABEÇALHO, ESQUERDA, CENTRO, DIREITA e RODAPÉ".

Veja na figura abaixo a estrutura de nosso Layout colorido para fins de distinção. Note que as tags HTML e BODY estão sendo usadas aqui também:

Imagem 1

Camadas de um site de 3 colunas

Código HTML

Vale lembrar novamente que estamos criando somente o Layout por enquanto independente do Drupal ou preocupados com o visual ou design do site por enquanto.

Crie um arquivo chamado index.html e coloque o código abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link type="text/css" rel="stylesheet" media="all" href="estilo.css" />
</head>
<body>
<div id="externo">
<div id="cabecalho"></div>
<div id="esquerda"></div>
<div id="direita"></div>
<div id="centro"></div>
<div id="rodape"></div>
</div>
</body>

Nota: O DIV com o id "direita" foi colocado antes do centro, pois assim é possivel trabalhar o posicionamento com as Folhas de Estilos.

Estruturando o Layout Com Folhas de Estilo

Como precisamos criar a estrutura de nosso layout com posicionamentos precisos, vamos utilizar Folhas de Estilos (CSS) .

Crie um arquivo chamado estilo.css e coloque o código abaixo:

#externo, #cabecalho, #esquerda, #direita, #centro, #direita, #rodape { text-align:left; border:solid 1px #000; padding: 10px; }
#esquerda, #centro, #direita { margin: 10px 0; }
#externo { position:relative; margin: 0 auto; width:1000px; }
#cabecalho { width:978px; height:150px; }
#rodape { width:978px; height:150px; clear:both; }

Nota: Para visualizarmos a estrutura inicial de nosso Layout, colocamos uma borda em todos os DIV's, posteriormente vamos retirá-las.

Atualmente, nossas camadas do Layout estão sendo exibidas uma baixo da outra dentro do DIV com id "externo".

Veja na imagem como está o resultado de nosso layout:

Layout sem larguras

Possibilidades de Layouts

Podemos ter várias possibilidades de Layouts, não vou colocar um print para cada senão seria perca de tempo, mas vou listar abaixo algumas da possibilidades. Vou usar o nome das camadas aqui da esquerda para a direita indicando a movimentação das colunas com o CSS:

Técnica CSS para adaptar o Layout Para o Drupal

Vamos usar uma técnica CSS muito boa quando desejamos trabalhar com um mesmo Layout dinâmico como é o caso do Drupal.

Precisamos criar uma regra para que na ausência de uma coluna o Layout continue sempre inteiro e as colunas nos seu posicionamentos corretos.

A técnica é simples!

Colocamos um seletor de classe CSS na tag BODY do documento que irá fazer com que o CSS posicione os DIV's de acordo. Continue lendo que você vai entender.

Como vimos anteriormente, é possível ter várias combinações e obter vários tipos de Layouts diferentes, por isto, vamos decidir usar apenas os 3 mais comuns na maioria dos sites e blogs. Após terminado este tutorial você poderá criar outras combinações e fazer a festa!

Vamos então ficar com:

As classes CSS da tag BODY que vamos utilizar são:

lateral-esquerda
Para posicionar a coluna da ESQUERDA à esquerda, o CENTRO no restante do espaço disponível à direita e não mostrar a DIREITA.
lateral-direita
Para posicionar a coluna da DIREITA à direita, o CENTRO no restante do espaço disponível à esquerda e não mostrar a ESQUERDA.
laterais
Para posicionar a coluna da ESQUERDA à esquerda, o CENTRO no centro e a DIREITA à direita.

Nota: Algumas empresas ou profissionais em si têm padrões para nomenclatura em seu código CSS, JavaScript, etc, por isto, este padrão se adapta bem à este tutorial, mas se preciso for modifique antes de apresentar à sua empresa ou cliente.

Por exemplo, quando eu colocar "lateral-esquerda" no atributo "class" da tag BODY, eu vou ter um conjunto de seletores CSS que já estão predefinidos para carregar o Layout sem a coluna da DIREITA, e extendendo o CENTRO; quando eu quiser mostrar a coluna da ESQUERDA e ocultar a da direita eu coloco "lateral-direita".

Tudo isto é feito pelo CSS, então você pode mudar isto à vontade depois, entretanto, vale lembrar que não estamos modificando aqui a posição da coluna, ou seja, a ESQUERDA é a coluna da esquerda; se quisermos mudar o conteúdo da ESQUERDA para a DIREITA precisaríamos criar outros seletores ou usar uma tecnologia dinâmica, e é claro, aqui entra o Drupal! Veremos isto mais adiante.

Então, para a lógica funcionar, vamos precisar acrescentar alguns conjuntos de seletores que irão alterar o posicionamentos das camadas ESQUERDA, CENTRO E DIREITA em nosso Layout.

/**
 * Para o layout com uma coluna à ESQUERDA e CENTRO à direita
 */

.lateral-esquerda #esquerda {}
.lateral-esquerda #centro {}
.lateral-esquerda #direita {}

/**
 * Para o layout com uma coluna à DIREITA e CENTRO à direita
 */

.lateral-direita #esquerda {}
.lateral-direita #centro {}
.lateral-direita #direita {}

/**
 * Para o layout de 3 colunas
 */

.laterais #esquerda {}
.laterais #centro {}
.laterais #direita {}

A princípio parece muito código, mas o resultado final é mais do que o desejado.

Abaixo as modificações no arquivo estilo.css já com os posicionamentos para todos os casos acima:

/**
 * Zera a margem e o espaçamento em todos os elementos HTML
 */

* { margin: 0; padding: 0; }

/**
 * Conjunto de propriedades para dar uma estética visual inicial
 */

#externo, #cabecalho, #esquerda, #direita, #centro, #direita, #rodape { text-align: left; border: solid 1px #000; padding: 10px; }

/**
 * Margem padrão para esquerda, centro e direita
 */

#esquerda, #centro, #direita { margin: 10px 0; }

/**
 * Externo
 */

#externo { position: relative; margin: 0 auto; width: 1000px; }

/**
 * Cabeçalho
 */

#cabecalho { width: 978px; height: 150px; }

/**
 * Para o layout com uma coluna à ESQUERDA e CENTRO à direita
 */

.lateral-esquerda #esquerda { width: 170px; float: left; }
.lateral-esquerda #centro { width: 776px; float: left; margin-left: 10px; }
.lateral-esquerda #direita { display:none; }

/**
 * Para o layout com uma coluna à DIREITA e CENTRO à direita
 */

.lateral-direita #centro { width: 776px; float: right; margin-right: 10px; }
.lateral-direita #direita { width: 170px; float: right; }
.lateral-direita #esquerda { display:none; }
/**
 * Para o layout de 3 colunas
 */

.laterais #esquerda { width: 170px; float: left; }
.laterais #direita { width: 170px; float: right; }
.laterais #centro { width: 572px; margin-left: 203px; }

/**
 * Rodapé
 */

#rodape { width: 978px; height: 150px; clear: both; }

Testando Os Seletores

Para testar agora é facil!

Crie um atributo "class" na tag BODY do documento e coloque o valor "laterais":

<body class="laterais">

Você vai ver o layout como já estava antes, com três colunas.

Agora mude o valor do atributo class para "lateral-esquerda"; veja o resultado, e mude para "lateral-direita".

Se tudo ocorreu corretamente, então você deve ter notado a flexibilidade desta técnica.

Finalizamos aqui esta parte do Layout no formato de template. Vamos agora ver como o Drupal trabalha com templates e temas e como adaptar este template que criamos para o Drupal 6 transformando-o em um tema.

Temas no Drupal 6

Primariamente, o Drupal possui um motor de temas interno e uma ferramenta de templates próprios ,chamado PHPTemplate; então quando os temas precisam ser processados pelo sistema o motor de temas do Drupal liga-se ao PHPTemplate e retorna uma interface para o usuário de acordo com as informações pré-definidas pelo administrador do sistema. Este processo torna o tempo de execução mais rápido.

No entanto, como o Drupal é um sistema muito flexível, ele pode utilizar outras ferramentas de templates, tais como: Smarty, PHPTAL, XTemplate entre outros disponíveis. Para adaptar uma nova ferramenta ao Drupal, visite http://drupal.org/project/Theme+engines e baixe os motores para a ferramenta desejada, caso ela exista. Vale lembrar, que estes motores não são parte de qualquer versão oficial do Drupal e por isto podem apresentar problemas e perca no desempenho no tempo de execução.

Vamos nos reter ao PHPTemplate que por si é muito rápido, prático e fácil de se usar.

PHPTemplate

Historicamente, o PHPTemplate foi criado por Adrian Rossouw. Apartir da versão 6 do Drupal algumas modificações foram feitas e a forma como o tema processa o PHPTemplate foi melhorado e algumas funções de tema não existem mais, entretanto são chamadas dinamicamente.

O PHPTemplate utiliza arquivos no formato "alguma-coisa.tpl.php".

Explicando melhor, "alguma-coisa" é pelo fato de que quase qualquer coisa na interface do Drupal poder ser tranformada em um arquivo de template pelo mesmo. Ou seja, temos como trabalhar separadamente no tema com os Blocks, Boxes, Comments, Nodes, Pages, etc...

O complemento ao nome ".tpl" indica o uso de um arquivo template explicitamente.

Todos os arquivos de template atualmente são arquivos com a extensão ".php".

Anatomia de um Tema no Drupal 6

Um tema no Drupal 6 possui uma estrutura padrão e alguns arquivos padrões deverão estar presentes no diretório onde o tema se encontra, veja a imagem abaixo:

Anatomia de um tema no drupal 6

Fonte da imagem: http://drupal.org/node/171194

Entendendo esta estrutura, temos:

.info
Este arquivo com extensão ".info" e com o nome do tema é necessário para que o Drupal encontre seu tema, e é ele quem vai gerar o nome interno de seu tema. Mais adiante veremos o que podemos colocar neste arquivo.
.tpl.php
São os arquivos de templates processados pelo motor do tema. Cada arquivo .tpl.php é responsavel por aplicar temas a fragmentos de dados.
template.php
Este é o arquivo onde colocamos a parte lógica de nosso tema, ou seja o código PHP, para não misturá-lo com a parte de processamento e controle do layout. Nele podemos sobreescrever as funções usadas nos temas.

Os demais são bem intuitivos, logo.png é o logotipo usado pelo tema, style.css é a folha de estilos e screenshot.png é uma miniatura para dar uma visualização prévia na área de adminsitração de temas.

Criando um Tema para o Drupal 6

Vamos agora ver como um tema é criado.

Primeiramente, vamos criar uma pasta dentro de sites/all/themes. Caso a pasta "themes" não exista, não perca tempo e crie agora mesmo.

Criada esta pasta, vamos criar o arquivo ".info" que vai ser responsável por passar as informações necessárias para o Drupal trabalhar com nosso tema.

Nosso tema será chamado "tutorial", logo o arquivo ".info" deverá ser nomeado como "tutorial.info".

Dentro da pasta em sites/all/themes/tutorial, crie o arquivo "tutorial.info".

Criado este arquivo vamos colocar nele as informações necessárias.

Nota: Seus temas devem ser salvos em "sites/all/themes" e jamais na pasta de temas do drupal.

Estrutura do arquivo .info

Um arquivo .info é um arquivo .ini. Cada linha é um par chave = valor e comentários são precedidos por ponto e vírgula ( ; ).

Encontramos as seguintes chaves em nosso arquivo:

Vamos ver o que tudo isto significa:

name
O nome que lemos na listagem dos temas na administração de temas.
name = Um Nome Qualquer
description
Uma breve descrição do tema. Aparecerá logo abaixo do nome do tema.
description = Tema de 3 colunas em tableless para meu site
screenshot
Diz ao Drupal onde encontrar a miniatura de uma imagem para visualização prévia do tema.
screenshot = screenshot.png
version
A versão do Tema. Se o tema não for hospedado em drupal.org é aconselhado utilizar, caso contrário não há necessidade pois na criação de uma versão esta informação é inserida automaticamente em temas contribuídos.
version = 1.0
core
A partir do Drupal 6 e posteriores, todos os arquivos .info para módulos e temas devem indicar qual versão maior do drupal eles são compatíveis. Este valor é comparado com a constante DRUPAL_CORE_COMPATIBILITY e caso não corresponda, o tema será desabilitado automaticamente.
core = 6.x
engine
Motor de tema usado. Caso não seja especificado um, o padrão é assumido, ou seja "phptemplate".
engine = phptemplate
base theme
Caso seja um subtema, o mesmo pode especificar o tema base.
base theme = garland
regions
As regiões dos blocos disponíveis são definidas especificando a chave "region" seguida do nome interno entre colchetes seguido do sinal de igual com o valor que é um nome legível por humanos. Novas regiões podem ser criadas, e para tal basta seguir o padrão. Caso não sejam especificadas as chaves para os blocos padrões, os mesmos são assumidos automaticamente sem precisar declará-los.
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

features
As características ou elementos que são exibidos no tema. Se nenhuma chave for especificada todas serão assumidas automaticamente.
features[] = logo
features[] = name
features[] = slogan
features[] = mission
features[] = node_user_picture
features[] = comment_user_picture
features[] = search
features[] = favicon
; Estes dois ultimos foram desabilitados e
; todos os acima habilitados como sendo as características necessárias.
; features[] = primary_links
; features[] = secondary_links
stylesheets
O padrão de um tema é usar o arquivo "style.css". Além da chamada da função drupal_add_css() no arquivo template.php do tema, comum nas versões anteriores ao Drupal 6, agora podemos especificar várias folhas de estilo diretamente no arquivo ".info" de nosso tema. A chave assume que você especifique qual o tipo de folha no primeiro colchete.
stylesheets[all][] = outra-folha-qualquer.css
scripts
Caso similar à stylesheets, além de chamar drupal_add_js(), podemos especificar vários arquivos Javascript diretamente no arquivo ".info" também.
scripts[] = arquivo-javascript-qualquer.js
php
Define a versão mínima do PHP que o tema suportará. O valor é comparado com a constante DRUPAL_MINIMUM_PHP.
php = 4.3.3

Com toda esta quantidade de informação, vamos criar nosso arquivo "tutorial.info".

Coloque o código a seguir dentro do arquivo "tutorial.info":

name = Tutorial
description = Tema em tableless utilizado no tutorial.
core = 6.x
engine = phptemplate
stylesheets[all][] = style.css
version = "6.12"

Omitimos algumas chaves de nosso arquivo, pois não serão necessárias ou serão acrescentadas posteriormente.

Já informamos ao Drupal que temos um tema novo.

Se você acessar agora a administração de temas em "http://seusite/admin/build/themes", você já verá o tema "Tutorial" listado mais no final da listagem de temas disponíveis, entretanto sem uma imagem de pré-vizualização pois você não a criou ainda.

Criando o Template da Página - page.tpl.php e template.php

Depois do arquivo ".info", se não houver um arquivo "page.tpl.php" de pouco vai adiantar um tema, pois é neste arquivo que reproduzimos o Layout desejado.

Crie um arquivo com este nome na pasta do tema, e copie o código de nosso arquivo "index.html" do template que criamos anteriormente para este arquivo.

Remova as linhas que contem:

<link type="text/css" rel="stylesheet" media="all" href="estilo.css" />

e

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Crie um arquivo em branco e salve-o como "template.php".

Antes de mergulhar de cabeça em nosso tema, vou explicar a lógica de um template.

Uma ferramenta de template é responsável por separar a parte lógica da camada de apresentação do site ou aplicação.

Para que isto seja possível, no arquivo de template existem "chaves" que variam de ferramenta para ferramenta. O conteúdo do arquivo é obtido por algum recurso no sistema ou motor de tema e as chaves são substituídas em um novo arquivo que é gerado dinamicamente.

Para exemplificar melhor, o ELEMENTO "title" entre as tags HEAD do documento varia de acordo com a página ou seção; esta informação contém uma fonte de origem que está registrada em algum lugar, que pode ser um arquivo, um banco de dados, um array, etc... Mas, independente da origem, nossa ferramenta de template foi criada para processar tal origem e substituir esta chave a partir de um padrão, que nosso nosso exemplo pode ser #nome-da-chave# entre sustenidos, então bastaria colocar #title# entre as tags title que nossa ferramenta de template iria procurar o valor para tal chave no local onde ela foi instruída a processar.

No caso do Drupal, e mais especificamente, no PHPTemplate, as chaves utilizadas são variáveis PHP simples. Existem algumas variáveis-chaves pré-definidas no Drupal, mas você poderá criar as suas variáveis caso deseje, embora não haja necessidade aparente.

Variáveis Disponíveis

Utilidade Geral:

$base_path
O caminho do URL da instalação do Drupal. Este será pelo menos o padrão "/".
$css
Um array de arquivos CSS para a página atual.
$directory
O diretório no qual o tema está localizado, por exemplo themes/garland ou theme/garland/minelli.
$is_front
TRUE se a página atual for a front page ou página inicial. Utilizado para alternar a frase da missão do site.
$logged_in
TRUE se o usuário está registrado e logado.
$is_admin
TRUE se o usuário tiver permissão para acessar páginas administrativas.

Metadados da Página:

$language (objeto)
O idioma no qual o site está sendo exibido.
$language->language
Contém a represantação textual deste
$language->dir
Contém a direção do idioma. Este será talvez "ltr" ou "rtl".
$head_title
Uma versão modificada do titulo da página, para uso na tag TITLE.
$head
Marcação para a seção HEAD (incluindo meta tags, palavras-chaves e assim por diante).
$styles
Tags STYLE necessárias para importar todos os arquivos CSS para a página.
$scripts
Tags SCRIPT necessárias para carregar os arquivos Javascritp e as configurações para a página.
$body_classes
Um conjunto de classes CSS para a tag BODY. Esta contém bandeiras indicando o layout atual (multiplas colunas, coluna única), o caminho atual, se o usuário está logado, e assim por diante.

Identidade do Site:

$front_page
O URL da página inicial. Utilize esta ao invés de $base_path, quando fazer ligações com a página inicial. Esta inclui a linguagem do domínio ou prefixo.
$logo
O caminho para a imagem do logo, como foi definido na configuração do tema.
$site_name
O nome do site, vazio quando a exibição foi desabilitada nas configurações do tema.
$site_slogan
O slogan do site, vazio quando a exibição foi desabilitada nas configurações do tema.
$mission
O texto da missão do site, vazio quando foi desabilitada nas configurações do tema.

Navegação:

$search_box
O HTML para exibir a caixa de busca; vazia se a busca foi desabilitada.
$primary_links(array)
Um array contendo os links da navegação primária para o site, se eles foram configurados.
$seconday_links(array)
Um array contendo os links da navegação secundária para o site, se eles foram configurados.

Conteúdo da Página(em ordem de ocorrência na padrão page.tpl.php):

$header (Esta variável está deslocada aqui pois não possui definição na documentação do arquivo para ela)
A região do cabeçalho
$left
O HTML para a barra lateral da esquerda
$breadcrumb
O caminho do breadcrumb para a página atual
$title
O título da página para uso no conteúdo HTML atual.
$help
Texto de ajuda dinâmico, na maior parte para páginas administrativas.
$messages
O HTML para status e mensagens de erro. Deveriam ser exibidas proeminente
$tabs
Tabs com links para sub-páginas abaixo da página atual (por exemplo, as tabs view e edit quando exibindo um node).
$content
O conteúdo principal da página atual do Drupal.
$right
O HTML para a barra lateral da direita.

Rodape/Dados de fechamento:

$feed_icons
Um string contendo todos os ícones de feeds para a página atual.
$footer_message
A mensagem do rodapé como foi definida nas configurações administrativas.
$footer
A região do rodapé
$closure
Marcação final de fechamento de quaisquer módulos que tenham alterado a página.
Esta variável deve sempre ser a última saída, logo após todo conteúdo dinâmico

NOTA: Algumas variáveis usadas ai são somente para a área administrativa e o usuário final do site não terá qualquer acesso visual às mesmas; estão sendo citadas aqui para complementar estas informações. No arquivo page.tpl.php que estamos criando elas também serão usadas, mas sem muito foco nesta parte do tutorial, estamos trabalhando por enquanto em um tema para o site e não para a área adminstrativa em si. Em outra parte deste tutorial podemos continuar esta detalhação.

Implementando o Arquivo "page.tpl.php"

Agora que você já conhece todas as variáveis-chaves usadas n a página "page.tpl.php" que é a página principal do tema, podemos substituir algumas partes em nosso arquivo que somente possui HTML estático e substituir outras por algumas destas variáveis.

Veja nosso arquivo final. Leia os comentários para entender as alterações:

[ page.tpl.php ]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Acrescentamos aqui o idioma da pagina e a direção do texto do idioma -->
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="<?php print $language->language ?>"
lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
<head>
<!-- Removemos a tag meta contendo o tipo do documento e o charset
-- para inserir estas informações de acordo com as configurações
-- informadas ou obtidas pelo Drupal
-->
<?php print $head ?>
<!-- Inserimos o título da página que varia dinamicamento -->
<title><?php print $head_title ?></title>
<!-- Inserimos a importação de folhas de estilos -->
<?php print $styles ?>
<!-- Carregamos os arquivos javascript necessários -->
<?php print $scripts ?>
</head>
<!-- Colocamos uma função na tag BODY
-- que irá criar um atributo class na mesma
-- e controlar o valor deste atributo de acordo
-- com as configurações dos Blocks em uso
-- Esta função foi herdada do tema padrão Garlando
-- no arquivo "template.php"
-->
<body<?php print phptemplate_body_class($left, $right); ?>>
<!-- Layout -->
<div id="externo">
<div id="cabecalho">
<?php /* Imprime o conteudo definido nos Blocks para o Header (cabeçalho) */ ?>
<?php print $header; ?>
<!-- Herdado do Garland -->
<div id="logotipo">
<?php
// Prepara o cabeçalho criando um array com algumas informações do site
$site_fields = array();
// se o nome do site existe
if ($site_name) {
/**
* Codifica caracteres especiais num string de texto puro para exibir o nome do site como HTML.
*/

$site_fields[] = check_plain($site_name);
}
if ($site_slogan) {
/**
* O mesmo que ocorre com o nome do site ocorre com o slogan
*/

$site_fields[] = check_plain($site_slogan);
}
/*
* Une as chaves de $site_fields com espaços para criar o title
*/

$site_title = implode(' ', $site_fields);
/**
* Se todas as informações foram passadas
*/

if ($site_fields) {
// coloca o nome do site entre tags SPAN
$site_fields[0] = '<span>'. $site_fields[0] .'</span>';
}
/*
* Une as chaves de $site_fields com espaços para criar o HTML
*/

$site_html = implode(' ', $site_fields);
// Testa se $logo ou $site_title possuem valor
if ($logo || $site_title) {
// Cria um cabeçalho com o um link para a pagina inicial filtrando-o contra protocolos indesejáveis (XSS)
print '<h1><a href="'. check_url($front_page) .'" title="'. $site_title .'">';
// se o logo existir
if ($logo) {
print '<img src="'. check_url($logo) .'" alt="'. $site_title .'" id="logo" />';
}
// Imprime o HTML com o nome do site final
print $site_html .'</a></h1>';
}
?>
<?php /* Imprime os links primarios se eles existirem */ ?>
<?php if (isset($primary_links)) : ?>
<?php print theme('links', $primary_links, array('class' => 'links primary-links')) ?>
<?php endif; ?>
<?php /* Imprime os links secundários se eles existirem */ ?>
<?php if (isset($secondary_links)) : ?>
<?php print theme('links', $secondary_links, array('class' => 'links secondary-links')) ?>
<?php endif; ?>
</div>
</div><!-- /cabecalho -->

<?php /* Se existir algum Block a ser exibido na esquerda, então esta coluna será montada com o respectivo conteúdo */ ?>
<?php if ($left): ?>
<div id="esquerda">
<?php /* Se a caixa de busca estiver ativada e esta coluna exista, ela aparecerá na esquerda */ ?>
<?php if ($search_box): ?><div class="block block-theme"><?php print $search_box ?></div><?php endif; ?>
<?php print $left ?>
</div><!-- /esquerda -->
<?php endif; ?>

<?php /* Se existir algum Block a ser exibido na esquerda, então esta coluna será montada com o respectivo conteúdo */ ?>
<?php if ($right): ?>
<div id="direita">
<?php /* Se a caixa de busca estiver ativada e a coluna esquerda não exista, ela aparecerá na direita */ ?>
<?php if (!$left && $search_box): ?><div class="block block-theme"><?php print $search_box ?></div><?php endif; ?>
<?php print $right ?>
</div><!-- /direita -->
<?php endif; ?>
<div id="centro">
<?php /* Imprime o breadcrum do site */ ?>
<?php print $breadcrumb; ?>
<?php /* Imprime a missão do site caso ela exista */ ?>
<?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>
<?php /* Imprime as tabs das páginas que as usem */ ?>
<?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
<?php /* Imprime o título do node */ ?>
<?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
<?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
<?php /* Imprime tabs secundarias */ ?>
<?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
<?php /* Imprime informações relevantes ao usuário */ ?>
<?php if ($show_messages && $messages): print $messages; endif; ?>

<?php /* Imprime ajuda caso esteja disponível */ ?>
<?php print $help; ?>

<?php /* Imprime todo o conteúdo especificado no Block Content */ ?>
<?php print $content ?>

<?php /* Imprime os feeds da página */ ?>
<?php print $feed_icons ?>
</div><!-- /centro -->
<div id="rodape">
<?php /* Imprime a mensagem do rodapé, e os Blocks selecionados como Footer */ ?>
<?php print $footer_message . $footer ?>
</div><!-- /rodape -->
</div><!-- /externo -->
<?php /* Marcação final de fechamentos diversos */ ?>
<?php print $closure ?>
</body>

Criando o Arquivo style.css

O Arquivo CSS padrão de todo tema para Drupal é o arquivo "style.css".

Crie um arquivo chamado "style.css" e coloque dentro da pasta do tema "tutorial".

Coloque o conteúdo de nosso arquivo "estilo.css" dentro de "style.css".

Estaremos incluindo alguns seletores a mais futuramente devido a colocação de novos DIV's dentro do Layout.

Se você prestou bem atenção até aqui, você já deve ter associado a linha do arquivo "tutorial.info" que contém:

stylesheets[all][] = style.css

Esta linha instrui o Drupal à incluir o arquivo "style.css" no tema em uso, neste caso tutorial.info.

Caso você queira adicionar novas Folhas de Estilo à seu tema, bastaria você acrescentar um linha trocando apenas o nome do arquivo:

stylesheets[all][] = style.css
stylesheets[all][] = arquivo-qualquer.css

Nota: Nosso tema não utilizará Javascript por enquanto, mas caso for preciso, a lógica seria a mesma; basta utilizar a chave "scripts".

E os Outros Arquivos?

Teoricamente, podemos dizer que nosso tema para Drupal 6 já existe. Para nosso tema ficar redondinho, vamos adicionar alguns arquivos mais básicos que vamos "copiar" da pasta do tema Garland, e que não precisam ser alterados por enquanto. Na próxima parte de nosso tutorial, vamos abordar estes arquivos e outros templates que fazem parte do Core (núcleo) do Drupal, e explorar um recurso chamado "suggestions" ou "sugestões". Os arquivos que vamos usar agora são:

Estes arquivos devem ser copiados e coloados em sites/all/themes/tutorial.

Por curiosidade e conhecimento, após copiar estes arquivos, abra-os e veja o conteudo deles. Você vai encontrar $variáveis-chaves parecidas com as do arquivo "page.tpl.php", entretanto, tais variáveis se aplicam ao conteúdo destes tipos de páginas e devem ser considerados isoladamente em cada arquivo que as contem.

Estilizando Nosso Tema

Nosso tema não possui qualquer aspecto de design, imagens de fundo, etc... O objetivo deste tutorial não é criar um tema finalizado, profissional, com estilo visual "detonador". Por isto, sinta-se à vontade para criar o visual que desejar.

Após ter definido um visual para o tema, abra seu programa editor gráfico favorito e crie uma imagem de 150px por 90px. Dê um printscreen da tela com seu tema final sendo exibido, cole no seu programa de edição gráfica, e vá reduzindo até alcançar as dimensões acima. Salve este arquivo no formato ".png" com o nome "screenshot.png" dentro da pasta do tema.

Alternando a Exibição das Colunas Dinamicamente

Para seu tema alternar a exibição das colunas, abra o arquivo "template.php" dentro da pasta do tema do nosso tutorial, e coloque a função abaixo dentro dele:

/**
 * Define o valor do atributo &quot;class&quot; da tag body
 *
 * Adicionar as barras laterais quando preciso
 */

function phptemplate_body_class($left, $right) {
  if ($left != '' && $right != '') {
    $class = 'laterais';
  }
  else {
    if ($left != '') {
      $class = 'lateral-esquerda';
    }
    if ($right != '') {
      $class = 'lateral-direita';
    }
  }

  if (isset($class)) {
    print ' class="'. $class .'"';
  }
}

Esta função, que já chamamos na tag BODY em nosso arquivo "page.tpl.php", verifica se o conteúdo da esquerda e direita existem ao mesmo, caso exista, define o valor do atributo class para "laterais" exibindo assim ambas as colunas; caso contrário, se o conteúdo da esquerda não estiver vazio, define o valor como "lateral-esquerda" e assim, se o mesmo não existir, define como "lateral-direita".

Testando o Tema

Para testar se o tema está funcionando, defina-o como padrão e veja o resultado. Ative blocos, na esquerda, depois na direita e em ambas as regiões e veja o resultado. Caso, o CSS apresente problema em algum navegador fique à vontade para modificar, afinal, este tutorial não é um tutorial de CSS, mas fico à disposição para receber possíveis informações de melhoramento através dos comentários.

Nota: Crie um Logotipo qualquer e salve como "logo.png" dentro da pasta do tema "tutorial".

Para Criar Este Tutorial Foram Utilizados:

Como Criar um Tema Para Drupal 6 - Parte 02

IMPORTANTE: Para acompanhar todo esta parte do tutorial, você precisar ter conhecimentos em PHP razoáveis para entender como manipular funções.

Nesta segunda parte de nosso tutorial, vamos explorar uma ligação muito importante existente entre o arquivo ".info" de um tema, os outros arquivos templates fundamentais de um tema, os templates padrão e os "template suggestions" (alternativos).

Dica: No tutorial anterior me esqueci de dar uma dica importante. Quando estamos trabalhando com CSS, Javascript, ou mesmo os arquivos de templates nos temas do Drupal é preciso limpar o registro constantemente, caso contrário você não visualiza as alterações com facilidade. Para resolver este problema, abra o arquivo "template.php" do tema em uso, e coloque a chamada à função:

drupal_rebuild_theme_registry();

Uma vez feito isto, as atualizações constantes ficarão sempre disponíveis imediatamente. Entretanto, após terminado o processo de produção de um novo tema, retire a mesma linha do arquivo "template.php".

Alterando o Tema Para as Páginas de Administração

No Drupal é possivel utilizar um tema específico para a área administrativa e outro para o site em si. Navegue até "/admin/settings/admin" e veja que há um menu dropdown com os temas listados em ordem alfabética. Ao salvar as configurações com um tema diferente do site ao acessar as páginas administrativas você navegará com a interface usando o tema escolhido. Há um checkbox que permite ativar este tema para a área de edição/criação de conteúdos.

Para continuar com esta parte do tutorial, escolha o tema "Tutorial" e salve as configurações, embora o mesmo não esteja formatado corretamente ainda.

Recursos Disponíveis na Área Administrativa

O arquivo ".info" possui um como que "segredinho". As chave "features" do arquivo ".info" de um tema para Drupal 6 tem um papel muito importante na área administrativa do Drupal.

Com elas é possivel ativar ou desativar o acesso à recursos no tema, como por exemplo o Logotipo, o Nome do Site, os Links Primários e qualquer Recurso (feature) existente no arquivo ".info" a partir de uma interface amigável.

O nosso arquivo "tutorial.info", que se encontra na primeira parte deste tutorial atualmente está sem qualquer chave "feature[]" e desta forma os valores padrões são assumidos e o acesso à todos estes recursos também.

Acesse a área administrativa do Drupal em /admin/build/themes/settings/tutorial e você deverá ver os seguintes checkboxes na página:

Recursos Padrão

Se você notar, o checkbox "Site Slogan" está desmarcado e os checkboxes User pictures in posts, User pictures in comments e Searchbox estão desabilitados. Você deve estar se perguntando porque os três checkboxes estão desabilitados se eles são parte dos recursos padrões.

No caso de User pictures in posts e User pictures in comments, se dá pelo fato de a opção "Picture Support" estar marcada como "Disabled" por padrão. Acesse /admin/user/settings e altere esta opção para "Enabled" caso queira exibir imagens dos usuários em posts e comentários, e automaticamente os checkboxes ficarão habilitados.

Já no caso do "Search" é devido ao módulo não estar ativado. Ative o módulo que o checkbox será habilitado.

Vamos fazer um jogo rápido para comprovar a funcionalidade desta interface.

Abra o arquivo "tutorial.info", insira duas quebras de linhas após "engine = phptemplate" e coloque as chaves:

features[] = logo
features[] = name
features[] = slogan
features[] = mission
features[] = node_user_picture
features[] = comment_user_picture
features[] = search
features[] = favicon
features[] = primary_links
features[] = secondary_links

Agora comente as linhas:

;features[] = node_user_picture
;features[] = comment_user_picture
;features[] = search

Acesse /admin/build/themes/settings/tutorial e veja que os checkboxes comentados sumiram!

Retirados alguns recursos da exibição

Eu alterei o arquivo ".info" e ao atualizar a página do navegador as alterações apareceram; caso você não veja alterações e todos os checkboxes continuem ali, vá em "/admin/settings/performance" e procure pelo botão "Clear Cached Data" logo no final do conteúdo desta página. Depois volte à "/admin/build/themes/settings/tutorial " e veja que os checkboxes sumiram. Isto é preciso pois estas informações ficam guardadas no cache do Drupal; uma nota interessante: o Drupal trabalha com Dados em Cache e tem um Registro de Temas, quando você trabalha com um tema e precisa limpar o Registro, você não está limpando o Cache do Drupal, senão estaria apagando outras informações relevantes ao sistema também armazenadas e vice-versão. Por este motivo não confunda o fato destas informações referentes ao tema estarem sendo armazendas em Cache e você ter que apagar todo o Cache para poder ver qualquer alteração.

Voltando ao nosso assunto. Estas alterações também são obtidas removendo as respectivas chaves no arquivo ".info" ao invés de comentá-las.

Vale lembrar aqui o seguinte: este recurso habilita ou não o usuário da interface de acessar tais recursos e ativar ou não os mesmos no site, entretanto, se você ocultar um item, ele não será desativado, somente não aparecerá na lista, e ainda, caso você oculte um item desmarcado isto quer dizer que não será permitido ao usuário da interface alternar para a ativação e vice-versa.

Criando Regiões Personalizadas para os Blocos

Algo que foi facilitado no Drupal 6 é a criação de Regiões personalizadas.

Uma região é um bloco de conteúdo existente e pré-definido pelo admistrador do site e que são passados ao tema pelas variáveis mais comuns: $header, $left, $right, $content e $footer.

As regiões são registradas no arquivo ".info" e podem ser acessadas pelas chaves regions[].

Os valores padrões não precisam ser especificados no arquivo ".info" entretanto, caso você queria personalizar seu tema e criar uma nova região, então você precisará inserir todas as regiões, pois ao inserir uma chave regions[] o Drupal vai analisar o conteúdo do arquivo, procurar pelos regions registrados e caso encontre uma ou mais de uma, o que ele não encontrar além disso entenderá que deve omitir da exibição.

Os valores padrões como já vimos na primeira parte de nosso tutorial são:

regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

O que temos aí é simples de entender:

regions
É a chave indicando a existencia de uma região.
[nome]
É especificamente o nome que esta chave possui internamente no Drupal e que será a variável usada para criar o conteúdo no tema.
= Qualquer nome
É o nome da chave humanamente acessível. Você pode alterar os nomes padrões também.

Então, para se criar uma nova região, como por exemplo, "publicidade" bastaria fazer o seguinte:

regions[publicidade] = Publicidade

E logo você precisaria inserir as demais regiões padrões para não perder a visualização delas no tema.

regions[publicidade] = Publicidade
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

Obrigatóriamente, limpe os dados em Cache em "/admin/settings/performance"; caso contrário, você não verá as alterações.

Uma vez feito isto, basta você criar um local dentro da estrutura de seu tema, e passar o nome da chave como variável, neste caso "$publicidade".

Para testar este recurso, altere o arquivo "page.tpl.php" do tema "tutorial" colocando o código abaixo logo acima do rodapé de nosso arquivo:

<?php if($publicidade): ?>
<div id="publicidade"><?php print  $publicidade; ?></div><!-- /publicidade -->
<?php endif; ?>

O arquivo "page.tpl.php" agora deve estar assim:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--   Acrescentamos aqui o idioma da pagina e a direção do texto do idioma   -->
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="<?php print $language->language ?>"
lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
<head>
<!-- Removemos a tag meta   contendo o tipo do documento e o charset
-- para inserir estas informações de   acordo com as configurações
-- informadas ou obtidas pelo   Drupal
-->
<?php print $head ?>
<!-- Inserimos o   título da página que varia dinamicamento -->
<title><?php print $head_title ?></title>
<!-- Inserimos a importação de folhas   de estilos -->
<?php print $styles ?>
<!-- Carregamos os   arquivos javascript necessários -->
<?php print $scripts ?>
</head>
<!-- Colocamos uma função na tag   BODY
-- que irá criar um atributo class na mesma
-- e controlar o valor   deste atributo de acordo
-- com as configurações dos Blocks em uso
-- Esta   função foi herdada do tema padrão Garlando
-- no arquivo   "template.php"
-->
<body<?php print phptemplate_body_class($left,   $right); ?>>
<!-- Layout -->
<div   id="externo">
<div id="cabecalho">
<?php /* Imprime o conteudo definido nos   Blocks para o Header (cabeçalho) */ ?>
<?php print $header; ?>
<!-- Herdado do Garland -->
<div   id="logotipo">
<?php
//   Prepara o cabeçalho criando um array com algumas informações do   site
$site_fields = array();
// se o nome do   site existe
if ($site_name) {
/**
* Codifica caracteres especiais   num string de texto puro para exibir o nome do site como HTML.
*/

$site_fields[] = check_plain($site_name);
}
if ($site_slogan) {
/**
* O mesmo que ocorre com o nome   do site ocorre com o slogan
*/

$site_fields[] = check_plain($site_slogan);
}
/*
* Une as chaves de $site_fields   com espaços para criar o title
*/

$site_title = implode(' ',   $site_fields);
/**
* Se todas as informações foram   passadas
*/

if ($site_fields) {
// coloca o nome do site entre tags   SPAN
$site_fields[0] = '<span>'. $site_fields[0] .'</span>';
}
/*
* Une as chaves de $site_fields com espaços para criar o   HTML
*/

$site_html = implode(' ', $site_fields);
//   Testa se $logo ou $site_title possuem valor
if   ($logo ||   $site_title) {
// Cria um cabeçalho com o um link para a   pagina inicial filtrando-o contra protocolos indesejáveis (XSS)
print '<h1><a href="'. check_url($front_page) .'"   title="'. $site_title .'">';
// se o logo   existir
if ($logo) {
print '<img src="'. check_url($logo) .'"   alt="'. $site_title .'" id="logo"   />';
}
// Imprime o HTML   com o nome do site final
print $site_html .'</a></h1>';
}
?>
<?php /*   Imprime os links primarios se eles existirem */ ?>
<?php if (isset($primary_links)) : ?>
<?php print theme('links', $primary_links, array('class' =>   'links primary-links')) ?>
<?php endif; ?>
<?php /*   Imprime os links secundários se eles existirem */ ?>
<?php if (isset($secondary_links)) : ?>
<?php print theme('links', $secondary_links, array('class' =>   'links secondary-links')) ?>
<?php endif; ?>
</div>
</div><!-- /cabecalho   -->
<?php /* Se existir   algum Block a ser exibido na esquerda, então esta coluna será montada com o   respectivo conteúdo */ ?>
<?php if ($left): ?>
<div id="esquerda">
<?php /* Se a caixa de busca estiver   ativada e esta coluna exista, ela aparecerá na esquerda */ ?>
<?php if ($search_box): ?><div class="block block-theme"><?php print $search_box ?></div><?php endif; ?>
<?php print $left ?>
</div><!-- /esquerda -->
<?php endif; ?>
<?php /* Se existir algum Block a ser exibido na esquerda, então esta   coluna será montada com o respectivo conteúdo */ ?>
<?php if ($right): ?>
<div   id="direita">
<?php /* Se a   caixa de busca estiver ativada e a coluna esquerda não exista, ela aparecerá na   direita */ ?>
<?php if (!$left &amp;&amp; $search_box): ?><div class="block   block-theme"><?php print $search_box ?></div><?php endif; ?>
<?php print $right ?>
</div><!--   /direita -->
<?php endif;   ?>
<div id="centro">
<?php /* Imprime o breadcrumb do site   */ ?>
<?php print $breadcrumb; ?>
<?php /* Imprime a missão do site caso   ela exista */ ?>
<?php if ($mission): print '<div id="mission">'. $mission   .'</div>'; endif; ?>
<?php /*   Imprime as tabs das páginas que as usem */ ?>
<?php if ($tabs): print '<div id="tabs-wrapper"   class="clear-block">'; endif; ?>
<?php /*   Imprime o título do node */ ?>
<?php if ($title): print '<h2'. ($tabs   ? ' class="with-tabs"' : '') .'>'. $title   .'</h2>'; endif; ?>
<?php if ($tabs): print '<ul class="tabs   primary">'. $tabs .'</ul></div>'; endif; ?>
<?php /*   Imprime tabs secundarias */ ?>
<?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
<?php /* Imprime informações relevantes   ao usuário */ ?>
<?php if ($show_messages &amp;&amp; $messages): print $messages; endif; ?>
<?php /* Imprime ajuda caso esteja   disponível */ ?>
<?php print $help; ?>
<?php /* Imprime todo o conteúdo especificado no Block Content */   ?>
<?php print $content ?>
<?php /* Imprime os feeds da página   */ ?>
<?php print $feed_icons ?>
</div><!-- /centro -->

<-- NOVA REGIÃO PUBLICIDADE QUE FOI CRIADA -->

<?php if($publicidade): ?>
<div id="publicidade"><?php print  $publicidade; ?></div><!-- /publicidade -->
<?php endif; ?>

<div id="rodape">
<?php /* Imprime a mensagem do rodapé, e   os Blocks selecionados como Footer */ ?>
<?php print $footer_message . $footer ?>
</div><!-- /rodape -->
</div><!-- /externo -->
<?php /* Marcação final de fechamentos diversos */ ?>
<?php print $closure ?>
</body>
</html>

Depois de ter realizado as alterações acesse a área administrativa em "/admin/build/block" e veja que logo acima do rodapé apareceu uma nova região para o Block "publicidade" recém criado!

Nova Região para o Bloco Publicidade

Breadcrumb

O Breadcrumb do Drupal não possui um local específico para ativá-lo ou desativá-lo, por este motivo algumas das soluções no caso de você não querer que o mesmo seja exibido em seu tema, são:

  1. Apagar o bloco correspondente no arquivo "page.tpl.php" onde se encontra a variável-chave $breadcrumb
  2. Criar uma função que somente exiba o breadcrumb nas páginas administrativas.

Sobreescrevendo as Saídas dos Temas

Agora que já temos uma boa base para entendermos os aspectos mais fundamentais de um tema para Drupal 6 podemos nos aprofundar no que há de mais belo no
Drupal: "o Poder Sobreescrever ou Extender quase tudo".

Podemos sobreescrever quase tudo em um Tema para Drupal 6 e isto nos dá muita flexibilidade.

Relembrando:

Ao utilizar uma tecnologia OpenSource, sempre que possível "SOBREESCREVA" ou "EXTENDA" os recursos da mesma; nunca modifique!

Imagine que você não goste da forma como o Drupal exibe algo por padrão nos módulos, usando o exemplo que se encontra na documentação do Drupal, você gostaria de colocar uma lupa no lado do formulário de buscas (Search Box). Então, você pode procurar pelo arquivo ".tpl" no diretório do módulo e copiá-lo para o diretório de seu novo tema. Feito isto, basta você abrir o arquivo e alterar livremente até obter o resultado desejado.

OBSERVAÇÃO: Como vamos estar trabalhando com atualizações constantes no tema a partir de agora, caso não tenha feito isto ainda, por favor, abra seu arquivo "template.php" e insira a linha abaixo na última linha do arquivo para que os registros de seu tema sejam limpos a cada atualização de página a fim de obtermos vizualização imediata das alterações.

drupal_rebuild_theme_registry();

O Drupal possui uma maneira bem simples de se sobreescrever algo:

  1. Localize o módulo responsável pela marcação HTML.
  2. Faça um dos seguinte:
    • Se o módulo possui um arquivo template (.tpl), copie este template para a pasta de seu tema.
    • No núcleo do módulo, identifique a função de pré-processamento (preprocess) que está gerando a marcação que você deseja alterar e copie ela e todo o seu conteúdo para o arquivo "template.php" do novo tema. Você vai precisar alterar o prefixo "theme_" ou "template_" para corresponder com o nome do novo tema. No caso de nosso tema "tutorial", se quiséssemos sobreescrever as funções "theme_breadcrumb" e "template_preprocess_page", ficaríamos com "tutorial_breadcrumb" e "tutorial_preprocess_page" em nosso arquivo "template.php".
  3. Dentro da função ou arquivo template, modifique o código da marcação HTML para se adaptar à sua necessidade.
  4. Atualize o cache do tema.

NOTA: A auto descoberta de sobreescrita de temas é realizada pelo PHPTemplate, por isto é necessário que a chave "engine" no arquivo ".info" esteja com o valor para "phptemplate", caso contrário não irá funcionar.

Colocando isto em prática, caso você não tenha ativado o módulo Search, vá em "/admin/build/modules" e ative-o primeiro. Verifique se o formulário de busca está sendo exibido em algum bloco, caso contrário, vá em "/admin/build/blocks" e escolha uma posição para ele. Copie o arquivo "/modules/search/search-block-form.tpl.php" para "/sites/all/themes/tutorial/" e apague todo o conteúdo e insira o conteúdo abaixo:

<div class="container-inline">
<img src="http://www.gilbertoalbino.com/tutoriais/img/icon-busca.png" align="absmiddle" />
<?php print  $search_form; ?>
</div>

Atualize sua página e você verá uma lupinha no lado do texto da busca igual à figura abaixo:.

Formulário de Busca Modificado

Você viu como é fácil sobreescrever?

Vamos testar uma alteração realizada diretamente em uma função.

Abra o arquivo "template.php" e coloque o seguinte bloco após a funçao phptemplate_body_class():

function theme_breadcrumb($breadcrumb) {
        if (!empty($breadcrumb)) {
            return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';
    }
}

Esta é a função intocada que gera o Breadcrumb padrão nos temas.

Renomeie "theme_breadcrumb" para "tutorial_breadcrumb".

Navegue até "/admin/settings/site-information" e caso você esteja utilizando outro tema para as páginas de edição de conteúdo, altere o tema para "tutorial" em "/admin/settings/admin" a fim de poder acompanhar esta sequência.

Você verá a seguinte exibição:

Visualização do Breadcrumb original

Como você pode ver o Breadcrumb está usando o separador " » ".

Note no código após o comando "return" da função "tutorial_breadcrumb" que o PHP está unindo (implodindo) as parte do array breadcrumb com o separador "»":

return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';

Embora isto seja legal, nós queros testar alguma alteração através de funções diretamente no arquivo template.php.

Modifique a função "tutorial_breadcrumb" conforme abaixo e atualize a página:

function tutorial_breadcrumb($breadcrumb) {
  if (!empty($breadcrumb)) {
    return '<div class="breadcrumb">'.
    implode(' <img src="'
     .check_url('http://www.gilbertoalbino.com/tutoriais/img/seta-breadcrumb.png').'" /> ',
     $breadcrumb
    )
  .'</div>';
  }
}

Você verá o breadcrumb alterado com imagens no lugar do separador:

Breadcrumb alterado

Arquivos Templates Padrões

O Núcleo (Core) do Drupal contém vários módulos que já vem pré-instalados. Alguns destes já são obrigatórios e outros permitem ser ativados depois da instalação, como é o caso do módulo Search.

Alguns dos módulos possuem arquivos templates e todos podem ser sobreescritos utilizando o procedimento que vimos anteriormente.

Segue abaixo a listagem completa dos arquivos templates padrões do Drupal. Para alterar um destes arquivos, basta copiá-lo para a pasta de seu tema.

Aggregator
"modules/aggregator/..."
  • aggregator-feed-source.tpl.php
  • aggregator-item.tpl.php
  • aggregator-summary-item.tpl.php
  • aggregator-summary-items.tpl.php
  • aggregator-wrapper.tpl.php
Block
"modules/system/..."
  • block.tpl.php

"modules/block/..."

  • block-admin-display-form.tpl.php
Book
"modules/book/..."
  • book-all-books-block.tpl.php
  • book-export-html.tpl.php
  • book-navigation.tpl.php
  • book-node-export-html.tpl.php
Comment
"modules/comment/..."
  • comment-folded.tpl.php
  • comment-wrapper.tpl.php
  • comment.tpl.php
Forum
"modules/forum/..."
  • forum-icon.tpl.php
  • forum-list.tpl.php
  • forum-submitted.tpl.php
  • forum-topic-list.tpl.php
  • forum-topic-navigation.tpl.php
  • forums.tpl.php
Node
"modules/node/..."
  • node.tpl.php
Poll
"modules/poll/..."
  • poll-bar-block.tpl.php
  • poll-bar.tpl.php
  • poll-results-block.tpl.php
  • poll-results.tpl.php
  • poll-vote.tpl.php
Profile
"modules/profile/..."
  • profile-block.tpl.php
  • profile-listing.tpl.php
  • profile-wrapper.tpl.php
Search
"modules/search/..."
  • search-block-form.tpl.php
  • search-result.tpl.php
  • search-results.tpl.php
  • search-theme-form.tpl.php
User
"modules/user/..."
  • user-picture.tpl.php
  • user-profile-category.tpl.php
  • user-profile-item.tpl.php
  • user-profile.tpl.php
System
"modules/system/..."
  • page.tpl.php
  • maintenance-page.tpl.php
  • box.tpl.php

Variáveis Disponíveis Para os Arquivos .tpl dos módulos

Na primeira parte deste nosso tutorial nós vimos as variáveis-chaves do arquivo "page.tpl.php".

Cada arquivo de template possui um conjunto de variáveis especificas.

Todas elas estão comentadas no cabeçalho de todos os arquivos ".tpl" e infelizmente estão em inglês limitando o total aproveitamente da interpretação somente por quem domina o suficiente do inglês.

Para salvar a barra dos amigos desenvolvedores que não dominam o inglês, vou deixar traduzido no final deste tutorial todos os termos encontrados em cada arquivo dos módulos no núcleo do Drupal. E se de alguma forma você precisar modificar algo no template destes arquivos, você poderá estar consultando futuramente como um guia de referência.

Templates Suggestions ou Templates Alternativos

Além de ser possível extender os templates padrões da maior parte módulos do Drupal, também é possível ir um nível adiante e encontrar situações de personalização isoladas para um arquivo em especifíco a partir de uma sugestão gerada por um conteúdo criado sem precisar modificar todo o visual de um tipo de node, mas somente quando tal situação for encontrada. Complicou? Não! Veja o exemplo abaixo:

Suponha que você criou uma página (page) e que o "node" dela é "7", internamente o Drupal estará chamando o template padrão "node-tpl.php" para exibir o conteúdo.

Este "node" possui o tipo "page". Com estas duas informações já temos uma sugestão: "node-page.tpl.php". Bastaria você criar um arquivo com este nome, copiar o conteúdo de "node.tpl.php" dentro dele e modificá-lo para se adaptar às novas necessidades visuais. Com isto todo node do tipo "page" seria modificado de acordo com as alterações que você realizou no arquivo "node-page.tpl".

IMPORTANTE: Para que os Templates Alternativos funcionem é preciso que o template base (que é o template padrão usado para extender o tema) esteja no mesmo diretório do tema. Neste caso, por estarmos utilizando "node.tpl-php" este já deve estar em seu tema, mas caso você utlize outra sugestão de template, copie o template base para a pasta do tema em questão.

Vamos criar uma situação hipotética aqui onde você quer sua página limpinha sem nada além do título e conteúdo.

Crie uma "Page" com o Título "Currículo" e com o Conteúdo abaixo:

Este é meu currículo:
Sei programar em PHP
Sei programar em Javascript
Sei criar temas para Drupal 6
Me contrate!

Agora crie um arquivo chamado "node-page.tpl.php". Copie o conteúdo do arquivo "node.tpl.php" para dentro deste novo arquivo.

Muitas coisas estão sendo exibidas ai, você somente quer o Titulo e o Conteúdo, então para agilizar o processo apenas copie o código abaixo para dentro de seu arquivo "node-page.tpl.php" removendo o que você colou anteriormente:

<h1><?php print  $title ?> nos Pages em Geral</h1>
<div id="node-<?php print  $node->nid; ?>"
    class="node<?php if ($sticky) { print  ' sticky'; } ?>
    <?php if (!$status) { print  ' node-unpublished'; } ?>">
    <div class="content clear-block">
        <?php print  $content ?>
    </div>
</div>

Você terá esta exibição:

Pages modificados

Isto é muito interessante, mas não é a melhor solução em alguns casos!

Suponhamos que você criou 2 páginas para seu site (curriculo e servicos, respectivamente com os nodes de IDs 7 e 8) e que você gostaria de modificar somente estes dois nodes do tipo "page". Então encontramos uma situação isolada aqui, logo, o Drupal permite ir além e criar os seguintes arquivos templates isoladamente sem precisar alterar "todos" os nodes do tipo page como na situação anterior.

Agora, você pode criar estes dois arquivos e modificá-los isoladamente; copiando o conteúdo do arquivo node.tpl.php dentro deles e modificando-os.

IMPORTANTE: Neste caso você também precisa inserir o arquivo base "node-page.tpl.php" para a pasta de seu tema e criar uma função de pré-processamento, caso contrário não funcionará. Continue com o próximo tópico para resolvermos isto!

Criando uma função preprocess para nosso arquivo node-page-NID.tpl.php

NOTA: NID é o Id do node em questão.

Vou tentar ser o mais breve possível aqui.

Uma função preprocess é usada para definir variáveis para um tema e se destinam somente à aplicação de temas em Hooks implementados como templates.

Para que suas funções pré-processadoras associadas como hook funcionem, os arquivos templates correpondentes devem existir na pasta do tema.

Existem algumas funções pré-processadoras no Drupal, entretanto, vamos nos ater à uma delas:

template_preprocess_hook

Em futuros tutoriais pretendo me apronfundar na criação de módulos para o Drupal e estarei tratando vários assuntos relacionados ao Núcleo do Drupal, mas por hora, basta saber que um "hook" é um conceito usado no Drupal que permite a extensão de módulos facilmente a partir de um conjunto definido de parâmetros e um tipo de resultado especificado.

No arquivo "template.php", insira o código abaixo:

function tutorial_preprocess_node(&$vars) {
  $node = $vars['node'];
  $vars['template_files'][] = 'node-' . $vars['type'] . '-'. $node->nid;  
  return $vars;
}

Como você pode notar o prefixo da função foi alterado para "tutorial_" e o sufixo do hook para "_node". Como estamos implementando o node, então informamos ao hook que vamos altera-lo no tema "tutorial"; passamos a variável "$vars" por referência a fim de acessarmos as informações declaradas nela externamente. Foi criado uma variável $node a partir de $var['node'] para podermos acessar o id do node que vamos trabalhar.

Na linha:

$vars['template_files'][] = 'node-' . $vars['type'] . '-'. $node->nid;  

é onde acontece toda a mágica, nós atribuímos à chave "template_files" o padrão referente que queremos transformar em template.

Queremos que o template pré-definido processe o node de determinado tipo com determinado id.

Feito isto, agora podemos criar o arquivo isoladamente.

O meu Page aqui gerou um id 8, então o NID aqui é 8. Dependendo do seu NID ai altere o nome do arquivo de acordo:

[node-page-8.tpl.php]

<h1><?php print  $title ?> no Page isolado para o NID</h1>
<div id="node-<?php print  $node->nid; ?>"
class="node<?php if ($sticky) { print  ' sticky'; } ?>
<?php if (!$status) { print  ' node-unpublished'; } ?>">
<div class="content clear-block">
<?php print  $content ?>
</div>
</div>

Atualize a página do seu node e veja que o arquivo "node-page.tpl.php" não está mais sendo exibido, embora ele exista ainda!

Você deverá ter a seguinte visualização:

Alteração do Template Isolado para o NID

Bom, agora fica fácil associar as coisas.

Módulo Devel

O módulo Devel é uma boa alternativa para inspecional os complementos de seu tema no processo de desenvolvimento. Ele funciona ao modelo do Firebug do Firefox e permite localizar precisamente informações relevantes aos nodes da pagina atual e oferecendo sugestões para funções de pré-processamento e templates alternativos.

Veja a imagem abaixo:

Screenshot Módulo Devel

Fonte: http://drupal.org/project/devel

Bonus - Tradução das Variáveis na Documentação dos Arquivos .tlp dos Módulos

modules/aggregator/aggregator-feed-source.tpl.php

$source_icon
Ícone do Feed com o link para a fonte. Exibido por theme_feed_icon().
$source_image
Imagem definida pela fonte do feed.
$source_description
Descrição definida pela fonte do feed.
$source_url
URL para a fonte do feed.
$last_checked
Quanto tempo atrás o feed foi verificado localmente.

modules/aggregator/aggregator-item.tpl.php

$feed_url
URL para feed de origem.
$feed_title
O Título do item do feed.
$source_url
Link para a seção da fonte local.
$source_title
Título da fonte remota.
$source_date
Data na qual o feed foi postado na fonte remota.
$content
Conteúdo do item do feed.
$categories
Categorias com os links atribuídos ao feed.

modules/aggregator/aggregator-summary-item.tpl.php

$feed_url
Link para o feed de origem.
$feed_title
Título do feed.
$feed_age
Idade do feed remoto.
$source_url
Link para a fonte remota.
$source_title
title definido localmente para a fonte.

modules/aggregator/aggregator-summary-items.tpl.php

$title
Título para o feed ou categoria.
$summary_list
Lista desordenada de items com links dos items do feed gerados por theme_item_list().
$source_url
URL para a fonte local ou categoria.

modules/aggregator/aggregator-wrapper.tpl.php

$content
Todo o conteúdo de aggregator.
$page
Links do Pager exibidos por theme_pager().

modules/block/block-admin-display-form.tpl.php

$block_regions
Um array de regions. Organizados por nomes com o título como valor.
$block_listing
Um array de blocks organizados por região e em seguida por delta.
$form_submit
Botão submit do formulário..
$throttle
TRUE ou FALSE dependendo se o módulo throttle esteja ativado.

Cada $data em $block_listing[$region] contém:

$data->region_title
Título da região para o bloco listado.
$data->block_title
Título do bloco.
$data->region_select
Menu dropdown para atribuir uma região.
$data->weight_select
Menu dropdown para definir os weights.
$data->throttle_check
Checkbox para habilitar throttling.
$data->configure_link
Link de configuração do bloco.
$data->delete_link
Link para excluir blocos adicionados por usuário.

modules/book/book-all-books-block.tpl.php

$book_menus
Array com as estruturas do livro exibidos como uma lista desordenada. Organizado pelo ID do book que também é o ID do node pai.

modules/book/book-export-html.tpl.php

$title
Título mais importante do node.
$head
Tags do cabeçalho.
$language
O código do idioma, por exemplo, "en" para inglês.
$language_rtl
TRUE ou FALSE dependendo de scripts com idiomas da direita para a esquerda(rtl -right to left).
$base_url
URL para a página inicial do site.
$content
Nodes dentro da estrutura atual exibidos por book-node-export-html.tpl.php.

modules/book/book-navigation.tpl.php

$tree
O filho mais próximo do node atual exibido como uma lista desordenada.
$current_depth
Intensidade do node atual dentro da estrutura do livro. Fornecido para contexto.
$prev_url
URL para o node anterior.
$prev_title
Título para o node anterior.
$parent_url
URL para o node pai.
$parent_title
Título do node pai. Não imprimido por padrão. Fornecido como uma opção.
$next_url
URL para o próximo node.
$next_title
Título do próximo node.
$has_links
Sinaliza TRUE uqnado os dados "anterior", "pai" ou "próximo" possuem um valor.
$book_id
O ID do livro da estrutura atual que está sendo vizualizada. O mesmo que o ID do node contendo a estrutura inteira. Fornecido para contexto.
$book_url
O URL do livro/node da estrutura atual sendo vizualizada. Fornecido como uma opção. Não utilizado por padrão.
$book_title
O título do livro/node da estrutura atual sendo vizualizada. Fornecido como uma opção não utilizado por padrão.

modules/book/book-node-export-html.tpl.php

$depth
Intensidade do node atual dentro da estrutura.
$title
Título do node.
$content
Conteúdo do node.
$children
Todos os nós filhos recursivamente exibidos por este arquivo.

modules/commnet/comment-folded.tpl.php

$title
Um título com link para o comentário completo.
$new
Marcador para novo comentário.
$author
Autor do comentário. Pode ser link ou texto puro.
$date
Data e hora de postagem.
$comment
Obejto do comentário completo.

modules/commnet/comment-wrapper.tpl.php

$content
Todos os comentários para uma página em específico. Também contém controles de seleção.

modules/commnet/comment.tpl.php

$author
Autor do comentário. Pode ser um link ou texto puro.
$content
Corpo do post.
$date
Data e hora da postagem.
$links
Vários links operacionais.
$new
Marcador para novo comentário.
$picture
Imagem do autor.
$signature
Assinatura do autor.
$status
Status do comentário. São possíveis valores: comment-unpublished, comment-published ou comment-preview.
$submitted
Em linha com data e horário.
$title
Título com link.

modules/forum/forum-icon.tpl.php

$new_posts
Indica se o tópico contém ou não novos posts.
$icon
O ícone para exibição. Pode ser um dos 'hot', 'hot-new', 'new', 'default', 'closed', ou 'sticky'.

modules/forum/forum-list.tpl.php

$forums
Um array de fóruns e categorias a serem exibidos. Este é organizado pelos ids númericos de todos os fóruns e categorias filhos.
$forum_id
Id do fórum para o forum atual. É o pai para todos os items dentro do array $forum.
 

Cada $forum em $forum contém:

$forum->is_container
É TRUE se o fórum pode contem outros fóruns. É FALSE se o fórum pode conter somente tópicos.
$forum->depth
Qual a intensidade que o fórum possui na hierarquia atual.
$forum->zebra
string 'even' our 'odd' utilizada para a classe da linha.
$forum->name
O nome do fórum.
$forum->link
O URL para o link deste fórum.
$forum->description
A descrição deste fórum.
$forum->new_topics
TRUE se o forum contém posts não lidos.
$forum->new_url
Um URL para os post não lidos do fórum.
$forum->new_text
Texto para o URL acima na qual informa quantos são os novos posts.
$forum->old_topics
Uma contagem de posts que já foram lidos.
$forum->num_posts
O número total de posts no fórum.
$forum->last_reply
Texto representando a últma vez que um fórum foi postado ou comentado.

modules/forum/forum-submitted.tpl.php

$author
O autor do post.
$time
Quanto tempo atrás o post foi criado.
$topic
Um objeto contendo dados crús (não filtrados) do post. Inseguro, se assegure de limpa este dado antes de imprimí-lo.

modules/forum/forum-topic-list.tpl.php

$header
O cabeçalho da tabela. Este é pré-gerado com informação na ordem de clicks. Caso você precise modificar isto, veja template_preprocess_forum_topic_list().
$pager
O pager para exibir debaixo da tabela.
$topics
Um array de tópicos a serem exibidos.
$topic_id
Id numérico para o tópico do fórum atual.

Cada $topic em $topic contém:

$topic->icon
O ícone para exibir.
$topic->moved
Um sinal para indicar se o tópico foi movido para um outro fórum.
$topic->title
O título do tópico. Seguro para exibição.
$topic->message
Se o tópico foi movido, este contém uma explicação e um link.
$topic->zebra
String 'even' ou 'odd' string para a classe da linha.
$topic->num_comments
O número de respostas neste tópico.
$topic->new_replies
Um sinal para indicar se existem comentários não lidos.
$topic->new_url
Se existem respostas não lidas, este é o link para elas.
$topic->new_text
O text contendo a contagem traduzida devidamente pluralizada.
$topic->created
Uma string imprimível representando quando um novo tópico é postado.
$topic->last_reply
Uma string imprimível representando quando um tópico foi respondido pela última vez.
$topic->timestamp
O timestamp crú de quando este tópico foi postado.

modules/forum/forum-topic-navigation.tpl.php

$prev
O ID do node do post anterior.
$prev_url
O URL do post anterior.
$prev_title
O título do post anterior.
$next
O ID do node do próximo post.
$next_url
O URL para o próximo post.
$next_title
O título do próximo post.
$node
O node crú que está sendo exibido atualmente. Contém dados inseguros e qualquer dado dentro deste deve ser filtrado antes de apresentado.

modules/forum/forums.tpl.php

$links
Um array de links que permitem ao usuário postar novos tópicos do fórum. Pode também conter uma string informando um usuário que ele deve logar para que possa postar.
$forums
Os fórums para exibir (como processados por forum-list.tpl.php).
$topics
Os tópicos para exibir (como processados por forum-topic-list.tpl.php)
$forums_defined
Um sinal indicando que os forums estão configurados.

modules/node/node.tpl.php

$title
O título (sanitarizado, filtrado) do nó.
$content
Corpo do node ou teaser dependento do sinalidador(flag) $teaser.
$picture
A imagem do autor do saída do node a partir de theme_user_picture().
$date
Data de criação formatada (utiliza $created para reformatar com format_date()).
$links
Links com tema como "Read more", "Add new comment", etc. criados por theme_links().
$name
Username com tema do node a partir de theme_user().
$node_url
URL direto para o nó atual.
$terms
A lista com tema para os links dos termos de taxonomia criados por theme_links().
$submitted
A informação de envio com tema criado por theme_node_submitted().

Outras variáveis:

$node
Objecto node completo. Contém dados que podem não ser seguros.
$type
Tipo do node, ou seja, story, page, blog, etc.
$comment_count
Número de comentários ligados ao node.
$uid
O id do usuário do autor no node.
$created
O horário na qual o node foi publicado formado no timestamp Unix.
$zebra
Imprime tanto "even" ou "odd". Útil para listragem zebra nas listas do teaser.
$id
Posição do node. Incrementa cada vez que é exibido.

Variáveis de status do node

$teaser
Sinal indicando o estado do teaser.
$page
Sinal para o estado completo da pagina.
$promote
Sinal para a promoção para a página inicial.
$sticky
Sinal para definição de post destacado.
$status
Sinal para status publicado.
$comment
Estado de configurações do comentário para o node.
$readmore
Sinaliza TRUE se o conteúdo do teaser do node não pode conter o conteúdo do corpo principal.
$is_front
Sinaliza TRUE quando exibido na página inicial.
$logged_in
Sinaliza TRUE quando o usuário atual é um membro logado.
$is_admin
Sinaliza TRUE quando o usuário atual é um administrador.

modules/poll/poll-bar-block.tpl.php e

modules/poll/poll-bar.tpl.php

$title
O título da enquete.
$votes
O número de votos para esta opção.
$total_votes
O número total de votos para esta opção.
$percentage
O percentual de votos para esta opção.
$vote
O número escolhido do voto atual do usuário.
$voted
Define TRUE se o usuário votou para esta opção.

modules/poll/poll-results-block.tpl.php e

modules/poll/poll-results.tpl.php

$title
O título da enquete.
$results
O resultado da enquete.
$votes
Os resultados totais na enquete.
$links
Links na enquete.
$nid
O nid da enquete.
$cancel_form
Um formulário para cancelar o voto do usuário, se permitido.
$raw_links
O array cru de links. Deve ser executado por meio de theme('links') se utilizado.
$vote
O número da escolha do voto atual do usuário.

modules/poll/poll-vote.tpl.php

$choice
Os botões radio para as opções na enquete.
$title
O título da enquete.
$block
TRUE se este estiver sendo exibo como um bloco.
$vote
O botão para votar.
$rest
Tudo o mais no formulário que pode ter sido adicionado através dos hooks form_alter.

modules/profile/profile-block.tpl.php

$picture
Imagem configurada para a conta com o link para a página dos usuários.
$profile
Array organizado de todos os campos dos perfis que possuem um valor.

Cada $field em $profile contém:

$field->title
Título do campo do perfil.
$field->value
Valor do campo do perfil.
$field->type
Tipo do campo do perfil, ou seja, checkbox, textfield, textarea, selection, url ou date.

modules/profile/profile-listing.tpl.php

$picture
Imagem configurada para a conta com o link para a página dos usuários.
$name
Nome da conta de usuário com o link para a página dos usuários.
$profile
Array organizado de todos os campos do perfil que estão definidos como visível na página de lista de membros (configurada pelos administradores do site). Este também precisa possuir um valor para ser exibido.

Cadas $field em $profile contém:

$field->title
Título do campo do perfil.
$field->value
Valor do campo do perfil.
$field->type
Tipo do campo do perfil, ou seja, checkbox, textfield, textarea, selection, list, url ou date.

modules/profile/profile-wrapper.tpl.php

$content
Os perfis da conta de usuário interagem por meio de profile-listing.tpl.php.
$current_field
O campo nominado sendo navegado. Fornecido aqui para contexto.

modules/search/search-block-form.tpl.php

$search_form
O formulário de busca completo pronto para impressão.
$search
: Array of keyed search elements. Can be used to print each form
* element separately.

Chaves padrão dentro de $search:

$search['search_block_form']
Text input dentro de um div.
$search['submit']
Butão de envio do formulário.
$search['hidden']
Elementos escondidos do formulário. Utilizados para validar os formulários quando enviados.

modules/search/search-result.tpl.php

$url
URL do resultado.
$title
Título do resultado.
$snippet
Uma pequena prévia dos resultados. São se aplica às buscas de usuários.
$info
String de todas as informações meta prontas para impressão. Não se aplica às buscas de usuários.
$info_split
Contem o mesmo dado que $info, separados por um array organizado.
$type
O tipo da busca, por exemplo, "node" ou "user".

Chaves padrão dentro de $info_split:

$info_split['type']
Tipo do node.
$info_split['user']
Autor do node com um link para o perfil dos usuários. Depende da permissão.
$info_split['date']
Última atualização do node. Com pouca formação.
$info_split['comment']
Número de comentários exibidos como "% comments", sendo "%" a contagem. Depende de comment.module.
$info_split['upload']
Número de arquivos anexados exibodos como "% attachments", sendo % a contagem. Depende de upload.module.

modules/search/search-results.tpl.php

$search_results
Todos os resultados é exibido por search-result.tpl.php.
$type
O tipo da busca, por exemplo, "node" ou "user".

modules/search/search-theme-form.tpl.php

$search_form
O formulário de busca completo pronto para impressão.
$search
Array de elementos da busca organizados. Pode ser utilizado para imprimir cada elemento do formulário separadamente.

Chaves padrão dentro de $search:

$search['search_theme_form']
Text input dentro de um div.
$search['submit']
Botão de envio do formulário.
$search['hidden']
Elementos ocultos do formulário. Utilizado para validar os formulários quando enviados.

modules/system/block.tpl.php

$block->subject
Título do bloco.
$block->content
Conteúdo do bloco.
$block->module
Módulo que gera o bloco.
$block->delta
Este é um id numérico conectado à cada módulo
$block->region
A região do bloco na qual o bloco atual se encaixa.

Variáveis auxiliáres:

$block_zebra
Exibe 'odd' e 'even' dependente de cada região de bloco.
$zebra
Mesma exibição de $block_zebra mas independente de qualquer região de bloco.
$block_id
Contador depende de cada região de bloco.
$id
Mesma exibição de $block_id mas independente de qualquer região de bloco.
$is_front
Sinaliza TRUE quando apresentado na página inicial.
$logged_in
Sinaliza TRUE quando o usuário atual é um membro logado.
$is_admin
Sinaliza TRUE quando o usuário atual é um administrador.

modules/system/box.tpl.php

$title
Título do box.
$content
Conteúdo do box.

modules/system/maintenance-page.tpl.php

NOTA
Todas as variáveis de page.tpl

modules/system/page.tpl.php

NOTA
Todas as variáveis que você já conhece de page.tpl.php.

modules/user/user-picture.tpl.php

$picture
Imagem definida pelo usuário ou padrão do site. Terá um link dependendo da permissão para vizualizar a página do perfil dos usuários.
$account
Array com informações da conta. Potencialmente inseguro. Assegure-se de utilizar check_plain().

modules/user/user-profile-category.tpl.php

$title
Título da categoria para o grupo de items.
$profile_items
Todos os items para o grupo exibidos por user-profile-item.tpl.php.
$attributes
Atributos HTML. Normalmente exibe classes.

modules/user/user-profile-item.tpl.php

$title
Título do campo para o item do perfil.
$value
Valor definido pelo usuário para o item do perfil ou dados de um módulo.
$attributes
Atributos HTML. Normalmente exibe classes.

modules/user/user-profile.tpl.php

$user_profile
Todos os dados do perfil do usuário. Pronto para impressão.
$profile
Array organizado de categorias de perfis e seus itens ou outros dados fornecidos pelos módulos.

Como colocar um campo ao lado do outro no formulário de criação/edição de nodes?

Muitos já devem ter passado pelo problema de ter que colocar um campo ao lado do outro em um formulário de criação/edição de um node.

Para iniciar, você precisa criar uma função no arquivo template.php de seu tema.

function seutema_theme($existing, $type, $theme, $path) {
  return array(
    'nome_do_tipo_de_conteúdo_node_form' => array(
        'arguments' => array('form' => NULL),
        'template' => 'node-nome_do_tipo_de_conteúdo-edit'
    )
  );
}

Onde:
seutema = o nome do seu tema;
nome_do_tipo_de_conteúdo = o nome de máquina do seu tipo de conteúdo (story, page, blog, meu_formulario)

Feito isso, você precisará criar um arquivo chamado: node-nome_do_tipo_de_conteudo-edit.tpl.php (para a criação/edição dos nodes) com o seguinte conteúdo:

<?php print drupal_render($form['field_meu_campo']['value']); ?>

Você pode adicionar o HTML necessário para isolar o campo e estilizar da maneira que desejar.

Recomendo usar a seguinte grafia:

<div class="meu_campo"><?php print drupal_render($form['field_meu_campo']['value']); ?></div>
<div class="meu_campo2"><?php print drupal_render($form['field_meu_campo2']['value']); ?></div>
<div class="meu_campo3"><?php print drupal_render($form['field_meu_campo3']['value']); ?></div>

Onde: meu_campo é o nome do campo em questão.

Para adicionar a classe que irá flutuá-los lado à lado, eu resolvi da seguinte maneira:

- --- [ início ] --- -

<div id="criacao-nome_do_tipo_de_conteudo">
        <div class="metade">
                <div class="nome_do_campo"><?php print drupal_render($form['field_nome_do_campo']['value']); ?></div>
                <div class="nome_do_campo2"><?php print drupal_render($form['field_nome_do_campo2']['value']); ?></div>
        </div>

...

</div>

<?php print drupal_render($form); ?>

- --- [ término ] --- -

Essa última linha é o que adiciona os demais controles do formulário, tais como: opções de endereço, demenu, os botões de envio, etc...

Feito isso, adicionei as seguintes regras no meu style.css:

.metade {
        clear: both;
}

.meu_campo,
.meu_campo2 {
        width: 47%;
        float: left;
        margin: 0 1%;
}

Faça isso para todos os campos que desejar flutuar lado à lado.

Caso tudo corra bem, ao acessar: http://seusite.com.br/node/add/nome-do-tipo-de-conteudo

Os campos especificados neste arquivo devem estar flutuando.

Espero que esse arquivo possa ter ajudado! @:)

Saudações,
aleagi
.

Como corrigir erros de codificação (acentuação)

Boas a todos!

Um problema relatado com certa frequência em fóruns que participo é o de erros na acentuação de textos.

Motivado por um post aqui no Drupal, resolvi colocar essa dica para outras pessoas que passem pelo mesmo problema.

Para que a acentuação e caracteres especiais apareçam corretamente é necessário configurar os 3 ítens abaixo da mesma maneira:

1. a página;
2. o banco de dados;
3. o editor.

Considerando o uso de utf-8 (o mais indicado), como isso deve ser feito ?

1. Na página:

1.1 Definir o idioma (opcional mas recomendado)

<html xmlns="http://www.w3.org/1999/xhtml" lang="pt-br" xml:lang="pt-br">

1.2 definir o charset

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2. No banco de dados (MySql)

2.1 Conjunto de caracteres MySQL: UTF-8 Unicode (utf8)
2.2 Collation de conexão do MySQL: utf8_unicode_ci

3. No editor. IMPORTANTE, aqui é onde aparece muito problema.
Normalmente as pessoas não se ligam na codificação que seu editor usa. Editam o arquivo, salvam e pronto. Ao enviar para o servidor, mesmo estando correto o charset da página e do bd, o erro persiste.
No nosso exemplo, usando utf-8, nosso editor precisa salvar usando utf-8 também.
No Windows normalmente os editores salvam usando iso-8859-1, para não ter problema é necessário identificar onde mudar esse parâmetro e então salvar o arquivo em utf-8.

Um exemplo de como esse pequeno detalhe muda tudo, criei 2 arquivos html idênticos em conteúdo e o charset está setado como utf-8, que pode ser constatado no código fonte da página, porém ao salvar, um foi salvo com iso-8859-1 e outro com utf-8

Veja os exemplos aqui:
charset utf-8, gravado com codificação iso-8859-1
charset utf-8, gravado com codificação utf-8

Vê como muda tudo ? ;)

Segue alguns editores em Windows/Linux e onde mudar essa opção:

Windows (com a colaboração do gutomec- Luiz Gustavo) :D

Dreamweaver:
1 - Para trocar o file encoding vá em Modify>Page Properties... (ou Ctrl+j);
2 - Em Category selecione Title/Encoding;
3 - Selecione em Encoding o que desejar e dê um OK;
4 - Salve o documento.

EditPlus:
1 - Vá em Documents>File Encoding>Change File Encoding;
2 - Vai abrir uma janela pedindo para selecionar o file encoding, selecione o desejade e dê um OK.
3 - Salve o documento.

Linux

Geany
1 - vá em "documento"
2 - selecione "definir codificação"
3 - escolha a codificação desejada

Gedit
1 - vá em "arquivo"
2 - selecione "salvar como"
3 - selecionar na caixa select o código desejado

Eclipse
1 - vá em "preferences
2 - em "editors" procure a opção para definir codificação

Espero que ajuda e qualquer dúvida é só falar.

Abs

Como disparar ações a determinados eventos - módulo Triger

Este é um pequeno tutorial para usar o módulo Trigger, que acompanha a instalação básica do Drupal 6x.

Primeiro, vejamos para que serve o módulo, conforme sua própria descrição:

“Ações são tarefas individuais que o sistema pode realizar, tais como despublicar um conteúdo ou banir um usuário. Módulos, como o módulo trigger, podem disparar essas ações quando certos eventos de sistema ocorrerem; por exemplo, quando um novo conteúdo for adicionado ou quando um usuário se conectar. Os módulos também podem prover ações adicionais.
Existem dois tipos de ações: simples e avançadas. As ações simples não exigem nenhuma configuração adicional e são listadas automaticamente. Ações avançadas podem fazer mais coisas que as ações simples; por exemplo, enviar um e-mail para um endereço específico, ou verificar por certas palavras em um pedaço de conteúdo. Essas ações precisam ser criadas e configuradas antes de poderem ser usadas.”

Definições:
Trigger = Gatilho;
Actions = Ações;
Token = literalmente, símbolo. Tecnicamente: “é um segmento de texto ou símbolo que pode ser manipulado por um parser, que fornece um significado ao texto; em outras palavras, é um conjunto de caracteres (de um alfabeto, por exemplo) com um significado coletivo. - Wikipédia”.
Popularmente: “pedaços de marcação que serão substituídas por algum conteúdo”.

Vamos em frente com um exemplo prático.

Situação:
Toda vez que um usuário postar um comentário, o sistema deve enviar um email para um endereço informado, contendo no campo “assunto” o título do comentário e no “corpo” do email, a data do servidor (não é a da criação do comentário) junto com o texto do comentário.

Solução:

Primeiro precisamos criar a ação que será disparada.

Veja a tela da opção "Ação"

1. Acessar a opção "Início › Administrar › Configuração do site › Ações"
>> http://seu_site/admin/settings/actions

Na tela irá aparecer algumas ações já disponíveis. No meu está assim:

Publicar post
Despublicar post
Descartar post
Cancelar destaque do post
Promover post para a página inicial
Remover post da página inicial
Salvar post
Bloquear usuário atual
Banir o endereço de IP do usuário atual

Como não há nenhuma ação para enviar email, vamos ter que criar uma.

2. No final dessa página, no campo “Tornar uma nova ação avançada disponível", selecione "Send tokenized e-mail" e clique em enviar.

3. Na nova tela (Configurar uma ação avançada) preencher como no exemplo:

Veja a tela da opção Configurar Ação

3.1 Descrição: "Avisar Admin Comentario Novo"
É o nome que vamos identificar a ação.
Obs.: nesse campo estará aparecendo o nome padrão “Send tokenized e-mail” que poderá ser substituído ou não, dependendo da preferência. No nosso caso, estou alterando para um nome mais sugestivo.

3.2 destinatário: webmaster@seusite.com.br
Aqui você tem 2 opções, ou informa um endereço de email (webmaster@seusite.com.br) ou um token, que poderia ser o [site-mail], digitando exatamente como está. Dessa forma, ao disparar a ação, o campo “[site-mail]” será substituído pelo email do site. Segue alguns só para conhecimento:
Global tokens
[user-name] Nome do usuário corrente que está logado
[user-mail] Email do usuário corrente que está logado
[site-url] A url do site

Para uma lista completa de todos os tokens disponíveis, basta clicar no final da página na opção: "Placeholder tokens”

3.3 assunto: [comment-title-raw]
Vamos usar um token, que vai informar o título do comentário

3.4 mensagem: Um novo comentário foi publicado em [site-date]: [comment-body-raw]
Usamos um token para a data do servidor, seguido de dois-pontos e do corpo do comentário.

3.5. Salvar e o sistema retorna a tela anterior.


Com nossa ação criada, o próximo passo é configurar o gatilho(trigger) para acioná-la.

Veja a tela da opção Gatilho

4. Acessar a opção "Início › Administrar › Construção do site › Gatilhos"
>> http://seu_site/admin/build/trigger/comment

Opções disponíveis:
* Comentários    * Conteúdo    * Cron    * Taxonomia    * Usuários

Como nossa ação vai atuar nos comentários, vamos selecionar "Comentários"
Na nova tela, serão exibidos os gatilhos disponíveis.

5. Vamos ao que nos interessa, que é o "Gatilho: Depois de salvar um novo comentário" e na caixa select, a ação que nós criamos vai estar lá: "System >> Avisar Admin Comentario Novo". Selecione e clique em "atribuir".

6. The end :D

Abs e espero ter ajudado.

Como instalar e configurar o TinyMCE no Drupal

Nesse tutorial veremos como instalar e usar o editor WYSIWYG TinyMCE no Drupal.

O TinyMCE é um editor online designado WYSIWYG (What You See Is What You Get) em português "O que você vê é o que você tem".

Com ele é possivel editar conteúdo online sem precisar saber HTML, mas com formatação rica. Ele foi criado pela empresa Moxiecode, e pode ser baixado livremente no site da empresa em: http://tinymce.moxiecode.com/. Ele funciona independente do Drupal, mas aqui veremos como integrá-lo ao Drupal.

Atualmente existe um módulo para o Drupal que habilita o uso do TinyMCE para edição de conteúdo. Esse módulo está disponível em: http://drupal.org/project/tinymce

Como diz na página do módulo o mesmo não instala o TinyMCE em sí, então é preciso que você baixe, além do módulo para o Drupal, o TinyMCE.

Assim, o primeiro passo para a instalação do TinyMCE é ir até a página do módulo e baixá-lo. Em seguida, vá até a página do TinyMCE e baixe-o também.
Nesse ponto é importante observar, na página do módulo, qual versão do TinyMCE ele suporta. No momento em que eu escrevo esse tutorial, a versão suportada é a 2.1.2. Assim, quando for baixar, procure essa versão.

Com os dois produtos baixados, você deve descompactar o módulo na pasta modules da sua instalação do Drupal. Isso fará com que o módulo esteja disponível para o Drupal.
Isso, por si só, não faz com que o TinyMCE esteja funcional. É necessário também descompactar o TinyMCE na pasta do módulo tinymce. Assim, a estrutura de diretórios deve ficar semelhante a essa:

Antes:

Depois:

Isso feito, podemos habilitar o módulo para o nosso site.

Para tanto logue-se como administrador no seu site. Acesse Administrar -> Construção do site -> Módulos e habilite o módulo TinyMCE.

Pronto o módulo está instalado.

Nesse ponto você não verá o editor ainda pois, no caso do TinyMCE, você precisa configurar um perfil de usuário que terá acesso a esse editor. Isso é feito assim para evitar que usuários, sem os privilégios necessários, acessem o TinyMCE.

Então você deve criar um perfil (esse tutorial não irá cobrir esse procedimento) e ir até: Administrar -> Gerenciamento de usuários -> Controle de acesso e dê a permissão "access tinymce" para esse perfil. Obviamente que se o seu usuário pode fazer outras coisas, você deve dar as permissões necessárias.

Isso habilitará o usuário acessar o TinyMCE, mas precisamos configurar como o editor será exibido para o usuário. Ao contrário de outros módulos para o Drupal (como o FCKEditor) o nível de personalização do TinyMCE é muito grande.

Vamos configurar o TinyMCE. Para isso acesse o seu site e vá em: Administrar -> Configuração do site -> TinyMCE settings

A primeira vez que você acessa essa página lhe será mostrado um aviso de que ainda não há um perfil, e lhe será dada a oportunidade de criar um.
Clicando nesse link, você será levado a uma tela onde pode configurar cada parâmetro do TinyMCE.

Vamos dar uma breve olhada nessas opções.

Vamos por partes:

Basic setup

Você vai dar um nome para esse perfil.

Nesse ponto você pode configurar qual o perfil de usuário pode acessar esse conjunto de opções do TinyMCE (pode ser mais de um perfil).

É possível configurar outros itens relacionados ao o usuário.

Visibilidade

Você escolhe em quais páginas o TinyMCE vai ser usado. Ele vem, por padrão, para ser usado em páginas de conteúdo, comentários e perfil do usuário.

Buttons and plugins

Como o nome diz, você pode configurar os botões e plugins que fará uso.

Editor appearance

Configura as opções de visualização (posicionamento e alinhamento) do editor na tela.

Editor appearance

Aqui você configura como o editor irá tratar o código gerado ou colado. Você pode habilitar a limpeza e formatação do código, o que é uma boa opção.

CSS

Por último é possível configurar os estilos do Editor. Isso impacta diretamente em como o exitor é exibido. Recomendo escolher para o parâmetro "Editor CSS", a opção "tinyMCE default". Isso evita conflitos entre o CSS do seu site e o Editor.

Pronto. Ao salvar essa tela, o TinyMCE estará configurado para o seu site.

Uma nota importante. Se você tentar acessar, com o primeiro usuário que você criou para o site, alguma tela onde o editor deveria aparecer ele não aparecerá. Isso acontece porque você precisa atribuir a esse usuário o mesmo perfil para o qual você configurou o TinyMCE. Isso feito, estará disponível também para esse usuário.

Dúvidas, sugestões e comentários, por favor deixe abaixo.

Como instalar o Drupal no Ubuntu

Neste tutorial será explicado como instalar o Drupal e os programas necessários para seu funcionamento, no Ubuntu.

Os comandos de instalação serão executados em um terminal, que pode ser acessado pelo menu Aplicativos > Terminal.

1. Apache

sudo apt-get install apache2

Teste a instalação abrindo o navegador e digitando na barra de endereços: http://127.0.0.1 ou http://localhost

Caso apareça a mensagem abaixo, a instalação foi bem sucedida!

"It works! This is the default web page for this server. The web server software is running but no content has been added, yet."

2. MySQL

sudo apt-get install mysql-server

Ao término do download dos pacotes, o programa irá solicitar uma senha, guarde-a, pois será necessáaria no futuro.

3. PHP

sudo apt-get install php5 php5-mysql

Com esses programas instalados, seria possível trabalhar sem maiores problemas, no entanto, recomendo a instalação do phpMyAdmin. Com ele é possível criar, excluir e fazer backups das tabelas do banco de dados pelo modo gráfico.

4. phpMyAdmin

sudo apt-get install phpmyadmin

Ao término do download a instalação do aplicativo irá solicitar algumas configurações:

Na barra de endereços, em seu navegador, digite: http://localhost/phpmyadmin

Utilize o usuário root e a senha anteriormente cadastrada.

Em "Ações MySql localhost", crie um novo banco de dados de nome "drupal-db" (o nome do banco de dados é você quem define) e clique em "criar".

5. Instalando o Drupal

Primeiramente, faça o download da última versão do Drupal em http://drupal.org/download

Caso queira a versão em português, faça o download da mesma em http://drupal.org/project/pt-br

Após o download, extraia o arquivo tar.gz do drupal (no meu caso, 6.19) para a pasta localizada em /var/www/.

Modifique o nome da pasta para “drupal”, para facilitar o uso.

5.1. Instalação do Drupal em português

Extraia os arquivos do pacote traduzido (pt-br) para pasta renomeada “drupal” em /var/www/drupal/

Mescle as pastas existentes (do arquivo em inglês) com as do arquivo em português, substituindo os arquivos de mesmo nome

Abra seu navegador e digite: http://localhost/drupal

Caso tenha extraído corretamente o arquivo de tradução, aparecerá a opção de instalação em português do Brasil.

Provavelmente ocorrerão erros na instalação. Leia as informações sobre o erro na tela, pois a solução também será informada.

5.2. Observações importantes

  1. Será necessário criar a pasta “files”, dentro do diretório “default” permitirá o armazenamento dos arquivos associados ao seu novo site.
  2. Será necessário criar um arquivo de configuração inicial para o site, com permissão de leitura e escrita. O que poderá ser feito pelo modo gráfico, com privilégios de administrador.

Caso esteja tudo certo, atualize a página de instalação do drupal e ele prosseguirá com a instalação e solicitará:

Feitas as alterações necessárias em ./sites/default e ./sites/default/settings.php, retire as permissões de leitura e escrita.

5.3. Configurando o site

Para configurar o seu site, forneça as seguintes informações:

Configure e conta do administrador, que dá acesso irrestrito ao site.

Em caso de dúvidas, escreva-as abaixo.

---
Vanini Lima - http://www.vaninilima.com

Criando sua própria autenticação do Drupal

Como uma das grandes vantagens de se trabalhar com o Drupal é a de que ele é altamente customizável, a autenticação não poderia ficar pra traz. Neste artigo vamos ver como é simples criar seu próprio sistema de autenticação para o Drupal.

Para tornar este artigo mais fácil de entender, vamos criar um módulo real que vai autenticar todos os usuários que estão em um arquivo texto. O nome do nosso módulo será fileauth.

Basicamente vamos apenas usar um hook para criar nosso módulo, o hook_auth.

Então chega de bla bla bla e vamos lá...

Primeiro crie o diretório fileauth onde os arquivos do nosso módulo vai ficar e crie o arquivo fileauth.info dentro dele.

Agora crie o arquivo usuarios.txt com o seguinte conteúdo:

pedro:1234
priscilla:4321
fulano:abcd
zezinho:obdc

Estando com tudo pronto, vamos para o módulo. Crie o arquivo fileauth.module e coloque o seguinte conteúdo. Em seguida vou explicar o que ele vai fazer...

<?php
function fileauth_auth ($username, $password, $server) {
  $file = drupal_get_path('module', 'fileauth') . '/usuarios.txt';
  // File not found
  if ( !file_exists($file) ) {
    drupal_set_message("File '$file' not found!", 'error');
    return FALSE;
  }
  $users = file($file, FILE_IGNORE_NEW_LINES);
  // No users on file
  if (!count($users)) {
    return FALSE;
  }
  foreach ($users as $user) {
    list($u, $p) = split(':', $user);
    if ($u == $username && $p == $password) {
      return TRUE;
    }
  }
  // User not found...
  return FALSE;
}
?>

Muito simples né? vamos à explicação...

Caso o drupal não ache o usuário em sua base de dados, ele executa nossa função passando o usuario e a senha que foram escritos no formulário. O parâmetro $server pode ser esquecido neste momento por nós pois não vai ter utilidade...

O módulo apenas abre o arquivo e procura por um usuário:senha... Simples né?

Você agora pode fazer o que quiser... validar com usuários de banco de dados, XML-RPC etc. O céu é o limite...

Até a próxima.

Criando um tema para o Drupal

Esse tutorial mostra como transformar um template HTML em um tema do Drupal.

Como pré-requisito para entender esse tutorial você vai precisar entender um pouco de PHP, HTML e CSS para conseguir acompanhar tudo.

Update: Esse tutorial foi feito com base no Drupal 5.x assim não deve funcionar plenamente nas versões superiores sem algumas alterações.

Para esse tutorial também é necessário que você já tenha uma instalação do Drupal na sua máquina. Caso você ainda não tenha ou não saiba como fazer essa instalação pode ver esse tutorial e esse screencast.

Para o melhor entendimento desse tutorial, quando nos referimos a template estaremos falando de um layout feito em HTML e que ainda não tem funcionalidade no Drupal. Quando nos referirmos a tema estamos nos referindo a um template já funcionando no Drupal.

Então, antes de mais nada, precisamos encontrar um template. No nosso tutorial vamos pegar um template já pronto na Internet, no seu caso você mesmo pode fazer um ou pagar um designer para que o faça.
O template escolhido para esse tutorial foi o Standardized disponível em http://www.freecsstemplates.org/preview/standardized. Esse template é grátis, podendo ser baixado gratuitamente. Você precisará manter os créditos do tema, pois ele está licenciado sob a Creative Commons, mas isso não é problema pois estamos em uma comunidade se Software livre não é? :-)

Em seguida precisaremos montar nosso tema propriamente dito. Eu tenho por hábito partir de um tema pré-existente, mas você não precisa fazer isso, é uma questão pessoal. Para esse tutorial, vou usar como base o tema Bluemarine que já vem com toda instalação do Drupal.

Assim, a primeira coisa a fazer é baixar o template (acima você tem o endereço para download). Em seguida entramos na pasta themes da nossa instalação do Drupal e copiamos toda a pasta do tema bluemarine com um nome diferente, no nosso caso o nome do nosso tema será tutorial. O resultado final será algo como mostrado abaixo.

Sistema de arquivos

Em seguida copiamos alguns elementos do template para a pasta do nosso novo tema. No caso desse nosso tema, vamos copiar a pasta images e o arquivo default.css que estão na pasta do template para a pasta do nosso tema. Em seguida, apagamos o arquivo style.css que já estava na pasta do nosso tema e renomeamos o arquivo default.css para style.css. Isso é necessário pois o Drupal entende, por padrão, que o nome do arquivo de CSS do nosso tema se chama style.css. Obviamente podemos ter outros aquivos CSS, mas para o nosso tema vamos fazer seguindo o padrão. Uma outra coisa que podemos fazer é baixar um thumbnail para substituir o que já existe do bluemarine. Isso Não é imprescindível mas é importante pois é através desse thumbnail que vamos poder visualizar na área de administração de temas qual é o nosso tema. No caso do template que baixamos, ele já tem um thumbnail em http://www.freecsstemplates.org/download/thumbnail/standardized. Baixe esse arquivo e substitua o arquivo screenshot.png que está na pasta do nosso tema.

Com isso terminamos os preparativos e podemos partir para a construção do tema propriamente dita. Como eu disse me baseio em um tema para construir os meus, então o trabalho aqui é um pouco de copiar e colar, e vou mostrar como estava antes e depois até o resultado final.

Para começar o trabalho, primeiro renomeamos o arquivo page.tpl.php do tema que copiamos para algo como page.tpl.php.old e copiamos o arquivo index.html do template para a pasta do tema com o nome page.tpl.php. No final poderemos apagar o page.tpl.php.old. Em seguida abrimos os dois arquivos para montar o tema. Para facilitar o entendimento, dividi em partes de forma que podemos ir acompanhando pedaço por pedaço da construção do tema.

Começamos com a tag HTML do nosso tema. No tema original ela é assim:

Aqui vemos duas marcações em PHP, com a variável $language que é o código do idioma do site. Isso é usado para formatar o HTML de acordo com os padrões da W3C. No nosso template veio assim:

Perceba que aqui existe um comentário sobre a licença do template, e a tag HTML não tem designação de idioma, então modificamos para que fique assim:

Pronto, temos essa parte terminada. Em seguida vamos para os cabeçalhos. É nessa parte que são declarados os estilos, javascript e várias outras partes importantes do tema do Drupal. Abaixo o original, no tema bluemarine:

E abaixo o original no nosso template:

Por fim temos o resultado final:

Veja que o resultado final é igual ao original do bluemarine. Nem sempre será, no nosso tema vamos usar a estrutura básica, então não precisamos de alterações. Agora uma breve explicação do que é cada uma das variáveis nessa seção:

Agora vamos ver a parte do cabeçalho do nosso tema. Se você já deu uma olhada no tema que escolhemos como padrão, lembrará que ele tem um cabeçalho com o menu, em uma barra verde, e abaixo um título. Vamos então ver como fazer isso. Primeiro vemos como é no tema original, o bluemarine:

E depois como veio no template:

Por último vemos como ficou:

Vejamos o que é cada uma dessas variáveis:

Note ainda que mativemos a estrutura do HTML básico do nosso template. Isso porque podem haver elementos HTML que precisaremos para manter o estilo pretendido. No caso, deixamos o DIV com sua classe header que ele já possui.

Em seguida vamos para a seção que trata do menu. Vejamos como é o original no bluemarine

E como o template escolhido trata essa parte:

Por fim, como ficou com a alteração que fizemos:

Antes de mais nada, veja que cortamos algumas coisas no nosso código. O Drupal vem com dois níveis de menu, prontos para serem usados: o primário e o secundário. No nosso caso, só vamos usar o primário, e o secundário foi excluído. Outra coisa que excluímos foi a caixa de pesquisa, pois vamos usar um bloco para isso. Então vejamos o que significa cada uma dessas variáveis:

Agora vamos para a parte principal do nosso tema. O tema nos permite personalizar a apresentação do conteúdo do site. O Drupal entende que o conteúdo é tudo que é exibido na parte principal do do seu site, assim nem tudo que é exibido nessa seção é de fato conteúdo, mas coisas como os formulários de edição, configuração e etc. também são exibidos nessa área. Vejamos como é o original no bluemarine:

Em seguida como veio no nosso template. Note que não está tudo que há no template, apenas uma parte.

Por último como ficou depois de alterarmos:

Novamente veja que mudamos apenas o que precisamos do Drupal. Parte da formatação original do template ficou. Vejamos o que é cada uma dessas variáveis:

Veremos agora a nossa barra lateral da esquerda, que terá a caixa de busca, caixa de login, e, quando logado, o menu de administração (também conhecido como navegação). Vejamos então o original no bluemarine:

Como o template escolhido veio:

E como ficou no final:

Nesse caso temos apenas uma variável, $sidebar_left, que irá carregar todos os blocos que posicionarmos na esquerda. Nesse momento cabe uma explicação sobre como carregar os blocos no Drupal e quais variáveis são usadas para isso.
O Drupal trabalha com um conceito de região. Por padrão ele define 5 regiões onde podemos posicionar blocos. Essas regiões são mostradas no template page.tpl.php em forma de variáveis como abaixo:

É possível que se defina outras regiões, mas esse tutorial não irá cobrir isso. Num futuro tutorial falaremos disso.

Agora veremos a última parte do nosso tema, o rodapé. Abaixo a verão original no bluemarine:

E em seguida o template:

Por fim, a versão alterada no nosso tema:

Novamente, parte do template foi mantida, pois ela é fundamental para a formatação correta do site. Vejamos o que é cada uma dessas variáveis:

Pronto, para esse tema que escolhemos, isso é tudo que precisamos mexer com PHP/HTML. Veremos agora como deixar mais próximo do template original, pois ainda são necessários alguns pequenos ajustes de CSS.

Antes de mais nada, precisamos habilitar o nosso novo tema. Assim você deve se logar como administrador, e ir na parte de temas (Adminsitrar -> Construção do site -> Temas) e habilitar o nosso novo tema, e definí-lo como padrão:

Vejamos como ficou o site com essas mudanças que fizemos (clique na imagem para ampliar):

Veja que ainda existem coisas a serem feitas. Precisamos colocar o bloco de login, a caixa de busca e formatar o conteúdo.
Vamos criar um item que apareça no menu superior. Para isso crie uma página (Criar conteúdo -> Página) e preencha os campos que desejar e em opções de menu preencha como abaixo:

Isso fará com que apareça um menu na barra verde. Vejam que, como eu disse antes, o primary links é diferente do menu de navegação.

Agora nós temos um item no menu superior, podemos criar tantos quantos desejarmos.

Agora vamos habilitar a caixa de busca na barra lateral da esquerda, para isso vá até a página de adminstração de blocos (Administrar -> Construção do Site - > Blocos) e habilitamos o bloco da busca na esquerda conforme abaixo:

Para que usuários anônimos acessem a caixa de busca, precisamos dar a permissão correta:

Pronto, temos todos os elementos que precisamos no nosso site.
Nossa caixa de busca ficou assim:

Agora faltam os ajustes de CSS. Precisaremos identificar quais as classes que definem a cor das duas caixas, login e busca além dos botões e caixa de texto.

Olhando o código fonte do template, identifiquei que a caixa de login, no template, tem aplicada a classe boxA e a de busca boxB. Olhando o código gerado pelo site até o momento, pude identificar que o bloco de login possui a classe block-user e o bloco de busca possui a classe block-search.
Assim, tendo mapeado as classes de origem e destino, editamos o arquivo style.css e trocamos todas as ocorrências de uma classe (no caso boxA e boxB) por outra (no caso block-user e block-search). Assim temos o resultado para a caixa de busca:

Mas ainda ainda não está como esperávamos. Nem o botão nem a caixa de texto está como esperávamos, para isso precisaremos trocar mais uma parte do CSS pelas classes corretas.
Vejamos então. A caixa de texto padrão do template utiliza a classe text que vamos ter que trocar pela classe que o Drupal utiliza, chamada form-text. Para isso, editamos novamente o arquivo style.css e procuramos or todas as ocorrências de input.text e trocamos por input.form-text. Igualmente com o botão, que no template tem a classe button e no Drupal a classe é form-submit.

Pronto, com todas as classes trocadas, temos como resultado final:

Então até o momento temos o seguinte com usuário anônimo(clique para ampliar):

E com usuário administrador(clique para ampliar):

No entanto não está 100% igual ao que desejamos, pois acima de cada bloco temos um título, coisa que não há no nosso template original. Assim precisamos desabilitar isso. Para tanto acesse a área de adminstração dos blocos (Administrar -> Construção do site -> Blocos) e escolha a opção "configurar" dos dois blocos que queremos tirar o título e troque o nome do título do bloco para <none>, como abiaxo:

Por fim, precisamos definir o nome do site, o slogan e a mensagem de rodapé. Para isso acesse a área de adminsitração do site na parte de informações (Administrar -> Configuração do site -> Informações do site) e altere os dados como abaixo e depois salve as informacões(clique para ampliar):

Isso por si só fará com que você tenha esses dados configurado. Porém o slogan do site depende do seu tema. Alguns desse elementos são controlados individualmente por cada tema, e o nosso tema está com o slogan desativado, então teremos que ativá-lo. Para isso acesse a área de configuração do tema (Administrar -> Construção do site -> Temas) e clique na opção "Configurar" do nosso tema e, em seguida, marque a caixa de "Slogan do site", conforme abaixo:

Pronto, isso termina com a configuração do nosso site, veja como ficará na versão final, com usuário anônimo(clique para ampliar):

E com o usuário logado(clique para ampliar):

Temos um template aplicado no nosso site. É bom lembrar novamente que esse não é o único método de fazer temas, e para algumas pessoas não é o melhor. Também deve-se lembrar que esse é um exemplo simples e que o Drupal te deixa fazer muito mais coisa do que foi mostrado nesse simples tutorial.

Abaixo você pode baixar o template pronto

Duvidas, sugestões e comentários são bem vindos.

Um abraço e espero que seja útil para você.

AnexoTamanho
tutorial.zip14.14 KB

Desenvolvendo Portais com o CMS Drupal

Desenvolvendo Portais com o CMS Drupal

Este é um tutorial, do tipo passo-a-passo que ensina a instalar, configurar e adicionar conteúdo no CMS Drupal.
Não requer conhecimento do Drupal, nem de PHP, mas com conhecimento da criação de sites ou disposto a aprender.
Algo forte no Drupal são seus conceitos. Ele trabalha com conceitos próprios, diferente de outros CMS, portanto
é importante se acostumar com eles. Vamos ao tutorial...

O Drupal é um dos mais populares CMS.

O que é o Drupal?

É um Sistema Gerenciador de Conteúdos (CMS) open source em PHP distribuído sob a licença GNU. É um CMS que
foca no desempenho, segurança e recursos. A versão 5.5 tem apenas 736KB compactados, bem enxuto. Conta
atualmente com uma grande comunidade ao redor do planeta. Dos CMS populares é o único com um bom suporte
ao PostgreSQL.

Onde obter Ajuda?

Site oficial - http://drupal.org/handbooks
Site da comunidade Brasileira - http://drupal-br.org
Manual Traduzido pela comunidade brasileira - http://drupal-br.org/manual
Dicas no site Drupal Brasil - http://drupal-br.org/dicas
Online no site oficial - http://drupal.org/getting-started/5
Em PDF para Drupal5 - http://drupal.org/files/getting-started_2.pdf
Fórum em Inglês - http://drupal.org/forum
Fórum em Português (Brasil) - http://drupal-br.org/forum

Pré-requisitos

- Apache 1.3.x ou 2.x (se usar o mod_rewrite pode adotar URL limpas/amigáveis)
- PHP 4.3.3 ou superior ou 5.x. Para PHP 5.2 usar o Drupal 5.2 ou superior ou o 4.7.5 ou superior.
- MySQL - Com suporte redondo ao MySQL (4.5 ou 5.0). Requer no servidor de hospedagem os seguintes privilégios
para o usuário do banco no MySQL: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES.
- PostgreSQL - Suporte ainda com restrições ao PostgreSQL (7.3 ou superior). Atenção ao instalar alguns módulos.
Caso encontre problemas com alguns módulos, faça a migração do código que deve estar voltado para o MySQL.

- PHP XML extension
- PHP mbstring extension (processamento do texto em UTF-8)
- Biblioteca GD
- session.save_handler:user
- session.cache_limiter: none
- memory_limit: 24M (recomendado)
- Para PHP instalado como módulo o .htaccess deve ter AllowOverride None
- Banco com codificação UNICODE
- Servidor de e-mail: SMTP = localhost e smtp_port = 25

Downloads

4.x, 5.x ou 6.x (beta) - http://drupal.org/download

Criação do Banco de Dados

O banco de dados, idealmente, deve ser criado com suporte a UNICODE (UTF-8).

MySQL

Criar o banco com suporte a UTF-8.

PostgreSQL

Se num servidor de hospedagem, geralmente não terá opção para dar suporte a UNICODE.
Ainda por cima, nos servidores de hospedagem a versão do PostgreSQL já é bem antiga e com
suporte padrão a SQL_ASCII.
Em alguns testes, a codificação SQL_ASCII funciona bem com os módulos defaults nas versões
5.5 e 6.x.

A recomendação da equipe é que o banco tenha suporte a UNICODE (para evitar problemas com a acentuação),
pela linha de comando com:

createuser --pwprompt --encrypted --no-adduser --no-createdb drupal
createdb --encoding=UNICODE --owner=drupal drupal

Ou então na console do psql com:

CREATE ROLE drupal WITH ENCRYPTED PASSWORD 'drupal';
CREATE DATABASE drupal WITH ENCODING 'UNICODE' OWNER drupal;

No phppgadmin apenas escolhemos a codificação UNICODE.

Instalação

- Fazer o download da última versão e descompactar no servidor
- Criar o subdiretório "files" na pasta "drupal" e dar permissão de escrita se num UNIX
- Acessar via navegador http://localhost/drupal
- Interativamente instalar observando as recomendações.

Precisa ter cookies habilitados no navegador.

Versão 4.x

- Devemos criar o banco
- Importar o script que se encontra em database/database.pgsql ou database.mysql.
- Depois devemos configurar o script sites/default/settings.php com as informações do banco criado, na linha:
$db_url = 'mysql://nomeusuario:senha@localhost/nomebanco';

Versões 5.x e 6.x

- Apenas crie o banco
- E chame o navegador com http://localhost/drupal

Após instalado crie a sua conta de super usuário (UID1).

Instalação do Idioma Português do Brasil

- Faça o download do site oficial em
http://drupal.org/node/151248
- Descompacte localmente
- Abra o Drupal, Administrar, após ter habilitado o módulo de suporte, no Drupal 6 é Language, no 5 é Localization
- Clique em Add Language e indique português Brasil e Add
- Ative, coloque como default e Save
- Clique no link "Importing a translation" e indique o arquivo pt-br.po e clique em Import.

Instalação do Editor HTML WYSIWYG para ser usado nas textareas de conteúdo

- Baixar o módulo de http://ftp.drupal.org/files/projects/tinymce-5.x-1.9.tar.gz
- Faça o upload para a pasta modules do Drupal e descompacte
- Faça o download da versão 2.1.3 do tinymce de http://prdownloads.sourceforge.net/tinymce/tinymce_2_1_3.tgz?download
- Envie por upload para a pasta modules/tinymce do Drupal. Ficará assim: modules/tinymce/tinymce
- Faça o login como super usuário do Drupal
- Crie um perfil de usuário exclusivamente para acessar o TinyMCE (somente para acessar)
- Vá em Administrar - Configuração do site - TinyMCE (caso ainda não tenha um perfil crie) e faça algum usuário usar o tinymce
- Clique em Editar no perfil e em Basic Setup selecione o perfil e veja outras configurações
- Clique em Update profile abaixo
- Requer ainda Conteúdo do tipo HTML Full. Lembre de dar permissão de uso somente para usuários de confiança.

Para testar clique no menu Criar Conteúdo - Selecione um dos itens e verá o TinyMCE aparecer.

Obs.: Tive como base o tutorial do Drupal Brasil (Como instalar e configurar o TinyMCE no Drupal).

Ativação dos demais Módulos

O Drupal vem com vários outros módulos úteis, mas desativados.
Clique em Administrar - Módulos e selecione os que deseja ativar.

Atualização da versão atual

Clicar em Administrar - Módulos
Clicar no link "update.php" e seguir as instruções.

Configurações do Site

Existe uma grande quantidade de configurações que podemos alterar ou ajustar no Drupal:
Administrar - Configuração do site

Aí temos: data e hora, desempenho, idiomas, informações sobre o site e várias outras.

Informações do Site

Aqui definimos algumas coisas importantes sobre o site:

- Título do Site (que aparece na barra do navegador)
- E-mail do responsável
- Slogan do site
- Mensagem de rodapé
- Página inicial padrão (podemos escolher qualquer página como a inicial)

Alguns Conceitos do Drupal

- Blocos - são componentes da interface do Drupal, como o menu de navegação, como a área de login,
a área da enquete, o formulário de busca, etc. Podem aparecer ou não em todas ou várias páginas.

- Regiões - a página no Drupal divide-se nas seguintes regiões: cabeçalho, rodapé, conteúdo, barra lateral
esquerda e barra lateral direita.

- Taxonomia - através deste módulo temos como criar categorias e subcategorias (termos) para poder organizar
melhor o conteúdo. Na versão 5.x temos Categoria e na 6.x já é Taxonomia.

- Termo - Este é uma subcategoria.

- Livro - é o tipo de conteúdo que pode ser desenvolvido em colaboração, por vários autores.

- Página - Page não posta autor, data ou comentário por default

- Story - posta autor, data ou comentário por default

Ao publicar uma página de conteúdo podemos escolher se ela irá ou não para front page.

Configurar Blocos

Administrar - Blocos

Podemos definir a região em que cada bloco ficará, como também podemos escolher se ele não será exibido.

Instalar Módulo de Terceiros

- Fazer o download do módulos
- Enviar por upload para o subdiretório modules do Drupal
- Extrair
- Acessar a seção Adrministrar - Módulos e ativar (ao final)
Observe que alguns módulos tem dependências, que devem ser instaladas antes para que seja ativado.

Instalar Temas

De forma semelhante à instalação dos módulos.
Após a instalação podemos marcar como padrão para que seja usado no site.

Instalação do módulo "nice menus"
Este módulo permite a exibição de menus com submenus em árvore.

- Faça o download do site do Drupal http://drupal.org/...
- Faça o upload para o diretório modules do Drupal no servidor e descompacte
- Vá em Administrar - Módulos e ative o novo módulo Nice Menus
- Vá em Administrar - Nice Menus e configure. Escolha quantos menus utilizará. Default são 3.
- Agora vá em Administrar - Blocos e selecione o(s) nice menus que irá usar escolhendo a região.
- Lembre de ocultar o menu de navegação para usar o Nice Menu.
- A região mais adequada para o Nice Menu é a lateral esquerda.

Adicionar Conteúdo

Neste exemplo iremos criar uma estrutura para exibição de autores e artigos. Ou seja, aparecerá um item do menu
de navegação chamado Artigos, que ao ser clicado abre o leque de autores. Ao clicar num autor serão exibidos
os seus artigos, como a seguir:

Artigos
--AutorA
----Artigo1
----Artigo2
----Artigo3
--AutorB
----Artigo1
----Artigo2
----Artigo3

Vamos Criar uma Categoria chamada Artigos

Lembre que se estiver no Drupal 6.x não é Categoria mas Taxonomia.

- Clique em Administrar - Categorias
- Acima clique em Novo Vocabulário
- Em Nome do Vocabulário digite "Artigos"
- Em Descrição digite "Artigos sobre o Drupal"
- Em Texto de Ajuda também digite "Artigos sobre o Drupal"
- Em Tipos vamos marcar aqueles que poderão usar esta categoria.
Como quero que esta seção seja criada em colaboração, podendo vários autores trabalhar num mesmo artigo,
vamos selecionar apenas "Página de Livro"
- Em Hierarquia vamos selecionar "Múltipla"
- Marcar "Termos Relacionados" e clicar em Enviar

Criar As SubCategorias/Termos

Agora vamos criar as subcategorias para cada autor
- Clicar no link "Adicionar termos" correspondente a Artigos
- Em Nome do termo digite "Autor A"
- Em Descrição digite "Artigos do Autor A"
- Em Peso selecione "1" e clique em Enviar

De forma semelhante crie o termo do Autor B.
- Clicar no link "Adicionar termos" correspondente a Artigos
- Em Nome do termo digite "Autor B"
- Em Descrição digite "Artigos do Autor B"
- Em Peso selecione "2" e clique em Enviar

Observe que o Autor B tem peso 2, isso para separar em ordem.

Criar o menu e os dois submenus para nossos dois termos

Lembre que a categoria e os termos são apenas capas que serão administradas via menu e exibirão o conteúdo, ou seja,
sua finalidade é de organização.

- Clique em Administrar - Menus
- Abaixo de Navegação clique em Novo item
- Em Título digite Artigos
- Em Descrição digite "Artigos sobre o Drupal"
- Em Endereço entre com ""
- Em Peso entre com o número da ordem desejada para o Menu
- Clique em Enviar

Agora vamos criar um novo item de menu, agora para abrigar o primeiro Termo (Autor A):

Antes de criar os submenus temos que conhecer os links dos termos criados (Autor A e Autor B).
Para isso vá em Categorias e clique em Listar termos dos Artigos.
Basta pousar o mouse sobre o link de cada um dos autores, Autor A e Autor B, que aparecerá um link
mais ou menos com taxonomy/term/3 ou coisa parecida, dependendo de quantos termos já criastes.

- Abaixo de Navegação clique em Novo item
- Em Título digite "Autor A"
- Em Descrição digite "Artigos do Autor A"
- Em Endereço entre com "taxonomy/term/3" sem as aspas
- Em Item superior selecione Artigos, que será o menu deste item
- Em Peso selecione 1, para ser o primeiro
- Clique em Enviar
Observe que tem uma opção Expandido, que pode ser usada para criar menus que já aparecem abertos

De forma semelhante crie o item para o Autor B, apenas alterando o Peso para 2.

Criando o Conteúdo a ser exibido no Menu

- Clique no menu Criar Conteúdo e selecione Página de Livro
- Em Título digite "Primeiro Artigo"
- Na combo Artigos selecione Autor A
- Em Corpo digite o texto do primeiro artigo do Autor A
- Em Formato de entrada podemos selecionar o formato. Caso este autor seja de confiança e use o TinyMCE devemos
selecionar FULL HTML
- Em Peso selecione 1
- Em Configurações do endereço digite "primeiro" ou o que desejar para endereço do artigo.
- Em Configurações do Menu digite para Título "Primeiro Artigo" e o mesmo para Descrição
- Em Item superior selecione Navegação - Artigos - Autor A
- Em Peso selecione 1
- Clique em Enviar

Criando Menu tipo o Tutoriais do Drupal Brasil e do Drupal Ribafs

- Criamos uma categoria com um nome como "Colaborações"
- Criamos vários termos para esta categoria e anotamos seus endereços:
taxonomy/term/3, taxonomy/term/4, taxonomy/term/5, etc.
- Criamos tantos itens de menu quantos forem os termos, no caso, do tipo Primary Links, para cada um atribuindo o respectivo endereço do termo
- Então criamos o conteúdo para cada item de menu. Lembrando que cada termo e cada item de menu e conteúdo deve ter pesos diferentes.
Os pesos correspondem à ordenação dos mesmos.

Adicionar conteúdo com Imagens

- Habilite módulo upload
- Configurar o usuário/grupo para poder fazer upload
- Ver configurações do upload
- Habilitar o tipo de conteúdo para upload
- Criar conteúdo
- Anexar o arquivo (copie o path do arquivo na caixa de upload)
- Use no conteúdo. Assumindo que o filtro permite usar .

Formatos de Entrada

O Drupal traz a opção de vários formatos de entrada:
- HTML Filtrado (padrão)
- Código PHP (onde o código digitado pode ser executado)
- HTML completo

Segurança

Atenção: qualquer direito que permita ao PHP administrar filtros deve ser delegado com extremo cuidado.

O HTML full só deve ser configurado para sites de extrema confiabilidade.

Caso tenhamos a segurança como importante para o site devemos assinar a lista de segurança do Drupal
http://drupal.org/security

Depois que o site estiver concluído é prudente criar uma outra conta para administrar o site, mas com restrições,
para evitar o uso como super usuário.

Gerenciamento de Usuários

Por default vem com dois grupos (roles, papéis) de usuários: anônimos e autenticados
O usuário UID1 é o super usuário, tem poderes para fazer qualquer coisa com o site.

Controle de Acessos - aqui temos acesso aos privilégios dos grupos de usuários atuais para cada seção do site.
Onde definimos as permissões dos grupos/papeis/roles de usuários.

Opções de Usuário - Onde decidimos como será o cadastro de usuários. Temos 3 alternativas:

- Apenas um administrador pode criar uma nova conta de usuário.
- Um visitante pode criar uma conta sem a aprovação de um administrador.
- Visitantes podem criar contas, mas será necessário a aprovação do administrador.

Papeis - Os papéis permitem que você regule e ajuste a administração do Drupal. Um papel define um
grupo de usuários que tem certos privilégios definidos nas permissões de usuário. Exemplos de papel
incluem: usuário anônimo, usuário autenticado, moderador, administrador, etc. Nesta área você pode
definir os nomes dos vários papéis. Para remover um papel, clique em "editar".

Perfis - aqui podemos personalizar o conteúdo visto pelos usuários, permitindo visualizar uns e ocultando outros.

Regras de acesso - Criar regras para nome de usuário e endereço de email, tanto para novas quanto para
aquelas previamente registradas (usuários que estiverem logados neste momento não serão deslogados).
Se um nome de usuário ou endereço de email for enquadrado em uma regra de proibição, então a conta não
será criada ou, se já registrada, não vai mais poder fazer login. Uma regra de host é efetiva para toda
requisição de página, não apenas para o registro de usuários.

Usuários - aqui podemos criar novos usuários e configurar os existentes.

Podemos criar usuários e grupos à vontade, passando ou retirando privilégios de acordo com nossas necessidades.

Para cada usuário podemos:
- escolher um ou mais grupos a que pertencerá
- idioma (ele até poderá escolher dependendo da configuração do site)
- escolher o tema
- além de outra opções como fuso horário, formulário de contato, etc

Observe que podemos criar um grupo de confiança, configurar o mesmo para usar o TinyMCE com HTML Full.
Para maior segurança permitir que apenas o administrador cadastre usuários.

Dicas extras

- Acesso ao site quando perdemos a página inicial, quando instalamos um template que não mostra o login (por não ter a região com o mesmo) ou por outro motivo qualquer:
http://localhost/drupal/?q=user

_________________________________________________________
Ribamar FS - http://ribafs.net e http://drupal.ribafs.net

Drupal em português do Brasil (instalação)

1. Entre na administração do seu site em Drupal e clique em módulos (Modules).

2. Marque a opção Locale. Ela vai habilitar a interface para outras línguas além do inglês.

3. Agora é preciso baixar a tradução do drupal para o português do Brasil (pt-br). Vamos usar a linha de comando:

# cd /var/www

# wget http://ftp.drupal.org/files/projects/pt-br-5.x-2.00.tar.gz

# tar -xvzf pt-br-5.x-2.00.tar.gz -C /var/www/seu_site/

4. Na administração, vá em Site configuration e, depois, clique em Localization. Ou digite no Firefox http://localhost/seu_site/?q=admin/settings/locale

5. Clique em add language, escolha o português do Brasil e add language!

6. Agora vamos importar o arquivo de tradução, em Import. Procure o arquivo pt-br.po (Ele vai estar em /var/www/seu_site/pt-br/pt-br.po). Certifique-se que em Import into está marcado o português do Brasil. Import!

7. Habilite este idioma em Enabled e marque como padrão (Default). Clique em Save configuration.

Pronto! Reza a lenda que seu Drupal está em português :)

Incluir imagem no post do Drupal usando FCKeditor e IMCE

Estive testando algumas possibilidades de incluir imagens nas publicações do Drupal e sempre dava problema. A instabilidade dos módulos fazia com que eu desistisse de incluí-los nos projetos. Testei o Image Picker e tive dor de cabeça da integração deste com os editores de texto.

Ao instalar o FCKeditor sozinho, notei que ele tinha uma boa usabilidade e, ao integrar com o IMCE, rodou sem problemas. Neste pequeno tutorial farei a descrição da instalação destes dois módulos:

Em /modules/, baixe o módulo FCKeditor
# wget http://ftp.drupal.org/files/projects/fckeditor-5.x-2.1.tar.gz

Descompacte
# tar zxvf fckeditor-5.x-2.1.tar.gz

Entre na pasta fckeditor
# cd fckeditor

Baixe o FCKeditor
# wget http://ufpr.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor_2.6.tar.gz

Descompacte
# tar zxvf FCKeditor_2.6.tar.gz

Em admin/build/modules, ative os módulos FCKeditor e IMCE.

Em admin/user/access, dê as devidas permissões aos usuários.

Em admin/settings/imce, ative FCKeditor no IMCE (Enable FCKEditor support); Abaixo, há as definições para cada tipo de usuário (Settings for the role) - ative a opção "Enable extras". Ative esta opção apenas para os tipos de usuários que poderão subir imagens para o servidor.

Em admin/settings/fckeditor, no Perfil Advanced, habilite os tipos de usuários que poderão usar o editor de texto. Você encontra esta opção em "Basic Setup".

As demais configurações do FCKeditor e do IMCE você personaliza de acordo com seu gosto.

Instalar multi-línguas (módulo Localizer)

É necessário instalar o módulo Localizer. Em seusitio/modules/, baixe o localizer:

wget http://ftp.drupal.org/files/projects/localizer-5.x-3.3.tar.gz

Descompacte:

tar -zxvf http://ftp.drupal.org/files/projects/localizer-5.x-3.3.tar.gz

Entre no módulo Localizer:

cd localizer

Baixe as bandeiras das línguas:

wget http://www.speedtech.it/files/localizer-flags.tgz

Descompacte:

tar -zxvf http://www.speedtech.it/files/localizer-flags.tgz

Entre em seusitio/sites/default/settings.php e adicione, no final, esta linha:

include_once('sites/all/modules/localizer/localizer_settings.php');

Note que o arquivo localizer_settings.php deve estar na pasta seusitio/sites/all/modules/localizer/

No meu caso, o arquivo localizer_settings.php estava em seusitio/modules/localizer/ e, então, a linha que incluí no meu settings.php foi esta:
include_once(’modules/localizer/localizer_settings.php’);

Agora abra seu navegador de internet no seu sítio, entre na administração e, em módulos, ative o Menu (Localizer), o Taxonomy (Localizer) e todos os módulos do Localizer. O Localizer pede, ainda, que estejam instalados os módulos Views e Token. Você precisa instalá-los e ativá-los.

Pronto. Deve estar funcionando. Desligue o computador e vá andar de bike :)

Obs: A dica de instalar esse módulo foi do efeefe :P

Instalar o Drupal no Dreamhost.com

1) Entre no painel de controle do dreamhost.

2) Ir para Manage Domains > Add New Domains.

3) Em Full Hosted, preencha:
- Domain to Host: seusite.org
E clique em Fully host this domain now!

Ele criou uma pasta em /home/username/seusite.org/

4) Entre no seu servidor compartilhado via SSH (Você pode fazer isso por FTP, mas mostrarei apenas por SSH).

5) Entre na pasta do seusite.org
cd seusite.org

6) Baixe a última versão estável do Drupal:
wget http://ftp.drupal.org/files/projects/drupal-5.7.tar.gz

7) Descompacte:
tar -zxvf drupal-5.7.tar.gz 8) Renomeie a pasta:
mv drupal-5.7/ novosite

9) No painel do Dreamhost, ir em Goodies > Manage MySQL > Create a new MySQL database. Preencher:
- Database Name: dbseusite
- New Hostname: dbseusite . seusite.org
- First User: adminseusite
- New Password: suasenha
- New Password Again: suasenha
E clique em Add new database now!

10) Abra o navegador e digite www.seusite.org/novosite

11) Preencha:
- Database Name: dbseusite
- Database username: adminseusite
- Database password: suasenha
Em Advanced options, escreva em Database host:
dbseusite.seusite.org
E clique em Save configuration :)

Mamão e Drupal com açucar, desmistificando o primeiro contato com o Drupal

Instalando, configurando, adaptando e utilizando o Drupal.

Vídeo-tutorial desmistificando o primeiro contato aos interessados em conhecer o Drupal.

Ensina como montar um site com as páginas:

- Home (exibindo resumo de todo conteúdo)
- Equipe (listar equipe do site com nome, thumb, foto e descrição)
- Novidades (matérias, textos, informativo divididos em categorias)
- Contato (formulário de contato)

Veja o vídeo e baixe tudo que foi produzido (drupal, coleção de módulos, banco de dados e tema) em:
http://drupal.planetaria.com.br

O vídeo foi feito bem caseiro e sem um grande planejamento. É de iniciante para iniciante.

Gostaria muito de saber se ajudou alguém, se não da pra entender, se ta ruim, qualquer comentário é bem-vindo.

Em breve estarei disponibilizando o vídeo no Vimeo, picotado em partes, pra ficar melhor de assistir.

Abraço,
Diogo.

Módulo de pagamento por boleto bancário

Esse é um módulo que eu fiz para poder pagar por boleto bancário, por enquanto ele permite apenas pagamento pelo banco do brasil mas fazer adaptações nele para suportar outros bancos é possível.

Ele foi desenvolvido para funcionar com o ubercart, até a versão alpha8(última alpha) funcionou ok, nos betas que sairam não testei mas deve funcionar.

Quem quiser saber mais detalhes baixe e veja o arquivo leia-me, tem mais informações nele.

Como falei no outro tópico, comentários, melhorias, criticas, fiquem a vontade, a idéia é que vejam o quão útil ele pode ser e como podemos melhora-lo.

abraços

AnexoTamanho
uc_boleto2.zip6.54 KB

Passando argumentos para um bloco

Digamos que você construi um módulo para controle de produtos, nesse seu módulo você possui uma página construída através do módulo, com o hook_menu, por exemplo: http://localhost/drupal/produto

No hook_menu você tem um callback que aponta para a função produto_get_content, essa função é responsável por trazer o nome do produto no título da página, através da função drupal_set_title, ela não busca mais nenhuma informação.

O que queremos é quando o usuário acessar http://localhost/drupal/produto/10 passando o parâmetro 10 seja buscada todas informações referente ao produto, para fazer isso podemos construir views do tipo bloco, cada view fica responsável por mostrar um tipo de conteúdo, uma mostra a descrição do produto, outra mostra as fotos, e podemos criar as views conforme a necessidade.

A página http://localhost/drupal/produto/10 será composta de vários blocos, o problema que temos é passar o parâmetro 10 para cada view, as views do tipo bloco não consegue pegar de forma automática o parâmetro da url para usar como argumento na view.

Nós podemos forçar a passagem desse argumento para view, isso pode ser feito usando uma opção mais avançada de argumento no Drupal.

Na construção da view você deve ir até o fieldset Arguments, escolher o tipo do argumento que você irá passar, no nosso caso nós precisamos do argumento do tipo código do produto, esse tipo de argumento não existe por padrão, você precisa que o seu módulo crie esse argumento, para fazer isso você pode visitar http://drupal-br.org/tutoriais/prover-campos-personalizados-para-o-views e http://drupal.org/handbook/modules/views/api nesses endereços você pode descobrir como fazer isso.

Agora precisamos pegar o argumento 10 da url http://localhost/drupal/produto/10 podemos fazer isso através da função arg(x) do Drupal.

Para forçar a passagem do argumento 10 para view do tipo bloco bastar ir no fieldset Arguments abrir o fieldset Argument Handling Code e inserir o código abaixo na textarea:

$args[0] = arg(1);

return $args;

Esse código pega o parâmetro 10 da url insere no vetor $args e retorna o valor. Fazendo dessa forma a view do tipo bloco consegue obter o parâmetro.

Agora você consegue montar diversos blocos no seu site que trazem os conteúdos referente ao produto.

Você pode usar isso para as mais diversas funcionalidades.

Passo a passo de como atualizar Drupal 6.x para uma versão mais recente

Neste post estarei ensinando de forma amigável como proceder uma atualização de uma maneira correta e segura.

OBSERVAÇÃO

Antes de iniciar qualquer procedimento de atualização não importa qual software for sempre faça uma cópia de segurança(backup) de tudo que será afetado, no nosso caso, faça o backup do seu banco de dados e da pasta do seu website.

Interface para fazer download do Drupal.Para começar a primeira coisa que você deve fazer é acessar a Drupal.org e fazer download da versão mais recente que surgiu, este download sempre fica na página principal.

A versão atual do Drupal encontra-se na 6.12.
Com o download finalizado, por favor acesse o ambiente administrativo do seu site.

Siga para:

Interface de manutenção do seu site.

Por razões de segurança é necessário você deixar o site em modo offline.

Primeiro passo concluído!

Agora você precisa descompactar o arquivo que você tinha feito download. Se você perceber dentro desse arquivo compactado haverá uma pasta principal normalmente intitulada com este nome /Drupal6.x.

 Interface para desativar o seu website.

Dicas:

Se você perceber o sistema operacional (windows ou linux) vai pedir confirmação de substituição de arquivo, por favor, confirme essa ação.

Segundo passo concluído!

A partir de agora seu Drupal está praticamente atualizado,  mas falta uma parte muito importante ainda. Se esta atualização abranger as correções de banco de dados não adianta só substituir os arquivos são necessários outros procedimentos.

Para iniciar estes procedimentos, por favor acesse o seguinte caminho:

 Você irá para tela inicial de atualização do banco de dados do Drupal. Nesta tela você verá algumas informações referente a atualização, para continuar, pressione o botão continue.

 Tela de confirmação para o update do banco de dados.

A próxima tela será a de confirmação, você poderá ver uma série de itens que poderão ser atualizados ou não, por favor não mexa em nenhum dos campos de seleção por que poderá causar mal funcionamento de seus módulos. Somente pressione o botão Update.

Update finalizado com sucesso.

Não próxima tela você perceberá que todos os passos da atualização estão concluídos, normalmente quando a uma real atualização de banco de dados nesta tela aparece um resumo do que foi feito, no caso da tela abaixo isso não ocorre porque foi feito uma atualização de teste do Drupal 6.12 para a mesma versão.

 

Siga para interface de administração do seu projeto e faça os mesmos procedimentos que foram feitos para colocá-lo em modo offline, mas agora deixo-o em modo online.

Para confirmar a atualização acesse a seguinte página:

Se apareceu a versão correta, parabéns! Você acaba de concluir todos os passos necessários para atualização do seu site.

Simples não?

Download do tutorial

Prover campos personalizados para o Views

Hoje vou mostrar como criar um pequeno módulo com um campo que é gravado em uma tabela própria, e em seguida disponibilizar esse campo para filtragem e ordenação no módulo Views.

Antes de começarmos, prcisamos nos ambientar. Para quem nunca criou um módulo para o Drupal, recomendo, antes de ler esse tutorial, ler essa documentação: http://drupal.org/node/508
Um outro requisito para entender plenamente esse tutorial(sua segunda parte, mais especificamente), é um pouco de conhecimento do módulo Views. Para baixar e testar esse módulo, acesse http://drupal.org/project/views Uma documentação inicial está disponível em http://drupal.org/node/47412
Ao final desse artigo, você poderá baixar o módulo de teste que vamos criar.

Sabendo essas coisas vamos lá.

Parte 1 - Criação do módulo

Para esse tutorial vamos assumir alguns padrões:

Antes de mais nada precisamos criar um módulo e, para isso, precisamos criar uma pasta com o nome do nosso módulo.
Assim, acesse a pasta modules da sua instalação do Drupal e crie uma pasta chamada modteste. Dentro dessa pasta crie, a princípio, 3 arquivos: modteste.info modteste.install modteste.module

Cada arquivo desse tem um propósito:

Abaixo temos um exemplo do arquivo modteste.info (clique na imagem para ampliar)

Explicando:

name = modteste: Esse é o nome do módulo

description = Permite criar um tipo de teste: Essa é a descrição do módulo. Ela será mostrada na área de instalação de módulos do Drupal

package = Testes: Esse é o pacote do módulo. Na área de instalação de módulos do Drupal, esse será o nome do separador (fieldset) que conterá o seu módulo

version = VERSION: Aqui é a versão do seu módulo. Se você deixar VERSION ele pegará a versão atual do Drupal. É recomendável que você defina números de versões coerentes com o Drupal que você está utilizando. Assim, se a série do Drupal para a qual o seu módulo foi feito é a 5, utilize algo como 5.x-0.1, onde: 5.x é a série para a qual o seu módulo foi feito e 0.1 é efetivamente a versão do seu módulo. Uma coisa importante sobre as versões é notar que mesmo que você faça um módulo quando o Drupal estava na versão 5.3, utilize 5.x pois você está fazendo o módulo para essa série, e não para a versão específica, uma vez que o que vem depois do ponto é só o número de bugfixes da série.

A seguir o arquivo modteste.install (clique na imagem para ampliar):

Explicando:

Esse arquivo conta, essencialmente com duas funções:

modteste_install(): função que realiza o procedimento de instalação. É executada quando se marca o checkbox e envia o formulário na área de instalação de módulos do Drupal.

modteste_uninstall(): função que realiza o procedimento de desinstalação. É executada quando o módulo é desabilitado na área de instalação de módulos do Drupal, e em seguida marcado o checkbox e enviado o formulário na aba Desinstalar, também na área de instalação de módulos do Drupal.

Note que, no exemplo, só foram feitas a criação e exclusão de tabelas. No entanto pode-se realizar qualquer ação nesse momento. Isso vai depender do que o seu módulo precisa para cada momento. Esse arquivo só é necessário, efetivamente, se você vai realizar alguma configuração no momento da instalação/desinstalação.

Por fim temos o arquivo modteste.module. Vamos ver os pontos chave desse arquivo. Pretendo escrever um outro tutorial explicando, mais detalhadamente, como criar um módulo.

Primeiro a função modteste_uninstall() que montra o formulário em si:

/**
* Implementação do hook_form().
*/

function modteste_form(&amp;$node) {
    $type = node_get_types('type', $node);
    $form['title'] = array(
        '#type' => 'textfield',
        '#title' => check_plain($type->title_label) ,
        '#required' => TRUE,
        '#default_value' => $node->title,
        '#weight' => -5
    );
    $form['meucampo'] = array(
        '#type'=>'radios',
        '#title'=> t('Um campo a mais'),
        '#default_value' => $node->meucampo,
        '#options'=> _modteste_options() );
    $form['body_filter']['body'] = array(
        '#type' => 'textarea',
        '#title' => check_plain($type->body_label) ,
        '#default_value' => $node->body,
        '#rows' => 20,
        '#required' => TRUE);
    $form['body_filter']['filter'] = filter_form($node->format);
    return $form;
}

Essa função implementa 3 campos. Dois desses campos são padrão para qualquer tipo de conteúdo no Drupal(node): o título e o corpo(title e body).

Todo tipo no Drupal possui um título e um copro. Esses dados são, por padrão, gravados na tabela node(somente o title) e node_revisions(title e body).

O terceiro campo do formulário é o nosso campo personalizado. Esse campo será, na verdade, um conjunto de radio buttons onde podemos escolher um valor.

Um princípio importante na hora de trabalhar com o Drupal é não mexer nos módulos e tabelas que ele cria, pois essas mudanças podem se perder quando você atualizar o Drupal na próxima vez. Só mexa no que o Drupal já traz se você estiver corrigindo um bug(correção que você deve enviar para os desenvolvedores do Drupal, para poder melhorá-lo para a sua próxima versão), caso contrário evite.

Tendo isso em mente, criamos uma tabela com o mesmo nome do nosso módulo (modteste). Essa tabela terá dois campos: um será o nosso campo efetivamente, e o segundo o nid(node id) que é o "elo"(foreign key) entre o nosso campo e o node dele.

Se você prestou atenção no arquivo modteste.install verá que ele cria uma segunda tabela, e já a popula. Essa é uma tabela auxiliar para o nosso módulo e será nela que iremos guardar os valores possíveis para o nosso campo.
Como já foi dito esse terceiro campo(meucampo) é um conjunto de radio buttons. Para tanto, a sua definição pede uma opção chamada "#options" que nada mais é que um array contendo o par chave/valor para cada um dos radio buttons.

No nosso caso, esses valores vêm de uma tabela auxiliar chamada modteste_options então fiz uma pequena função para carregar esses valores:

function _modteste_options(){
    $result = db_query(&quot;SELECT * FROM {modteste_options}&quot;);
    while ($option = db_fetch_array($result)) {
        $options[$option['mid']] = $option['name'];
    }
    return $options;
}

Note que essa função começa com o caractere _ .Essa é uma convenção do Drupal que significa que é uma função interna para esse módulo.

Por fim temos as seguintes funções:

function modteste_insert($node) {
    if (user_access('criar um teste')) {
        db_query(&quot;INSERT INTO {modteste} (nid, meucampo) VALUES (%d, %d)&quot;, $node->nid, $node->meucampo);
    }
}
   
function modteste_update($node) {
    if (user_access('alterar seu próprio teste')) {
        db_query(&quot;UPDATE {modteste} SET nid=%d, meucampo=%d WHERE nid=%d&quot;, $node->nid, $node->meucampo, $node->nid);
    }
}

function modteste_delete($node) {
    if (user_access('alterar seu próprio teste')) {
        db_query(&quot;DELETE FROM {modteste} WHERE nid=%d&quot;, $node->nid);
    }
}

Essas três funções fazem, respectivamente, a inserção, alteração e remoção do nosso campo na tabela auxiliar.
Note que não precisamos escrever nenhuma instrução SQL para a tabela node ou node_revisions. Isso é feito internamente pelo Drupal.

Esses são os pontos chave para o nosso módulo. Como dito antes, você pode baixar o módulo no final desse artigo e ver como é feito o restante do módulo.

Parte 2 - Integração com o módulo Views

Agora vamos ver como integrar nosso módulo com o módulo Views.

Nesse artigo não vamos cobrir o módulo Views, apenas a itegração do nosso módulo com ele.

O módulo Views permite criar visualizações personalizadas para determinadas situações. Existem diversas opções para criar Views, recomendo você dar uma olhada com mais calma nesse módulo. Em breve devo lançar um screencast só com o módulo views.

O módulo Views, assim como o Drupal inteiro, trabalha com hooks que nada mais são do que funções que podem ser extendidas.

Assim, o módulo Views implementa algumas funções que podemos extender para habilitar o nosso campo personalizado para construção de views. Vamos ver 2 dessas funções:
hook_views_tables(): Nessa função são definidas tabelas usadas para o relacionamento entr o módulo Views e o seu módulo
hook_views_arguments(): Nessa função são definidos os campos que podem ser usados como argumentos(via URL) para uma view.

Abaixo temos o código dessas duas funções:

function modteste_views_tables() {
    $tables['modteste'] = array(
        'name' => 'modteste',
        'provider' => 'internal',
        'join' => array(
            'left' => array(
                'table' => 'node',
                    'field' => 'nid'
                ),
            'right' => array(
                'field' => 'nid'
            )
        ),
        &quot;filters&quot; => array(
            'meucampo' => array(
                'name' => t('Teste: Meu campo'),
                'list' => 'views_handler_filter_modteste_meu_campo',
                'operator' => 'views_handler_operator_andor',
                'help' => t('Permite você filtrar pelo Meu Campo'),
            ),
        ),
        'sorts' => array(
            'meucampo' => array(
                'name' => t('Teste: Meu Campo'),
                'handler' => 'views_handler_sort_modteste_sort',
                'help' => t('Ordenar pelo meu campo'),
            ),
        ),
    );
    return $tables;
}
function modteste_views_arguments() {
    $arguments = array(
        'modteste_meucampo' => array(
            'name' => t(&quot;Teste: Meu campo&quot;),
            'handler' => &quot;views_handler_arg_modteste_meucampo&quot;,
        ),
    );
    return $arguments;
}

Na função modteste_views_tables() nós definimos qual o nome da tabela que vamos utilizar para o relacionamento e como esse relacionamento se dará(veja o array join nessa função). Também definimos os filtros(filters) e as ordenações(sorts). Para esses dois ultimos, o módulo faz uso de funções callback, que nada mais são funções que são chamadas para executar e retornar um valor(ou conjunto de valores) sem precisarmos escrevê-la no local onde a chamamos.

É nessas funções callback que está o código a ser executado quando filtrarmos ou ordenarmos um campo.
A função modteste_views_arguments() tem um funcionamento semelhante. Ela especifica o nome de um campo(no caso acima modteste_meucampo) e uma função callback que será usada para executar a filtragem. Aparentemente ela é semelhante ao filters da outra função, mas a diferença essêncial é que ela implementa o nosso campo como um argumento para filtragem pela URL. Assim, eu posso chamar minha view, passando por argumento na URL o valor(no caso) do Meu Campo e a view fará a filtragem por nodes que tenham Meu Campo com esse valor.

Por fim, para manter as coisas organizadas, criamos um arquivo chamado views_modteste.inc e colocamos todas as funções de view nesse arquivo(as duas funções que estamos extendendo e suas callback). No arquivo modteste.module criamos então um mecanismo para que o Drupal encontre esse arquivo, criando uma função hook_init() como a abaixo:

function modteste_init() {
    if (module_exists('views')) {
        include_once('./'. drupal_get_path('module', 'modteste') .'/views_modteste.inc');
    }
}

Essa função irá carregar as nossas funções de views, somente se exisiter o módulo views (e esse estiver habilitado).

Assim concluímos esse tutorial.
Espero que ele sirva para você.
Esteja à vontade para comentar.

Abraço

AnexoTamanho
modteste.tar.gz2.69 KB

Relatos individuais sobre a construção de sites

O objetivo desse tópico é que as pessoas façam relatos sobre como construíram seus sites (o que, como, de que jeito, etc.).

Muitos novatos não sabem como usar muitas funções e recursos do drupal e dessa forma sentem uma redobrada dificuldade no contato inicial com o cms. Existindo à disposição relatos individuais da construção de variados sites e diferentes módulos e recursos possam sentir-se mais seguros no caminho das pedras.

Para inaugurar a seção, apresento o site que estou construindo!

Curso de Economia

Pessoal, estou construindo o site do meu antigo curso de graduação (http://www.economia.ufma.br/) e, como todo novato, tenho sentido dificuldade em entender detalhadamente o funcionamento de todos os recursos do drupal. Aqui, disponibilizarei progressivamente os procedimentos que adotei/estou adotando na construção do site. Com isso, espero disponibilizar a outros iniciantes casos reais detalhados do que e como se fez no site. Ademais, pretendo publicizar o conjunto das dificuldades e desafios nessa fase de aprendizado e familiarização com o Drupal.

SITE: Curso de Ciências Econômicas da UFMA
ÁREA: Educação
FOCO: Interatividade entre usuários; Auto-gestão de equipes; Produção descentralizada de conteúdo.
Público-Alvo: Alunos, Professores, Servidores;
Papéis de usuário: Aluno, Professor, Servidor, Coordenador do Curso, Chefe de Departamento, Grupo de Pesquisa X (como não sei fazer de outra forma, cada grupo de pesquisa receberá um papel de usuário), Coordenador do Grupo de Pesquisa X.

Opções de criação de conteúdo:
- Fórum: todos postam;
- Comentários: Todos comentam;
- Mensagens entre usuários: todos enviam;
- Agenda/Eventos: Professores, Servidores criam;
- Enquetes: Professores, Servidores criam;
- Matérias (Stories): Professores, Servidores criam;
- Páginas estáticas: Professores, Servidores criam;
- Páginas de livros: Professores, Servidores criam;
- Projetos: Professores, Servidores criam;

Obs.: Na fase inicial de operação do site os alunos não terão permissão de criação de conteúdo, mas à medida em que o uso do site evoluir pode-se modificar isso.

Alternativas encontradas a problemas específicos

Há questões acerca da utilização do Drupal e da operacionalização do site que tive de raciocinar bastante e vasculhar em muitos locais (Sites Drupal Brasil, Hispanico, durpal.org, Cocinando con drupal, Italia, ...). Eis algumas soluções encontradas:

- Agendador de Tarefas: Minhas tarefas agendadas (Atualização das notícias rss, backup do banco de dados) só estavam sendo executadas manualmente porque o site não estava incluído no corn.php do servidor. Para evitar os trâmites burocráticos preferi instalar o módulo "poormanscron" que executa o agendador do site. Agora tudo está sendo atualizado devidamente.

Em breve postarei outras soluções encontradas para o meu site.

Caminho das pedras

Tenho descoberto muitas coisas do drupal mexendo e remexendo muitas vezes dentro do site e dentro dos sites do drupal mundo afora. Por conta disso, gostaria de compartilhar as descobertas que estou fazendo sobre detalhes do uso e operação do drupal, espero que seja útil a outros como tem sido para mim.

Restringir o local de menu onde os usuários podem postar consteúdo

Como estou construindo um site onde diferentes papéis de usuário postam conteúdo precisava restringir os locais onde poderiam inserí-los para não bagunçar o site.
Descobri que em "Início » Administrar » Construção do site >> Configurações" é possível se determinar isso. Para tanto, deve-se definir qual menu os usuários terão acesso para alocar os conteúdos.
Organizei os links para que todos os locais onde os usuários irão postar conteúdo estejam no mesmo menu, no meu caso o Menu Atividades. Quando o usuário entra em "Criar Conteúdo" a única opção disponível de menu é o que eu defini.
Ainda estou testando essa descoberta pois preciso saber como vou, como administrador, postar conteúdo em outros locais do site. Também vou tentar descobrir como fazer isso para cada papel de usuário.

Espaços/ambientes de criação de conteúdo no site

Como num curso universitário há constante produção de textos e documentos, a idéia é permitir que os professores possam criam diferentes formas de textos em diferentes seções do site, cada qual com um objetivo diferente, assim:

==>Utilizando o tipo de conteúdo Página de Livro:

- Seção Textos para Discussão
> Um autor: Um professor cria e edita individualmente um texto;
> Vários Autores: Professores editam textos de outro professor caso este permita; podem também páginas dentro de um texto;
>> Em ambos os casos, podem enviar arquivos diversos para dentro dos textos (pdf, doc, xls, jpg...).
>>> Há categorias específicas para a seção.

- Seção Artigos:
> Todas as opções válidas para os Textos para discussão, mas com categorias específicas para a seção.

- Seção Grupos de Pesquisa:
> Todas as opções válidas para os Textos para discussão, mas com categorias específicas para a seção.
>>Apenas membros de um grupo de pesquisa podem criar e editar conteúdo.
>>Qualquer professor pode criar um grupo de pesquisa e selecionar os usuários que farão parte.

- Seção Disciplinas do Curso:
> Todas as opções válidas para os Textos para discussão, mas com categorias específicas para a seção.
>> Professores podem disponibilizar materiais didáticos complementares para uma disciplina;
>> Publicar avisos aos alunos;
>> Publicar as notas, etc.

- Arquivos e Imagens:
> Quando enviados pelo IMCE/TinyMCE:
>> Só podem ser acessados diretamente ou editados por quem fez o upload;
> Quando enviados pelo FileManager:
>> Podem ser acessados diretamente por todos;
> Quando enviadas fotos pelo Image:
>> Idem. As imagens são também disponibilizadas para as galerias de imagens e imagens randomicas.

- Seção Projetos:
> Professores e Servidores criam e selecionam os usuários que farão parte.

- Agenda:
> Há a agenda geral do curso onde professores e servidores criam eventos, etc.;
> Grupos de pesquisa: Cada grupo de pesquisa tem sua agenda própria, independente da agenda geral do curso.

Módulos Instalados

VERSÃO DRUPAL: 5-7
MÓDULOS INSTALADOS:
==> account_reminder: relembrar aos usuários os dados da conta de acesso ao site;
-akismet: proteção conta span;
-backup_migrate: backup do banco de dados. Só funciona se você tiver acesso às páginas fora do raiz do site, como eu não tenho essa permissão não consigo utilizar o backup automatico, só o manual, fazendo o download do arquivo .sql;
-biblio: lista de bibliografias dos professores do curso;
-blockanonymouslinks: proteção contra span;
-bookmarks2: lista de sites recomendados pelos professores do curso;
-calendar: módulo para calendário. Mas não estou utilizando porque o event também tem um calendário integrado;
-captcha: para impedir robots nos formulários e nos cadastros;
-cck: ajuda a criar conteúdo... não sei detalhes... só sei que ajuda, hehehe;
- dba: acesso ao banco de dados diretamente do site. Permite fazer backup programado do banco de dados... e está funcionando;
-devel: sei que ajuda no desenvolvimento do site, mas ainda não sei como utilizá-lo;
-docs: gerenciador de documentos. Ainda não sei bem utilizá-lo porque tenho que associá-lo a um tipo de conteúdo...;
-drupal_ftp: (até agora não sei usá-lo...)
-ecard: cria um ecard da agenda e de outros módulos
-event: para criar eventos;
event_manager: complementa o event;
filemanager: configura como serão enviados arquivos para o site. também gerencia esse envio;
-image: envio de imagens para o site;
-imce: envio de imagens para o site. Pelo que andei lendo esse é o melhor que tem. Por enquanto vou manter os dois (junto com o image), depois vejo se posso desabilitar o outro;
-mimemail (não está funcionando porque ainda estou sem as configurações do servidor, que não é o mesmo onde está o site)
-multforms: ainda não tive uma oportunidade de usá-lo, mas parece ser muito útil para a criação de formulários mais complexos;
-nodefamily: tô voando;
-nodeprofile: idem
-pageroute: na prática, ainda não sei o que é, nem para que serve;
-pin: recurso legal para só permitir inscrições no site somente a pessoas que tenham um número de autorização. No momento está desativado, mas quando o site estiver em operação acho que ficará habilitado, de forma que os calouros do curso recebam um número que permita o cadastro no site;
-poormanscron: como não tenho o site inscrito no cron.php do servidor tive que instalar esse módulo para fazer funcionar os agendamentos existentes (rss, backup, etc.);
-privatemsg: Excelente módulo para troca de mensagens entre os usuários. A única limitação é não enviar mensagens para grupos de usuários (ex.: alunos de uma disciplina, professores de um grupo de pesquisa, somente para professores, somente para alunos, etc.);
-project: No curso há diversos projetos em execução (projetos de pesquisa, projeto de mestrado, projeto de PET, etc.) e acredito que esse módulo será útil para ajudar nesse gerenciamento;
-project_issue: complementar ao prject;
-project_permissions: complementar ao prject;
-tinymce: para trabalhar com imagens nos conteúdos. Segundo li é o melhor;
-token: não sei o que é, mas ele é requerido por vários outros...;
-urlist: lista de sites do professores. Estou decidindo se mantenho esse ou o bookmarks2;
-views: Esse é um dos módulos mais importantes do drupal, mas estou viajando na maionese total, mas um dia eu aprendo, hehehe.

Módulos Traduzidos

Para cosntruir o site estou utilizando muitos módulos e quase nenhum está em português, assim, passei a traduzí-los. Não os disponilizei no site porque ainda estou treinando, quando me sentir mais seguro posto todos:

São eles:
- Biblio;
- Blockanonymouslinks;
- CCK;
- OG (Organic Groups);
- Poormanscron;
- PrivateMsg;
- Project;
- Project_Issues;
- Scheduler;
- Site map;
- Taxonomy User Access;
- Technorati

Se alguém tiver interesse em algum deles é só me contatar que envio para o email.

Problemas e soluções

Nesse novo tópico, disponibilizarei alguns problemas e as soluções que encontrei...ou não.

Menu Links Favoritos

Uma maneira muito prática de constuir-se um menu lateral para exibir links favoritos e/ou recomendados de um site é a criação de um Bloco. O procedimento é muito simples (extraído a partir de http://drupal-br.org/geral/drupal-brasil/lista-de-sites-sugeridos):

1) acessar Início » Administrar » Construção do site » NOVO BLOCO
2) Descrição do Bloco: Um título para o bloco
3) Corpo do Bloco: neste campo deve-se adicionar tag's html para chamar o link e a imagem do site desejado:
No link abaixo há três exemplos de como proceder:

Clique aqui!

O resultado desse procedimento no site que estou construindo ficou assim:
http://www.economia.ufma.br, seção Sites relacionados, à direita.

Organic Grupos (OG)

Problema: Estou enfrentando uma série de contratempos com a utilização do módulo Organic Groups (http://drupal.org/project/og), pois ele interferiu em vários módulos pré-instalados, fazendo com que apresentassem problemas ou que deixassem de funcionar, caso do TINYMCE que estava ativo para todos os usuário mas simplesmente não aparecia na caixa de criar conteúdo.

Solução: Para que o Tinymce voltasse a funcionar, excluí o perfil de usuários dentro do próprio Tinymce; depois criei outro perfil com as mesmas características. Resolvido. Solução simples porém de trabalhosa descoberta, hehe.

Questões não resolvidas no site

Para um novato, a intensidade e quantidade de desafios são grandes na familiariazão com um cms tão poderoso como o drupal. Num ambiente assim caracterizado e com inúmeras possibilidades de personalização, e na ausência de uma documentação em português ou espanhol, especificamente no que se refere às VIEW's e às permissões de acesso às diferentes Formas/Tipos de conteúdo (stories/matérias, páginas estáticas e Páginas de Livros), seja pelas permissões normais, como pelas taxonomias/categorias.

Sobre estas duas questões assentam 70% de todos os desafios que tenho para aprender a utilizar o drupal e o mesmo se repete com todos os usuários iniciantes que abrem tópicos nos foruns do site.

Atualmente estou engajado na tentativa de entender como funcionam as view's para, a partir daí, conseguir gerar outras formas de visualização da informação do site. Ontem consegui descobrir um pedaço da roda, cheguei à conclusão que uma view é apenas uma consulta feita ao banco de dados, um forma de filtrar a informação e exibí-la num formato específico desejado pelo criador do site.

Já criei algumas view's para testar e me complico com a quantidade de opções de personalização das mesmas, bem como de saber como utilizá-las depois de prontas (e estou batendo muita cabeça sobre isso).

Pois bem, vamos às questões:

- Como ativar RSS para todo o site, por categorias (RSS dos avisos, das agendas, das páginas, das postagens, etc.)?
- Como fazer com que a foto do usuário só apareça na lista de usuários logados, no perfil, nas postagens dos foruns e nos comentários (e não nas páginas, livros e matérias [stories])?
- Qual módulo permite enviar mensagens para grupos de usuários de uma só vez?
- Tenho o Sistema de Editoração de Revistas Eletrônicas (SEER/OJS) do IBICT instalado, como aproveitar o cadastro dos usuários do site? É através do OpenId, widget do blogger, ou o que?
- Como programar o dia/horário que uma página/nodo irá ao ar, assim como pode ser feito no wordpress?
- Como fazer com que o criador de um Grupo de Pesquisa receba automaticamente a atribuição do papel de Coordenador do Grupo?
- Como encerrar o login após o navegador ser fechado ou quando o computador ficar inativo por X minutos?
- Como trocar algumas Mensagens de Informação do Drupal por Mensagens de Alerta ou de Exclamação?

Tipos alternativos de criação de conteúdo

Ou "Quem não tem cão caça com gato"

Na minha atual limitação em trabalhar com o view's e com as permissões de acesso por taxonomias/categorias estou testando uma forma muito peculiar de tipos de conteúdo, criando um tipo para cada grupo de papéis de usuários, como se vê abaixo:

<>Permissões para criar conteúdo para cada local de publicação de conteúdo:

- Textos para Discussão:
> Criei um novo tipo de conteúdo para cada local de publicação de conteúdo;
>> "Texto individual": Página de livro que os professores só podem alocar no respectivo item de menu;
>> "Texto colaborativo": Página de livro que só pode ser alocada pelos autores no respectivo item de menu;

- Artigos:
> "Artigo individual": Página de livro onde o professor só pode alocar neste item de menu;
> "Artigo colaborativo": Pagina de livro onde os professores só podem alocar neste local;

- Grupos de Pesquisa:
> "Página X" (Com o nome do grupo) -> Os membros do grupo criam páginas estáticas vinculadas a este item de menu;
> "Texto X" (...) Página de livro que os membros do grupo publicam apenas neste item de menu;

- Disciplinas do Curso:
> "Cadastrar Disciplina": Página estática onde apenas o Coordenador do Curso e o Servidor (funcionário) têm acesso. A página criada não aparece em nenhum item de menu, mas em link na página "Grade Curricular", editada manualmente. Possui campos de categorias específicas (Semestre da disciplina, papel da disciplina [Núcleo do Curso, Complementar, Optativa] e Departamento a qual está vinculada [Deptos de Economia, Computação, Direito, Matemática, Sociologia, Contabilidade, Letras]);

- Agenda (event):
> Criei uma view para cada papel de usuário, mas ainda não sei como utilizá-las no site;

- Project:
> Defini que os professores podem criar um projeto. Defini também que podem selecionar quem fará parte do mesmo;

ScreenCast - Estudo de caso

Olá Pessoal meu nome é Mayk Brito.
To começando uma série de screencasts sobre o Drupal

Como sou novo no ramo de screencast eu gostaria de
receber críticas de vcs q são feras no assunto.

lá no http://mayk.brito.net.br/screencasts/all
estão os vídeos.. comentem se acharem interessante,
se acharem ruim, se não acharem nada.. =D

Esta primeira série não cobre tópicos básicos, mas
se vcs quiserem mandem as idéias p/ a nossa próxima
série de vídeos.

Acredito que será muito útil!!
Abraço!

Screencast - Mini galeria de imagens

Um aluno do último Treinamento Mão na Massa Drupal me procurou perguntando como fazer uma mini galeria anexada a uma página. Como não é uma coisa muito trivial para quem está começando com o Drupal mexer com o módulo Views e como essa é uma pergunta que pode ajudar outras pessoas resolvi fazer um Screencast para tentar ajudar.

Abaixo o vídeo

E quem quiser baixar o vídeo para ter consigo basta clicar aqui. Está em formato MP4.

Screencast - sobre Views

Olá pessoal,

Como prometi no canal #drupal-br semana passada, gravei um screencast sobre views. Na verdade há mais dois semi-prontos que devem ir ao ar até o meio da semana.

Quem quiser assistir online o vídeo está aí abaixo:

Quem quiser fazer o download basta clicar aqui(o vídeo está em formato MP4)

Como de costume peço desculpas pela gagueira e pelos eventuais erros de pronúncia do nome do nosso amado CMS.

Dúvidas, erros encontrados, sugestões e qualquer outra coisa que você acha pertinente, sobre esse screencast, é só falar aí nos comentários.

Abraços.

Screencast: Instalando o Drupal 7 em Português

Olá,

Estou enviando mais um tutorial em forma de screencast. Esse screencast é uma instalação guiada do Drupal 7 em Português do Brasil.

Quem quiser fazer o download do vídeo pode clicar aqui.

Screencast: criando um tema para o Drupal 6

Já faz um tempo que eu venho querendo criar um screencast sobre criação de temas. Finalmente eu tive um tempo e pude gravar.

Como de costume peço desculpa pela gagueira e pelos excessos de "éééé"s.

Esse screencast é, em sua essência, o que mostrei nesse tutorial.

Duvidas, sugestões e comentários é só falar.

Caso você queira baixar o vídeo, clique aqui.

Tutoriais e screencasts em inglês

Para ter acesso a uma lista de tutoriais em inglês acesse o tópico Lista de sites com tutoriais, screencasts, etc...

Tutorial - Como fazer um sistema de destaque de conteúdo com bloco slideshow no Drupal 6

Antes de acabar o ano, um tutorial de como promover conteúdo a destaque e exibir um slideshow com esses destaques, assunto de dúvida recente aqui no Drupal Brasil.

http://www.xulispa.com.br/blog/como-fazer-um-sistema-de-destaque-de-cont...

Críticas e comentários são muito bem vindos.

Tutorial - Criando e publicando um site rapidamente em Drupal 6

Neste tutorial, colocarei passos rapidos para a construção de um site e sua publicação online, no final o site ficará em inglês, mas traduzi-lo para portugues é facil e existem vários tutoriais na net (tem um video que eu coloquei no youtube explicando como fazer isso) e depois eu adiciono no final desse tutorial se for o caso. O objetivo é construir um site rapidamente, deixando o ambiente de trabalho online e não local.

O nível do tutorial é intermediario, mas acho q iniciantes conseguirão segui-lo bem.

Para esse tutorial, adote os seguintes termos
---------------------------------------------
username = o nome de usuário que você criar
password = a senha que você inventar
databasename = o nome da base de dados do seu site
meusite = o nome do site que você criar
seusite = o domínio que você contratou

Tutorial
----------------------------------------------
a. Instalar programas

* XAMPP 1.6.8 (a nova versão dá problema com o Drupal 6.1X, baixe a antiga em http://sourceforge.net/projects/xampp/files/
* FileZilla 3.2.X.Y http://filezilla-project.org/download.php?type=client
* Crie uma conta em um host qualquer (recomendo http://www.hostsh.com.br que dá suporte ao Drupal)

b. Preparar instalação

* baixar drupal 6.14 http://drupal.org
* descompactar na pasta C:/xampp/htdocs e renomear para meusite
* copiar, colar na mesma pasta e renomear o arquivo em meusite/sites/default - default.settings.php para settings.php
* iniciar Apache e MySql no Xampp
* no navegador ir em http://localhost/phpmyadmin
* em criar base de dados, digitar databasenamee dar OK

c. Instalar o site

* no navegador ir em http://localhost/meusite
* na instalação em base de dados, escolha mysqli, nome databasename, usuario root e deixar senha em branco
* nome do site meusite, usuario #1 username senha password
* ao terminar de instalar e se vc ver uma pagina dizendo WELCOME TO YOUR NEW DRUPAL WEBSITE, vc terminou a instalação com exito, pode dar um erro de envio de email, mas isso não atrapalha

d. Preparar a BASE DE DADOS para Exportação

* no navegador digite http://localhost/phpmyadmin
* clique em databasename no canto esquerdo
* clique no botao exportar
* no final da pagina, marque compactar com Zip
* salve o arquivo no desktop databasename.sql

e. Importar Base de Dados online

* Entar no endereço cpanel do host que você contratou
* procurar o ícone Base de Dados MySql
* clique em Criar a base de dados e digite databasename
* clicar no icone PHPMYADMIN
* na nova janela, clique na databasename no canto esquerdo (o nome pode variar dependendo do host, alguns adicionam username_databasename)
* clique no botão IMPORTAR
* envie o arquivo no desktop chamado databasename.sql e aguarde a criação das tabelas

f. Preparar os arquivos para envio

* abrir, em um editor o arquivo settings.php na pasta xampp/htdocs/meusite/sites/default
* na linha 92 faça alterações de acordo com como ficara no host, altere
$db_url = 'mysqli://username@localhost/databasename';
* por
$db_url = 'mysql://username:password@localhost/databasename';
* onde username e password são os dados da conta que você contratou e databasename o nome da base de dados que está no host
* salve e feche o arquivo

g. Enviando os arquivos

* Abra o programa FileZilla
* host: seusite usuario: username senha: password
* clicar em conectar
* do lado direito clicar 2x em public_html
* do lado esquerdo navegar ate a pasta xampp/htdocs/meusite, clique duas vezes para abrir a pasta, selecione todo o conteudo e com o direito do mouse, clicar em ENVIAR

quando terminar, visite o endereço do seu site para ver ele online ou visite o endereço do host/~suaconta para ver se tudo esta ok

Quaisquer dúvidas é só postar ai abaixo

Alan

Tutorial - Criando um site com caixas de notícias

Introdução

Esse tutorial foi escrito para suprir a necessidade de várias pessoas na comunidade Drupal Brasil. São pré-requisitos para realizar esse tutorial um pouco de conhecimento da língua inglesa e alguma familiaridade com o Drupal.

Objetivo

O objetivo desse tutorial é mostrar como construir um site com caixas (boxes) onde serão carregadas informações que desejamos.

Pare esse tutorial, iremos carregar em uma página, algumas notícias que vamos definir como destaque e ao lado delas itens de um determinado tipo, que vamos chamar de artigo. Esse é um exemplo simplificado, podendo ser melhorado e expandido.

Versões

Esse tutorial foi feito com base no Drupal e módulos nas versões abaixo:

Ele pode funcionar com versões mais novas desses módulos, mas é provável que com versões anteriores não funcione.

Antes de começar o tutorial você já deve ter instalado o Drupal. Caso você não saiba como instalar o Drupal veja o screencast de instalação do Drupal também feito por mim.

Baixando os módulos

Para começarmos temos que baixar os módulos que utilizaremos nas suas respectivas páginas no Drupal.org

Após baixar esses módulos, vá até a pasta sites/all da sua instalação do Drupal e, alí, crie uma pasta chamada modules. Dentro da pasta modules descompacte o conteúdo de cada um dos 3 módulos que baixamos. Isso fará com que você possa instalar esses módulos no seu site.

Habilitando os módulos

Tendo feito isso e, assumindo que o seu site esteja rodando em http://localhost e com as Urls limpas (clean urls) ativadas, vá até http://localhost/admin/build/modules.

Nessa página são mostrados todos os módulos disponíveis para instalação. Você verá que, apesar de termos baixado 3 pacotes, existem vários módulos novos para instalação. Isso se dá porque cada pacote que baixamos pode ter vários módulos.

Você deve então habilitar os módulos que usaremos que são:

Para habilitar basta marcar a caixa de texto na em frente ao nome de cada módulo, e depois clicar no botão Salvar configurações (Save configurations) no final da página.

Entendendo os módulos

Uma vez habilitados os módulos, já temos os módulos necessários para a construção do nosso site personalizado, mas a simples instalação não faz o que precisamos. Nesse momento vamos ver o que cada um desses módulos faz para entendermos porque os habilitamos.

Panels

Ele capacita o site a ter uma visualização em painéis (panels, em inglês). Ele será a peça fundamental para a construção do layout da página.

Panels Page

Complemento para o Panels. Ele possibilita criação de páginas com painéis, que é o que queremos.

Views

Esse é um dos módulos mais utilizados com o Drupal pois possibilita uma grande flexibilidade na extração de dados. Ele será usado para montar as listagens que usaremos no nosso site.

Node Queue

Esse módulo não é essencial para uma construção de site no formato que queremos, mas o utilizaremos por ele trazer uma abordagem mais simples para a promoção de páginas a destaques.

Definindo um destaque

Uma vez que vamos construir uma página que carregará os nossos destaques, precisamos definir o que seria esse destaque. Isso será feito usando-se o módulo Node Queue. Esse módulo permite que adicionemos determinados conteúdos a Queues (filas). Em conjunto com o módulo Views e o Panels ele vai realizar o efeito que queremos. Assim, o primeiro passo é criar um queue.

Criando um queue

Para criar um queue acesse http://localhost/admin/content/nodequeue ou vá navegando pelo menu em Administrar > Organizar conteúdo > Node queue .

Aqui podemos adicionar um novo queue ao clicarmos em Add node queue.

Ao acessar a página de criação de queues você deverá preencher alguns dados:

Por fim, envie o formulário, e teremos o nosso queue pronto.
Somente essa configuração não é suficiente para termos o efeito desejado, mas é o primeiro passo.

Agora vamos adicionar o nosso tipo Artigo que será carregado ao lado dos destaques, conforme especificamos no inicio do tutorial.

Criando um novo tipo

Àpartir do Drupal 5 você pode criar quantos tipos achar necessário, sem precisar programar nenhuma linha de código. Isso foi criado para facilitar a vida de pessoas que ainda não têm conhecimento suficiente de programação mas precisam de algo fácil.

Para o nosso tutorial, vamos criar um tipo Artigo que será, automaticamente, listado ao lado dos destaques na nossa página de destaques.

Para criar um novo tipo acesse http://localhost/admin/content/types/add ou Administrar > Organizar conteúdo > Tipos de conteúdo > Novo tipo de conteúdo.

Aqui serão solicitados alguns campos, mas vou detalhar somente os mais importantes:

Ao final, salve esse formulário.

Agora teremos a opção de adicionar o nosso novo tipo no menu Criar conteúdo. Crie uns dois ou três artigos (esse novo tipo que adicionamos) e umas duas ou três notícias (tipo story) pois usaremos esses conteúdos mais na frente.

Ativando o destaque

Como já expliquei no inicio, o módulo Views é o responsável por carregar informações em formatos que desejamos, sem que precisemos escrever instruções SQL ou código PHP. Esse módulo será usado tanto para carregar os destaques quanto para carregar os nossos artigos.

Na verdade, ao criar um queue com o módulo Node Queue ele já realizou parte do trabalho. Esse módulo já criou a view que carregará as informações de destaque, e assim só precisamos ativá-la. Para isso acesse http://localhost/admin/build/views ou Administrar > Construção do site > Views , e localize a linha onde está a view chamada nodequeue_1 e clique no link Enable dessa view.
A

ssim teremos a view dos destaques devidamente habilitada e agora poderemos criar o nosso painel, onde, efetivamente, estará a visualização que desejamos.

Criando um painel

Para criar um painel, acesse http://localhost/admin/panels/panel-page/add ou Administrar > Panels > Panel pages > Add.
A criação de um painel se dará em forma de Wizard (telas passo-a-passo). De forma a facilitar o entendimento vamos ver cada uma dessas telas, mas nos atendo ao que for necessário para o nosso tutorial. Você verá que existem várias configurações que não exploraremos mas que fazem com que o poder de construção de paineis seja maior.

Então vamos à primeira tela.

Aqui podemos escolher a forma como o nosso painel será exibido. Como definimos no começo, o nosso painel será composto de 2 colunas, cada uma contendo o bloco que desejamos (destaques e artigos). Assim, escolhemos a opção Two column.

Na segunda tela, temos algumas informações, das quais prencheremos:

Por enquanto só iremos preencher esses dados, e vamos clicar no botão Next para irmos para a próxima parte do nosso painel.

Nessa próxima tela, Advanced, não vamos preencher nada, apenas clicar no botão Next.

Novamente iremos passar pela tela Context sem preencher nada, pois no nosso tutorial ela não será usada. Clique no botão Next.

Chegamos, finalmente, à tela Conteúdo. Aqui é onde adicionamos o que desejamos que seja carregado no nosso painel. É onde a ação acontece.
Você pode ver que há dois espaços, um chamado Left side e Right side, que nada mais são que os locais onde as informações serão carregadas. Esses dois espaços são exatamente as duas colunas que escolhemos ao iniciar a criação do nosso painel(se lembra de escolher Two Column no início?). Se houvessemos escolhido 3 colunas, teríamos aqui 3 espaços.

Agora clique ao ícone de + no Left side e você verá que se abrirá uma tela para escolhermos qual bloco iremos carregar nessa nossa região.

Se você reparar na seção Contributed modules dessa pequena janela, verá que há um bloco alí que nos é familiar, o bloco Destaques que criamos ao adicionar o nosso node queue.

Clique no ícone desse bloco para adicioná-lo.
Você irá para uma nova janela, onde não preencheremos nada, e só clicaremos no botão Add pane no final dessa janelinha.

Por equanto não temos o que carregar na outra área, por isso vamos deixá-la sem nada, e clicar no botão Save para criar nosso bloco.

Agora se acessarmos http://localhost/destaques veremos como ficou nosso painel.

Lembre-se que só será carregado nesse painel notícias (story) que você clicou no link Adicionar aos destaques. Se você não criou nenhuma notícia ou se não adicionou nenhuma aos destaques, a página ficará vazia.

Bacana, temos o nosso painel, mas não é ainda o que prometemos para esse tutorial. Afinal, ele não está carregando os nossos artigos (você se lembra que criamos um tipo artigo não é?).
Pois bem, então vamos adicionar esse recurso ao nosso painel.

Criando uma view de artigos

Como já disse, o módulo Views permite uma grande flexibilidade de carregamento de dados do nosso site. Nós já vimos isso em ação pois o bloco de destaque que está sendo carregado no nosso painel é uma view. O que precisamos é criar nossa própria view, com os dados que queremos.

Vamos lá então!

Acesse http://localhost/admin/build/views ou Administrar > Construção do site > Views e clique na opção Add para adicionar uma nova view.
Uma view pode ser algo muito complexo, por isso não vamos abordar todas as opções disponíveis, apenas aquelas necessárias para o nosso tutorial. Vamos aos campos, separados por cada uma de suas seções:

Basic Information

Nessa seção preenchemos as informações básicas da nossa view.

Bloco

Aqui vamos preencher as informações de bloco. Como vamos usar nossa view num painel só vamos adicionar um bloco e não uma página.

Filtros

Aqui podemos filtrar o que será carregado no nosso bloco. Como só queremos objetos do tipo Artigo será aqui que iremos definir isso.

Sort Criteria

Aqui é a nossa última opção, que nada mais é que a forma como os dados serão ordenados para exibição. Como queremos ver os últimos artigos no topo da lista precisamos configurar isso. Para tanto proceda assim:

Pronto, agora é só salvar a nossa view e ela já estará disponível para utilizarmos no nosso painel.

Adicionando os artigos ao painel

Agora vamos à parte final do nosso painel. Acesse http://localhost/admin/panels/panel-page ou Administrar > Panels > Panel pages e veja que o nosso painel foi listado.

Clique no link Editar e em seguida na aba Conteúdo.

Essa tela nós já vimos. Agora clique no ícone + da região Right side e na tela que se abrirá escolha, na seção Contributed modules, o nosso recém criado bloco de artigos. Da mesma forma, na tela seguinte ao se clicar no ícone do nosso bloco, não preencha nada, e apenas clique no botão Add pane.

Por fim, clique no botão Save no final da página e em seguida acesse http://localhost/destaques.
Pronto, temos a nossa página personalizada, com informações relevantes.

Considerações finais

Vimos como criar uma página diferente para o nosso site, usando módulos já existentes e sem programar nenhuma linha de código.

Obviamente que algumas pessoas vão querer personalizar ainda mais essas informações.
Os módulos utilizados nesse tutorial permitem um enorme grau de personalização mas que exigem um pouco mais de conhecimento tanto de PHP e HTML/CSS quanto de Drupal.

Também existem outras formas de se obter esse mesmo efeito, sem esses módulos. Mas nem sempre são tão simples ou tão rápidas.

Você encontará, em inglês, toda documentação desses módulos em:

Se esse tutorial foi útil para você, e se você pode contribuir com alguma informação/experiência, sinta-se à vontade para comentar. Se você encontrar erros ou inconsistências, os comentários também estão abertos para sua contribuição.

Tutorial - Customizando a caixa de busca

A caixa de busca é um item do drupal que pode ser habilitado no arquivo 'page.tpl.php' que se encontra no na pasta do tema usado.

A entrada no tema é da forma

<div id="algum id" >
<?php if($search_box): ?>
<?php print $search_box; ?>
<?php endif; ?>
</div>

onde você poderá colocar aonde desejar no arquivo 'page.tpl.php', e ele terá por padrão o layout

caixa de busca

Para mudar esse layout, podemos fazer da seguinte forma:

- copie o arquivo 'search-block-form.tpl.php' que existe na pasta do modulo da caixa de busca que se encontra em 'modules/search' para a pasta do seu tema.
Renomeie esse arquivo para 'search-theme-form.tpl.php'.

- na pasta do seu tema, verifique se existe o arquivo 'template.php', se não existir, crie um. Adicione a esse arquivo o seguinte código:

<?php

// Função para customizar a caixa de busca.
function <nome do seu tema>_preprocess_search_theme_form( &$vars , $hook ) {

  // Para mudar o BLOCO da caixa de busca, você deve renomear essa função para
  // '<nome do seu tema>_preprocess_search_block_form' e usar 'search_block_form'
  // em vez de 'search_theme_form' nas customizações abaixo.

  // Modifica os elementos do form da caixa de busca.
  $vars['form']['search_theme_form']['#title'] = t('');
 
  // Define o valor do texto padrão da caixa de busca.
  $vars['form']['search_theme_form']['#value'] = t('Pesquisar ...');
 
  // Adiciona uma classe customizada á caixa de busca.
  $vars['form']['search_theme_form']['#attributes'] = array('class' => 'NormalTextBox txtSearch','onfocus' => "if (this.value == 'Pesquisar ...') {this.value = '';}", 'onblur' => "if (this.value == '') { this.value = 'Pesquisar ...'; } ");
 
  // Muda o texto do botão 'submit'.
  //$vars['form']['submit']['#value'] = t('Go');

  // Refaz a versão renderizada ( apenas o form de texto, o resto se mantêm inalterado).
  unset($vars['form']['search_theme_form']['#printed']);
  $vars['search']['search_theme_form'] = drupal_render($vars['form']['search_theme_form']);

  $vars['form']['submit']['#type'] = 'image_button';
  $vars['form']['submit']['#src'] = path_to_theme() . '/images/search.jpg';
   
  // Refaz a versão renderizada ( apenas o botão 'submit', o resto se mantêm inalterado).
  unset($vars['form']['submit']['#printed']);
  $vars['search']['submit'] = drupal_render($vars['form']['submit']);

  // Coleta todas os elementos forms para tornar mais fácil a impressão do form como um todo.
  $vars['search_form'] = implode($vars['search']);

}
?>

O código acima basicamente remove o texto "Buscar neste Site", adiciona uma classe customizada para a caixa de texto, muda o botão "Buscar" para uma imagem 'search.jpg' a sua escolha, e adiciona um textinho básico ( nesse caso, vai aparecer "Pesquisar..." ) na caixa de texto que automaticamente some ao se clicar em cima na hora de digitar pra pesquisa.

- no site, vá para 'admin/settings/performance' e limpe o cache do seu drupal e verifique a sua caixa de busca customizada aparece.

O resultado final será o seguinte:

Com a caixa aparecendo e funcionando normalmente, você poderá edita-la no css do seu tema como bem quiser.

Então é isso pessoal, até a próxima se Deus quiser. :D

Tutorial - Mudando a visualização de um node com o Panels

Às vezes você precisa exibir um determinado tipo de conteúdo com uma aparência um pouco mais trabalhada, para valorizar o seu conteúdo. Com o Drupal isso pode ser feito de várias formas, e nesse tutorial vamos ver uma, usando o módulo Panels.

O que vamos fazer

Esse tutoria irá mostar como exibir partes de um determinado tipo de conteúdo em duas colunas como no exemplo mostrado abaixo.

foto do exemplo

Nesse exemplo estamos mostrando, em duas colunas, o conteúdo que seria exibido um embaixo do outro. É esse exemplo que vamos reproduzir.

Pré requisitos

Antes de começar você deve ter o Drupal instalado, bem como o Módulo Panels e suas dependências. Não vou cobrir aqui a instalação apenas o uso dos mesmos.
Para esse tutorial também habilitei o módulo blog e criei posts para blog, mas isso não é obrigatório

Mãos à obra

Após ter instalado tudo, o primeiro precisamos criar algum conteúdo.

Depois de criar conteúdo, acesse a página de gestão de Painéis em Administrar > Construção do site > Páginas e procure pelo painel node_view e clique em Editar para esse painel.

linha a habilitar

Você será direcionado à tela de edição desse painel. Como ele é um painel zerado, você precisa adicionar uma variante para ele. Isso irá, efetivamente, criar o visual que desejamos.

Para isso, clique no link Add a new variant

como adicionar uma variante

Ao adicionar uma variante lhe será solicitado que dê um título administrativo (para que você a localize quando for necessário) a ela, que escolha um tipo de variante (que no caso será Panel) e quais recursos opcionais você deseja. No caso, marque os dois itens padrão (Selection Rules e Contexts).

o que escolher para a variante

O próximo passo é escolher as regras de seleção (Selection Rules) para esse painel. No caso, eu escolhi uma regra por tipo, você pode escolher a que melhor lhe interessar.

escolhendo a regra de seleção

Caso você tenha feito como eu, ele irá te solicitar a quais os tipos de conteúdo você deseja atrelar esse painel. Eu escolhi Post de blog e Artigo, escolha qual lhe for mais conveniente.

escolhendo tipos

O passo seguinte você poderá adicionar os contextos. Como editamos um painel com contexto já pré-configurado (o contexto é o node) podemos só continuar para a tela seguinte.

escolhendo contexto

Em seguida, escolhemos o layout. Para o meu exemplo escolhi um layout de 2 colunas. Você pode escolher qual achar melhor.

escolha de layout

Estamos quase no fim! Agora vamos escolher o que queremos exibir em cada uma das regiões do nosso painel.

conteúdo para as regiões

No meu exemplo, escolhi para o pane da esquerda o conteúdo do node e para o da direita os comentários do node. Mais uma vez, fica a seu critério escolher o que achar melhor.

escolhendo o conteúdo

Após isso você precisará clicar em Create variant e por fim no botao Salvar que fica logo mais abaixo.

Pronto, com isso você terá o resultado abaixo para os tipos de conteúdo que você escolheu mudar a visualização.

foto do exemplo

Comentários e sugestões são bem vindas. Abaixo você pode baixar essa variante para pode importar, caso deseje.

AnexoTamanho
Exportação da variante2.34 KB

Tutorial : Campos de um conteudo em forma de tabs

Esse é para aqueles que desejam colocar os campos de um conteudo em forma de tabs.
O melhor módulo que faz isso ( pelo que eu conheço ) é o CCK Fieldroup Tabs ( http://drupal.org/project/cck_fieldgroup_tabs ).
Para esse tutorial é nescessário entender de CCK. Se você não sabe ainda usar esse módulo, siga esse tutorial.

Baixe e instale o módulo e siga o passo-a-passo:

  1. vá até 'admin/content/types/list' e clique em 'Gerenciar campos' no tipo de conteudo que deseja colocar os campos em tabs, ou crie um tipo de conteudo novo.
  2. na seção 'Novo grupo', crie um grupo. Esse grupo é que vai ser o tab que vai aparecer no node, então, todos os campos que colocar nele, vai aparecer num tab.
    Crie o rótulo do grupo ( esse vai ser mostrado na tab ), o nome do grupo ( para a administração ), e clique em salvar.
  3. crie o campo que você quer mostrar no tab ( ou use um que já exista).
  4. crie outros grupos e campos
  5. arraste os campos que você quer mostrar num tab, dentro de um grupo ( que na pratica É o tab )
  6. clique no link 'Exibir campos', e você verá os grupos e seus respectivos campos. Na coluna 'Node completo', na linha do GRUPO , você clica no select e escolhe ( óbviamente ) 'tabs'.
  7. nesse ponto, você pode criar um conteudo de teste, e se deu tudo certo, vai aparecer as tabs com os campos dentro delas

Essa dica serve para colocar tantos campos quanto você queira em um tab. Mas se você quer um só campo por tab, simplesmente coloque um só campo no grupo, que é o tab.

Esse é o mínimo que você precisa para ver tabs no seu conteudo. Acredito que a partir disso é simples brincar com as possibilidades que o drupal em conjunto com outros módulos oferece.

Até a próxima.

Tutorial Para Iniciantes

Instalando Drupal


Parte Administrativa



Módulos




Como portar seu layout para Drupal




Menus Drupal

Input Format

Colocando Data e Hora no Drupal

003

Como criar uma View

004

Node = conteúdo primario

Comentário = conteúdo para comentarios

File = conteúdo para arquivos

Node = usando node como newsletters

Node revision = histórico de mudança do node

Term = esta anexado com o node

Usuário = usuarios que criaram conta no site

Mas geralmente usamos o primeiro(Node)...

  • Após escolher vá para a próxima tela:

    005

    Seguindo a numeração da imagem acima temos:

    1- Aqui estão os display, quando bloco ele aparece na parte dos blocos pra que voçe possa coloca-lo no lugar que deseja.

    2- Nome: Esse é o Nome do Display, pode ser qualquer coisa.

    3- Título: O título aparece na pagina da views... então é melhor deixar em branco

    4- Aqui voçe escolhe o estilo da linha, escolha sempre node.

    5- Abilita e dessabilita o uso de paginação...

    6- Quantidade de Itens que será exibido.

    7- Aqui ele vai te dar as informações necesarias para quando for criar os arquivos TPL.PHP, e é aqui que voçe vai atualizar o tema quando acabar de criar os arquivos TPL.

    8- Escolher a ordem do conteúdo conforme deseja. Exemplo clássico: Ordenar as notícias pelas ultimas atualizadas.

    9- Filtrar o conteúdo que vai ser utilizado.

  • obs: Os campos obrigatórios que é preciso para a views ser criada é o "Row style" e "Endereço".

  • Depois que tiver configurado a view, crie os arquivos TPL.PHP
  • Iportante!!! nunca esqueçer de dar um rescan no theme information.





  • Imagem No Drupal




    Taxonomia



    Lembretes Drupal

    URLs Alternativas



    Nodes



    Módulo Taxonomy Theme para versão 6 do DRUPAL

    Baixe os módulos Taxonomy Theme e ThemeKey.

    coloque o módulo na pasta de módulos e o ative na parte administrativa do site.

    Acrescente a extensão /update.php e atualize os módulos.Irá aparecer um link(ThemeKey) do menu de navegação em Administrar/configuração do site.

    A primeira coisa a se fazer no módulo é configura-lo.

    Let's go!!!

    Clique em Configurações, vai aparecer essa tela aew:

    006

    Tem que estar com essas configurações...

    Marcando a caixa "Provide all themes for selection" voçe vai deixar disponivel todos os temas que foram instalados no Drupal.

    Marcando a caixa "Discover all node properties for selection" permite que voçe escolha que tipo de propriedades que quer que o thema seja exibido. E o que importa pra gente ai é o "type", entao nao esquece de marcar esse cara aew...

    Agora tu vai em Properties(propriedades)...

    009



    Agora a gente pode escolher um tema para um tipo de conteúdo com o "type" que abilitamos nas propriedades.

    007

    Selecione o "type" nas "Property" ao lado de Valor, e em Valor voçe coloca o tipo de conteúdo que vai ser exibido com tal tema ^^

    Esse "nid" é criado automaticamente, entao nao se preocupe em adiciona-lo =D



    Mas se quiser colocar uma pagina com outro tema... vá em "Paths".


    008


    Coloque o endereço e escolha o tema, e pronto... Essa parte é apropriada para alterar o tema de uma Views.



    Block.tpl.php

    Considerações gerais:

    O que fazer quando a edição de um node está sendo exibida no tema externo. > Entrar em /admin/content/nodewords e desmarcar a opção "Use the teaser of the page if the meta description is not set."
    Bom está é a noção do que eu tenho do Drupal, uma grande ferramenta, mais que ainda falta muito para eu aprender!!! Estou aceitando criticas e sujestões.

    Me perdoem se eu cometi algum erro, por isso sintam-se a vontade para me corrigir. Agradeço a toda galera do Drupal Brasil, em especial minha Parceira Laila, que sempre está me dando uma força.

    Tutorial: Instalando o Drupal 6 em português

    Muitas pessoas têm instalado o Drupal com sucesso, mas algumas têm tido problemas em colocá-lo em português do Brasil.

    Para desmistificar esse processo esse tutorial simples foi criado.

    Requisitos

    Esse tutorial foi feito para o Drupal 6.x e o único requisito é ter o Drupal nessa versão. Para instalação do Drupal 5.x em português, veja o screencast que eu fiz a respeito disso.

    Abordagens

    No Drupal 6 existem duas formas de instalar um idioma: durante o processo de instalação ou depois da instalação. Nesse tutorial vamos ver primeiro a durante a instalação e em seguida a que é tida como a tradicional.

    Baixando a tradução

    A tradução mais completa e que está sempre sofrendo atualizações é a que está no servidor de traduções do Drupal Brasil em http://traducao.drupal-br.org. É a partir desse servidor que iremos baixar a tradução para o nosso site.

    Após acessar o servidor, no menu lateral direito clique na opção Exportar.

    Você será remetido a uma tela onde escolherá algumas opções:

    Choose a project: O projeto que deseja exportar a tradução. No nosso caso queremos a tradução do Drupal, então digitaremos Drupal(se já não vir preenchido).

    Release: Escolha o último release disponível, ainda que ele seja diferente da sua versão atual (por exemplo, no momento que escrevia esse artigo a última versão do Drupal era a 6.6 mas o release disponível era o 6.4).

    Type of export: Tipo de exportação. No nosso caso queremos a tradução e não um template. Então escolha Tradução.

    Format used: Aqui temos 4 opções:

    Depois de escolher as opções mencionadas, basta clicar no botão Exportar e salvar os arquivos que ele irá gerar.

    Drupal em português - Tradução na instalação

    Nesse processo você vai precisar ter o Drupal pronto para instalar. Aqui não será abordada a instalação em si, somente como fazer a instalação em português. Assim, você já deve ter baixado e descompactado o Drupal em um local onde o seu servidor Web consegue acessá-lo.

    Você também deve ter o arquivo que exportamos do servidor de traduções, no formato de pacote para o Drupal 6 (primeira opção da exportação).

    Considerando que a instalação será feita localmente e assumindo seu endereço local como http://localhost vamos aos passos:

    Esse é o procedimento básico. Em alguns casos você pode receber a mensagem The translation import failed, because the file could not be read.. Isso porque esses arquivos que acabamos de descompactar precisam de permissão de leitura para o usuário que executa o seu servidor Web. Então dê a permissão adequada.

    Modo tradicional

    Nesse modo você já tem o seu site instalado em inglês e precisa instalar a tradução. Você já deve ter baixado a tradução no passo correto desse tutorial e agora vamos instalá-la. Lembre-se que a tradução é a All in one file.

    A primeira coisa que devemos fazer é habilitar o módulo de tradução, chamado Locale. Para isso acesse Administer > Site building > Modules escolha o módulo Locale e clique no botão Save Configuration

    Com o módulo Locale ativado, precisamos importar a tradução. Para isso acesse: Administer > Site building > Translate interface. Aqui, na parte superior, clique em Import.

    No campo Language file escolha o arquivo que baixamos do servidor de traduções. No campo Import into escolha o idioma português do Brasil ou seja "Portuguese, Brazil (Português)". As demais opções deixe-as como estão e clique no botão Import.

    Com isso temos a tradução importada, mas falta um último passo, que é ativá-la para o nosso site. Para tanto acesse Administer > Site configuration > Languages. Nessa tela veremos os dois idiomas disponíveis: Inglês e Português. Para ativar o português, como o padrão, basta escolher na opção Default o nosso idioma e em seguida clicar no botão Save Configuration

    Nesse momento o site estará em português. Você pode ainda desabilitar o idioma inglês, se desejar, desmarcando a caixa Ativado.

    Conclusão

    Esses são dois modos de se ter o Drupal em português do Brasil. Existe, pelo menos, mais um modo de se instalar a tradução que não abordamos aqui mas que é semelhante ao primeiro com elementos do segundo.

    Deixo claro que a tradução aqui feita é apenas da interface, e não de conteúdo.

    Fique à vontade para deixar comentários com sua experiência, dúvida, sugestão ou crítica.

    Tutorial: Personalizando o nome de usuário em um post

    Hoje em dia, com a popularização de blogs, é muito comum que queiramos algo mais personalizado e, às vezes, esquecemos de um pequeno detalhe que, para alguns, faz toda a diferença: o nome da pessoa que enviou o post.

    No Drupal, quando enviamos um post, o que aparece é o nome do usuário e não o nome da pessoa. Isso é facilmente resolvido com o módulo Profile (presente no core do Drupal), e uma pequena personalização.

    Irei mostrar como personalizar o nome de usuário, autor de um post no site. O tutorial vai mostrar como personalizar somente o nome de usuários logados, deixando os anônimos e não registrados na sua forma padrão.

    Antes
    Visualização antes

    Depois
    Visualização depois

    Requisitos

    Esse tutorial não cobre a instalação e configuração do Drupal além daquilo que iremos usar. Para isso você encontra outros tutoriais aqui no Drupal Brasil.

    Também vou assumir que você está com o Drupal em Português. Assim, só estará em inglês aquilo que não consta na tradução feita pela equipe do Drupal Brasil.

    Para realização desse tutorial com o mesmo resultado mostrado teremos alguns requisitos:

    Esse tutorial pode não funcionar com versões anteriores do Drupal, desses módulos e/ou temas.

    O tema Framework foi usado apenas para podermos trabalhar sem mexer nos tema core. Se você tem um tema seu, ou se quiser usar um dos temas padrão, o procedimento será o mesmo.

    Preparação

    A primeira coisa que devemos fazer é habilitar o módulo Profile e o tema Framework.

    Para habilitar o módulo Profile acesse: Administrar > Construção do site > Módulos. Em seguida marque a caixa referente ao módulo Profile e clique no botão Salvar configurações.

    O tema que usaremos não vem com o Drupal por padrão, então antes temos que baixá-lo. Para isso baixe a última versão disponível em http://drupal.org/project/framework

    Após baixar o tema, descompacte-o na pasta sites/all/themes (a pasta themes não existe por padrão, então crie-a). Esse é o local padrão e recomendado para depositar temas. Para saber mais leia esse artigo que escrevi há algum tempo.

    Em seguida, para habilitar o tema Framework, acesse: Administrar > Construção do site > Temas. Em seguida marque a caixa referente ao tema Framework e selecione o radio button ao lado, para deixar esse tema como o padrão.

    Ressalto, novamente, que a habilitação do tema Framework é opcional e, caso você já possua um tema que deseja aplicar as mudanças, ela pode ser ignorada.

    Configurando o campo

    Agora que temos os requisitos instalados, vamos criar o campo que será usado para guardar o nome real do usuário.

    O módulo Profile é um dos módulos que vêm com o Drupal no seu pacote básico. Ele é usado para ampliar a quantidade de campos no perfil do usuário (daí o seu nome). Nós o habilitamos por esse motivo (queremos guardar o nome real do usuário) e agora precisamos configurá-lo.

    Agora acesse Administrar > Gerenciamento de usuários > Perfis. Aqui podemos adicionar quantos campos quisermos ao perfil dos nossos usuários. Esses campos podem ser de vários tipos: caixa de texto, seleção em lista, lista livre etc. Aqui não iremos discutir cada um desses itens, ficando esse assunto para um outro tutorial. No momento vamos adicionar apenas um campo do tipo campo de texto de uma linha clicando na opção com esse mesmo nome.

    Ao solicitarmos a adição de um novo campo de texto, temos algumas informações a prencher. Abaixo segue uma descrição breve de cada uma:

    Salve esse campo e teremos terminado com a configuração do módulo Perfil.

    Alterando o nome do usuário

    Agora iremos preencher o campo que criamos para o nosso usuário.

    Para isso acesse Minha conta e escolha a opção Editar.

    Você deve perceber que existe agora uma nova aba, logo abaixo das abas Ver e Editar, chamada Pessoal. Essa é a aba que mencionei no passo anterior e que, na verdade, e a categoria dos campos que adicionamos ao nosso formulário (no nosso caso apenas Nome Completo).

    Clique na aba Pessoal, e em seguida digite seu nome completo no campo referido. Em seguida, salve o seu cadastro.

    Se você clicar na aba Ver você poderá notar que agora é exibido o seu nome completo na ficha cadastral. Esse é um grande recurso presente no Drupal e que muitos CMS modernos ainda não implementaram.

    Se você já tiver algum post no seu site, verá que nada mudou. Isso porque ainda precisamos personalizar o tema.

    Agora vamos para a personalização em si.

    Personalizando o tema

    O Drupal é construído sob uma plataforma bastante flexível e extensível. Uma das possibilidades dessa flexibilidade é que personalizemos algumas áreas pré-definidas pelo desenvolvedor. É isso o que ocorre com o nome de usuário, e é fazendo uso desse recurso que iremos personalizá-lo.

    Essa personalização envolve vários conceitos relacionados a temas, mas iremos nos ater essencialmente a aquilo que é necessário para a personalização. Para saber mais sobre personalização e temas recomendo o outro artigo que escrevi sobre esse assunto.

    A primeira coisa que devemos fazer é abrir, para edição, o arquivo template.php localizado na pasta do tema Framework (sites/all/themes/framework). Esse arquivo, quando presente em um tema e com o conteúdo apropriado, permite que alguns pontos do Drupal possam ser personalizados. Você verá que ele já possui conteúdo, mas iremos até o final do arquivo para adicionar, depois de tudo, o código abaixo:

    function phptemplate_username($object) {

      if ($object->uid && $object->name) {
       
        $user = user_load(array(uid => $object->uid));

        //aqui está a mágica que fizemos
        if (!empty($user->profile_nome)) {
          $name = $user->profile_nome;
        } else {
          $name = $object->name;
        }

        if (user_access('access user profiles')) {
          $output = l($name, 'user/'. $object->uid, array('title' => t('View user profile.')));
        }
        else {
          $output = check_plain($name);
        }
      }
      else if ($object->name) {
        if ($object->homepage) {
          $output = l($object->name, $object->homepage);
        }
        else {
          $output = check_plain($object->name);
        }

        $output .= ' ('. t('not verified') .')';
      }
      else {
        $output = variable_get('anonymous', t('Anonymous'));
      }

      return $output;
    }

    Esse código irá fazer com que, se preenchido, o campo que criamos substitua o nome de usuário.

    Agora perceba o nome da função phptemplate_username(). Essa função faz uso do recurso do Drupal que mencionei acima. Ela é uma "reimplementação" da função original que se chama theme_username() que está no arquivo includes/theme.inc e na versão 6.6 do Drupal é implementada à partir da linha 1559.

    Ao criar a função no arquivo template.php trocando o theme por phptemplate fazemos com que a nossa função sobrescreva a original.

    Esse é apenas um recurso do Drupal no que se refere a personalização. Iremos falar disso em um futuro artigo.

    A personalização que fizemos está na linha 8 e apenas trocamos o campo a ser exibido. Perceba que o nome do campo a ser impresso tem que ser, necessariamente, profile_nome pois foi esse o nome de campo que usamos na hora de criar o campo com o módulo Profile.

    Conclusão

    Vimos como personalizar, com relativa facilidade um campo no Dupal (apesar de longo o tutorial, o processo é muito pequeno). Essa é apenas uma forma de fazer isso e, na minha opinião, a mais limpa e simples.

    Uma outra forma de se fazer isso seria mexer no arquivo node.tpl.php.

    Um outro modo que pode ser mais prático é utilizar o módulo Real Name que faz, em linhas gerais, o que fizemos agora, mas sem a necessidade de mexer no tema e com a personalização de um campo qualquer.

    URLs de blogs renomeados usando o módulo Pathauto para o Drupal

    Em um lugar específico do site, precisei implementar o módulo BLOG para que os usuários pudessem interagir melhor no portal que estou desenvolvendo. O drupal tem esse módulo pré-instalado, mas os usuários passaram a se queixar que não queriam ser o www.seu-site.com/blog/1, e sim, o www.seu-site.com/blogs/fulano ou www.seu-site.com/blogs/beltrano.

    E agora, como resolver esse impasse?

    Eu poderia renomear manualmente no "URL aliases", mas o processo seria penoso. Teria que encontrar uma solução automatizada. Pesquisei no fórum do drupal-br [ http://drupal-br.org/suporte/modulos/urls-de-blogs ], peguei umas dicas com a comunidade e adaptei à minha necessidade, que descrevo a seguir:

    Baixe o módulo pathauto para seu-drupal/modules/
    # wget http://ftp.drupal.org/files/projects/pathauto-5.x-2.2.tar.gz

    Descompacte
    # tar zxvf pathauto-5.x-2.2.tar.gz

    Habilite o módulo em admin/build/modules. Ele funciona com o módulo Path, pré-instalado, que tem que estar - também - habilitado.

    Agora o pulo do gato.

    No meu caso, eu precisava renomear os blog/1, blog/2... para blogs/fulano e blogs/beltrano e os nodes (conteúdos) referentes às publicações em BLOG, de seu-site.com/node/1 para seu-site.com/content/testando-o-blog e assim por diante.

    Assim que configurei globalmente, o pathauto renomeou todos meus nodes, inclusive de outros tipos de conteúdo, como páginas de livro, enquete e fóruns, mas eu só precisava que ele fizesse isso com os nodes do módulo blog.

    Em admin/settings/pathauto, configurei assim:

    - Configurações gerais

    Em "Update action", ativei o "Create a new alias. Leave the existing alias functioning." para renomear os nodes existentes, preservando os endereços antigos (node/1, node/2...).

    Em "Reduce strings to letters and numbers from ASCII-96", marque; evita bagunçar o o endereço do post com caracteres estranhos quando você escreve com acentos no título da publicação.

    - Blog path settings

    Marque a opção "Bulk generate aliases for blogs that are not aliased" para renomear os blogs já existentes que ainda não foram renomeados. Os futuros blogs serão renomeados automaticamente assim que o usuário criar uma conta.

    - Node path settings

    Em "Default path pattern", recorte o código content/[title-raw] e cole em "Pattern for all Blog paths". Note que o primeiro tem que ficar em branco e o segundo tem que assumir o código do primeiro.

    Aqui funcionou. e aí?

    apt-get install drupal5

    Tenho visto que muita gente tem preferido instalar o drupal pelo proprio gerenciador de pacotes do Ubuntu ou Debian e tem tido alguma dificuldade na hora de colocar o site no servidor de produção.

    Após este tutorial você vai ver como é simples.

    1) Exporte o banco de dados da instalação do drupal. No Ubuntu, geralmente é usado o banco de dados drupal5. Para descobrir qual esta sendo usado, abra o arquivo /etc/drupal/5/sites/default/dbconfig.php.

    2) Importe no banco de dados do seu servidor de produção.

    3) Baixe do site do drupal a MESMA VERSÃO do drupal que você instalou na sua máquina. Caso você não saiba qual a versão, com o comando $ apt-cache show drupal5 | grep Version você vai ver.

    4) Descompacte o arquivo.

    5) Faça o upload dos arquivos do drupal e os módulos extras para o servidor de produção.

    6) Edite o arquivo settings.php, que se encontra em sites/default/settings.php, alterando a variavel $db_url com as informações do banco de dados do seu servidor de produção.

    7) ACESSE O SITE.

    Possíveis Problemas

    * Os módulos extras que eu instalei não estão habilitados. Acesse admin/build/modules e habilite novamente.

    Teóricamente deve funcionar... mas caso tenha algum problema, me avisa que eu altero este tutorial.

    Acho que é só isso...

    Flw!

    register_globals is enabled

    Instalei o drupal num servidor de um cliente e deu o seguinte erro:

    register_globals is enabled. Drupal requires this configuration directive to be disabled. Your site may not be secure when register_globals is enabled. The PHP manual has instructions for how to change configuration settings. (Currently using PHP register globals Enabled (1))

    Ganhei uns cabelos brancos até ver que é bem fácil resolver esse impasse. Basta criar o arquivo php.ini dentro da pasta do drupal com o seguinte código:
    [PHP]
    register_globals = Off



    Outras possíveis soluções para este problema neste tópico no fórum de suporte.

    Biblioteca de códigos

    A biblioteca de códigos tem como objetivo agregar definições de Views, CCK, Imagecache, Panels, e qualquer outro módulo que permita exportação de definições, além de trechos de código PHP e JQuery.

    O objetivo é facilitar e agilizar o desenvolvimento, além de sanar dúvidas, a partir do compartilhamento de informações.

    Recomendações

    PHP

    Trechos de código em PHP precisam necessáriamente estar em um arquivo de tema (normalmente .tpl.php ou no template.php), ou em um módulo próprio, ou mesmo dentro de um node, desde que se ative o módulo PHP Filter, que está presente no core.

    Códigos PHP precisam estar dentro da marcação <?php ?> para funcionar.

    Adicionando ID's únicos a menus em blocos

    Normalmente, quando se cria um menu no Drupal ele também tem a possibilidade de ser exibido como um bloco. Porém, os itens deste menu não possuem ID's únicos, o que limita algumas possibilidades de formatação ou de manipulação através de javascript.

    O código abaixo deve ser colocado no template.php do seu tema, e resolve este problema. Recomenda-se que você limpe o cache após implementá-lo.

    Observe que dependendo do starter theme que você utilizar, talvez esta função nem seja necessária...

    Não é necessário incluir as tags PHP no código abaixo.

    <?php
    /**
     * coloca classes e ids em itens do menu em um bloco
     */


    function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
      $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf'));

      if (!empty($extra_class)) {
        $class .= ' '. $extra_class;
      }
      if ($in_active_trail) {
        $class .= ' active-trail';
      }
      static $contador = 0;
      $contador +=1;

      $id .= 'item-' . $contador;
     
      return '<li id="'.$id.'" class="'. $class .'">'. $link . $menu ."</li>\n";
    }
    ?>

    Como exibir o formulário de contato do Drupal em qualquer página.

    Recomenda-se que você ative o módulo PHP Filter e coloque o código abaixo em um bloco, assim você pode colocar o formulário de contato em qualquer lugar da página.

    Não foi testado, mas deve funcionar se for colocado em um tema também.

    Da forma que está escrito, só funciona em Drupal 6.

    <?php
    require_once drupal_get_path('module', 'contact') .'/contact.pages.inc';
    print drupal_get_form('contact_mail_page');
    ?>

    Views

    Views é um módulo que fornece um método flexível para construtores de site controlarem como listagens e tabelas de conteúdo serão exibidas. Mais informações na página do projeto.

    Esta página de livro agrega vários tipos de views exportadas.

    Gerenciamento de conteúdo Simples

    Esta Views cria uma tabela de listagem de nodes para gerenciamento simples de conteúdo. é ideal para sites pequenos que não possuem muito conteúdo e que você não deseja dar acesso administrativo para o gerenciamento de nodes.

    O código abaixo é para sites que não utilizam comentários:

    $view = new view;
    $view->name = 'administracao_nodes';
    $view->description = '';
    $view->tag = '';
    $view->view_php = '';
    $view->base_table = 'node';
    $view->is_cacheable = FALSE;
    $view->api_version = 2;
    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
    $handler = $view->new_display('default', 'Defaults', 'default');
    $handler->override_option('fields', array(
      'type' => array(
        'label' => 'Tipo',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_node' => 0,
        'exclude' => 0,
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'title' => array(
        'label' => 'Título',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_node' => 1,
        'exclude' => 0,
        'id' => 'title',
        'table' => 'node',
        'field' => 'title',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'created' => array(
        'label' => 'Publicado em',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'date_format' => 'small',
        'custom_date_format' => '',
        'exclude' => 0,
        'id' => 'created',
        'table' => 'node',
        'field' => 'created',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'edit_node' => array(
        'label' => 'Operações',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'Editar',
        'exclude' => 0,
        'id' => 'edit_node',
        'table' => 'node',
        'field' => 'edit_node',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'delete_node' => array(
        'label' => '',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'Deletar',
        'exclude' => 0,
        'id' => 'delete_node',
        'table' => 'node',
        'field' => 'delete_node',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'status' => array(
        'label' => 'Publicado',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'link_class' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'type' => 'yes-no',
        'not' => 0,
        'exclude' => 0,
        'id' => 'status',
        'table' => 'node',
        'field' => 'status',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('filters', array(
      'type' => array(
        'operator' => 'in',
        'value' => array(
          'poll' => 'poll',
          'ad' => 'ad',
          'artigo' => 'artigo',
          'download' => 'download',
          'evento' => 'evento',
          'galeria' => 'galeria',
          'newsletter' => 'newsletter',
          'noticia' => 'noticia',
          'pagina' => 'pagina',
        ),
        'group' => '0',
        'exposed' => TRUE,
        'expose' => array(
          'use_operator' => 0,
          'operator' => 'type_op',
          'identifier' => 'Tipo',
          'label' => 'Conteúdo: Tipo',
          'optional' => 1,
          'single' => 1,
          'remember' => 0,
          'reduce' => 1,
        ),
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('access', array(
      'type' => 'role',
      'role' => array(
        '3' => 3,
      ),
    ));
    $handler->override_option('cache', array(
      'type' => 'none',
    ));
    $handler->override_option('title', 'Gerenciar Conteúdo');
    $handler->override_option('empty', 'Atualmente o Site não possui nenhum Conteúdo.');
    $handler->override_option('empty_format', '1');
    $handler->override_option('items_per_page', 50);
    $handler->override_option('use_pager', '1');
    $handler->override_option('style_plugin', 'table');
    $handler = $view->new_display('page', 'Gerenciar Conteúdo', 'page_1');
    $handler->override_option('path', 'gerenciar/conteudo');
    $handler->override_option('menu', array(
      'type' => 'normal',
      'title' => 'Gerenciar Conteúdo',
      'description' => '',
      'weight' => '0',
      'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
      'type' => 'none',
      'title' => '',
      'description' => '',
      'weight' => 0,
    ));

    Se o seu site possuir comentários (tiver o módulo comments ativado), você deve utilizar esta versão ligeiramente alterada, que permite gerenciar os comentários também:

    $view = new view;
    $view->name = 'views_admin_editor_nodes';
    $view->description = 'Views administrativa para nodes - editor';
    $view->tag = '';
    $view->view_php = '';
    $view->base_table = 'node';
    $view->is_cacheable = FALSE;
    $view->api_version = 2;
    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
    $handler = $view->new_display('default', 'Defaults', 'default');
    $handler->override_option('fields', array(
      'title' => array(
        'label' => 'Título',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_node' => 1,
        'exclude' => 0,
        'id' => 'title',
        'table' => 'node',
        'field' => 'title',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('sorts', array(
      'created' => array(
        'order' => 'DESC',
        'granularity' => 'second',
        'id' => 'created',
        'table' => 'node',
        'field' => 'created',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('filters', array(
      'type' => array(
        'operator' => 'in',
        'value' => array(
          'flashnode' => 'flashnode',
          'image' => 'image',
          'product' => 'product',
          'video' => 'video',
          'capitulo' => 'capitulo',
          'dica' => 'dica',
          'links' => 'links',
          'page' => 'page',
        ),
        'group' => '0',
        'exposed' => FALSE,
        'expose' => array(
          'operator' => 'type_op',
          'label' => 'Conteúdo: Tipo',
          'use_operator' => 0,
          'identifier' => 'type',
          'optional' => 1,
          'single' => 1,
          'remember' => 0,
          'reduce' => 0,
        ),
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('access', array(
      'type' => 'role',
      'role' => array(
        '3' => 3,
        '4' => 4,
      ),
    ));
    $handler->override_option('cache', array(
      'type' => 'none',
    ));
    $handler->override_option('title', 'Gerenciar Conteúdo');
    $handler->override_option('empty', 'Atualmente não existe nenhum Conteúdo cadastrado.');
    $handler->override_option('empty_format', '1');
    $handler->override_option('items_per_page', 50);
    $handler->override_option('use_pager', '1');
    $handler->override_option('distinct', 0);
    $handler->override_option('style_plugin', 'table');
    $handler->override_option('style_options', array(
      'grouping' => '',
      'override' => 1,
      'sticky' => 0,
      'order' => 'asc',
      'columns' => array(
        'title' => 'title',
        'created' => 'created',
        'status' => 'status',
        'type' => 'type',
        'edit_node' => 'edit_node',
        'delete_node' => 'delete_node',
      ),
      'info' => array(
        'title' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'created' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'status' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'type' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'edit_node' => array(
          'separator' => '',
        ),
        'delete_node' => array(
          'separator' => '',
        ),
      ),
      'default' => '-1',
    ));
    $handler = $view->new_display('page', 'gerenciar conteudo', 'page_1');
    $handler->override_option('fields', array(
      'title' => array(
        'label' => 'Título',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_node' => 1,
        'exclude' => 0,
        'id' => 'title',
        'table' => 'node',
        'field' => 'title',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'created' => array(
        'label' => 'Data de publicação',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'date_format' => 'small',
        'custom_date_format' => '',
        'exclude' => 0,
        'id' => 'created',
        'table' => 'node',
        'field' => 'created',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'status' => array(
        'label' => 'Publicado',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'type' => 'yes-no',
        'not' => 0,
        'exclude' => 0,
        'id' => 'status',
        'table' => 'node',
        'field' => 'status',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'type' => array(
        'label' => 'Tipo',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_node' => 0,
        'exclude' => 0,
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'edit_node' => array(
        'label' => 'Operações',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'Editar',
        'exclude' => 0,
        'id' => 'edit_node',
        'table' => 'node',
        'field' => 'edit_node',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
      'delete_node' => array(
        'label' => '',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'apagar',
        'exclude' => 0,
        'id' => 'delete_node',
        'table' => 'node',
        'field' => 'delete_node',
        'override' => array(
          'button' => 'Override',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('filters', array(
      'rid' => array(
        'operator' => 'or',
        'value' => array(
          '3' => '3',
          '4' => '4',
        ),
        'group' => '0',
        'exposed' => FALSE,
        'expose' => array(
          'operator' => FALSE,
          'label' => '',
        ),
        'id' => 'rid',
        'table' => 'users_roles',
        'field' => 'rid',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
        'reduce_duplicates' => 0,
      ),
      'type' => array(
        'operator' => 'in',
        'value' => array(
          'flashnode' => 'flashnode',
          'product' => 'product',
          'video' => 'video',
          'capitulo' => 'capitulo',
          'dica' => 'dica',
          'links' => 'links',
          'page' => 'page',
        ),
        'group' => '0',
        'exposed' => TRUE,
        'expose' => array(
          'use_operator' => 0,
          'operator' => 'type_op',
          'identifier' => 'tipo',
          'label' => 'Filtrar',
          'optional' => 1,
          'single' => 1,
          'remember' => 0,
          'reduce' => 1,
        ),
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('path', 'gerenciar/conteudo');
    $handler->override_option('menu', array(
      'type' => 'default tab',
      'title' => 'Gerenciar Conteúdo',
      'description' => '',
      'weight' => '0',
      'name' => 'menu-menu-editor',
    ));
    $handler->override_option('tab_options', array(
      'type' => 'normal',
      'title' => 'Gerenciar Conteúdo',
      'description' => '',
      'weight' => '0',
    ));
    $handler = $view->new_display('page', 'gerenciar comentários', 'page_2');
    $handler->override_option('fields', array(
      'subject' => array(
        'label' => 'Título',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_comment' => 1,
        'exclude' => 0,
        'id' => 'subject',
        'table' => 'comments',
        'field' => 'subject',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'name' => array(
        'label' => 'Autor',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'link_to_user' => 1,
        'exclude' => 0,
        'id' => 'name',
        'table' => 'comments',
        'field' => 'name',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'timestamp' => array(
        'label' => 'Data de publicação',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'date_format' => 'small',
        'custom_date_format' => '',
        'exclude' => 0,
        'id' => 'timestamp',
        'table' => 'comments',
        'field' => 'timestamp',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'edit_comment' => array(
        'label' => 'Operações',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'Editar',
        'exclude' => 0,
        'id' => 'edit_comment',
        'table' => 'comments',
        'field' => 'edit_comment',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'delete_comment' => array(
        'label' => '',
        'alter' => array(
          'alter_text' => 0,
          'text' => '',
          'make_link' => 0,
          'path' => '',
          'alt' => '',
          'prefix' => '',
          'suffix' => '',
          'help' => '',
          'trim' => 0,
          'max_length' => '',
          'word_boundary' => 1,
          'ellipsis' => 1,
          'strip_tags' => 0,
          'html' => 0,
        ),
        'text' => 'apagar',
        'exclude' => 0,
        'id' => 'delete_comment',
        'table' => 'comments',
        'field' => 'delete_comment',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('sorts', array());
    $handler->override_option('filters', array(
      'type' => array(
        'operator' => 'in',
        'value' => array(
          'flashnode' => 'flashnode',
          'video' => 'video',
          'capitulo' => 'capitulo',
          'dica' => 'dica',
        ),
        'group' => '0',
        'exposed' => FALSE,
        'expose' => array(
          'operator' => 'type_op',
          'label' => 'Conteúdo: Tipo',
          'use_operator' => 0,
          'identifier' => 'type',
          'optional' => 1,
          'single' => 1,
          'remember' => 0,
          'reduce' => 0,
        ),
        'id' => 'type',
        'table' => 'node',
        'field' => 'type',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'comment_count' => array(
        'operator' => '>',
        'value' => array(
          'value' => '0',
          'min' => '',
          'max' => '',
        ),
        'group' => '0',
        'exposed' => FALSE,
        'expose' => array(
          'operator' => FALSE,
          'label' => '',
        ),
        'id' => 'comment_count',
        'table' => 'node_comment_statistics',
        'field' => 'comment_count',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
      'name' => array(
        'operator' => 'word',
        'value' => '',
        'group' => '0',
        'exposed' => TRUE,
        'expose' => array(
          'use_operator' => 0,
          'operator' => 'name_op',
          'identifier' => 'nome',
          'label' => 'Comentário: Autor',
          'optional' => 1,
          'remember' => 0,
        ),
        'case' => 1,
        'id' => 'name',
        'table' => 'comments',
        'field' => 'name',
        'override' => array(
          'button' => 'Use default',
        ),
        'relationship' => 'none',
      ),
    ));
    $handler->override_option('title', 'Gerenciar Comentários');
    $handler->override_option('empty', 'Atualmente não existe nenhum comentário cadastrado.');
    $handler->override_option('style_options', array(
      'grouping' => '',
      'override' => 1,
      'sticky' => 0,
      'order' => 'asc',
      'columns' => array(
        'subject' => 'subject',
        'name' => 'name',
        'timestamp' => 'timestamp',
        'edit_comment' => 'edit_comment',
        'delete_comment' => 'delete_comment',
      ),
      'info' => array(
        'subject' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'name' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'timestamp' => array(
          'sortable' => 1,
          'separator' => '',
        ),
        'edit_comment' => array(
          'separator' => '',
        ),
        'delete_comment' => array(
          'separator' => '',
        ),
      ),
      'default' => '-1',
    ));
    $handler->override_option('path', 'gerenciar/comentarios');
    $handler->override_option('menu', array(
      'type' => 'tab',
      'title' => 'Gerenciar Comentários',
      'description' => '',
      'weight' => '1',
      'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
      'type' => 'none',
      'title' => '',
      'description' => '',
      'weight' => 0,
    ));

    Observação: é provavel que após a importação da views você precise configurar o filtro node:tipo da mesma, selecionando os nodes que devem aparecer no filtro.

    Views para Blog

    Fornece uma views para criação de um blog completo, com listagem de posts e os seguintes recursos:

    • Feed da página principal (/blog)
    • bloco e página de marcadores (categorias)
    • feeds individuais para cada marcador
    • bloco e página de arquivo mensal
    • bloco com os 10 posts mais populares
    • bloco com os 10 posts mais comentados

    Dependências: módulo comment e módulo statistics, ambos do core. é necessário criar um tipo de conteúdo identificado como blog, ou se for o caso, alterar a views.

    Recomendações

    o caminho padrão do blog está configurado para /blog. recomenda-se que seja criado um tipo de conteúdo identificado como blog.

    Se você estiver utilizando pathauto, recomenda-se que seja configurado o path dos nodes como "blog/[title-raw]".

    Recomenda-se que seja criado um vocabulário chamado "marcadores" e que ele seja associado aos nodes do tipo blog. e que este vocabulário seja de marcação livre. Se você estiver usando pathauto, recomenda-se que path seja definido como "blog/categorias/[vocab-raw]/[catpath-raw]".

    $view = new view;
    $view->name = 'blog';
    $view->description = '';
    $view->tag = '';
    $view->view_php = '';
    $view->base_table = 'node';
    $view->is_cacheable = FALSE;
    $view->api_version = 2;
    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
    $handler = $view->new_display('default', 'Defaults', 'default');
    $handler->override_option('fields', array(
    'title' => array(
    'label' => '',
    'alter' => array(
    'alter_text' => 0,
    'text' => '',
    'make_link' => 0,
    'path' => '',
    'link_class' => '',
    'alt' => '',
    'prefix' => '',
    'suffix' => '',
    'target' => '',
    'help' => '',
    'trim' => 1,
    'max_length' => '50',
    'word_boundary' => 1,
    'ellipsis' => 1,
    'strip_tags' => 0,
    'html' => 0,
    ),
    'empty' => '',
    'hide_empty' => 1,
    'empty_zero' => 0,
    'link_to_node' => 1,
    'exclude' => 0,
    'id' => 'title',
    'table' => 'node',
    'field' => 'title',
    'override' => array(
    'button' => 'Override',
    ),
    'relationship' => 'none',
    ),
    ));
    $handler->override_option('sorts', array(
    'created' => array(
    'order' => 'DESC',
    'granularity' => 'second',
    'id' => 'created',
    'table' => 'node',
    'field' => 'created',
    'relationship' => 'none',
    ),
    ));
    $handler->override_option('arguments', array(
    'name' => array(
    'default_action' => 'ignore',
    'style_plugin' => 'default_summary',
    'style_options' => array(),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'glossary' => 0,
    'limit' => '0',
    'case' => 'none',
    'path_case' => 'lower',
    'transform_dash' => 1,
    'add_table' => 0,
    'require_value' => 0,
    'id' => 'name',
    'table' => 'term_data',
    'field' => 'name',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    ),
    'created_year_month' => array(
    'default_action' => 'ignore',
    'style_plugin' => 'default_summary',
    'style_options' => array(),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'id' => 'created_year_month',
    'table' => 'node',
    'field' => 'created_year_month',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    ),
    ));
    $handler->override_option('filters', array(
    'status' => array(
    'operator' => '=',
    'value' => '1',
    'group' => '0',
    'exposed' => FALSE,
    'expose' => array(
    'operator' => FALSE,
    'label' => '',
    ),
    'id' => 'status',
    'table' => 'node',
    'field' => 'status',
    'relationship' => 'none',
    ),
    'type' => array(
    'operator' => 'in',
    'value' => array(
    'blog' => 'blog',
    ),
    'group' => '0',
    'exposed' => FALSE,
    'expose' => array(
    'operator' => FALSE,
    'label' => '',
    ),
    'id' => 'type',
    'table' => 'node',
    'field' => 'type',
    'relationship' => 'none',
    ),
    ));
    $handler->override_option('access', array(
    'type' => 'none',
    ));
    $handler->override_option('cache', array(
    'type' => 'none',
    ));
    $handler->override_option('empty', 'Desculpe, mas atualmente não existe nenhum post de blog publicado.');
    $handler->override_option('empty_format', '1');
    $handler->override_option('use_pager', '1');
    $handler->override_option('row_plugin', 'node');
    $handler->override_option('row_options', array(
    'relationship' => 'none',
    'build_mode' => 'teaser',
    'links' => 1,
    'comments' => 0,
    ));
    $handler = $view->new_display('page', 'Página - Principal', 'page_1');
    $handler->override_option('path', 'blog');
    $handler->override_option('menu', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    ));
    $handler = $view->new_display('feed', 'Feed principal', 'feed_1');
    $handler->override_option('title', 'Blog do Zé - RSS');
    $handler->override_option('style_plugin', 'rss');
    $handler->override_option('style_options', array(
    'mission_description' => FALSE,
    'description' => '',
    ));
    $handler->override_option('row_plugin', 'node_rss');
    $handler->override_option('row_options', array(
    'relationship' => 'none',
    'item_length' => 'default',
    ));
    $handler->override_option('path', 'blog/feed');
    $handler->override_option('menu', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    ));
    $handler->override_option('displays', array(
    'page_1' => 'page_1',
    'default' => 0,
    'block_1' => 0,
    'page_2' => 0,
    ));
    $handler->override_option('sitename_title', 0);
    $handler = $view->new_display('block', 'Bloco marcadores', 'block_1');
    $handler->override_option('arguments', array(
    'name' => array(
    'default_action' => 'summary asc',
    'style_plugin' => 'default_summary',
    'style_options' => array(
    'count' => 1,
    'override' => 0,
    'items_per_page' => '25',
    ),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'summary asc',
    'glossary' => 0,
    'limit' => '0',
    'case' => 'none',
    'path_case' => 'lower',
    'transform_dash' => 1,
    'add_table' => 0,
    'require_value' => 0,
    'id' => 'name',
    'table' => 'term_data',
    'field' => 'name',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    'override' => array(
    'button' => 'Use default',
    ),
    ),
    ));
    $handler->override_option('title', 'Marcadores');
    $handler->override_option('items_per_page', 20);
    $handler->override_option('use_more', 1);
    $handler->override_option('use_more_text', 'mais');
    $handler->override_option('link_display', 'page_2');
    $handler->override_option('block_description', '');
    $handler->override_option('block_caching', -1);
    $handler = $view->new_display('page', 'Página marcadores', 'page_2');
    $handler->override_option('arguments', array(
    'name' => array(
    'default_action' => 'summary asc',
    'style_plugin' => 'default_summary',
    'style_options' => array(),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'summary asc',
    'glossary' => 0,
    'limit' => '0',
    'case' => 'none',
    'path_case' => 'lower',
    'transform_dash' => 1,
    'add_table' => 0,
    'require_value' => 0,
    'id' => 'name',
    'table' => 'term_data',
    'field' => 'name',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    'override' => array(
    'button' => 'Use default',
    ),
    ),
    ));
    $handler->override_option('title', 'Marcadores');
    $handler->override_option('items_per_page', 0);
    $handler->override_option('use_pager', '0');
    $handler->override_option('path', 'blog/categorias/marcadores');
    $handler->override_option('menu', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    ));
    $handler = $view->new_display('feed', 'Feed marcadores', 'feed_2');
    $handler->override_option('arguments', array(
    'name' => array(
    'default_action' => 'ignore',
    'style_plugin' => 'default_summary',
    'style_options' => array(),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'glossary' => 0,
    'limit' => '0',
    'case' => 'none',
    'path_case' => 'lower',
    'transform_dash' => 1,
    'add_table' => 0,
    'require_value' => 0,
    'id' => 'name',
    'table' => 'term_data',
    'field' => 'name',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    ),
    ));
    $handler->override_option('title', 'Blog do Zé - Marcadores');
    $handler->override_option('link_display', 'page_2');
    $handler->override_option('style_plugin', 'rss');
    $handler->override_option('style_options', array(
    'mission_description' => FALSE,
    'description' => '',
    ));
    $handler->override_option('row_plugin', 'node_rss');
    $handler->override_option('row_options', array(
    'relationship' => 'none',
    'item_length' => 'default',
    ));
    $handler->override_option('path', 'blog/categorias/marcadores/feed');
    $handler->override_option('menu', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    ));
    $handler->override_option('displays', array(
    'page_2' => 'page_2',
    'default' => 0,
    'page_1' => 0,
    'block_1' => 0,
    ));
    $handler->override_option('sitename_title', 0);
    $handler = $view->new_display('block', 'Bloco arquivo mensal', 'block_2');
    $handler->override_option('arguments', array(
    'created_year_month' => array(
    'default_action' => 'summary asc',
    'style_plugin' => 'default_summary',
    'style_options' => array(
    'count' => 1,
    'override' => 0,
    'items_per_page' => '25',
    ),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'summary asc',
    'id' => 'created_year_month',
    'table' => 'node',
    'field' => 'created_year_month',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    'override' => array(
    'button' => 'Use default',
    ),
    ),
    ));
    $handler->override_option('title', 'Arquivo Mensal');
    $handler->override_option('items_per_page', 20);
    $handler->override_option('use_pager', '0');
    $handler->override_option('use_more', 1);
    $handler->override_option('use_more_text', 'mais');
    $handler->override_option('link_display', 'page_3');
    $handler->override_option('block_description', '');
    $handler->override_option('block_caching', -1);
    $handler = $view->new_display('page', 'Página Arquivo Mensal', 'page_3');
    $handler->override_option('arguments', array(
    'created_year_month' => array(
    'default_action' => 'summary asc',
    'style_plugin' => 'default_summary',
    'style_options' => array(
    'count' => 1,
    'override' => 0,
    'items_per_page' => '25',
    ),
    'wildcard' => 'all',
    'wildcard_substitution' => 'Tudo',
    'title' => '',
    'breadcrumb' => '',
    'default_argument_type' => 'fixed',
    'default_argument' => '',
    'validate_type' => 'none',
    'validate_fail' => 'summary asc',
    'id' => 'created_year_month',
    'table' => 'node',
    'field' => 'created_year_month',
    'validate_user_argument_type' => 'uid',
    'validate_user_roles' => array(
    '2' => 0,
    '3' => 0,
    ),
    'relationship' => 'none',
    'default_options_div_prefix' => '',
    'default_argument_user' => 0,
    'default_argument_fixed' => '',
    'default_argument_php' => '',
    'validate_argument_node_type' => array(
    'blog' => 0,
    'page' => 0,
    ),
    'validate_argument_node_access' => 0,
    'validate_argument_nid_type' => 'nid',
    'validate_argument_vocabulary' => array(
    '1' => 0,
    ),
    'validate_argument_type' => 'tid',
    'validate_argument_transform' => 0,
    'validate_user_restrict_roles' => 0,
    'validate_argument_php' => '',
    'override' => array(
    'button' => 'Use default',
    ),
    ),
    ));
    $handler->override_option('title', 'Arquivo Mensal');
    $handler->override_option('items_per_page', 40);
    $handler->override_option('path', 'blog/arquivo-mensal');
    $handler->override_option('menu', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    'name' => 'navigation',
    ));
    $handler->override_option('tab_options', array(
    'type' => 'none',
    'title' => '',
    'description' => '',
    'weight' => 0,
    ));
    $handler = $view->new_display('block', 'Bloco mais populares', 'block_3');
    $handler->override_option('fields', array(
    'title' => array(
    'label' => '',
    'alter' => array(
    'alter_text' => 0,
    'text' => '',
    'make_link' => 0,
    'path' => '',
    'link_class' => '',
    'alt' => '',
    'prefix' => '',
    'suffix' => '',
    'target' => '',
    'help' => '',
    'trim' => 1,
    'max_length' => '50',
    'word_boundary' => 1,
    'ellipsis' => 1,
    'strip_tags' => 0,
    'html' => 0,
    ),
    'empty' => '',
    'hide_empty' => 1,
    'empty_zero' => 0,
    'link_to_node' => 1,
    'exclude' => 0,
    'id' => 'title',
    'table' => 'node',
    'field' => 'title',
    'override' => array(
    'button' => 'Override',
    ),
    'relationship' => 'none',
    ),
    'totalcount' => array(
    'label' => '',
    'alter' => array(
    'alter_text' => 0,
    'text' => '',
    'make_link' => 0,
    'path' => '',
    'link_class' => '',
    'alt' => '',
    'prefix' => '',
    'suffix' => '',
    'target' => '',
    'help' => '',
    'trim' => 0,
    'max_length' => '',
    'word_boundary' => 1,
    'ellipsis' => 1,
    'strip_tags' => 0,
    'html' => 0,
    ),
    'empty' => '',
    'hide_empty' => 0,
    'empty_zero' => 0,
    'set_precision' => FALSE,
    'precision' => 0,
    'decimal' => '.',
    'separator' => '.',
    'prefix' => '(visto ',
    'suffix' => ' vezes)',
    'exclude' => 0,
    'id' => 'totalcount',
    'table' => 'node_counter',
    'field' => 'totalcount',
    'override' => array(
    'button' => 'Use default',
    ),
    'relationship' => 'none',
    ),
    ));
    $handler->override_option('sorts', array(
    'totalcount' => array(
    'order' => 'DESC',
    'id' => 'totalcount',
    'table' => 'node_counter',
    'field' => 'totalcount',
    'override' => array(
    'button' => 'Use default',
    ),
    'relationship' => 'none',
    ),
    ));
    $handler->override_option('arguments', array());
    $handler->override_option('title', 'Posts mais populares');
    $handler->override_option('use_pager', '0');
    $handler->override_option('style_plugin', 'list');
    $handler->override_option('style_options', array(
    'type' => 'ol',
    ));
    $handler->override_option('row_plugin', 'fields');
    $handler->override_option('row_options', array(
    'inline' => array(),
    'separator' => '',
    'hide_empty' => 1,
    ));
    $handler->override_option('block_description', '');
    $handler->override_option('block_caching', -1);
    $handler = $view->new_display('block', 'Bloco mais comentados', 'block_4');
    $handler->override_option('fields', array(
    'title' => array(
    'label' => '',
    'alter' => array(
    'alter_text' => 0,
    'text' => '',
    'make_link' => 0,
    'path' => '',
    'link_class' => '',
    'alt' => '',
    'prefix' => '',
    'suffix' => '',
    'target' => '',
    'help' => '',
    'trim' => 1,
    'max_length' => '50',
    'word_boundary' => 1,
    'ellipsis' => 1,
    'strip_tags' => 0,
    'html' => 0,
    ),
    'empty' => '',
    'hide_empty' => 1,
    'empty_zero' => 0,
    'link_to_node' => 1,
    'exclude' => 0,
    'id' => 'title',
    'table' => 'node',
    'field' => 'title',
    'override' => array(
    'button' => 'Use default',
    ),
    'relationship' => 'none',
    ),
    'comment_count' => array(
    'label' => '',
    'alter' => array(
    'alter_text' => 0,
    'text' => '',
    'make_link' => 0,
    'path' => '',
    'link_class' => '',
    'alt' => '',
    'prefix' => '',
    'suffix' => '',
    'target' => '',
    'help' => '',
    'trim' => 0,
    'max_length' => '',
    'word_boundary' => 1,
    'ellipsis' => 1,
    'strip_tags' => 0,
    'html' => 0,
    ),
    'empty' => '',
    'hide_empty' => 0,
    'empty_zero' => 0,
    'set_precision' => FALSE,
    'precision' => 0,
    'decimal' => '.',
    'separator' => '.',
    'prefix' => '(',
    'suffix' => ')',
    'exclude' => 0,
    'id' => 'comment_count',
    'table' => 'node_comment_statistics',
    'field' => 'comment_count',
    'override' => array(
    'button' => 'Use default',
    ),
    'relationship' => 'none',
    ),
    ));

    jQuery

    jQuery é uma biblioteca javascript que tem como filosofia "Fazer mais, com menos". Ela é a biblioteca javascript nativa do Drupal.

    Nesta seção você encontrará alguns trechos de código jQuery para incrementar seus sites Drupal.

    Normalmente estes trechos de código devem ser colocados em arquivos javascript em seu tema.

    Adicionando um texto "Pesquisar..." que some ao clicar no campo de busca.

    Este código adiciona um pequeno texto "Pesquisar..." ou qualquer outra coisa que você deseje no campo de texto de pesquisa. Ao clicar no campo, o texto desaparece automáticamente.

    O código está funcionando no campo de busca fornecido pelo tema, mas ele pode afetar qualquer outro campo, basta que você substitua #edit-search-theme-form-1 pelo id do campo requisitado.

    Crie um arquivo .js no seu tema, registre-o no arquivo seu_tema.info. Depois, escreva dentro do arquivo:

    $(function(){

    $('#edit-search-theme-form-1').attr('value','pesquisar...');
      $('#edit-search-theme-form-1').click(function(){
        $(this).attr('value','');
      });


    });

    Você pode ver este código funcionando neste site: http://www.daadmunipe.com/

    Existe uma variação deste código, onde o texto some ao se passar o mouse sobre o campo, e se o mouse sair de cima do campo e o mesmo continuar vazio, o texto "pesquisar..." retorna como valor do campo.

    $(function(){

    $('#edit-search-theme-form-1').attr('value','pesquisar...');
      $('#edit-search-theme-form-1').hover(function(){
        if($(this).attr('value')=='pesquisar...') {
          $(this).attr('value','');
        }
      },function(){
        if($(this).attr('value')=='') {
          $(this).attr('value','pesquisar...');
        }
      });


    });