Drupal → Создание поля с автодополнением (autocomplete)

13.04.2011

Чтобы наделить поле функцией автодополнения нужно:

1. Добавить полю свойство #autocomplete_path и прописать в нём путь, по которому будут возвращаться данные:

/**
 * Form builder.
 */
function mymodule_myform() {
  $form['myfield'] = array(
    '#type' => 'textfield',
    '#title' => 'My field',
    '#autocomplete_path' => 'mymodule/autocomplete', // <--
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
  );
  return $form;
}

2. Зарегистрировать в hook_menu() указанный путь:

/**
 * Implements hook_menu().
 */
function mymodule_menu() {
  $items['mymodule/autocomplete'] = array(
    'page callback' => 'mymodule_autocomplete',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

3. В соответствующей callback функции вернуть данные в json формате:

/**
 * Autocomplete callback.
 */
function mymodule_autocomplete($string) {
  // для примера, возвратим заголовки нод
  $result = db_select('node', 'n')
    ->fields('n', array('title'))
    ->condition('title', '%' . db_like($string) . '%', 'LIKE')
    ->range(0, 10)
    ->execute();

  $matches = array();
  foreach ($result as $row) {
    $matches[$row->title] = check_plain($row->title);
  }
    
  drupal_json_output($matches);
}

Profit.

Поле с автодополнением при помощи jQuery UI Autocomplete.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Мне в Вашем коде единственно что не нравится что у Вас нет проверки на присутствие результатов. Если их не будет, произойдет варнинг от php в foreach. Я бы написала так:

if (count($result)) {
  foreach ($result as $row) {
    $matches[$row->title] = check_plain($row->title);
  }
}

если результатов не будет, то цикл просто не выполнится, никаких варнингов не будет

Гость
05.07.2011, 10:20

При выделении нужного варианта в поле ввода вставляется его просто текст, а как потом обработать это дело, я имею ввиду что нод стаком именем может быть несколько, можно конечно заменить

$matches[$row->title] = check_plain($row->title); на 
$matches[$row->nid] = check_plain($row->title);

,но тогда там просто число ни очем не говорящее(непонятно что за статья) хотя нид можно использовать.
Как тут лучше поступить ?

как потом обработать это дело

$nid = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->condition('title', $form_state['values']['myfield'])
  ->execute()
  ->fetchField();
Гость
06.07.2011, 04:53

а вдруг там 2 статьи с одинаковым названием, всякое бывает

Гость
25.10.2011, 11:31

И пугать пользователя непонятными цифрами. Буэээ

А как сделать в drupal 6, чтобы при клике или нажатию Enter среди найденного сразу происходил Submit по данному значению?

Гость
04.10.2012, 03:02

Неплохо бы добавить, что для того чтобы фишка с hook_menu сработала, т.е. добавилась бы псевдостраничка, нужно очистить кэш...

Роман
17.10.2012, 17:56

Скажите пожалуйста, а возможно ли таким образом переопределить выводимую информацию уже для существующего поля ССК, ссылающегося на ноду ?

То есть, допустим, есть ноды с населенными пунктами и у них есть таксономия - регионы России. И есть ноды другого типа, в которых есть ССК-поля - ссылки на эти населенные пункты.

Так вот, возможно ли сделать так, чтобы если пользователь хочет выбрать нас. пункт "Николаевка", то чтобы ему показывалось не "Николаевка, Николаевка, Николаевка", а "Николаевка (Ростовская обл.), Николаевка (Московская обл.), Николаевка (Краснодарский край)" ?

hook_menu_alter или hook_ajax_render_alter или hook_query_alter

Роман
17.10.2012, 18:37

Так а каким образом мне узнать, какой пункт меню в этом случае нужно переопределить в hook_menu_alter, если я знаю название CCK-поля ?
Допустим, у меня CCK-поле называется field_node_link и переопределяется hook_menu_alter.

Роман
17.10.2012, 22:15

Открыл в firebug.

Вот фрагмент, соотв. одной строке, где autocomplete

[html]

[/html]

Не вот это ли название пункта меню ?

node_reference/autocomplete/node/yrv_news/field_node_link

Роман
17.10.2012, 22:20

Думаю, нужно повнимательнее изучить node_reference.module.
Тогда многое прояснится.

Спасибо, за статью.
К сожалению не работает это решения для комбинированного фильтра поля Views

PS
Сайт очень полезный.
Пожалуйста, не удаляйте его.

Подскажите. Я создал множественное поле textfield в настройках типа материала. Мне необходимо сделать его автодополняемым. В какую сторону копать?

Разрабатываю зависимые autocomplete-поля. Столкнулся с трудностью передачи результата выбора значения первого поля во второе (форма выбора адреса, например). Обычными селектами решается все просто, а тут загвоздка. Пробовал передать результат (id улицы) в value созданного автокомплитом поля выбора здания (там где хранится ссылка коллбека) путем замены в js этой ссылки, но в коллбек приходит неизмененные данные. Т.е. ссылка меняется, но в hook_menu приходит неизмененная. Размышлял о кеше формы, но где его править? Поможете?

Добавить комментарий