Puis-je utiliser ajax pour cibler plusieurs éléments de formulaire à partir d'une seule entrée?

8

J'essaie d'utiliser ajax pour mettre à jour deux parties différentes d'un formulaire drupal à partir d'un seul flou d'entrée de formulaire.

J'ai le truc ajax standard sur mon entrée:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Cela fonctionne bien, permutant mon div lorsque l'entrée est mise à jour ... mais je veux également mettre à jour une autre entrée de formulaire ailleurs dans le formulaire avec un code différent en raison du flou sur mon entrée d'origine.

Est-ce possible, des idées?

Edit: Pour plus de clarté, voici mon exemple du monde réel:

  • Type de contenu «film»
  • Champ 'primary_title' ajouté
  • Lorsque 'primary_title' est mis à jour, mon rappel ajax vérifie les chaînes similaires et retourne du HTML.
  • Le code HTML du rappel est inséré dans un div vide.

    Cette partie fonctionne très bien!

J'essaie également de modifier l'entrée de titre standard du nœud, en lui donnant la valeur de 'primary_title' après avoir fait quelques regex pour ranger la chaîne (en supprimant "The" ou "A" dès le début, etc.) Le résultat sera deux champs de titre, un avec le titre complet 'titre_principal' et un 'titre' coupé qui sera utile pour trier et afficher les enregistrements.

Meule
la source

Réponses:

13

Il semble que vous pouvez cibler différentes parties d'un formulaire à l'aide des commandes ajax, mais vous devez choisir de n'en renvoyer qu'une seule :

  • HTML ou

  • Un tableau pouvant être rendu ou

  • Un tableau de commandes AJAX

Dans la situation sur laquelle j'ai écrit à l'origine, j'essayais de renvoyer à la fois un tableau de commandes AJAX et un tableau pouvant être rendu, ce qui ne semble pas possible.

Le code du module d'exemples montre comment cibler différentes parties d'un formulaire à l'aide d'un tableau de commandes AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

Dans cet exemple de code, #html_div obtient $ text et séparément #html_status obtient "Mise à jour de html_command_example avec text = $ text;". date ('r'). ""

Deux emplacements différents sur un formulaire avec deux informations différentes provenant du seul rappel ajax!

En regardant à nouveau sur quoi je travaillais, je me suis rendu compte que je n'avais pas du tout besoin de retourner le champ de titre du nœud. Ce ne sera qu'un champ utilitaire, utilisé pour trier les données dans des listes.

J'ai masqué le champ sur le formulaire de nœud et il est rempli la deuxième fois que mon formulaire est créé lorsque mon rappel ajax d'origine est déclenché.

Meule
la source
0

Je suis assez nouveau sur Drupal, mais jusqu'à présent, j'ai trouvé le cadre Ajax plutôt flexible. Cela fonctionne très bien tant que vous l'utilisez comme prévu. Donc, dans votre cas, si vous connaissez certains JS, le mieux serait de faire ce script vous-même, il devrait être très léger.

Bonne chance!

soieAdmin
la source
Merci pour la suggestion :) J'ai réalisé que je n'ai pas du tout besoin de renvoyer le champ de titre du nœud car il est simplement utilisé comme champ utilitaire pour organiser les listes. Il est rempli lorsque mon formulaire est reconstruit à la suite de mon rappel ajax existant.
Rick
0

Une autre option, de drupal.org :

Vous pouvez facilement remplacer l'intégralité du formulaire si cela est plus simple. Ajoutez simplement un #prefix et #suffix à l'ensemble du tableau de formulaires, puis définissez-le comme #ajax ['wrapper']. (Cela vous permettra de modifier plusieurs éléments de formulaire via un seul appel ajax.) La seule raison de ne pas le faire est que le processus est plus rapide si moins d'informations sont transférées.

Votre fonction de rappel peut être aussi simple que:

function _callback($form, $form_state) {
  return $form;
}

Cela devrait être appelé à partir d'un #ajaxtableau sur un élément de formulaire ( field_whateverpour l'exemple ci-dessous) défini dans un hook_form_FORM_ID_alter()(ou une sorte de crochet de modification de formulaire) où vous testez également $form_stateet apportez des modifications au $formtableau, comme:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
cdmo
la source