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.
Комментарии
Мне в Вашем коде единственно что не нравится что у Вас нет проверки на присутствие результатов. Если их не будет, произойдет варнинг от php в foreach. Я бы написала так:
если результатов не будет, то цикл просто не выполнится, никаких варнингов не будет
При выделении нужного варианта в поле ввода вставляется его просто текст, а как потом обработать это дело, я имею ввиду что нод стаком именем может быть несколько, можно конечно заменить
Как тут лучше поступить ?
а вдруг там 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
Не вот это ли название пункта меню ?
node_reference/autocomplete/node/yrv_news/field_node_link
возможно
Думаю, нужно повнимательнее изучить node_reference.module.
Тогда многое прояснится.
Спасибо, за статью.
К сожалению не работает это решения для комбинированного фильтра поля Views
PS
Сайт очень полезный.
Пожалуйста, не удаляйте его.
Подскажите. Я создал множественное поле textfield в настройках типа материала. Мне необходимо сделать его автодополняемым. В какую сторону копать?
в сторону виджета
Разрабатываю зависимые autocomplete-поля. Столкнулся с трудностью передачи результата выбора значения первого поля во второе (форма выбора адреса, например). Обычными селектами решается все просто, а тут загвоздка. Пробовал передать результат (id улицы) в value созданного автокомплитом поля выбора здания (там где хранится ссылка коллбека) путем замены в js этой ссылки, но в коллбек приходит неизмененные данные. Т.е. ссылка меняется, но в hook_menu приходит неизмененная. Размышлял о кеше формы, но где его править? Поможете?
Оставить комментарий