Drupal: использование данных строки запроса в Views - PullRequest
0 голосов
/ 02 августа 2011

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

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

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

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

Ответы [ 2 ]

1 голос
/ 03 августа 2011

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

Сначала, добавьте пользователя: роли в качестве аргумента в вашем представлении.Затем в пользовательском модуле реализуйте 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' равен 10, то http://mysite.com/10 также вернет тот же результат.

Если вы хотите, чтобы он только просматривалup rolenames, вы можете изменить ловушку так, чтобы она не работала, когда она не находит роль (просто сделайте $ rid = 0, и вы не получите никаких результатов).

0 голосов
/ 31 мая 2013
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)) {`enter code here`
      // 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;
      }
    }
  }
}
...