#autocomplete_path в елементах textfield

11.04.2011
#autocomplete_path in textfield elements
Автор:

Інколи в процесі розробки сайтів виникає необхідність, для зручності вводу даних, створити поле з автозаповненням (autocomplete field). Прикладами таких полів можуть бути віджети для cck-полів Node reference i User reference.

Розглянемо програмне створення такого роду полів. Згідно Drupal Forms API reference властивість #autocomplete_path можна додати тільки для елемента textfield. Ця властивість визначає шлях, по якому автоматично виключений Javascript-код Друпала пошле НТТР-запити, використовуючи JQuery.

Першим ділом оголосимо textfield у формі:

php
$form['example'] = array( 
  '#type' => 'textfield', 
  '#title' => t('Example Textfield'), 
  '#autocomplete_path' => 'products/autocomplete', 
);

Тепер в hook_menu() визначимо callback для нашого автозаповнення.

php
/** 
 * Implementation of hook_menu 
 */ 
function module_menu() { 
  $items['products/autocomplete'] = array( 
    'page callback' => 'module_products_autocomplete', 
    'type' => MENU_CALLBACK, 
    'access arguments' => array('administer nodes'), 
  ); 

  return $items; 
}

І на закінчення нам потрібно описати саму функцію зворотнього виклику, яка передає певний масив функції drupal_json():

php
function module_products_autocomplete($string) { 
  $matches = array(); 
  $res = db_query("SELECT title, nid FROM {node} WHERE LOWER(title) LIKE LOWER('%s%%')", $string);

  while ($row = db_fetch_array($res)) { 
    $matches[$row['nid']] = $row['title']; 
  } 
  drupal_json($matches); 
}

Результатом усіх старань у вас є повноцінне автозаповнюване поле.

Але досить часто виникає потреба у передавачі певних параметрів функції автозаповнення. В моєму випадку потрібно було переробити масив ідентифікаторів нод, і в автокомпліт підтягувати тільки дані ноди з цього масива. Для цього hook_menu() визначаємо page arguments:

php

/** 
 * Implementation of hook_menu 
 */ 
function module_menu() { 
  $items['products/autocomplete/%'] = array( 
    'page callback' => 'module_products_autocomplete', 
    'page arguments' => array(2), 
    'type' => MENU_CALLBACK, 
    'access arguments' => array('administer nodes'), 
  ); 

  return $items; 
}

Вносимо деякі поправки в певні властивості #autocomplete_page для textfield'a.

php
//we get $nids array with identificators of nodes 
$string_nids = implode('|', $nids); 
$form['example'] = array( 
  '#type' => 'textfield', 
  '#title' => t('Example Textfield'), 
  '#autocomplete_path' => "products/autocomplete/{$string_nids}",
);

Параметр $string автоматично передається функції автозаповнення за посередництвом АРІ. Якщо ви хочете передати додаткові аргументи, помістіть їх перед $string:

php
function module_products_autocomplete($arg2, $string) { 
  $matches = array(); 
  $nids = explode('|', $arg2); 
  $res = db_query("SELECT title, nid FROM {node} WHERE LOWER(title) LIKE LOWER('%s%%') AND nid IN (" . db_placeholders($nids, 'int') . ")", array_merge(array($string), $nids));

  while ($row = db_fetch_array($res)) { 
    $matches[$row['nid']] = $row['title']; 
  } 
  drupal_json($matches); 
}

Вищенаписане Друпал візуалізує приблизно так:

Голосів: 1 Рейтинг: 5

Також по темі

1

У сфері ІТ технологій розробникам важливо не тільки продемонструвати свої вміння та навички, а й вміти вдосконалювати їх. 

2

ССК-форматери - це частини коду, і вони дозволяють виводити поля так, як нам заманеться. Часто виникає ситуація, коли існуючих форматерів для виконання тієї...

3

Досить часто виникає необхідність реалізувати сайт із підтримкою мультимовності - можливості перекладу вмісту сайта на різні мови, де переклад на ту чи іншу мову здійснює модератор сайту. Проте...

4

В унісон із новими віяннями моди попапи здобули не на жарт серйозну популярність серед замовників, при чому в останніх сформувалось стійке відчуття, що сайт в ідеалі повинен бути в попапі. ...

5

Підключення до різних баз потрібно для експорту та імпорту даних. Розглянемо три способи виходу з такої ситуації.

Subscribe to our blog updates