Разрешение «Просмотр неопубликованного контента» для неавтора

18

Я немного погуглил, чтобы посмотреть, есть ли способ на уровне разрешений, позволяющий вошедшему в систему (но не администратору) пользователю просматривать неопубликованный контент (помеченный классом неопубликованных узлов CSS). Похоже, это запланировано только на Drupal 8. Но, может быть, кто-то был достаточно умен, чтобы сделать обходной путь?

У меня есть роль, Content Editorкоторая должна видеть все неопубликованные материалы, независимо от того, были они автором или нет.

Артур
источник

Ответы:

17

Если вы хорошо пишете очень маленький пользовательский модуль, вы можете использовать комбинацию hook_permission()и hook_node_access()сделать это:

function MYMODULE_permission() {
  return array(
    'unconditionally view unpublished content' => array(
      'title' => t('Unconditionally View Unpublished Content'),
      'restrict access' => TRUE
    )
  );
}

function MYMODULE_node_access($node, $op, $account) {
  // We're only bothered about the 'view' operation at the moment
  if ($op == 'view') {
    // If the user has access to our new permission, let 'em at it
    if (user_access('unconditionally view unpublished content', $account)) {
      return NODE_ACCESS_ALLOW;
    }
  }

  // For everything else let the system decide.
  return NODE_ACCESS_IGNORE;
}

Любая роль, которой вы назначаете новое разрешение, теперь сможет просматривать любой узел, независимо от того, опубликован он или нет.

Клайв
источник
Чтобы немного повысить безопасность, я добавил, && user_access('administer nodes')что это зависит от прав на создание контента. Теперь это не так "безоговорочно". Спасибо за пример!
Артур
Да, я должен был упомянуть, что вы, возможно, захотите немного «нарастить» это :) рады помочь
Клайв
снова отличный материал, Клайв. Это решает одну из моих проблем, а также ограничивает доступ к узлам с определенным сроком таксономии !!!
Uwe
1
Код действительно "безоговорочно просматривает любой контент". Он никогда не проверяет, опубликован ли узел или нет. Или, если роль имеет разрешение на просмотр содержимого в первую очередь.
JM01
6

Сначала я попробовал приведенный выше код, и это здорово. Но после предоставления прав на неопубликованный контент роли, эта роль все еще не могла видеть неопубликованный контент в представлениях, и это может быть очень полезно для некоторых ролей редактора ...

Я решил это с помощью модуля view_unpublished .

Коджо
источник
Я установил этот плагин, и вместо того, чтобы решить мою проблему, он не сделал и не сделал весь контент, отображаемый для пользовательской группы администраторов, которую я создал.
Мохамад Салама
Ну, извини, у тебя было такое поведение. Я уже давно пользуюсь им и никогда не имел такого pb с какой-либо ролью (если вы имели в виду, что ваша группа администраторов - это роль). Вы можете отправить сообщение в DO тогда.
Кодзё
3

Я использую ревизионный модуль для этого. После установки создаются следующие разрешения для каждого типа контента:

  • Тип контента : просмотр ревизий собственного контента

  • Тип контента : просмотр ревизий чьего-либо контента

  • Тип контента : публиковать ревизии собственного контента

  • Тип контента : публиковать ревизии чьего-либо контента

Предоставляя моим редакторам разрешение просматривать ревизии чьего-либо содержимого, они могут получать доступ и публиковать все узлы, которые были созданы или изменены другими пользователями.

Патрик Кенни
источник
1

Это то, что я в итоге сделал ....

Он создает «разрешение на просмотр любого контента» для каждого типа узла. Это почти то же самое, что и модуль узла, но добавляет дополнительную опцию.

/**
 * Implements hook_permission().
 */
function MODULE_permission() {
  $perms = array();
  foreach (node_permissions_get_configured_types() as $type) {
    $info = node_type_get_type($type);
    $perms += array(
      "view $type content" => array(
        'title' => t('%type_name: View any content', array('%type_name' => $info->name)),
      )
    );
  }
  return $perms;
}

/**
 * Implements hook_node_access().
 */
function MODULE_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;

  if (in_array($type, node_permissions_get_configured_types())) {
    if ($op == 'view' && user_access('view ' . $type . ' content', $account)) {
      return NODE_ACCESS_ALLOW;
    }
  }

  return NODE_ACCESS_IGNORE;
}
MTecknology
источник
1

Для этого есть модуль для Drupal 7 и Drupal 8:

View_unpublished

Этот модуль позволяет предоставить доступ для определенных пользовательских ролей для просмотра неопубликованных узлов определенного типа. Контроль доступа в этом отношении довольно гранулированный.

JeroenT
источник
0

Ссылаясь на официальное руководство администратора: https://drupal.org/node/1106606 модуль view_unpublished, предложенный Kojo, является быстрым и простым решением.

хаа
источник
0

Простой, разумный обходной путь - использовать флаг «продвижение на главную страницу» на узлах.

Если у вас нет другого использования этого флага, отфильтруйте ваши взгляды на «повышен до главной страницы». Ваши редакторы контента могут работать с узлом до его продвижения (по прямой ссылке). Но это пока не появится посетителям сайта.

Мы черпали вдохновение в подходе Youtube к видео.

user18099
источник
0

Если вам нужно только увидеть содержание в представлении, отключить SQL rewritingв Query Settingsсоответствии Otherс соображениях UI.

Это работает для меня, так как я только хочу, чтобы пользователи могли разблокировать неопубликованный контент.

Найл Мерфи
источник