Importância do array_filter com checkboxes

Events happening in the community are now at Drupal community events on www.drupal.org.
patrickespake's picture

Esses tempos quebrei a cabeça achar a solução de um problema desenvolvendo um módulo em Drupal.

Eu estava criando um módulo que exibe um formulário personalizado nos conteúdos, na área de configurações do módulo o usuário pode escolher quais tipos de nodes irão conter esse formulário personalizado.

O que eu fiz foi criar várias checkboxes, uma para cada tipo de node, o usuário seleciona e o formulário personalizado irá aparecer no node.

Eu usei o seguinte o hook_menu para fazer isso chamando uma outra função para criação do formulário de configuração do módulo.

Fiz assim:
/**
* Implementação do hook_menu().
* @param boolean $may_cache
* True para conteúdo cacheado.
* @return array
* Informações de criação do(s) menu(s).
*/
function meumodulo_menu($may_cache) {

if(!$may_cache) {
$itens = array();
$itens[] = array(
'path' => 'admin/settings/meumodulo',
'title' => t('Destination'),
'description' => t('Configure meumodulo.'),
'callback' => 'drupal_get_form',
'callback arguments' => 'meumodulo_admin_settings',
'access' => user_access('access meumodulo pages')
);

return $itens;

} // function meumodulo_menu

/**
* Callback para admin/settings/meumodulo
* @return array
* Com as informações de criação do formulário.
*/
function meumodulo_admin_settings() {

$form['meumodulo_nodetypes'] = array(
'#type' => 'checkboxes',
'#title' => t('Users may meumodulo these node types'),
'#options' => node_get_types('names'),
'#default_value' => variable_get('meumodulo_nodetypes', array('story')),
'#description' => t('A combobox will be available on these node types to make user-specific meumodulo.')
);

return system_settings_form($form);

}

/**
* Implementação do hook_form_alter().
* @param string $form_id
* Representa o nome do formulário.
* @param array $form
* Elementos que compõem o formulário.
*/
function meumodulo_form_alter($form_id, &$form) {

if (in_array($form['#node']->type, variable_get('meumodulo_nodetypes', array('story')))) {

... meu formulário aqui ...

}

}

Desta forma não funcinou, o formulário do módulo acabava aparecendo em outros nodes, quebrei a cabeça para resolver isso, tentei inserir outras informações para validar a exibição e nada funcinou. Porque a condição sempre retornava TRUE no hook_form_alter

O problema que acontecia era que o array geraldo vinha da seguinte forma:
Array
(
[page] => page
[story] => story
[blog] => 0
)

Esse valor [blog] => 0, que gerava a condição TRUE para todos os nodes. Se você analisar esse array está estranho a melhor forma seria ser apresentando da seguinte forma:

Array
(
[0] => page
[1] => story
)

Apenas exibindo os nodes marcados. Essa é forma correta, o array ficando desta forma tudo funciona perfeitamente e somente os nodes marcados exibem o formulário do módulo.

Eu descobri que existe uma linha de código que soluciona esse problema e gera o array no formato correto.

Basta inserir na função meumodulo_admin_settings o seguinte código:

$form['array_filter'] = array('#type' => 'hidden');

Ficando a função da seguinte forma:

/**
* Callback para admin/settings/meumodulo
* @return array
* Com as informações de criação do formulário.
*/
function meumodulo_admin_settings() {

$form['meumodulo_nodetypes'] = array(
'#type' => 'checkboxes',
'#title' => t('Users may meumodulo these node types'),
'#options' => node_get_types('names'),
'#default_value' => variable_get('meumodulo_nodetypes', array('story')),
'#description' => t('A combobox will be available on these node types to make user-specific meumodulo.')
);

$form['array_filter'] = array('#type' => 'hidden');

return system_settings_form($form);
}

Fazendo isso tudo funciona.

Mais informações: http://drupal.org/node/61760

Brasil

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: