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é.
Réponses:
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 .
la source
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:
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:
Voici un exemple de rappel:
Dans
mymodule_create_student_form($form, $form_state)
, créez votre formulaire comme vous le feriez normalement, puis dans la fonctionmymodule_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.la source
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.
la source
Les modules suivants peuvent être utilisés dans Drupal 7:
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).
la source
Si cela est vraiment similaire au scénario de l'école et que vos élèves peuvent rejoindre plusieurs classes, j'utiliserais:
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.
la source