web-dev-qa-db-ja.com

AJAX他のフィールド値に基づくオートコンプリート

少しひねりを加えたオートコンプリートフォームを実装しようとしています。オートコンプリートオプションを別のフィールドで制限したい(テキストフィールドをより具体的にする)。

AJAX APIが機能し、独自の値に基づいてフィールドのオートコンプリートフィルターを作成できるはずですが、別のフィールドに基づいてオートコンプリートフィルターを作成する方法がわかりません。フォームで。

私が見つけたものから この質問のみ は私の問題に似ていますが、残念ながら答えられていません。私はコードが欲しくなくて、どこを見るのが便利かを示唆するだけです。

ところで、私は解決策を考え出しましたが、データベースに2回アクセスする必要がある信じられないほど汚いハックです。 AJAXフィルターのベースとなるフィールドのコールバックを実装し、カスタムデータベーステーブルへのコールバックにフィールドの値を格納してから、目的のフィールドのコールバックにフィルターは値を取得し、それを機能させます。

BTW2:フィルターの基にしたいフィールドはテキストフィールドで、もう1つのカスタムエンティティ参照です。

BTW3: entityreferenceオプションの制限 モジュールがそのようなことをするので、私はそれが何とか可能であるとほぼ確信しています。 (それは私が望まない他のフィールドの助けを借りてそれを行います(そして私はとにかく試みたとしてもそれをまったく理解しませんでした:)))

5
Petrroll

研究が順調に進んだ...これが私が思いついた解決策です。 Drupal Form APIとAjax APIはこれを実行できるはずですが、少し前に少し混乱したので止めました-jQuery(Drupalにバンドルされている)を使用してフォールバックを作成しました。

カスタムモジュールの.infoファイルに、JavaScriptを追加します。

scripts[] = eap_student_feedback2_ajax.js

代わりにform_alter()呼び出しを使用してこれを追加し、 #attached FAPIキーを使用できます。

次に、JavaScriptファイルに依存するドロップダウンがあります。その国で利用可能なプログラムを選択する前に、国を選択する必要があります。国を選択すると、それらの国のプログラムリストがAjaxを介してフェッチされ、そのHTML選択リストに挿入されます。ウィジェットが利用可能になります。 jQueryコードは次のとおりです。

jQuery(function($) {

  $('#edit-field-survey-program-und option:gt(0)').remove();
  $('#edit-field-survey-program-und').attr('disabled', 'disabled');

  $("#edit-field-survey-country-und").click(function() {
    var selected_country = $("#edit-field-survey-country-und").val();
    if (selected_country != '_none') {
      $.ajax({
        type:'GET',
        url: '/eap-ajax/eap-country-programs/' + selected_country,
        data: '',
          success:function(data){
          //console.log("got: ");
          //console.log(data);
          // Do actual work.
          $('#edit-field-survey-program-und option:gt(0)').remove();
          $.each(data, function(key, value) {
            $('#edit-field-survey-program-und').append(
              '<option value="' + key + '">' + value + '</option>'
            );
          });
          $('#edit-field-survey-program-und').removeAttr('disabled');
        }
      }); 
    }
  });
});

私のモジュールファイルでは、ajaxエンドポイントを提供するためにhook_menuを実装しています。

// Make a frigging ajax callback.
function eap_student_feedback2_menu() {
  $items['eap-ajax/eap-country-programs/%'] = array(
    'page callback' => '_eap_student_feedback2_programs_json_endpoint',
    'page arguments' => array(2),
    'type' => MENU_CALLBACK,
    'access callback' => TRUE,
  );
  return $items;
}

また、jQueryのJSONを返すロジックを実装します。

function _eap_student_feedback2_programs_json_endpoint($country_term_id) {
  $matches = array();
  $result = db_query('
      SELECT tth.tid, ttd.name AS term_name
      FROM taxonomy_term_hierarchy tth
      LEFT JOIN taxonomy_term_data ttd ON tth.tid = ttd.tid
      WHERE tth.parent = :tid
      ORDER BY 2 ASC
  ', array(':tid' => $country_term_id));
  // add matches to $matches
  foreach ($result as $row) {
    $matches[$row->tid] = check_plain($row->term_name);
  }
  // return for JS
  return drupal_json_output($matches);
}
2
tenken

私はそれが少し素人であることを知っています、しかし質問はすでに答えられました私はそれを見つけませんでした。

ここにあります:

前のドロップダウンで結果を制限する方法をオートコンプリートのフォーム

そしてここ:

ajaxを使用してフィルターをかけるdrupal autocomplete form

ところで、私は質問を削除しますが、自分で回答された質問が見つからなかったので、これはもっと見つけやすいかもしれないと思いました。

//今は自分の答えを受け入れることができません。申し訳ありません。

2
Petrroll