Incruste un formulario "agregar nodo" en una página

19

Estoy buscando una forma de incrustar un formulario "agregar nodo" en una página de destino. Estaba usando Form Block , pero parece traer muchos errores porque estaba usando una versión de instantánea de desarrollo.

Ousneo
fuente
1
Si tiene problemas específicos con el bloque de formulario, el mejor lugar para buscar puede ser la cola de problemas para ese módulo.
Jeremy French

Respuestas:

28

Puedes usar:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Daniel Wehner
fuente
3
Si obtiene un error que node_add()no está definido, querrá agregarlo if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }al principio. Esta información proviene de aquí: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
mbrakken
¿Hay alguna manera de poner esto en un bloque? ¿O tiene que incluirse esto en el archivo tpl.php?
No puedo usar el código para el formulario con elementos Ajax (por ejemplo: carga de archivos). Posible solución
Dimetry
@Dimetry ve mi respuesta para usar elementos Ajax en un formulario de nodo incrustado.
Елин Й.
16

Aunque la respuesta de Daniel Wehner es absolutamente correcta y funciona, quería agregar dos problemas comunes que enfrenté con este enfoque y soluciones para superar esos problemas. Primero mi código, luego las explicaciones:

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 qué lo hice así, en lugar de lo simple de Daniel node_add?

Problema 1: la node_add()función cambia el título de la página a Crear 'tipo de nodo' , esto está codificado en la función.

Solución 1: en lugar de usar la node_addfunción, copié el código y eliminé el drupal_set_title. El código anterior es el mismo código que la node_addfunción, excepto de esta línea.

Problema 2: en la forma incrustada, algunas funciones ajax no funcionaron. Por ejemplo, si tiene un campo que puede tener valores ilimitados, de modo que tiene un botón 'Agregar otro elemento', o si tiene un campo de archivo de carga en su formulario, no funcionan.

Solución 2: en su módulo personalizado, implemente hook_menu_alter()para rutas de llamada ajax e incluya 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';
}
Елин Й.
fuente
¿Inline Entityform sería una alternativa? He estado jugando con el módulo pero no he podido mostrar un formulario de agregar nodo en el front-end, solo cuando editas un nodo puedes proporcionar un campo de referencia de entidad que muestre un formulario de agregar nodo.
AlxVallejo
1
Inline Entityform es para campos de referencia de entidad, lo cual es irrelevante para esta pregunta.
Елин Й.
1
Si no desea utilizar hook_menu_alter () para cargar archivos, etc., puede agregar la inclusión en un formulario alter para el formulario de nodo en su lugar: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash
@ ЕлинЙ. ¿Su respuesta se aplica a esta pregunta ?
Umair
1
@Umair Mi respuesta es solo sobre agregar un formulario de nodo a una página. No enviaría el formulario a través de AJAX ni actualizaría la vista. Sin embargo, puede lograr los que usan AJAX Framework .
Елин Й.
0

Si uso el código de respuesta aceptado ...

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);

... dentro de una función de devolución de llamada de página, print drupal_render..esto da como resultado una página completamente sin tema (aspecto roto).

Entonces, en cambio, acabo returnde editar el $form:

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