web-dev-qa-db-fra.com

Comment créer (et pré-peupler) plusieurs champs "Collection de champs" multiples sur un appel AJAX

Ceci est une extension de cette question - " Comment préremplir plusieurs " collecte sur le terrain " champs sous forme de noeud "

Je suis en train de faire la même chose, mais je suis en train de le faire fonctionner sur un appel ajax plutôt que sur la charge de forme.

Charges de formulaire, l'utilisateur sélectionne une option sur une liste déroulante, puis le formulaire remplit automatiquement plusieurs collections de champ avec Ajax.

le problème

La solution existante sur la question ci-dessus implique la modification de la forme quand il est d'abord construit, en changeant:

 $form_state['field']['--machine-name-of-field--'][LANGUAGE_NONE]['items_count']

Puis reconstruire la forme en utilisant les nouvelles valeurs de l'état de forme.

Le problème avec un appel Ajax est que, il semble ignorer les modifications apportées à $form_state Dans le rappel. c'est à dire.

function ajax_get_parent_field_collection ($form, &$form_state) {
  $form_state['field']['field_collection_entity']['und']['items_count'] = '3';
  return $form['field_collection_entity'];
}

Les modifications apportées à $ form_state ci-dessus sont ignorés, alors quand la forme est rien reconstruit se passe et si vous puis videz $form_state Aucune des modifications apportées n'est enregistrée.

Je pourrais créer manuellement les entités de collecte de champ et les insérer, mais j'espérais qu'il y a une réponse intelligente. Quelqu'un a-t-il abordé cela avant?

ÉDITER:

L'AJAX s'appelle actuellement sur un champ Sélectionner, de sorte que l'AJAX déclenche une fois que la liste déroulante SELECT est utilisée.

$form['field_company_for_center']['und']['#ajax'] = array (
  'callback' => 'ajax_get_parent_field_collection',
  'wrapper' => 'ajax-wrapper',
  'effect' => 'fade',
);
3
Dominic Woodman

Le formulaire doit être de nouveau construire après items_count est changé.

function MYMODULE_form_alter (&$form, &$form_state, $form_id) {
  if($form_id == 'MYFORM'){
    $form['#attributes']['id'] = 'MYMODULE-form-ajax-wrapper';

    // Handle triggered ajax element.
    if(!empty($form_state['triggering_element']['#array_parents'][0])) {
      if ($form_state['triggering_element']['#array_parents'][0] == 'field_node_reference') {
        $form_state['field']['field_collection_entity'][LANGUAGE_NONE]['items_count'] = '3';
      }
    }

    // Add ajax callback.
    $form['field_node_reference'][LANGUAGE_NONE]['#ajax'] = array (
      'callback' => 'MYMODULE_ajax_rebuild_form',
      'wrapper' => 'MYMODULE-form-ajax-wrapper',
    );
  }
}

/**
 * Ajax callback, rebuilds and returns the entire form.
 */
function MYMODULE_ajax_rebuild_form ($form, &$form_state) {
  return drupal_rebuild_form($form_state['build_info']['form_id'], $form_state, $form);
}
2
milkovsky