web-dev-qa-db-ja.com

Ajaxで読み込まれたフォームのキャッシュを防止する

分類用語を追加するカスタムページを作成しようとしています。このページには、すべての有効な語彙をリストする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;
    }

したがって、問題は、最初のロード後にフォームが同じ状態のままになることです。フォームを適切に更新する方法は?

5
volocuga

ドキュメントによると:

フォームへの変更は、フォームビルダー関数(この例では、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;
}

編集:私はあなたがフォームをラップしているのではなく、フォーム内のコンテナーをラップしていることに気づきました。フォーム全体を再ロードする場合は、フォームをラップする必要があります。

2
Pax