Estou procurando uma maneira de incorporar um formulário de "adição de nó" em uma página de destino. Eu estava usando o bloco de formulário , mas parece trazer muitos erros porque estava usando uma versão de instantâneo de desenvolvimento.
Estou procurando uma maneira de incorporar um formulário de "adição de nó" em uma página de destino. Eu estava usando o bloco de formulário , mas parece trazer muitos erros porque estava usando uma versão de instantâneo de desenvolvimento.
Respostas:
Você pode usar:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
indefinido, adicione if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
-o no início. Esta informação vem de aqui: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Embora a resposta de Daniel Wehner esteja absolutamente correta e funcione, eu queria adicionar dois problemas comuns que enfrentei com essa abordagem e soluções alternativas para superar esses problemas. Primeiro meu código, depois as explicações:
global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => 'YOUR_NODE_TYPE',
'language' => LANGUAGE_NONE,
);
$form = drupal_get_form('YOUR_NODE_TYPE . '_node_form', $node);
print drupal_render($form)
Por que fiz dessa maneira, em vez das simples de Daniel node_add
?
Problema 1: a node_add()
função altera o título da página para Criar 'tipo de nó' , isso é codificado na função.
Solução alternativa 1: em vez de usar a node_add
função, copiei o código e removi o drupal_set_title
. O código acima é o mesmo código da node_add
função, exceto nesta linha.
Problema 2: No formulário incorporado, algumas funções do ajax não funcionavam. Por exemplo, se você possui um campo que pode ter valores ilimitados, para ter um botão "Adicionar outro item" ou se possui um campo de upload de arquivo em seu formulário, eles não funcionam.
Solução alternativa 2: em seu módulo personalizado, implemente hook_menu_alter()
para caminhos de chamada ajax e inclua node.pages.inc
.
function YOURMODULE_menu_alter(&$items) {
$items['file/ajax']['file path'] = drupal_get_path('module', 'node');
$items['file/ajax']['file'] = 'node.pages.inc';
$items['system/ajax']['file path'] = drupal_get_path('module', 'node');
$items['system/ajax']['file'] = 'node.pages.inc';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Se eu usar o código da resposta aceita ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... dentro de uma função de retorno de chamada da página, print drupal_render..
isso resulta em uma página completamente sem tema (aparência quebrada).
Então, em vez disso, eu apenas return
editei $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;