it-swarm-ko.tech

자동 완성 자바 스크립트 모듈

사용자 지정 자동 완성 기능을 만들었습니다. 자동 완성 필드는 콘텐츠 프로필의 사용자 이름과 성으로 채워집니다.

동일한 이름과 성을 가진 사용자가 거의 없을 수 있습니다. 콘텐츠 형식 ID를 Drupal 자동 완성에 전달하고이 ID를 숨겨진 양식 필드에 추가하여 더 정확하게 할 수있는 방법은 무엇입니까?

콘텐츠 유형 ID를 자동 완성 필드에 직접 입력하고 싶지 않으므로 현재 구현에 대한 콜백이 필요합니다.

4
Codium

@googletorp 조언 덕분에 솔루션이 매우 쉽고 다른 사람들과 공유하고 싶습니다. 내가 필요한 것은 Drupal autocomplete object functions : found and select.

내 자동 완성은 콘텐츠 프로필 필드에서 작동합니다. 선택한 프로필의 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