J'ai quatre champs de référence d'entité pour l'entité utilisateur dans un formulaire. Le formulaire hôte est un formulaire de modification de nœud. Trois d'entre eux sont des listes sélectionnées, le dernier est le formulaire d'entité en ligne .
Après avoir ajouté une entité utilisateur via IEF, j'essaie de mettre à jour les valeurs des listes de sélection:
function ebep_users_feature_users_list_ajax($form, $form_state) {
$ief = array_shift($form_state['inline_entity_form']);
$options = array('_node' => t('- None -'));
$commands = array();
foreach($ief['entities'] as $data) {
$options[$data['entity']->uid] = $data['entity']->name;
}
foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
$form[$fieldName]['und']['#options'] = $options;
$commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
}
return array('#type' => 'ajax', '#commands' => $commands);
}
Cela fonctionne, mais lorsque j'essaie d'ajouter un autre utilisateur via IEF, j'obtiens:
Un choix illégal a été détecté. Veuillez contacter l'administrateur du site.
Related
questions énumérées ici à droite a résolu ce problème?Réponses:
--- Réponse originale. Est faux, vérifiez la mise à jour ci-dessous.
Il suffit de régler
Sur la sélection qui sera mise à jour avec AJAX.
Paiement "Un choix illégal a été détecté"
--- Mise à jour 17 décembre 2019 ---
En fait, ce n'était pas un bon conseil, c'était il y a longtemps, maintenant je sais mieux.
La fonction de rappel Ajax est censée renvoyer uniquement le morceau de formulaire qui a changé ou certaines commandes ajax.
Dans ce cas, la modification du formulaire doit être effectuée sur la fonction de formulaire ou sur un crochet de modification de formulaire. Les fonctions de création de formulaire et de validation sont exécutées chaque fois qu'un rappel ajax est appelé. Vérifiez simplement $ form_state sur votre formulaire de création ou de modification de fonction et ajustez les valeurs en conséquence.
Voir Résoudre l'erreur "Un choix illégal a été détecté ..."
la source
J'ai rencontré ce problème plusieurs fois dans Drupal 6, modifiant les valeurs de la liste Select via Ajax.
Voici ce que vous pouvez faire
array_merge
Si la première solution fonctionne pour vous, vous économiserez beaucoup de temps de codage et de test. MAIS si la liste dans le menu déroulant est dynamique et que vous n'avez aucun contrôle sur elle, vous devrez peut-être opter pour la deuxième solution.
Postez si vous rencontrez des problèmes, j'ai fait beaucoup de travail sur ce problème, pour mon projet, et je l'ai fait pour ~ 50 formulaires, PHEW !!! :)
la source
J'ai trouvé le meilleur moyen de contourner ce problème en définissant le
#value
sur la liste de sélection.Si nous avons la valeur dans formstate et qu'elle est dans nos options, nous n'obtiendrons pas d'erreur. Si notre valeur n'est pas dans les options, sélectionnez la première option dans nos options et utilisez-la.
la source
Ma solution:
la source
Dans votre rappel ajax, ajoutez:
Par mesure de sécurité, la
_form_validate()
fonction principale vérifie si la clé #options d'un élément a changé par rapport à ce qui avait été défini dans la version d'origine (ce qu'ils ont). En appelantdrupal_get_messages()
etform_get_errors()
nous disons à Drupal d'ignorer toutes les erreurs / messages lors de l'exécution de notre demande ajax. :)la source