Création de nœuds et de nœuds référencés en même temps

7

J'ai une situation où j'aimerais pouvoir créer des nœuds et des nœuds référencés en même temps. Y a-t-il des solutions pour cela qui fonctionnent bien pour cela?

Pour clarifier ce dont je parle, considérons la situation suivante ( très simplifiée à des fins d'explication):

Il existe une classe de type de contenu qui possède un champ référencé par nœud, Student . J'aimerais que les utilisateurs puissent créer des nœuds de classe et des nœuds d' étudiant en même temps. Je voudrais également qu'ils puissent utiliser la saisie automatique de référence de nœud normale pour choisir un étudiant qui existe déjà.

Idéalement, j'aimerais que tout cela fonctionne à partir d'une seule page, et travaille également dans les limites du système d'autorisation Drupal afin que je puisse avoir différents rôles et différentes autorisations.

Oui, je sais que dans ce cas, Student serait mieux servi en tant qu'utilisateur (plutôt qu'en tant que nœud), mais Class et Student sont juste pour illustrer la situation. Le scénario réel a vraiment besoin de références de nœuds.

Il y a une question similaire à cela, Créer des nœuds référencés avec le nœud parent , mais je ne suis spécifiquement intéressé que par les solutions Drupal 7.

ÉDITER:

Pas seulement à la recherche de modules existants, mais aussi à des débuts de code personnalisé.

mpdonadio
la source
Dans Drupal 7, j'ai écrit du code personnalisé pour le faire pour mes sites, simplement parce qu'il n'y a pas encore de solutions basées sur des modules auxquelles je puisse penser. Vous pouvez même lancer un formulaire pour créer le nœud étudiant dans un modal ctools, puis renvoyer le nid au formulaire de nœud d'origine en utilisant ajax_command_data () ou une autre fonction de passage de données ajax.
geerlingguy
@geerlingguy, si vous écrivez cela comme une réponse (en particulier une longueur d'avance pour le module nid AJAX passback), cela serait sérieusement considéré comme une réponse.
mpdonadio
Fera dans un peu.
geerlingguy

Réponses:

4

J'utilise la boîte de dialogue Références , qui met un petit "+" sur les champs de référence existants permettant à l'utilisateur de créer un nouvel étudiant directement à partir du formulaire d'édition du nœud de classe .

Létharion
la source
Quelqu'un at-il utilisé ce module? J'adorerais entendre des commentaires sur les versions alpha.
David John Smith
Pour info vient d'installer ce module et il semble s'adapter parfaitement.
David John Smith
8

Pour quelques sites différents maintenant, je l'ai fait en utilisant un modal ctools, et voici l'aperçu de base de la façon dont je l'ai implémenté (très simplement):

  • Créez un rappel de page personnalisé dans votre module hook_menu () qui affiche une forme de nœud de base pour le nœud que vous souhaitez référencer (pour un nœud `` étudiant '', ayez simplement un champ de nom et peut-être un champ d'année de fin d'études). Sur ce formulaire, dans votre rappel de soumission, enregistrez le nœud à l'aide de node_save () et stockez l'ID de nœud (qui devrait être à $ node-> nid après avoir passé un nouvel objet de nœud à node_save ()) dans le formulaire $form_state['storage']['student_id'].

  • Modifiez la forme du nœud maître / classe à l'aide de hook_form_alter () . Vous devez faire quelques choses ici:

Tout d'abord, vous devez ajouter le javascript modal et les fonctionnalités de ctools pour que ctools sache quoi faire avec votre lien spécial:

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

Deuxièmement, vous devez ajouter un lien vers le rappel de page que vous avez créé à l'étape 1 du menu hook, et avec ce lien, ajoutez la classe «ctools-use-modal». Ainsi, par exemple:

// 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')))
);
  • Dans votre rappel de page personnalisé, vous devez faire quelques choses pour le faire fonctionner avec ou sans JavaScript, et avec les fonctions de formulaire de ctools.

Voici un exemple de rappel:

<?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();
}
?>
  • Dans mymodule_create_student_form($form, $form_state), créez votre formulaire comme vous le feriez normalement, puis dans la fonction mymodule_create_student_form_submit(form, &$form_state)(soumettre), définissez la valeur du NID du nœud étudiant nouvellement créé dans $form_state['storage']['student_id']. C'est ainsi que vous obtiendrez ctools / AJAX pour renvoyer le nouveau nid à votre formulaire de classe d'origine.

  • Dans ma situation, j'utilisais le modal pour cracher du balisage à la page d'origine, j'ai donc passé le balisage dans un div d'espace réservé à l'aide ajax_command_append(), puis j'ai eu jQuery sur la page d'origine en surveillant le div d'espace réservé, et quand il a trouvé du contenu dans il, il déplacerait le HTML à la bonne place ailleurs sur la forme du nœud. Dans votre cas, vous devrez remplir un champ de référence de nœud à valeur unique ou multiple, qui peut être un peu plus complexe. Je n'ai pas encore eu besoin de faire ça ... donc je n'ai plus de conseils à offrir pour cette partie de l'équation.

geerlingguy
la source
4

Une option peut consister à ajouter la prise en charge des nœuds au module Inline Entity Form .

EDIT: Inline Entity Form prend en charge les nœuds de nos jours.

Bojan Zivanovic
la source
2

Les modules suivants peuvent être utilisés dans 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 crée uniquement un nouveau nœud s'il n'existe pas à l'aide de l'assistant de saisie semi-automatique. Nodeconnect et entityconnect fournissent un bouton d'ajout / modification à la référence du nœud, si l'assistant de saisie semi-automatique est utilisé. Nodeconnect ne le fournit que pour la référence de nœud tandis que entityconnect le fournit pour la référence de nœud, la référence d'entité, la référence de terme et la référence d'utilisateur.

Inline_entity_form fournit deux widgets supplémentaires pour la référence d'entité (uniquement).

sumanchalki
la source
0

Si cela est vraiment similaire au scénario de l'école et que vos élèves peuvent rejoindre plusieurs classes, j'utiliserais:

  • 3 types de contenu: Student (* -1) présence (1 *) classe
  • Bloc de formulaire pour entrer les données des étudiants directement dans un bloc;
  • Champ Vues pour afficher une vue avec une liste des étudiants participant à un cours;

Cela nécessiterait également l'utilisation de Token , le filtrage de la vue en fonction du nid de classe et la configuration d'une valeur par défaut pour le champ de référence du nœud de présence en tant que nid de classe actuel.

Finalement, vous pouvez mapper votre type de contenu Étudiant à Utilisateur avec une référence utilisateur.

Raffiner
la source
Mes types de contenu existent déjà et le site fonctionne. L'ajout d'un type intermédiaire nécessiterait beaucoup de retouches.
mpdonadio