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.
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.
Respuestas:
Puedes usar:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
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 )
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_add
función, copié el código y eliminé el drupal_set_title
. El código anterior es el mismo código que la node_add
funció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';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
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 return
de editar el $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;