Crear nodos y nodos de referencia al mismo tiempo

7

Tengo una situación en la que me gustaría poder crear nodos y nodos de referencia al mismo tiempo. ¿Hay alguna solución para esto que funcione bien para esto?

Para aclarar de lo que estoy hablando, considere la siguiente situación ( muy simplificada en aras de la explicación):

Hay una clase de tipo de contenido que tiene un campo referenciado de nodo, Estudiante . Me gustaría que los usuarios puedan crear nodos de clase y nodos de estudiantes al mismo tiempo. También me gustaría que puedan usar el autocompletado de referencia de nodo normal para elegir un Estudiante que ya existe.

Idealmente, me gustaría que todo esto funcione desde una sola página, y también que funcione dentro de los límites del sistema de permisos de Drupal para que pueda tener varios roles y varios permisos.

Sí, sé que en este caso , sería mejor que el Estudiante sea ​​un usuario (en lugar de un nodo), pero Clase y Estudiante son solo para ilustrar la situación. El escenario real realmente necesita referencias de nodo.

Hay una pregunta similar a esto, Crear nodos referenciados junto con el nodo padre , pero estoy específicamente interesado en las soluciones de Drupal 7 únicamente.

EDITAR:

No solo busca módulos existentes, sino que también comienza el código personalizado.

mpdonadio
fuente
En Drupal 7, he escrito un código personalizado para hacer esto en mis sitios, simplemente porque aún no hay soluciones basadas en módulos que se me ocurran. Incluso puede lanzar un formulario para crear el nodo del estudiante en un modal ctools, luego pasar el nid al formulario del nodo original usando ajax_command_data () u otra función de transferencia de datos ajax.
geerlingguy
@geerlingguy, si escribe eso como una respuesta (especialmente un comienzo para la transferencia de nid del módulo AJAX), se consideraría seriamente como una respuesta.
mpdonadio
Lo haré en un rato.
geerlingguy 01 de

Respuestas:

4

Utilizo el cuadro de diálogo Referencias , que pone un pequeño "+" en los campos de referencia existentes, lo que permite al usuario crear un nuevo alumno directamente desde el formulario de edición del nodo de clase .

Letharion
fuente
¿Alguien ha usado este módulo? Me encantaría escuchar algunos comentarios sobre las versiones alfa.
David John Smith
FYI Acabo de instalar este módulo y parece encajar perfectamente.
David John Smith
8

Para un par de sitios diferentes ahora, he hecho esto usando un modal ctools, y aquí está el resumen básico de cómo lo implementé (muy simple):

  • Cree una devolución de llamada de página personalizada en el hook_menu () de su módulo que muestre un formulario de nodo básico para el nodo al que desea hacer referencia (para un nodo 'estudiante', solo tenga un campo de nombre y quizás un campo de año de graduación). En ese formulario, en su devolución de llamada de envío, guarde el nodo usando node_save () y almacene el ID del nodo (que debe estar en $ node-> nid después de pasar un nuevo objeto de nodo a node_save ()) en el formulario $form_state['storage']['student_id'].

  • Modifique la forma del nodo maestro / clase usando hook_form_alter () . Necesita hacer algunas cosas aquí:

Primero, debe agregar el javascript y la funcionalidad modal de ctools para que ctools sepa qué hacer con su enlace especial:

// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();

En segundo lugar, debe agregar un enlace a la devolución de llamada de la página que creó en el paso 1 en el menú de enlace, y con ese enlace, agregue la clase 'ctools-use-modal'. Así por ejemplo:

// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
  '#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
  • En la devolución de llamada de su página personalizada, debe hacer algunas cosas para que funcione con o sin JavaScript, y con las funciones de formulario de ctools.

Aquí hay un ejemplo de devolución de llamada:

<?php
function mymodule_student_form_callback($js = FALSE) {
  // Make sure $js (set by ctools) is TRUE/loaded.
  if ($js) {
    // Add in ctools modal form stuff.
    ctools_include('modal');
    ctools_include('ajax');
    $form_state = array(
      'ajax' => TRUE,
      'title' => t('Create a Student'),
    );

    $output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
  }
  else {
    return 'Javascript must be enabled for this feature to work.';
    // Or, if we wanted to load the form normally...
    // return drupal_get_form('mymodule_create_student_form');
  }

  // If the form is executed, dismiss the form and reload the page.
  if ($form_state['executed']) {      
    $commands = array();

    // Close the frame.
    $commands[] = ctools_modal_command_dismiss();

    // Use one of the ajax framework commands to place the returned
    // student node nid into the proper form value, placholder div, etc.
    // See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
    $commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);

    $output = $commands;
  }

  // Render the output.
  print ajax_render($output);
  exit();
}
?>
  • En mymodule_create_student_form($form, $form_state), cree su formulario como lo haría normalmente, y luego, en la función mymodule_create_student_form_submit(form, &$form_state)(enviar), establezca el valor del NID del nodo de estudiante recién creado $form_state['storage']['student_id']. Así es como obtendrá ctools / AJAX para devolver el nuevo nid a su formulario de clase original.

  • En mi situación, estaba usando el modal para escupir algo de marcado a la página original, así que pasé el marcado a un marcador de posición usando ajax_command_append(), luego tuve un jQuery en la página original monitoreando el marcador de posición div, y cuando encontró contenido en , movería el HTML al lugar apropiado en otro lugar del formulario de nodo. En su caso, deberá completar un campo de referencia de nodo único o de valores múltiples, que puede ser un poco más complejo. Todavía no he necesitado hacer eso ... así que no tengo más consejos que ofrecer para esa parte de la ecuación.

geerlingguy
fuente
4

Una opción podría ser agregar soporte de nodo al módulo de formulario de entidad en línea .

EDITAR: El formulario de entidad en línea tiene soporte de nodo hoy en día.

Bojan Zivanovic
fuente
2

Los siguientes módulos se pueden utilizar en Drupal 7:

  1. https://drupal.org/project/noderefcreate
  2. https://drupal.org/project/nodeconnect
  3. https://drupal.org/project/entityconnect
  4. https://drupal.org/project/inline_entity_form

Noderefcreate solo crea un nuevo nodo si no existe mediante el asistente de autocompletar. Nodeconnect y entityconnect proporcionan el botón agregar / editar en la referencia de nodo, si se utiliza el asistente de autocompletar. Nodeconnect solo lo proporciona para referencia de nodo, mientras que entityconnect lo proporciona para referencia de nodo, referencia de entidad, referencia de término y referencia de usuario.

Inline_entity_form proporciona dos widgets adicionales para referencia de entidad (solo).

sumanchalki
fuente
0

Si esto es realmente similar al escenario de la escuela y sus estudiantes pueden unirse a varias clases, usaría:

  • 3 tipos de contenido: Estudiante (* -1) Asistencia (1- *) Clase
  • Bloque de formulario para ingresar datos del estudiante directamente en un bloque;
  • Vistas del campo para mostrar una vista con una lista de estudiantes que asisten a una clase;

Esto también requeriría usar Token , filtrar la vista en función del nid de clase y configurar un valor predeterminado para el campo de referencia del nodo de Asistencia como el nid de clase actual.

Eventualmente, podría asignar su tipo de contenido de Estudiante a Usuario con una referencia de usuario.

Refineo
fuente
Mis tipos de contenido ya existen y el sitio funciona. Agregar un tipo intermedio requeriría mucho retrabajo.
mpdonadio