hook_permission Drupal 7 разрешения на доступ для разных ролей
На прошлых уроках мы выводили страницы и блоки в разных местах, мы также использовали свойства 'access arguments', 'access callback' для задания ограничений на доступ к страницам. В этом уроке мы будем создавать возможность более гибкого редактирования правда доступа к операциям посредством страниц администрирования. Для этого мы будем использовать hook_permission() (в 6ом Друпале это был hook_perm()).
hook_permission()
Определяет разрешения для пользователей.
Этот хук может добавить разрешения, так что ваш модуль определит какие из них выбранны на страницы разрешений пользователей. Также хук используется для полного или частичного доступа к действиям (actions) которые выполняет модуль.
Разрешения проверяются используя user_access().
Возвращаемые значения
Массив ключи которого имя разрешения и соответствующие им значения массивы содержащие следующие пары ключ-значение:
title: Читаемое имя разрешения, которое показывается на странице разрешений. Это значения следует оборачивать в функцию t(), для того чтобы потом можно было перевести значение на другой язык.
description: (опционально) Описание того, что делает разрешения. Его тоже следует оборачивать в функцию t(), для перевода.
restrict access: (опционально) Boolean (логический, 0 или 1, true или false) который может быть TRUE для обозначения что администратору сайта следует ограничить доступ для этого разрешения только доверенным пользователям. Это свойство должно быть использовано для разрешений чтобы существующие угрозы безопасности не стали лазейкой для злоумышленника. (Например Управление фильтрами ввода и Полный контроль над нодами, предоставляемые ядром Друпала). Когда установлено TRUE, стандартное сообщение об ошибке определенное в user_admin_permissions() будет выведено через theme_user_permission_description() и будет связано с отображаемым разрешением на странице администрирования. По умолчанию значение restrict access это FALSE.
warning: (опционально) Отображать переводимое сообщение об ошибки для этого разрешения на странице администрирования. Это свойство переопределяет автоматическую ошибку генерируемую через restrict access, если установлено TRUE. Это свойство следует использовать редко, для того чтобы все разрешения выглядели понятно, последовательным и похожим на другие сообщение об угрозе безопасности как для других разрешений. Используйте description для того чтобы добавить информацию определяющую данное разрешение.
Давайте к коду из предыдущего урока добавим этот хук:
function sitemade_permission(){ return array('view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } function sitemade_menu(){ $items = array(); // инициализируем массив наших пунктов меню $items['admin/config/content/page_example'] = array( //добавляем страницу по пути 'admin/config/content/page_example' 'title' => 'Пример страницы', //заголовок страницы 'description' => 'Обычная страница', //описание страницы 'page callback' => '_page_example', //функция возвращающая контент страницы 'access arguments' => array('view page example'), //поставим права доступа как в hook_permission ); return $items; //возвращаем список страниц } function _page_example($content = NULL) { $content = ''; //инициализируем переменную пустого контента $query = db_select('node_revision', 'n'); //выбираем таблицу node_revision в которой лежит текущая ревизия документа $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); //присоединяем таблицу field_revision_body в которой лежит body $query->innerJoin('node', 'd', 'n.nid=d.nid'); //присоединяем таблицу node в которой лежит title ноды $query->fields('n', array('title'), array('nid'), array('vid')); //выбираем поля $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); //делаем ограничение по контент типу $query->orderBy('n.timestamp', 'DESC'); //сортируем сначала свежие новости $query->range(0, 10); //выбираем только 10 последних $result = $query->execute(); //выполняем запрос к БД while($nodes = $result->fetch()){ //обрабатываем запрос $content .= '<h3>' . $nodes->title . '</h3>'; //выводим title $content .= $nodes->body_value; //выводим body } return $content; //возвращаем контент }
Теперь на странице разрешений admin/people/permissions появится новое разрешение:
Выставляем разрешение только для администратора, чтобы обычные пользователи не могли увидеть эту страницу. Теперь при переходе на страницу admin/config/content/page_example обычным пользователям Друпал откажет в доступе ошибкой 403.
В следующем уроке мы сделаем страницу администрирования с формой выбора настроек нашего сайта с использованием Drupal Forms API.