Incorporar um formulário de "adição de nó" em uma página

19

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.

ousneo
fonte
1
Se você estiver tendo problemas específicos com o bloco de formulários, o melhor local para procurar pode ser a fila de problemas desse módulo.
Jeremy French

Respostas:

28

Você pode usar:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Daniel Wehner
fonte
3
Se você receber um erro 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 )
mbrakken
Existe uma maneira de colocar isso em um bloco? Ou isso precisa ser incluído no arquivo tpl.php?
Não consigo usar o código para o formulário com elementos Ajax (por exemplo: upload de arquivo). Solução possível
Dimetry
@ Dimetry, veja minha resposta para usar elementos Ajax em um formulário de nó incorporado.
Елин Й.
16

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_addfunção, copiei o código e removi o drupal_set_title. O código acima é o mesmo código da node_addfunçã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';
}
Елин Й.
fonte
O Inline Entityform seria uma alternativa? Venho brincando com o módulo, mas não consegui exibir um formulário de adição de nó no front-end, somente quando você edita um nó é possível fornecer um campo de referência de entidade que exibe um formulário de adição de nó.
AlxVallejo
1
Inline Entityform é para campos de referência de entidade, o que é irrelevante para esta pergunta.
Елин Й.
1
Se você não quiser usar hook_menu_alter () para upload de arquivos, etc., poderá incluir a inclusão em um formulário alter para o formulário do nó: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash
@ ЕлинЙ. Sua resposta se aplica a esta pergunta ?
Umair
1
@Umair Minha resposta é apenas sobre como adicionar um formulário de nó a uma página. Ele não enviaria o formulário via AJAX nem atualizaria a exibição. No entanto, você pode alcançar aqueles que usam o AJAX Framework .
Елин Й.
0

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 returneditei $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
alec
fonte