xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

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

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
Похожие записи

Комментарии RSS

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

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

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

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

$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();

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

добавляйте nid в конец названия

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

http://www.linkexchanger.su/2008/39.html
ключевое слово extraParams
jQ встроена в Drupal

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

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

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

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

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

hook_menu_alter или hook_ajax_render_alter или hook_query_alter

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

посмотреть в фаирбаге

Открыл в firebug.

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

<div class="ajax-new-content" style="display: block;">
<div class="form-item form-type-textfield form-item-field-node-link-und-1-nid" role="application">
<input id="edit-field-node-link-und-1-nid" class="form-text form-autocomplete" type="text" maxlength="128" size="60" value="" name="field_node_link[und][1][nid]" autocomplete="OFF" aria-autocomplete="list">
<input id="edit-field-node-link-und-1-nid-autocomplete" class="autocomplete autocomplete-processed" type="hidden" disabled="disabled" value="http://dc2/node_reference/autocomplete/node/yrv_news/field_node_link">
<span id="edit-field-node-link-und-1-nid-autocomplete-aria-live" class="element-invisible" aria-live="assertive"></span>
</div>
</div>

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

node_reference/autocomplete/node/yrv_news/field_node_link

возможно

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

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

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

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

в сторону виджета

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании