分類用語を追加するカスタムページを作成しようとしています。このページには、すべての有効な語彙をリストする1つのドロップダウンメニューがあります。そのメニューからいくつかを選択すると、完全な分類法の追加フォームが読み込まれます。
これはメニューコールバックです:
function add_term_form_callback($form, $form_state) {
module_load_include('inc', 'taxonomy', 'taxonomy.admin');
$vid = $form_state['values']['vocabulary'];
$vocabulary = taxonomy_vocabulary_load($vid);
$form_state['values'] = array();
$form_state['build_info']['args'] = array(array(), $vocabulary);
$form_state['rebuild'] = TRUE;
$form_state['no_cache'] = TRUE;
$form = drupal_build_form('taxonomy_form_term', $form_state);
return $form;
}
...そして形
function add_term_form($form, &$form_state) {
$options = array();
$options[0] = t('- Select -');
$vocabularies = taxonomy_get_vocabularies();
foreach ($vocabularies as $vocabulary) {
$options[$vocabulary->vid] = $vocabulary->name;
}
$form['vocabulary'] = array(
'#type' => 'select',
'#title' => t('Select vocabulary'),
'#options' => $options,
'#default_value' => $selected,
'#ajax' => array(
'callback' => 'add_term_form_callback',
'wrapper' => 'container',
'event' => 'change',
),
);
$form['container'] = array(
'#type' => 'container',
'#prefix' => '<div id="container">',
'#suffix' => '</div>',
);
return $form;
}
したがって、問題は、最初のロード後にフォームが同じ状態のままになることです。フォームを適切に更新する方法は?
ドキュメントによると:
フォームへの変更は、フォームビルダー関数(この例では、ajax_example_autocheckboxes())でのみ行う必要があります。そうしないと、検証が失敗します。コールバック関数は、フォームやその他の状態を変更してはなりません。
コールバックでform_stateとフォームを変更しています。
ドキュメントの理解に基づいて、ajaxコールバックでフォーム全体を返し、フォームビルダー関数でフォームに変更を加えるだけです。ドロップダウンのform_state値を確認するだけで、レンダリングするフォームを知ることができます。次のようなものになると思います。
function add_term_form_callback($form, $form_state) {
return $form;
}
function add_term_form($form, &$form_state) {
// If vocabulary has value
// do stuff
// $form = drupal_get_form('taxonomy_form_term');
// else :
$options = array();
$options[0] = t('- Select -');
$vocabularies = taxonomy_get_vocabularies();
foreach ($vocabularies as $vocabulary) {
$options[$vocabulary->vid] = $vocabulary->name;
}
$form['vocabulary'] = array(
'#type' => 'select',
'#title' => t('Select vocabulary'),
'#options' => $options,
'#default_value' => $selected,
'#ajax' => array(
'callback' => 'add_term_form_callback',
'wrapper' => 'container',
'event' => 'change',
),
);
$form['#prefix'] = '<div id="container">';
$form['#suffix'] = '</div>';
);
// endif;
return $form;
}
編集:私はあなたがフォームをラップしているのではなく、フォーム内のコンテナーをラップしていることに気づきました。フォーム全体を再ロードする場合は、フォームをラップする必要があります。