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

13.10.2010

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

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

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