Boa tarde!
Hoje vou ensinar a como criar um formulário programaticamente e fazer com que suas informações vá para dentro de um tipo de conteúdo.
Antes de continuar é necessário ler esse meu outro post, como criar um módulo no Drupal 7. Para saber como criar um módulo.
Crie seu módulo como é ensinado no post linkado acima. Eu farei o meu da seguinte forma.
Criei uma pasta em /sites/all/modules/meuformulario
Com os arquivos:
-
meuformulario.info
-
meuformulario.module
Dentro do meuformulario.info coloque isso:
name = Meuformulario
description = Meu pequeno formulario customizado
core = 7.x
; Information added by drupal.org packaging script on 2011-12-05
version = "7.x-0.1"
Não esqueça de limpar o cache para o Drupal reconhecer o novo módulo na interface. Quem usa Drush pode limpar o cache com esse comando no terminal do seu linux ou windows:
drush cc all
Para quem não usa Drush vá em Configurações (Configuration) >> Desempenho (Performance) dentro dessa página conterá um botão chamado limpar todos os caches (Flush all caches).
Feito isso é necessário habilitar o módulo. A ativação pode ser por dois caminhos, pelo drush:
drush en meuformulario
Ou via interface. Vá em módulos (modules) procure a categoria Outros (Others) marque o checkbox ao lado do módulo e vá ao final e parte o botão salvar (save).
Pronto! Nesse momento seu módulo já está ativo no Drupal.
Agora vamos criar o local que irá aparecer o nosso formulário :-)
Antes de criar o formulário propriamente dito precisamos definir em qual local ele deverá aparecer.
Então faça a seguinte pergunta: Esse formulário irá aparecer numa página ou num bloco? Ou então em ambos?
No nosso caso faremos o formulário aparecer na sua própria página.
Para isso precisamos utilizar um tipo de hook especial chamado hook_menu().
Resumindo hook_menu é uma função que te auxilia a registrar caminhos para encontrar suas pages, forms criadas programaticamente e entre outras coisas. Para quem conhece o padrão de projeto MVC pode se dizer que o hook_menu faz mais ou menoso papel de um controller.
Pois bem, agora entre no seu arquivo meuformulario.module e escreva o seguinte:
<?php
function meuformulario_menu() {
$items['meuformulario'] = array(
'title' => 'Título do meu formulário',
'page callback' => 'drupal_get_form',
'page arguments' => array('meuformulario_form'),
'access callback' => TRUE,
);
return $items;
}
function meuformulario_form($form, &$form_state) {
return $form;
}Toda vez que é utilizado um novo hook_ é necessário limpar o cache, então execute o mesmo comando de limpeza de cache ensinado acima.
Feito a limpeza vá ao navegador e digite:
Se tudo estiver certo você verá isto:

