Drupal AJAXは1回だけ起動します


7

Drupal 7では、次のことを実行したいフォームがあります。

  • 単純な2列のテーブルにオプションのリストを表示する
  • ドロップダウンリストからアクションを選択すると、AJAXが起動し、テーブルのオプションが置き換えられます

私はコードを書いていて、Drupalは最初に選択を選択したときにのみAJAXに値をポストします。これはフォームの「アイテム」タイプでは機能しませんか?ページには他のフォームもありますが、フォームIDはフォームフィールドと同様に一意です。

$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' => '',
          );

次に、AJAXコールバックで、結果の#markupがtheme( 'table')に設定されたデータが返されます。初めて機能するだけです。FirebugコンソールにPOSTデータが表示されます。別のドロップダウンオプションを選択すると、テーブルが更新されません。

ここで何か問題がありましたか?

編集:POSTが作成しているようですが、応答は空ですが、空であってはなりません。

編集2: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'];
}

基本的に月/年が選択されている場合、(フィールドコレクション内の)日付を照会しています。


のコードで質問を更新できますdelivery_date_weekends()か?
クライヴ

コールバックを追加
Kevin

回答:


5

これらのクエリを実際に実行しないと言うのは難しいですが、問題はフォーム要素の名前の不一致が原因であると思います。

フォームでは要素はとして定義されて$form['date_weekend']いますが、コールバックではと呼ばれる要素を設定します$form['booking_weekend']

これはおそらくことを除いていいと思い$form['booking_weekend']持っていない#prefix#suffixそれは$form['date_weekend']ありません。Drupalは、AJAX置換を行うときにラッパー要素全体を置換します。そのため、新しい要素に同じIDのラッパーがない場合、次のAJAX呼び出しは機能しません(正しいIDの要素が存在しないため)。

これで問題が解決するので、一致するように要素名を変更することをお勧めしますが、本当に別の要素にする必要がある場合は、コールバックで新しい要素の周りにラッパーを追加するだけです。

// The rest of delivery_date_weekends() comes before this as normal...

  $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.';
}

$form['booking_weekend']['#prefix'] = '<div id="dates-ajax">';
$form['booking_weekend']['#suffix'] = '</div>';

return $form['booking_weekend'];

さて、私はそれをすべて修正しました、そしてそれらは一貫しています。それはまだ最初にのみ機能し、次に2回目はフィールドがまったく更新されず、応答にデータがありません(あるはずです)。クエリは正常に機能します。結果がない場合でも、「週末は配達されません...」というマークアップが返されます。
ケビン

それは2回目にそれを置き換えようとしますか、つまり、フェードアニメーションを実行し、同じテーブルに置き換えますか?そうでない場合は、コンソールでjsエラーが発生しますか?
クライヴ

エラーも、置き換えも、何も起こらないように見えません。データはまだ投稿されています。レスポンスは完全に空です。まるでDrupalが何かをするべきだと知っていて、何をすべきでないかを知っているかのようです。「空」とは、返された一般的なコマンドが表示されることを意味しますが、すべての値はnullであり、0アイテムしかありません(通常は3です)。
ケビン

ケビン、これを機能させたことがありますか?私はajax呼び出しが一度だけ起動するという同じ問題を抱えています。そして、ページがリロードされるまで二度とない。
Brandon Bearden

はい、そうしました。AJAXコールバックで正しい要素が返されていることを確認してください。これにより、再レンダリングされたときにフォーム要素にバインドされます。それが私の問題だと思います。
ケビン

0

私は同様の問題で苦労しており、最終的にここで解決策を見つけました:

Drupalは、AJAX置換を行うときにラッパー要素全体を置換します。そのため、新しい要素に同じIDのラッパーがない場合、次のAJAX呼び出しは機能しません(正しいIDの要素が存在しないため)。

とてもシンプルですが、忘れていました。div-idの問題を修正した後、消えました:)ありがとう、Clive!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.