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()
か?