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

Drupal → Поле с автодополнением имён пользователей

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

В друпале достаточно легко создать поле с автодополнением имени пользователя:

$form['user'] = array(
  '#title' => 'Пользователь',
  '#type' => 'textfield',
  '#autocomplete_path' => 'user/autocomplete',
);

Сложнее когда необходима возможность ввести несколько пользователей, на манер тегов при создании материала:

autocomplete

Если на сайте включён модуль Views, то можно использовать его служебные функции для решения этой задачи:

$form['users'] = array(
  '#title' => 'Пользователи',
  '#type' => 'textfield',
  '#autocomplete_path' => 'admin/views/ajax/autocomplete/user', // views url
);

Иначе придётся добавить эту функциональность самостоятельно:

/**
 * Реализация hook_menu().
 */
function mymodule_menu() {
  $items['user/mass_autocomplete'] = array(
    'page callback' => 'mymodule_autocomplete_user',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
 
  return $items;
}
 
/**
 * Копипаст ф-ии views_ajax_autocomplete_user() используемой в Views
 */
function mymodule_autocomplete_user($string = '') {
  $array = drupal_explode_tags($string);
  $last_string = trim(array_pop($array));
  $matches = array();
  if ($last_string != '') {
    $prefix = count($array) ? implode(', ', $array) . ', ' : '';
 
    if (strpos('anonymous', strtolower($last_string)) !== FALSE) {
      $matches[$prefix . 'Anonymous'] = 'Anonymous';
    }
    $result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $last_string, 0, 10);
 
    while ($account = db_fetch_object($result)) {
      $n = $account->name;
      if (strpos($account->name, ',') !== FALSE || strpos($account->name, '"') !== FALSE) {
        $n = '"' . str_replace('"', '""', $account->name) . '"';
      }
      $matches[$prefix . $n] = check_plain($account->name);
    }
  }
 
  drupal_json($matches);
}
 
/**
 * Описание формы
 */
function mymodule_form() {
  ...
  $form['users'] = array(
    '#title' => 'Пользователи',
    '#type' => 'textfield',
    '#autocomplete_path' => 'user/mass_autocomplete', // адрес, по которому вызывается ф-я mymodule_autocomplete_user
  );
  ...
  return $form;
}
Написанное актуально для Drupal 6.x
Похожие записи

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

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

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