Модуль, который работает только для роли

Главные вкладки

Аватар пользователя Кришпер Кришпер 1 мая 2018 в 12:07

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

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 2 мая 2018 в 14:24
1

Semantics wrote:

Вы действительно так задали вопрос, что без контекста можно подумать, что речь о системе пермишенов

Совершенно верно. Телепатов тут как бы нет.

Кришпер wrote:

Но мне просто было интересно, можно ли сделать так, чтоб модуль подрубал свой функционал чисто по роли, чтоб в админке такое настроить.

Насколько мне известно - нет. Кроме того, многие процедуры/хуки, содержащиеся в модуле, кешируются Друпалом.

Типично кошерный с точки зрения 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'ить.

Комментарии

Аватар пользователя Olegars Olegars 1 мая 2018 в 13:43

Конечно можно, к любому модулю можно настроить доступ индивидуально на странице управления доступом. Само собой, в модуле должна быть прописана иакая возможность

Аватар пользователя OldWarrior OldWarrior 1 мая 2018 в 20:09

Кришпер wrote:

М-м-м, как оно называется правильно, чтоб погуглить?

<?php
// Без 'global' фокус не получится.
global $user

// Проверяем наличие роли 'looser'.
if (in_array('looser'$user->roles)) {
  
// Ваяем свои стопицотстроккода здесь...
}
?>
Аватар пользователя Кришпер Кришпер 2 мая 2018 в 9:35

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

Аватар пользователя ivnish ivnish 2 мая 2018 в 12:08
2

Вам уж ответили, что "косячить" (разрабатывать) сайт нужно на локальной машине, а не на проде. Тогда у вас и вопросов таких возникать не будет

Аватар пользователя OldWarrior OldWarrior 2 мая 2018 в 14:24
1

Semantics wrote:

Вы действительно так задали вопрос, что без контекста можно подумать, что речь о системе пермишенов

Совершенно верно. Телепатов тут как бы нет.

Кришпер wrote:

Но мне просто было интересно, можно ли сделать так, чтоб модуль подрубал свой функционал чисто по роли, чтоб в админке такое настроить.

Насколько мне известно - нет. Кроме того, многие процедуры/хуки, содержащиеся в модуле, кешируются Друпалом.

Типично кошерный с точки зрения 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'ить.