J'ai une situation très complexe où j'ai besoin de quelques conseils. J'ai un type de contenu my_content
, auquel est associé un champ de collecte de champs field_mycollection
, qui a un champ de référence d'entité faisant référence à l'utilisateur field_my_userreference
, un champ de téléphone field_my_phone
, un champ de texte field_my_text
et un autre champ de texte field_my_anothertext
.
My Content
|_ field_mycollection
|_ field_my_userreference
|_ field_my_phone
|_ field_my_text
|_ field_my_anothertext
L'entité utilisateur possède également des champs field_my_phone
, field_my_text
et field_my_yetanothertext
dont ce dernier a un nom de machine différent.
Ce que je veux faire, si sous forme d' my_content
édition / ajout, dans field_my_userreference
un utilisateur est sélectionné, les autres champs doivent être remplis automatiquement à partir des données de l'utilisateur sélectionné. Les champs remplis automatiquement doivent toujours être modifiables.
Comment pourrais-je atteindre cet objectif? J'aimerais le faire, si possible, avec un peu de codage, en utilisant hook_form_FORM_ID_alter()
.
Réponses:
Si vous souhaitez que cela se produise en direct et que tous les champs figurent déjà dans le formulaire, le moyen le plus sûr serait d'utiliser
hook_form_FORM_ID_alter()
pour ajouter les éléments suivants à un formulaire:Puis dans le
copy_field_value.js
comportement de création:Vous pouvez également utiliser
hook_form_FORM_ID_alter()
pour ajouter un#ajax
paramètre au champ source, mais cela rendrait votre formulaire appelant un serveur sur chaque copie de champ. Si vous devez réellement interroger la base de données, c'est la voie à suivre. Il serait assez large de le décrire à nouveau ici. Vous devez modifier le$form_state["input"]
tableau pour mettre à jour les valeurs réelles vues par l'utilisateur. Faites-le dans la fonction de création de formulaire, enveloppez-le avecisset
pour éviter les avis.Si votre élément de formulaire est
$form["something"]["something"]["element"]
, sa valeur sera en$form_state["input"]["something"]["something"]["element"]
- et vous pouvez le définirhook_form_alter
correctement, n'oubliez pas de prendre les deux$form
et$form_state
par référence.Remarque : la
.on()
méthode a été ajoutée dans jQuery 1.7, vous aurez donc besoin de la mise à jour de jQuery pour utiliser directement cette réponse, ou traduire mon code pour l'utiliser.change()
ou la.blur()
méthode.la source
<input>
identification des balises à l'aide de Firebug ou d'un outil similaire pour votre navigateur préféré. Ou utilisez tout autre sélecteur jQuery. Cela se produira uniquement dans le navigateur, vous avez donc ce que vous avez à l'écran. D'un autre côté, si vous devez réellement interroger la base de données (il me semble que cela m'a manqué),#ajax
c'est la voie à suivre. Mais ce serait assez large. Vous devez modifier le$form_state["values"]
tableau pour mettre à jour les valeurs réelles vues par l'utilisateur. Faites-le dans la fonction de création de formulaire, enveloppez-le avecisset
pour éviter les avis.Vous pouvez le faire en utilisant le module de champ calculé
la source
Je veux poster comment je l'ai réalisé grâce aux grandes aides de @ Mołot.
#ajax
propriété du champfield_my_userreference
.Mon code ressemble à:
la source
Cela peut être un peu tard, mais ce module https://www.drupal.org/project/entityreference_autofill semble faire ce que vous décrivez. Je l'ai utilisé et cela peut aussi vous aider.
la source