web-dev-qa-db-fra.com

Drupal AJAX seulement une fois

In Drupal 7, j'ai une forme où j'aimerais faire ce qui suit:

  • Afficher une liste d'options dans une simple table de deux colonnes
  • Sélection d'une action à partir d'une liste déroulante Feux AJAX et remplace les options du tableau

J'ai du code écrit et Drupal seulement affiche les valeurs sur AJAX== Voir la première fois que vous sélectionnez une sélection. Est-ce que cela ne fonctionne tout simplement pas sur le formulaire "élément" ? Remarque, il existe également d'autres formulaires sur la page, mais les ID de formulaire sont uniques, tout comme les champs de formulaire.

$form['new_date'] = array(
            '#type' => 'select',
            '#title' => 'Delivery Date',
            '#options' => $date,
            '#ajax' => array(
                'callback' => 'delivery_date_weekends',
                'wrapper' => 'dates-ajax',
                'method' => 'replace',
                'effect' => 'fade',
            ),
        );

$form['date_weekend'] = array(
                '#type' => 'item',
                '#prefix' => '<div id="dates-ajax">',
                '#suffix' => '</div>',
                '#markup' => '',
          );

Ensuite, dans le AJAX rappel, les données sont renvoyées avec # MiseMup définie sur Theme ('Table') des résultats. Cela ne fonctionne que la première fois, je vois le POST Données dans la console Firebug. Choisissez une autre option déroulante, ma table ne se met pas à jour.

Ai-je fait quelque chose de mal ici?

EDIT: On dirait que le POST le fait, mais la réponse est vide, mais ne devrait pas être.

Edit 2: Callback Ajax:

function delivery_date_weekends($form, $form_state) {

    $query = new EntityFieldQuery();
    $result = $query->entityCondition('entity_type', 'field_collection_item')
        ->propertyCondition('item_id', $form_state['values']['rates'])
        ->fieldCondition('field_delivery_basis', 'value', 'Weekly', '=');

    $startmonth = strtotime(date('m', $form_state['values']['new_date']).'/01/'.date('Y'));
    $endmonth = strtotime('+1 month', $startmonth);

    $query->fieldCondition('field_delivery_date_period', 'value', $startmonth, '>=')
                ->fieldCondition('field_delivery_date_period', 'value', $endmonth, '<=');

    $result = $query->execute();

    if ($result) {
        $headers = array(
            array('data' => 'Weekend', 'class' => 'tableHeader-processed'),
            array('data' => '', 'class' => 'tableHeader-processed'),
        );

        $rates = entity_load('field_collection_item', array_keys($result['field_collection_item']));

        foreach ($rates as $key => $rate) {
            if ($rate->field_delivery_available['und'][0]['value']) {
                $rows[] = array('data' => array(date('M j, Y', $rate->field_delivery_date_period['und'][0]['value']), array('data' => 'delivery link', 'class' => array('fee'))));
            } else {
                $rows[] = array('data' => array(date('M j, Y', $rate->field_delivery_date_period['und'][0]['value']), array('data' => 'Not Available!')));
            }
        }

        $form['booking_weekend']['#markup'] = theme('table', array('header' => $headers, 'rows' => $rows, 'sticky' => FALSE));
    } else {
        $form['booking_weekend']['#markup'] = 'No delivery weekends exist for this month. Please select another date.';
    }

    return $form['booking_weekend'];
}

Fondamentalement, quand un mois/an est sélectionné, je demande des dates (dans une collection de champs).

7
Kevin

Je me luttais avec un problème similaire et j'ai finalement trouvé une solution ici:

Drupal remplace l'ensemble de l'élément d'emballage lorsqu'il est un AJAX Remplacer, si le nouvel élément n'a pas d'emballage avec le même identifiant autour de celui-ci le suivant AJAX L'appel ne fonctionnera pas (car aucun élément n'existe avec le bon identifiant).

Très simple, mais j'en ai oublié. Après avoir corrigé le problème de Div-ID a disparu :) Merci, Clive!

0
jakuza