Подключить пермь для более чем одного типа контента

Друпал 6.x

У меня есть этот модуль, который управляет четырьмя разными типами контента. Если на то пошло, как мне определить разрешение для каждого контента в одном модуле? Это вообще возможно? Я не могу понять, как определить разрешение для каждого типа контента, потому что hook_perm должен быть назван именем модуля, и у него нет аргумента (например, hook_access $node) для возврата разрешения на основе типа контента. Вот как я хотел бы сделать -

function mymodule_perm() 
{
if(content1)    
return array(
    'create content1 node',
    'edit content1 nodes',
    'delete content1 nodes',
);
if(content2)    
return array(
    'create content2 node',
    'edit content2 nodes',
    'delete content2 nodes',
);
if(content3)    
return array(
    'create content3 node',
    'edit content3 nodes',
    'delete content3 nodes',
);
.......
}

Любая помощь будет высоко ценится.


person Andrew    schedule 11.06.2010    source источник


Ответы (2)


Обычно вам не нужно создавать разрешения для типов содержимого самостоятельно, так как модуль узла делает это за вас в node_perm(). Для каждого типа содержимого, объявленного вами в hook_node_info(), модуль узла автоматически создаст фиксированный набор разрешений следующим образом:

  $perms[] = 'create '. $name .' content';
  $perms[] = 'delete own '. $name .' content';
  $perms[] = 'delete any '. $name .' content';
  $perms[] = 'edit own '. $name .' content';
  $perms[] = 'edit any '. $name .' content';

Кроме того, вы можете объявить любое количество дополнительных разрешений в реализации ваших модулей hook_perm() (при условии, что они уникальны) и использовать их в своем коде по своему усмотрению.

Здесь важно то, что разрешение мало что делает само по себе — это просто имя, которое будет отображаться на странице разрешений, что позволяет отнести его к ролям. Они становятся «значимыми» только в коде, который использует их через вызовы user_access().

Так что, если, например, вы хотите сами создать специальное новое разрешение для каждого из ваших типов контента, вы просто объявите их в hook_perm() все сразу (поэтому вам не нужны никакие аргументы — просто верните одну строку для каждого разрешения, которое вы' хотел бы создать).

person Henrik Opel    schedule 11.06.2010
comment
Как я пропустил, что строки разрешений для каждого контента могут быть возвращены как строки целиком! Огромное спасибо. - person Andrew; 12.06.2010

Вообще говоря, модуль, реализующий более одного типа контента, будет возвращать все разрешения, которые он определяет из hook_perm(); нет способа узнать, для какого типа контента Drupal запрашивает реализованные разрешения.
Drupal всегда запрашивает у модулей список всех реализованных разрешений, которые даже не могут быть связаны с узлами; например, некоторые модули реализуют только разрешения для своих страниц настроек.

person apaderno    schedule 15.06.2010
comment
Да, нет никакого способа узнать, что у hook_perm нет аргумента, как у других ловушек, чтобы узнать, для какого узла запрашивается разрешение. - person Andrew; 22.06.2010