Drupal: использование данных строки запроса в представлениях

у меня есть несколько ролей модератора на моем сайте drupal. пользователи с этими ролями могут создавать контент определенного типа контента, называемый Новости. назовем роли следующим образом: role_a, role_b, role_c, ...

теперь у меня есть представление, которое показывает последние 5 элементов новостей.

мой вопрос в том, как гранулировать элементы новостей в представлении в соответствии со строкой запроса? я имею в виду, что на странице http://mysite.com/a я хочу видеть только те новости, которые были добавлены пользователь с ролью "а". http://mysite.com/b предназначен для пользователя с полномочиями «b». и Т. Д.

как я могу использовать параметры строки запроса в фильтре представлений?


person kbeat    schedule 02.08.2011    source источник


Ответы (1)


Я думаю, вы имеете в виду, что хотите использовать аргумент, а не строку запроса. В любом случае, я не думаю, что представления могут обрабатывать имена ролей по умолчанию (они могут нормально обрабатывать идентификаторы ролей), поэтому вам придется изменить запрос представления, чтобы достичь того, чего вы хотите.

Сначала добавьте 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