Можно ли сделать так, что бы модуль работал только для юзера с конкретной ролью? Просто пишу в модууле ф-ции, иногда косячу и сайт падает, т.к ф-ции модуля везде подгружаются.
Модуль, который работает только для роли
Главные вкладки
Лучший ответ
Вы действительно так задали вопрос, что без контекста можно подумать, что речь о системе пермишенов
Совершенно верно. Телепатов тут как бы нет.
Но мне просто было интересно, можно ли сделать так, чтоб модуль подрубал свой функционал чисто по роли, чтоб в админке такое настроить.
Насколько мне известно - нет. Кроме того, многие процедуры/хуки, содержащиеся в модуле, кешируются Друпалом.
Типично кошерный с точки зрения Drupal-way - подключение файла с дополнительным кодом в объявлении роутера меню (hook_menu). Что позволяет избирательно автоматически делать include, в зависимости от внутреннего пути Друпала. Например, как-то так:
<?php
function mymodule_menu()
{
$menu['my/page'] = array
(
'title' => 'My Page',
'page callback' => 'some_page',
'access callback' => TRUE,
'file' => 'some_page.inc', // Оно самое
);
return
$menu;
}
?>
Если в этой точке настроить access callback или access arguments, то можно ограничить доступ к роутеру для определённых ролей/прав. Содержимое файла загружается после проверки условий доступа и ДО выполнения page callback. В противном случае отдаётся 403 или что-подобное.
Разумеется, это предполагает, что функционал подключаемого файла актуален только в контексте это самого запрашиваемого пути. Т.е. должна быть или какая-то сущность, или явная привязка всей конечной "механики" к системе путей. Но, из опыта, в подавляющем большинстве случаев в Друпале мы работаем именно с такой механикой и обычно нет нужды без необходимости грузить и тащить стопицот строк ненужного/неконтекстного кода на протяжении выполнения всего PHP-процесса.
Вообще (как правило) чаще всего используются хуки Друпала, где в общем-то можно includ'ить любые либы/файлы избирательно в нужный момент и по своему усмотрению (см. module_load_include()). Чаще всего вы работаете либо с нодами, либо с терминами, либо с пользователями etc... Либо делается preprocess/alter каких-то существующих сущностей/форм. Т.е. обычно есть явные точки, в которых можно что-то там includ'ить.
Комментарии
Конечно можно, к любому модулю можно настроить доступ индивидуально на странице управления доступом. Само собой, в модуле должна быть прописана иакая возможность
М-м-м, как оно называется правильно, чтоб погуглить?
Оно называется "Не нужно разрабатывать на продакшене".
Отвечающий выше тебя просто не понял
<?php
// Без 'global' фокус не получится.
global $user; // Проверяем наличие роли 'looser'.
if (in_array('looser', $user->roles)) {
// Ваяем свои стопицотстроккода здесь...
}
?>
https://api.drupal.org/api/drupal/modules!user!user.module/function/user...
Можно, кстати, и так, но только тогда нужно явно указывать RID роли (число).
<?php
$user = $GLOBALS['user']; // Так намного безопаснее
?>
Перефразирую подробнее - проблема не в проверке роли, а в том, что ф-ции модулей в любом случае подгружаются везде. А когда я их пишу, порой косячу, получается ошибка и он вылетает на всём сайте. Пока вынес ф-ции в отдельный файл, который инклудю по роли. Но мне просто было интересно, можно ли сделать так, чтоб модуль подрубал свой функционал чисто по роли, чтоб в админке такое настроить.
Вам уж ответили, что "косячить" (разрабатывать) сайт нужно на локальной машине, а не на проде. Тогда у вас и вопросов таких возникать не будет
Совершенно верно. Телепатов тут как бы нет.
Насколько мне известно - нет. Кроме того, многие процедуры/хуки, содержащиеся в модуле, кешируются Друпалом.
Типично кошерный с точки зрения Drupal-way - подключение файла с дополнительным кодом в объявлении роутера меню (hook_menu). Что позволяет избирательно автоматически делать include, в зависимости от внутреннего пути Друпала. Например, как-то так:
<?php
function mymodule_menu()
{
$menu['my/page'] = array
(
'title' => 'My Page',
'page callback' => 'some_page',
'access callback' => TRUE,
'file' => 'some_page.inc', // Оно самое
);
return
$menu;}
?>
Если в этой точке настроить access callback или access arguments, то можно ограничить доступ к роутеру для определённых ролей/прав. Содержимое файла загружается после проверки условий доступа и ДО выполнения page callback. В противном случае отдаётся 403 или что-подобное.
Разумеется, это предполагает, что функционал подключаемого файла актуален только в контексте это самого запрашиваемого пути. Т.е. должна быть или какая-то сущность, или явная привязка всей конечной "механики" к системе путей. Но, из опыта, в подавляющем большинстве случаев в Друпале мы работаем именно с такой механикой и обычно нет нужды без необходимости грузить и тащить стопицот строк ненужного/неконтекстного кода на протяжении выполнения всего PHP-процесса.
Вообще (как правило) чаще всего используются хуки Друпала, где в общем-то можно includ'ить любые либы/файлы избирательно в нужный момент и по своему усмотрению (см. module_load_include()). Чаще всего вы работаете либо с нодами, либо с терминами, либо с пользователями etc... Либо делается preprocess/alter каких-то существующих сущностей/форм. Т.е. обычно есть явные точки, в которых можно что-то там includ'ить.