Добрый день русское сообщество. Использую 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 не срабатывает и дает доступ к перечисленным выше операциям. Где может быть моя ошибка ??
Комментарии
Кстати... тоже интересует...
судя по тому, что написано сдесь:
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 в выше приведенном коде)
Вставку в {node_access} вставляет hook hook_node_access_records() он работает коректно. а вот сама проверка
hook_node_grants() не работает у меня лично
1. Чего вы хотите добиться этим кодом? Т.е. как оно должно правильно работать?
2. Что лежит в таблице node_access для этой ноды?
Кусок функции 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'); //!!! Определяет разрешение для типа доступа (Просмотр, Модификация , Удаление ноды)
$nids = db_or()->condition('nid', $node->nid);
if ($node->status) {
$nids->condition('nid', 0);
}
$query->condition($nids);
$query->range(0, 1); //!!! Условия для полей 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-доступ запрещен.