Acrescentar um botão “salvar e cadastrar mais um” no Drupal 6
Recebi uma demanda de tornar “mais fácil” o cadastramento de um determinado tipo de conteúdo em um site desenvolvido com Drupal. Já se vai longe o tempo em que eu achava que eu sabia o que uma pessoa quer dizer quando fala em “mais fácil”. Seja como for, tentei fazer o que me pareceu sensato e fui tentar melhorar a aparência e funcionalidades do formulário.
Ontem, mais de três meses depois de implementadas as melhorias, o demandante percebeu que eu tinha colocado um botão “salvar e cadastrar mais um” no formulário. Curioso, ele me perguntou para que aquilo servia. Passada a fase das explicações (que aquele botão permite que você salve e cadastre mais um) ele ficou empolgado porque poderia cadastrar vários conteúdos daquele tipo em sequência. Ora essa, pensei comigo mesmo, quer dizer então que isso talvez sirva para alguma coisa, e decidi postar aqui como chegar a esse resultado.
O primeiro passo é criar seu próprio módulo customizado. Na verdade, recomendo que para todo site drupal você tenha um módulo customizado onde você possa colocar suas funções personalizadas. Aprenda aqui como criar seu módulo customizado.
Em seguida você vai usar um hook (gancho) fornecido pelo Drupal que permite você alterar os formulários fornecidos pelo sistema. Eu usei o hook_form_alter que permite alterar qualquer formulário. Para fazer com que o botão “cadastrar mais um” apareça para o tipo de conteúdo “mensagem”, use as seguintes funções (as explicações estão em comentários no código)
/*
* Implementação do hook_form_alter
* O Drupal procura nos módulos habilitados por funções que terminem com "_form_alter"
* e as executa no momento da construção do formulário.
*/
function meumodulo_form_alter(&$form, $form_state, $form_id){
//usando a função arg(), que recupera os argumentos da página
// podemos decidir quando aplicar nossas modificações
//Argumentos, para o Drupal, são informações passadas pela url, separadas por barra "/"
//Assim em exemplo.com.br/node/add, o argumento 0 é node e o argumento 1 é add
if (arg(0) == 'node' && arg(1) == 'add'){
if ( arg(2) == 'mensagem'){
$form['buttons']['novo']= array(
'#type' => 'submit',
//nome do botão
'#value' =>'Salvar e Cadastrar mais um',
//Peso (posição) do botão
'#weight'=> 5,
//Explicita uma função adicional a ser chamada quando o formulario for enviado
//a função node_form_submit é default para botões "enviar"
//a função meumodulo_novo_item é customizada para redirecionar o usuário
'#submit'=> array('node_form_submit','meumodulo_novo_item'),
'#post'=> array(),
'#programmed'=>FALSE,
'#tree'=>FALSE,
'#parents'=>array('novo'),
'#array_parents'=>array('buttons','novo'),
'#processed'=> TRUE,
'#description'=> NULL,
'#attributes' => array(),
'#required'=> FALSE,
'#input'=> TRUE,
'#name'=> 'op',
'#button_type'=>'submit',
'#executes_submit_callback'=> TRUE,
'#process' => array('form_expand_ahah'),
'#id'=> 'edit-novo',
'#defaults_loaded'=>TRUE,
'#sorted'=>TRUE
);
}
}
}
function meumodulo_novo_item($form, &$form_state){
//Incluir um item 'redirect' no $form_state
//Redireciona para uma nova página de criação de conteúdo do mesmo tipo
$form_state['redirect'] = array('node/add/'.arg(2));
}