Drupal 7 - ¿Cómo mostrar el formulario node / add / sometype en otra página?


Todo El problema es el siguiente:

Digamos que tenemos Artículos, Los Artículos pueden tener Pujas, Los Artículos pueden tener Preguntas y la Pregunta puede tener Respuesta.

Cuando se muestra un Elemento, también se debe mostrar todo el contenido asociado con este Elemento. Además, dependiendo de los roles, se deben mostrar ciertos formularios para hacer Ofertas, hacer Preguntas y repetir Respuestas.

¿Cómo lograr esto? ¿Debo tener un tipo de nodo separado para cada tipo? O debería tratar algunos subtipos como Preguntas y Respuestas como comentarios? ¿Debo usar algunos módulos conocidos para esto?

Estoy usando Drupal 7 e intenté escribir un módulo personalizado pero no lo conseguí funcionar correctamente.

Author: Laxman13, 2011-03-17

9 answers

Para obtener un formulario de edición de nodo, debe incluir el nodo .pagina.inc .

<?php
  // required for Drupal 6
  module_load_include('inc', 'node', 'node.pages'); 
  // which nodeform you want
  $node_type = 'YOURNODETYPE';
  $form_id = $node_type . '_node_form';
  // maybe add current users info
  global $user;
  // create a blank node
  $node = array(
    'uid' => $user->uid,
    'name' => (isset($user->name) ? $user->name : ''),
    'type' => $node_type,
  );
  // Invoke hook_nodapi and hook_node
  node_object_prepare($node);
  // Or you can also use an exiting node, for example
  // $node = node_load(123);
  // and the display the form:
  $output = drupal_get_form($form_id, $node);
?>
 19
Author: dobeerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-18 01:59:30
module_load_include('inc', 'node', 'node.pages');

$form = node_add('nodetype');
$output = drupal_render($form);

Si su formulario de nodo tiene un widget de carga de archivos, debe agregar las siguientes líneas al array de menú:

'file path' => drupal_get_path('module', 'node'),
'file' => 'node.pages.inc',
 33
Author: Marius Ilie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-01 09:05:47
// Drupal 7    
// Embed node creation form on a custom page inside module.
module_load_include('inc', 'node', 'node.pages');
$form = node_add('node_machine_name'); 
return drupal_render($form);
 5
Author: Kendrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-17 21:21:01

El Módulo Bloque de formulario es la forma más fácil de incrustar un formulario de nodo en una página. Luego usaría vistas con una pantalla de bloque y un argumento para mostrar una lista tabular de estos nodos relacionados.

Aunque el módulo de comentarios de Drupal 7 está construido en campos, realmente no es lo suficientemente flexible para cosas que no son como comentarios. Si desea que su subtipo tenga un título y un cuerpo, entonces los comentarios probablemente sean el camino a seguir. Si solo desea campos personalizados, entonces un nodo es el camino a seguir y posiblemente usando algo como Nodetitles automáticos.

Actualización para 2014: Si alguien prefiere agregar un bloque sin codificación, puede consultar el módulo Advanced Form Block, que agrega algunas características a sus bloques estándar (puede agregar tantos como desee, hacer que todos se envíen a través de AJAX e incluso seleccionar los campos que desee). A diferencia del módulo de bloque de formulario, todavía se mantiene activamente para Drupal 7.

 3
Author: Thomas4019,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 13:42:40

En Drupal 7 el nodo en blanco necesita ser creado como un objeto (no una matriz).

  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;
  $node->language = '';
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-16 09:12:52

La respuesta de Thomas me parece buena: Formblocks y tal vez nodetitles automáticos. Creo que podría ampliar eso con Nodereference URL Widget using usando nodereferences en lugar de comentarios, y dejando que ese módulo haga el trabajo de mantener los nodos hijos conectados a su padre.

 2
Author: user721183,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-22 22:11:59

Para que el ejemplo de dobeerman (la respuesta aceptada) funcione en d7, agregue 'language' => LANGUAGE_NONE y convierta la matriz node node en un objeto. es decir:

$node = (object)array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => $node_type,
  'language' => LANGUAGE_NONE
);
 1
Author: squall3d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-11 07:08:10

Estoy reproduciendo la solución que funcionó para mí en mi caso. está disponible como respuesta en Drupal.org y puede ayudar a otros con el mismo problema que yo estaba experimentando.

La respuesta está disponible aquí: https://www.drupal.org/node/1336212#comment-6192404.

Lo estoy copiando-pegando a continuación:

En su callback personalizado O en un hook_form_alter, llame a cualquiera...

<?php
form_load_include($form_state, 'inc', 'node', 'node.pages');
?>

...O...

<?php
form_load_include($form_state, 'inc', 'user', 'user.pages');
?>

...dependiendo de si el núcleo de Drupal forma la carga es un formulario de nodo o un formulario de usuario.

 1
Author: Marcos Buarque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-16 12:02:35

Así es como resolví el problema:

En mi hook_menu

$items['add-visiteur'] = array(
  'title' => 'Add',
  'page callback' => 'add_visiteur',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK,
);

Y mi función de devolución de llamada

function add_visiteur() {
  module_load_include('inc', 'node', 'node.pages'); 
  // which nodeform you want
  $node_type = 'visiteur';
  $form_id = $node_type . '_node_form';
  // maybe add current users info
  global $user;
  // create a blank node
  $node = new stdClass;
  $node->uid = $user->uid;
  $node->name = (isset($user->name) ? $user->name : '');
  $node->type = $node_type;

  // Invoke hook_nodapi and hook_node
  node_object_prepare($node);

  $output = drupal_get_form($form_id, $node);
  return $output;
}
 1
Author: Adrian Cid Almaguer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 16:49:39