Se conseguir chegar até aqui parabéns! Já chegamos na metade do caminho :-)
Antes de continuar vou explicar o que foi feito acima.
Após criar o hook_menu eu defini um novo local de acesso chamado meuformulario. Mas para criar um novo local eu preciso passar alguns parâmetros:
-
title: É o título que aparecerá no topo do navegador.
-
Page callback: É o que retornará dessa página. No nosso caso estamos retornando uma chamada de formulário, drupal_get_form nada mais é que uma função que carrega um formulário.
-
No page arguments: passamos o parâmetro que será usado no drupal_get_form, nesse caso é o nome da função que escrevemos logo após o hook_menu, meuformulario_form.
-
Access callback: É para definir se o acesso é permitido ou não a essa página.
Depois de criado o hook precisamos criar a função que irá gerar o formulário. Até esse momento já foi criado tal função só que ela ainda está vazia.
Para esse formulário vamos usar como base o campos do tipo de conteúdo Artigo (Article). Nesse tipo de conteúdo nós possuimos somente dois campos como entrada de texto, título (title) e o corpo (body).
Será usado o padrão Forms API para criar os dois campos.
function meuformulario_form($form, &$form_state) {
$form['titulo'] = array(
'#type' => 'textfield',
'#title' => t('T[itulo'),
'#default_value' => '',
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
);
$form['corpo'] = array(
'#title' => t('Corpo'),
'#type' => 'textarea',
'#description' => t('Descrição breve'),
'#default_value' => ''
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Enviar'));
return $form;
}Após escrever esses comandos salve e recarregue a página meuformulario e será isso que você verá:

Veja o que significa cada parâmetro declarado acima:
-
Type: É a declaração que define de que tipo seu campo será: textfield, textarea, select e etc...
-
Title: É o título que irá ao lado ou acima do campo.
-
Size: É o tamanho do campo própriamente dito e não a capacidade que pode ser escrito.
-
Maxlength: Esse sim é a capacidade de caracteres pode ser digitado.
-
Default_value: Serve para deixar alguma informação já escrita na hora que carregar o formulário.
-
Description: Serve para você colocar qualquer tipo de informação que desejar.
-
Required: Define se esse campo é de preenchimento obrigatório ou não.
Existem muitos outros parâmetros específicos ou não para cada tipo de campo, para maiores detalhes visite a página Forms API.
Entendido para que serve cada parâmetro declarado podemos ir para o próximo nivel de entendimento de um formulário criado programatiicamente.
Todo formulário criado por linha de programação precisa respeitar duas regras básicas, criar a função _form propriamente dita e criar sua função de submissão que é onde o formulário saberá pra onde deverá enviar as informações capturas no formulário.
Agora crie a seguinte função:
function meuformulario_form_submit($form, &$form_state) {
echo "<pre>";
print_r($form_state['values']);
exit;
}Esses três comandos dentro da função serve para debugar o que está dentro do form_state, para quem já é mais avançando em Drupal pode usar a função de debug do módulo Devel que é bastante recomendo para quem ainda não está acostumado com as matrizes e objetos gigantes que o Drupal gera rsrsrs.
Preencha o formulário e o submeta. Logo após o submit você deverá ver isso:

Esse pequeno debug servirá para você saber como pegar os valores de cada campo e assim enviar para objeto que será usado para registrar esses valores no tipo de conteúdo artigo.
Agora é o mais esperado! A parte final para que todo esse nosso trabalho funcione 100% como esperado!
function meuformulario_form_submit($form, &$form_state) {
$node = new stdClass();
$node->type = 'article'; // Machine name: article. Encontra em: admin/structure/types
node_object_prepare($node); // Função que define propriedades default de um node
$node->title = $form_state['values']['titulo'];
$node->language = LANGUAGE_NONE; //Como náo estamos trabalhando com multi-idiomas utilize essa constante
$node->body[$node->language][0]['value'] = $form_state['values']['corpo'];
$node->body[$node->language][0]['summary'] = text_summary($node->body[$node->language][0]['value']); //Para criar uma chamada
$node->body[$node->language][0]['format'] = 'filtered_html'; //Para definir que o texto pode receber um formato filtrado de html
node_save($node); //Salva o objeto no tipo de conteúdo article no banco de dados
if(!empty($node->nid)){ //Se for diferente de vazio o cadastro foi bem sucedido.
drupal_set_message('Cadastro efetuado com sucesso!', 'status');
}else{
drupal_set_message('Houve algum problema no cadastro.', 'error');
}
//Após o submissão com sucesso ou não o usuário será enviado de volta ao formulário com uma mensagem de aviso.
$form_state['redirect'] = array(
'meuformulario',
);
}Após programar as linhas acima, volte ao formulário e preencha-o. Caso obtenha sucesso será essa informação que deverã aparecer.

Se a caixa verde apareceu para você, SUCESSO ! Você conseguiu executar tudo corretamente! Para verificar se o conteúdo foi realmente cadastrado clique em find content (admin/content). Não esqueça que você precisa estar logado para acessar essa parte da administração.
Ẽ isso ai pessoal demorei, mas postei! Espero que gostem, por que da um trabalhão danado escrever com tantos detalhes!
Mais um detalhe estou anexão o módulo que fiz para criar esse post, para quem quiser testá-lo :-)
Baixe aqui!
Um bom final de domingo a todos!
Fui!