web-dev-qa-db-ja.com

オートコンプリートJavaScriptモジュール

カスタムオートコンプリート関数を作成しました。オートコンプリートフィールドには、コンテンツプロファイルのユーザー名と姓が入力されます。

同じ名前と姓を持つユーザーがほとんどいない可能性があります。コンテンツタイプIDをDrupalオートコンプリートに渡し、このIDを非表示のフォームフィールドに追加して、より正確にすることができます。

コンテンツタイプIDをオートコンプリートフィールドに直接入れたくないので、現在の実装へのコールバックが必要です。

4
Codium

@googletorpアドバイスのおかげで、解決策はとても簡単です。他の人と共有したいと思います。私が必要なのは、2つのDrupalオートコンプリートオブジェクト関数を上書きすることだけです:検出して選択しました。

私のオートコンプリートはコンテンツプロファイルフィールドで機能します。選択したプロファイルのnidをJSに渡します:

PHP:

function messagi_autocomplete($string) {
  global $user;

    $cache = cache_get('messagi_auto_complete_'.$string);
    $items = array();

    if ($cache) {

        $items = $cache->data;

    } else {

        $sql = "
              SELECT 
                n.nid AS id
              FROM 
                node as n
              WHERE 
                n.type = 'profile'
              AND
                u.status = 0
          ";
          $result = db_query($sql);
          $disabled = array();
          while($obj = db_fetch_object($result)) {
              $disabled[] = $obj->id;
          }




          $items = array();
          $sql = "
                        SELECT
                    profile.nid AS nid,
                    profile.field_profile_name_value AS name,
                    profile.field_profile_surname_value AS surname
                  FROM 
                    content_type_profile AS profile
                  WHERE  
                    lower(profile.field_profile_name_value) LIKE lower('%s%%')
                  OR lower(profile.field_profile_surname_value) LIKE lower('%s%%')
                  LIMIT 10
          ";
          $result = db_query($sql, $string, $string);  
          $sql = NULL;
          while($obj = db_fetch_object($result)) {
            if (! in_array($obj->nid, $disabled)) {
                  $key = check_plain($obj->name).' '.check_plain($obj->surname);
                  $items['nids'][$key] = (int) $obj->nid;
                  $items[$key] = $key.', '.check_plain($obj->venue);
            }
          } 
            if (! empty($items)) {

                cache_set('messagi_auto_complete_'.$string, $items, 'cache', 1000);     

            }
          $disabled = NULL; 


    }

  print drupal_to_js($items); 
  exit();   
}

JS:

$(document).ready(function() {    if
    (Drupal.jsEnabled) {
            Drupal.jsAC.prototype.found = function (matches) {
              if (!this.input.value.length) {
                return false;
              }

              var ul = document.createElement('ul');
              var ac = this;
              for (key in matches) {
                var li = document.createElement('li');
                //to avoid of showing nids object in the select list 
                if (key !== 'nids') {
                    $(li)
                      .html('<div>'+ matches[key] +'</div>')
                      .mousedown(function () {
    ac.select(this); })
                      .mouseover(function () {
    ac.highlight(this); })
                      .mouseout(function () { ac.unhighlight(this); });
                    li.autocompleteValue = key;
                    $(ul).append(li);
                } else {
                 //add all nids to prototype
                    Drupal.jsAC.prototype.nids = matches[key];
                }
               }
                //rest of the code
              }
            };

            Drupal.jsAC.prototype.select = function (node) {
              //get selected value nid and put it on form hidden field
              $('#edit-nid').val(Drupal.jsAC.prototype.nids[node.autocompleteValue]);
              this.input.value = node.autocompleteValue;
            };    
} })

これが将来誰かを助けることを願っています。このコードに対する他のアドバイスをありがとう。

3
Codium

デフォルトのDrupalオートコンプリートを使用する場合は、オートコンプリートにIDを追加してから、追加のカスタムJSを使用してIDを非表示フィールドに移動することをお勧めします。

他の解決策は、Drupalによって作成されたプロトタイプ関数を上書きし、そこで追加の処理を追加することです。

2
googletorp