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

11.04.2011
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

Иногда при разработке сайтов возникает необходимость, для удобства ввода данных, создавать поля с автозаполнением (autocomplete field). Примерами таких полей могут быть виджеты для cck-полей Node reference i User reference. Рассмотрим программное создание такого рода полей. 

Согласно Drupal Forms API reference свойство #autocomplete_path можно добавить только для элемента texfield. Это свойство определяет путь, по которому автоматически включенный JavaScript-код Друпала пошлет HTTP-запросы, используя 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_path для 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 автоматически передается функции автозаполнения посредством API. Если вы хотите передать дополнительные аргументы,  поместите их перед $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 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

CCK-форматтеры - это куски кода, позволяющие выводить поля так, как мы пожелаем. Часто возникает ситуация, когда существующих форматтеров для...

2

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

3

В предыдущем посте я приводил пример использования Ctools modal API с помощью одной формы. В этом же я рассмотрю использование еще одного мощного инструмента,...

4

Изначально идея #states заключалась в возможности создания динамических форм без написания JavaScript кода как такового. 

5

XML-RPC – простой протокол вызова удаленных процедур. XML-RPC является прародителем одного из популярных протоколов SOAP и, не смотря на свой возраст (реализован в 1998 году), XML-RPC не канул в...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime