Como customizar um formulário de node no Drupal 6 e 7

E outra coisa que os Drupaleiros brasileiros volta e meia se embolam é em como utilizar aquela tal de "FAPI", ou "Form API", também conhecida como "aquilo que você precisa saber para fazer módulos que customizem os formulários do Drupal".

Atenção: partirei do módulo criado em http://pedrorocha.net/2011/12/como-criar-um-m%C3%B3dulo-para-drupal-6-e-7

Qual meu objetivo com esse módulo: customizar a página de criação do node do tipo Página(page).

Drupal 6

No arquivo meuprimeiromodulo.module, adicionaremos o seguinte trecho de código:

function meuprimeiromodulo_form_page_node_form_alter(&$form, &$form_state) {
  // Exemplo de como mudar o título
  drupal_set_title("Eu quero mudar o título do formulário");
  // Exemplo de como mudar o tamanho do campo body
  $form['body_field']['body']['#rows'] = 3;
  // Exemplo de como mudar o texto do botão "Salvar"
  $form['buttons']['submit']['#value'] = 'E também quero mudar o botão salvar';
  // Exemplo de como adicionar uma função específica sua para ser executada ao 
  // salvar o node
  $form['#submit'][] = 'meuprimeiromodulo_meu_submit_especial';
}

function meuprimeiromodulo_meu_submit_especial() {
  /* Aqui vai seu código */
}

Drupal 7

No arquivo meuprimeiromodulo.module, adicionaremos o seguinte trecho de código:

function meuprimeiromodulo_form_page_node_form_alter(&$form, &$form_state) {
  // Exemplo de como mudar o título
  drupal_set_title("Eu quero mudar o título do formulário");
  // Exemplo de como mudar o tamanho do campo body
  $form['body']['und'][0]['#rows'] = 3;
  // Exemplo de como mudar o texto do botão "Salvar"
  $form['actions']['submit']['#value'] = 'E também quero mudar o botão salvar';
  // Exemplo de como adicionar uma função específica sua para ser executada ao 
  // salvar o node
  $form['#submit'][] = 'meuprimeiromodulo_meu_submit_especial';
}

function meuprimeiromodulo_meu_submit_especial() {
  /* Aqui vai seu código */
}

O que aconteceu aqui

Esse funcionamento foi alcançado através do hook_form_FORMID_alter(), que foi implementado com a função meuprimeiromodulo_form_page_node_form_alter. O hook funciona da seguinte forma:

  1. substitua a parte "hook" pelo nome do seu módulo(no nosso caso: meuprimeiromodulo"
  2. substitua a parte FORMID pelo valor do campo "form_id" do formulário que você quer alterar(dica: basta ver o código-fonte da página em que o formulário que você quer alterar está, e procurar por "form_id", que rapidamente irá achar), que no nosso caso foi "page_node_form"(page é o tipo de conteúdo, então outros nodes seguem a mesma regra, como cadastro_node_form, por exemplo)
  3. a variável $form guarda as informações sobre a estrutura do formulário, com um array bem estruturado e completo, aonde você pode alterar tudo antes de ir para a tela
  4. a variável $form_state guarda os valores com que o formulário foi preenchido(se é um novo node, o formulário virá vazio, então não terá muito valor nesse momento, mas sim em uma validação, etc)
  5. de resto, os comentários no próprio código já explicam

That's all folks!

obs: sintam-se a vontade para criticar, tirar dúvidas, questionar algo que possa ser feito melhor, etc

Tags: 

Categoria: