いくつかのセクションを持つフォームがあります。各セクションには「#states」属性があり、前のステップで選択したものに応じて表示または非表示になります。各セクション内には、フィールドを追加または削除するためのボタンがあります。これらのボタンのいずれかをクリックすると、AJAX を介して関数が呼び出されます。この関数は $form_state['triggering_element']['#name'] を使用してクリックされたボタンを見つけ、適切なセクションにフィールドを追加します。問題は、どのセクションが表示されていても、triggering_element が常に最初のセクションのボタンのように見えることです。非常に長いので、ここにすべてのコードを入れたくありません。いくつかのボタンと、それをクリックすると呼び出される関数、および最終的なコールバックは次のようになります。
$form['survey']['contents']['addsurvey'] = array(
'#type' => 'submit',
'#default_value' => t('Add Another Survey Question'),
'#submit' => array('touchpoints_metrics_add_one'),
'#limit_validation_errors' => array(),
'#name' => 'add-survey',
'#ajax' => array(
'callback' => 'touchpoints_metrics_callback',
'wrapper' => 'survey-div',
),
);
$form['mysteryshop']['contents']['addmystery'] = array(
'#type' => 'submit',
'#default_value' => t('Add Another Observation'),
'#submit' => array('touchpoints_metrics_add_one'),
'#limit_validation_errors' => array(),
'#name' => 'add-mystery',
'#ajax' => array(
'callback' => 'touchpoints_metrics_callback',
'wrapper' => 'mysteryshop-div',
),
);
function touchpoints_metrics_add_one($form, &$form_state) {
$element = $form_state['triggering_element']['#name'];
$tracker = '';
if (strpos($element, 'survey')) {
$tracker = 'num_surveys';
} elseif (strpos($element, 'mystery')) {
$tracker = 'num_mystery';
} elseif (strpos($element, 'budget')) {
$tracker = 'num_budget';
} elseif (strpos($element, 'incdec')) {
$tracker = 'num_incdec';
} elseif (strpos($element, 'roi')) {
$tracker = 'num_roi';
} elseif (strpos($element, 'epu')) {
$tracker = 'num_epu';
} elseif (strpos($element, 'response')) {
$tracker = 'num_response';
} elseif (strpos($element, 'numcomplete')) {
$tracker = 'num_numcomplete';
} elseif (strpos($element, 'perccap')) {
$tracker = 'num_perccap';
}
$form_state[$tracker]++;
$form_state['rebuild'] = TRUE;
}
function touchpoints_metrics_callback($form, &$form_state) {
$element = $form_state['triggering_element']['#name'];
$tracker = '';
if (strpos($element, 'survey')) {
$tracker = 'survey';
} elseif (strpos($element, 'mystery')) {
$tracker = 'mysteryshop';
} elseif (strpos($element, 'budget')) {
$tracker = 'budget';
} elseif (strpos($element, 'incdec')) {
$tracker = 'incdec';
} elseif (strpos($element, 'roi')) {
$tracker = 'roi';
} elseif (strpos($element, 'epu')) {
$tracker = 'epu';
} elseif (strpos($element, 'response')) {
$tracker = 'response';
} elseif (strpos($element, 'numcomplete')) {
$tracker = 'numcomplete';
} elseif (strpos($element, 'perccap')) {
$tracker = 'perccap';
}
return $form[$tracker]['contents'];
}