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 ... cependant 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:
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.
Il semble que vous pouvez cibler différentes parties d'un formulaire à l'aide des commandes ajax, mais vous devez choisir de renvoyer une seule de l'une ou l'autre:
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 AJAX et un tableau rendable , ce qui ne semble pas possible.
Le code dans le module d'exemples illustre le ciblage de 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 du 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é.
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 tableau #ajax
Sur un élément de formulaire (field_whatever
Pour l'exemple ci-dessous) défini dans une hook_form_FORM_ID_alter()
(ou une sorte de crochet de modification de formulaire) où vous testez également $form_state
et apportez des modifications au tableau $form
, 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;
}
Je suis assez nouveau pour Drupal mais jusqu'à présent, j'ai trouvé le cadre Ajax plutôt flexible. Il fonctionne très bien tant que vous l'utilisez comme il était prévu. Donc dans votre cas, si vous connaissez des JS le mieux serait de faire ce script vous-même, il devrait être très léger.
Bonne chance!