hook_node_grants( ) проблемы при работе

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

Аватар пользователя vetalion vetalion 27 августа 2011 в 14:54

Добрый день русское сообщество. Использую hook в своем модули hook_node_grants() и hook_node_access_records() модуль под D7 у меня такая проблема hook_node_access_records выполняет свою функцию и добавляет при сохранении в таблицу права. hook_node_grants имеет такой вид

function mymodule_node_grants($account, $op){
if($op == 'view' || $op == 'update' || $op == 'delete' ){
$grants['stuff_backup_user'] = array($account -> uid);
return $grants ;
} }

То есть я сравниваю gid(grants id) с id юзера
Но когда я захожу с какого то другого юзера на эту ноду то hook не срабатывает и дает доступ к перечисленным выше операциям. Где может быть моя ошибка ??

Комментарии

Аватар пользователя Orion76 Orion76 27 августа 2011 в 16:24

Кстати... тоже интересует...
судя по тому, что написано сдесь:
http://api.drupal.org/api/drupal/modules--node--node.api.php/function/ho...

<?php
$record 
= array(
  
'nid' => 0,
  
'gid' => 888,
  
'realm' => 'example_realm',
  
'grant_view' => 1,
  
'grant_update' => 0,
  
'grant_delete' => 0,
);
drupal_write_record('node_access'$record);
?>

And then in its hook_node_grants() implementation, it would need to return:

<?php
if ($op == 'view') {
  
$grants['example_realm'] = array(888);
}
?>

наверное при сохранении ноды, необходимо вставить соответствующую запись в {node_accsess} (пример: массив $record в выше приведенном коде)

Аватар пользователя vetalion vetalion 27 августа 2011 в 19:22

Вставку в {node_access} вставляет hook hook_node_access_records() он работает коректно. а вот сама проверка
hook_node_grants() не работает у меня лично

Аватар пользователя tonyk tonyk 27 августа 2011 в 22:00

1. Чего вы хотите добиться этим кодом? Т.е. как оно должно правильно работать?
2. Что лежит в таблице node_access для этой ноды?

Аватар пользователя Orion76 Orion76 29 августа 2011 в 14:46

Кусок функции node_access
Выбирает из таблицы node_access записи, по определенному условию,
И если записьи найдены, возвращает TRUE, т.е. доступ разрешен...
Смотрите коментарии, начинающиеся на //!!!:


<?php
  
// If the module did not override the access rights, use those set in the
  // node_access table.

//!!! Если это не новая нода
  

if ($op != 'create' && $node->nid) {
    if (
module_implements('node_grants')) {
      
$query db_select('node_access');
      
$query->addExpression('1');

//!!! Определяет разрешение для типа доступа (Просмотр, Модификация , Удаление ноды)

      

$query->condition('grant_' $op1'>=');

//!!! Условие для поля nid (ID текущей ноды или 0-все)
      
$nids db_or()->condition('nid'$node->nid);
      if (
$node->status) {
        
$nids->condition('nid'0);
      }
      
$query->condition($nids);
      
$query->range(01);

//!!! Условия для полей gid, realm
/* Условия возвращаются хуком ИМЯ_МОДУЛЯ_node_grants
т.е. например если он возвращает:
array(
'user_uid'=> $account->uid;
);
то будет искаться запись где
"gid"= ИД текущего пользователя.
"realm"='user_uid'

и если она найдена, пользователю даются тип прав, определенных переменной $op
*/
      

$grants db_or();
      foreach (
node_access_grants($op$account) as $realm => $gids) {
        foreach (
$gids as $gid) {
          
$grants->condition(db_and()
            ->
condition('gid'$gid)
            ->
condition('realm'$realm)
          );
        }
      }
      if (
count($grants) > 0) {
        
$query->condition($grants);
      }
      
$result =  (bool) $query
        
->execute()
        ->
fetchField();
      
$rights[$account->uid][$cid][$op] = $result;
      return 
$result;
    }
    elseif (
is_object($node) && $op == 'view' && $node->status) {
      
// If no modules implement hook_node_grants(), the default behaviour is to
      // allow all users to view published nodes, so reflect that here.
      
$rights[$account->uid][$cid][$op] = TRUE;
      return 
TRUE;
    }
?>

т.е. при записи в node_acces условий проверки доступа пишем туда любое условие для проверки его впоследствии в хуке node_grants,
где "realm" - имя группы условий, а "gid" значениее(например: "realm"-"sex", "gid"-"male", "grants_view"=TRUE -)))

да... и при выводе ноды должна вызываться функция node_access и анализироваться возвращаемое значение, которая возвращает TRUE-доступ разрешен, FALSE-доступ запрещен.