web-dev-qa-db-ja.com

オートコンプリートフィールドをカスタムモジュールフォームに追加する

2つのタイプのレポートを生成するために使用しているフォームに2つのオートコンプリートフィールドを追加しようとしています。私が行っているのは、CometChatチャットシステムをカスタムモジュールを使用してDrupalとインターフェイスさせたところ、今では顧客がそのためのレポートを求めているということです。ユーザーが結果セットは、チャットルームのオートコンプリートフィールドを名前で、インスタントメッセージを個人で使用できるようにすることです。

私はDB内の非Drupalテーブルにクエリを実行するため、CCKフィールドとオートコンプリートウィジェットモジュールを使用することはできません(その方法についてのトリックを知っている場合を除く)。私はこれまでにオートコンプリートフィールドを作成したことがありません。

私はメニューフックページコールバックを作成する必要があることを知っていますが、JSとpingbackがこのようなことを行うためにどのように機能するかは完全にはわかりません。誰かが始める方法を知っていますか?

オートコンプリートウィジェットモジュールのコードを調べて、モジュールから今すぐ学びます。しかし、私はこれで何か助けが欲しいです。

ありがとう!

4
Patrick

Drupal 6ここに完全な例があります: オートコンプリートを使用するテキストフィールド 。コードはおそらくこのサイトの人々にも役立つので、ここに投稿します:

次の名前のモジュールに基づいています: 'cities'

あなたのフォーム関数で:

$form['city'] = array(
  '#type' => 'textfield',
  '#title' => 'City',
  '#maxlength' => 128,
  '#autocomplete_path' => 'cities/autocomplete',
);

あなたのモジュールファイルで:

function cities_menu(){
  // path with autocomplete function for cities
  $items['cities/autocomplete'] = array(
    'title' => 'Autocomplete for cities',
    'page callback' => '_cities_autocomplete',
    'access arguments' => array('use autocomplete'),  //or whatever permission makes sense
    'type' => MENU_CALLBACK
  );
  return $items;
}

あなたのモジュールファイルにも:

function _cities_autocomplete($string) {
  $matches = array();
  //search table `cities` for cities that begin with the letters the user enters in the form
  $result = db_query_range("SELECT city FROM {cities} WHERE LOWER(city) LIKE LOWER('%s%')", $string, 0, 10);
  // add matches to $matches
  while ($data = db_fetch_object($result)) {
    $matches[$data->city] = check_plain($data->city);
  }
  // return for JS
  print drupal_to_js($matches);
  exit();
}
7
Clive