Свой модуль User Field Access with Entity reference - Показывать поле материала только определённым пользователям, указанным в поле Доступ

Drupal: 

Этот модуль разграничивает доступ к содержимому материалов для определённых пользователей. Автор материала при создании может указывать в поле Доступ имена пользователей, которые будут иметь доступ к полю body (Текст). Все другие пользователи не будут видеть это поле.

По умолчанию всегда показывается это поле для ролей: administrator, editor - а также для самого автора материала.

Если в поле "Доступ" не установлено ни одного значения, то просмотр поля закрыт для всех, кроме автора и разрешённых ролей, для показа поля по умолчанию нужно раскомментировать соответствующую строчку кода.

Для пользования модулем вы можете исправить названия полей: body, field_access, а также ролей, которые имеют доступ.

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

Готовый модуль можно скачать под статьёй.

Для дальнейшей доработки кода, можно пользоваться модулем Devel и командами просмотра переменных dpm(), закомментированными в коде.

  1. /* Implement hook_node_view_alter(&$build)
  2.   * body - field name to hide if the user has no access
  3.   * body - hides by default if field_access is empty
  4.   * administrator, editor - roles have access
  5.   * node author - has access
  6.   * filed_access - entityreference field contains users that have access
  7.   */
  8.  
  9. function user_field_access_reference_node_view_alter(&$build) {
  10.  
  11. //check the node type
  12. if ($build['#bundle'] == 'article' || $build['#bundle'] == 'blog') {
  13.  
  14. global $user;
  15. //echo 'uid: '.$user->uid.' ';
  16. //if (module_exists('devel')) dpm($build['#node']); //debug info
  17.  
  18. //if current user has roles administrator or editor return
  19. foreach ($user->roles as $role) {
  20. if (($role == 'administrator') || ($role == 'editor')) return;
  21. }
  22.  
  23. //if current user is the node author return
  24. if ($build['#node']->uid == $user->uid) return;
  25.  
  26. //check field body exist
  27. if (isset($build['body'])) {
  28.  
  29. //hide field body by default
  30. $build['body']['#access'] = FALSE;
  31.  
  32. if (isset($build['#node']->field_access['und'])) {
  33. $qnty_users = count($build['#node']->field_access['und']);
  34. } else {
  35. $qnty_users = 0;
  36. }
  37.  
  38. //display to all if field_access has no users defined
  39. //if ($qnty_users == 0) $build['body']['#access'] = TRUE; //uncomment to give access by default
  40.  
  41. //check if the user has access
  42. for ( $i = 0; $i < $qnty_users; $i++ ) {
  43. if ($build['#node']->field_access['und'][$i]['target_id'] == $user->uid) {
  44. //display field body
  45. $build['body']['#access'] = TRUE;
  46. break;
  47. }
  48. }
  49. }
  50. }
  51. }

Если нужно по умолчанию открыть доступ всем, когда в поле Доступ не задано ни одного значения, тогда раскомментируйте строку:

 if ($qnty_users == 0) $build['body']['#access'] = TRUE;

 

 

Применение модуля User Field Access with Entity reference:

  • платный доступ к содержимому,
  • приватная информация для доверенных пользователей,
  • статистика и результаты для авторов и определённых пользователей (если ваше поле содержит какую-либо динамическую информацию).

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

 

Как в коде модуля происходит обращение к полям

Этот модуль имеет обращение к переменным материала через связь $build['#node']. То есть к полю, например, field_access можно обратиться двумя способами:
$build['#node']->field_access или
$build['field_access']

Оба способа обращения к полю правильные. Но если использовать модуль Field Permissions, который ограничивает использование и показ полей для определённых ролей, или если скрыть показ поля field_permissions, тогда нужно использовать первый способ: обращение к полю материала, а не к полю отображения материала. Тогда в случае использования $build['#node']->field_access не возникнет ситуации, когда пользователи не смогут просматривать поле body, потому что доступ к полю field_access у них закрыт и скрипт не выполнит строки, разрешающие просмотр.

 

Как настроить сайт для разграничения доступа к полям

Представленный модуль User Field Access with Entity reference имеет зависимости: модуль Entity Reference.

  1. Скачайте и установите оба модуля: Entity Reference и User Field Access with Entity reference
  2. Для нужных типов материалов создайте поле "Доступ" типа Entity reference, в этом модуле оно называется access (полное машинное имя: field_access)
  3. Исправьте в модуле строчку, содержащую типы материалов: article. blog - на ваши типы, или закомментируйте эту строку проверки и соответствующую закрывающую скобку
  4. Настройте поле "Доступ" как на картинке: тип связи - пользователь, множественный доступ
    entity reference user

  5. Если нужно ограничить пользователей, которые могут устанавливать поле Доступ, установите модуль Field Permissions и настройте его, как, например, на картинке - предоставлен доступ установки, просмотра этого поля только Администратору
    filed permissions access field

  6. Создайте новые записи и добавьте доступ определённым пользователям
    node creation user access

Модули: