Listando conteúdo programaticamente #2

Listando conteúdo programaticamente #1. 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

Tudo bem galera?

Vamos à segunda parte do nosso módulo custom_view. Para quem não leu a primeira parte, segue o link: Listando conteúdo programaticamente #1. 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 em http://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("<hr>");
}

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.