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

В друпале достаточно легко создать поле с автодополнением имени пользователя:
$form['user'] = array(
  '#title' => 'Пользователь',
  '#type' => 'textfield',
  '#autocomplete_path' => 'user/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
Теги:
работа с формами
Добавлено: 26 Июля 2018 20:32:46 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...