Tudo bem galera?
Vamos à segunda parte do nosso módulo custom_view. Veja aqui a primeira parte. Nessa etapa teremos que fazer algumas mudanças no nosso módulo.
Primeira mudança:
Iremos até o arquivo custom_view.admin.inc, no hook custom_view_form($form, &$form_state) e adicionaremos a função t($string, array $args = array(), array $options = array()) nos textos que queremos traduzir.
Fica dessa forma:
$form['title'] = array( '#type' => 'checkbox', '#title' => t('Title'), '#description' => t('Let scheduled to appear the title'), ); $form['capital'] = array( '#type' => 'checkbox', '#title' => t('Capital'), '#description' => t('Let scheduled to appear in capital'), ); $form['inhabitant'] = array( '#type' => 'checkbox', '#title' => t('Inhabitants'), '#description' => t('Let scheduled to appear the number of inhabitants'), );
Com essa função t($string, array $args = array(), array $options = array()) podemos traduzir os texto para qualquer idioma na interface do drupal.
Segunda mudança:
Ainda no arquivo custom_view.admin.inc, no hook custom_view_form($form, &$form_state), modificaremos o tipo do campo ‘pagination’.
Fica dessa forma:
$form['pagination'] = array( '#type' => 'select', '#title' => t('Items per page'), '#options' => array( 5 => 5, 10 => 10, 15 => 15, ), '#default_value' => 10, '#description' => t('Number of items per page'), ); O tipo do campo que antes era 'checkbox' alteramos para 'select'. Adicionamos a função t() nos texto. Criamos os '#options' com seus respectivos valores.
Agora iremos dar continuidade no desenvolvimento da segunda etapa. Só para relembrar, veja os passos que seguiremos:
1 – Criação de um modulo. OK
2 – Implementação do hook_menu(). OK
3 – Criação de um form na área administrativa. OK
4 – Criação do submit do form.
5 – Manipulação de variable_get($name, $default = NULL) e variable_set($name, $value).
6 – Implementação do hook_theme($existing, $type, $theme, $path).
7 – Criação de um template.
Já criamos o módulo custom_view (passo 1), implementamos o hook_menu() (passo 2), criamos o form (passo 3) e agora iremos desenvolver os demais passos.
Passo 4: manipulação de variable_set() e criação do submit do form.
Dentro do arquivo custom.view.admin.inc iremos criar o submit do form
/** * Implements form submit */ function custom_view_form_submit($form, &$form_state) { variable_set('form_values', $form_state['values']); $form_state['redirect'] = "custom-view/view/brazilian_states"; }
4 – No Drupal essa função segue a seguinte nomenclatura, form ID + _submit. Dessa forma temos, custom_view_form seguido por _submit. O primeiro parâmetro é um array contendo as informações do próprio form. Ex: campos, action, method, theme, validate, id do form, etc. O segundo paramento é um array com o estado do form após o submit.
5 – Criação de uma variável persistente, cujo valor são as informações enviadas no form.
6 – Modificamos o redirect do form. Após o submit sermos direcionado para a url ‘custom-view/view/brazilian_states’.
7 – Fechamos o form submit.
Vamos voltar no arquivo custom_view.module e vamos criar a rota de menu para o redirect do form. Antes do return adicionem o seguinte trecho de código.
$items['custom-view/view/brazilian_states'] = array( 'title' => t('Listing'), 'page callback' => 'custom_view_views', 'access arguments' => array('administer custom view'), 'access callback' => TRUE, 'type' => MENU_CALLBACK, 'file' => 'custom_view.admin.inc', );
1 – Criaremos uma nova rota que irá nos direcionar para uma página com os resultados de uma consulta no banco de dados (iremos criar).
2 – Título para a pagina
3 – Função responsável por criar nossa pagina
4 – Permissão para acessar a rota do menu
5 – Permissão ao usuário para acessar o menu
6 – Registra uma caminho (url). Existem outros tipos de menu. Dê uma olhada emhttp://goo.gl/xa0s4 para maiores informações.
7 – Arquivo onde criaremos a nossa função callback.
8 – Fechamos a rota do menu.
Passo 5: Manipulação de variable_get($name, $default = NULL).
Agora iremos criar a função callback da rota de menu que acabamos de criar. Vamos para o arquivo custom_view.admin.inc
/** * Function callback of menu */ function custom_view_views() { $form_field = variable_get('form_field'); $content_view = array(); $query = new EntityFieldQuery(); $query ->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'brazilian_states') ->pager($form_field['pagination']); $result = $query->execute(); foreach ($result['node'] as $key => $node) { $node_info = node_load($node->nid); if ($form_field['title'] == 1) { $content_view[$node_info->nid]['title'] = $node_info->title; } if ($form_field['capital'] == 1) { $capital = entity_metadata_wrapper('node', $node_info); $content_view[$node_info->nid]['capital'] = $capital->field_capital->value(); } if ($form_field['inhabitant'] == 1) { $inhabitant = entity_metadata_wrapper('node', $node_info); $content_view[$node_info->nid]['inhabitant'] = $inhabitant->field_inhabitants->value(); } } $output = theme('custom_view_result', array( 'content_view' => $content_view, )); $output .= theme('pager'); return $output; }
4 – Criação da função.
5 – Recuperamos os valores da variável persistente, criada anteriormente no submit do form.
6 – Declaramos uma variável que receberá os valores que iremos passar para a função theme.
8 – Estanciamos o objeto responsável por listar o nosso conteúdo cadastrado.
9, 10 e 11 – Chamamos o método entityCondition($name, $value, $operator = NULL) e passamos algumas condições, primeiro o tipo de entidade e em seguida a própria entidade (node). Na segunda chamada do método passamos bundle e o tipo do bundle (brazilian_states).
12 – Adiciona a paginação e recebe como parâmetro a quantidade de itens por página.
13 – Executa a query e adiciona o resultado em uma variável
15 – Itera sobre a variável com os resultados da query
16 – Carrega as informações do(s) node(s).
18, 22 e 27 – Verifica se os campos ‘Título, Capital e Habitantes’ foram marcados no form. Assumindo que o valor 1 é para o checkbox marcado.
19, 24 e 29 – Adiciona os campos ao array que será passado para o template.
20, 25, 30– fecha a verificação.
23 e 28 – Utilizamos o método entity_metadata_wrapper($type, $data = NULL, array $info = array()) para abstrair o valor desse campo.
31 – fechamos o iterador
33 – Chamamos a função theme($hook, $variables = array()) onde informaremos o hook responsável pelo nosso theme.
34 – Passamos uma variável com os valores para hook_theme($existing, $type, $theme, $path).
35 – Fechamos o array e a função theme($hook, $variables = array()).
37 – Concatenamos mais um hook_theme($existing, $type, $theme, $path) a variável ‘$output’. Esse theme é responsável por renderizar a paginação.
38 – Retornamos a variável output.
39 – Finalizamos a função callback.
Passo 6: Implementação do hook_theme($existing, $type, $theme, $path)
Vamos realizar a implementação no arquivo custom_view.module
/** * Implements hook_theme(). */ function custom_view_theme($existing, $type, $theme, $path) { return array( 'custom_view_result' => array( 'variables' => array('content_view' => NULL), 'template' => 'view_result', 'path' => drupal_get_path('module', 'custom_view') . '/themes', ), ); }
4 – Implementação do hook_theme($existing, $type, $theme, $path)
5 – Retorna um array com as informações para criação do template
6 – Um sub array onde a chave é o nome do theme que chamamos na função callback.
7 – Onde passamos os valores das variáveis para o template.
8 – O nome do arquivo onde será o template. Não precisa adicionar extensão do arquivo.
9 – O caminho do arquivo. Utilizaremos a função drupal_get_path($type, $name) para retornar o caminho do módulo
10 – Fechamos o array do theme.
11 – Fechamos o array que será retornado.
12 – Fechamos o hook_theme($existing, $type, $theme, $path).
Passo 7: Criação de um template.
Agora vamos dentro da pasta custom_view e iremos criar uma pasta chamada themes. Dentro dessa pasta iremos criar um arquivo chamado view_result.tpl.php . Dentro desse arquivo vamos criar o template.
foreach ($content_view as $key => $value) { if (isset($value['title'])) { print($value['title']."<br>"); } if (isset($value['capital'])) { print($value['capital']."<br>"); } if (isset($value['inhabitant'])) { print($value['inhabitant']."<br>"); } print(""); }
1 – Iremos iterar sobre a variável passada para o hook_theme($existing, $type, $theme, $path)
2, 5 e 8 – Iremos verificar se as variáveis existem
3, 6 e 9 – Aqui vamos imprimir as variáveis na tela caso elas passem pela verificação
4, 7 e 10 – Fechamos as verificações
11 – Vamos imprimir uma linha, apenas para separar os resultados da paginação
12 – Fechamos o iterador
Após isso limpem o CACHE.
Bom pessoal é isso, qualquer dúvida, critica, sugestão ou ameaça deixem um comentário. Lembrando que existem módulos que fazem esse trabalho de uma forma mais amigável. Mas para título de aprendizagem e conhecimento de hooks e funções do drupal essa sequencia de posts serve que é um beleza. Até a próxima.
Artigo publicado originalmente em Drupal de Elite http://drupaldeelite.com.br/blog/listando-conteudo-programaticamente-2