Я думаю, вы имеете в виду, что хотите использовать аргумент, а не строку запроса. В любом случае, я не думаю, что представления могут обрабатывать имена ролей по умолчанию (они могут нормально обрабатывать идентификаторы ролей), поэтому вам придется изменить запрос представления, чтобы достичь того, чего вы хотите.
Сначала добавьте User: Roles в качестве аргумента в свой View. Затем в настраиваемом модуле реализуйте hook_views_query_alter () и измените запрос, заменив имя роли ее идентификатором.
function MYMODULE_views_query_alter(&$view, &$query) {
if ($view->name == 'my_view') {
$rolename = '';
foreach ($query->where as $where_index => $where) {
// find the role ID clause
$clause_index = array_search('users_roles.rid = %d', $where['clauses']);
if ($clause_index !== FALSE) {
// found it, so get the rolename
$rolename = $where['args'][$clause_index];
break;
}
}
// if the rolename argument was found
if (!empty($rolename)) {
// get the role ID
$user_roles = user_roles();
$rid = array_search($rolename, $user_roles);
// if the role exists, then replace the argument
if ($rid !== FALSE) {
$query->where[$where_index]['args'][$clause_index] = $rid;
}
}
}
}
Так, например, если ваш URL-адрес http://mysite.com/a, он будет искать Идентификатор роли 'a', затем найти все узлы автора с этой ролью. Он также будет принимать фактический идентификатор роли - например, если идентификатор роли 'a' равен 10, тогда http://mysite.com/10 также вернет тот же результат.
Если вы хотите, чтобы он только просматривал имена ролей, вы можете изменить ловушку так, чтобы она не выполнялась, когда она не находит роль (просто сделайте $ rid = 0, и вы не должны получать никаких результатов).
person
migimaru
schedule
03.08.2011