В друпале достаточно легко создать поле с автодополнением имени пользователя:
$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
Добавить комментарий