Запретить удалять ноды
Прислано: files32
пн, 16/08/2010 - 06:43
Здравствуйте.
Есть 2 вида материала. Материал1 ссылается на Материал2 при помощи CCK поля reference.
Требуется запретить удалять Материал2, если хоть один материал на него ссылается.
Из существующих модулей нашел только
cck_referential_integrity который просто удаляет ссылку из Материал1, если удален Материал2 на который тот ссылался.
Требуется написать этот функционал самому, но неясно какой хук позволит отловить удаление ноды и при этом запретить это действие.
hook_nodeapi отловить процесс удаление ноды позволяет, но нельзя запретить это делать в этом обработчике.
Какой хук мне тут подойдет?
- files32's blog
- Для комментирования войдите или зарегистрируйтесь
А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?
- Для комментирования войдите или зарегистрируйтесь
Как раз таки, мне кажется из hook_nodeapi() проканает
- Для комментирования войдите или зарегистрируйтесь
А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?
Нет, так не пойдет. Удалять надо разрешить.
Как раз таки, мне кажется из hook_nodeapi() проканает
Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.
- Для комментирования войдите или зарегистрируйтесь
Можно попробовать перехватывать validate формы node_delete_confirm, но не нравится мне этот подход тем, что при помощи других операций ноду все таки можно будет удалить, там где подтвержден6ие не запрашивается.
- Для комментирования войдите или зарегистрируйтесь
Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.
да, посмотрел документацию, косячокс.
Тогда hook_menu_alter() на путь node/%node/delete и туда вставить свою функцию проверки доступа, т.е. динамически разрешать и запрещать путь node/%node/delete
- Для комментирования войдите или зарегистрируйтесь
А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?
Нет, так не пойдет. Удалять надо разрешить.
Как раз таки, мне кажется из hook_nodeapi() проканает
Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.
А может когда вы отловили событие попробовать что-то типа drupal_access_denied()
- Для комментирования войдите или зарегистрируйтесь
hook_nodeapi вам не поможет. Если тип контента, для которого должно проверяться условие, создан вручную (а не модулем, как, например, forum), то вам нужно разбираться с правами доступа Друпала:
hook_node_grants
hook_node_access_records
- Для комментирования войдите или зарегистрируйтесь
<?php
function node_delete($nid) {
$node = node_load($nid);
if (node_access('delete', $node)) {
db_query('DELETE FROM {node} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);
// Call the node-specific callback (if any):
node_invoke($node, 'delete');
node_invoke_nodeapi($node, 'delete');
// Clear the page and block caches.
cache_clear_all();
// Remove this node from the search index if needed.
if (function_exists('search_wipe')) {
search_wipe($node->nid, 'node');
}
watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
drupal_set_message(t('@type %title has been deleted.', array('@type' => node_get_types('name', $node), '%title' => $node->title)));
}
}
?>Как видно из кода функция
node_delete сначала удаляет, а потом вызывает хук nodeapi.
- Для комментирования войдите или зарегистрируйтесь
Если тип контента, для которого должно проверяться условие, создан вручную (а не модулем, как, например, forum), то вам нужно разбираться с правами доступа Друпала:
hook_node_grants
hook_node_access_records
Похоже эти хуки отвечают только за права на свой тип контента.
- Для комментирования войдите или зарегистрируйтесь
Нет. За любой, как hook_nodeapi.
- Для комментирования войдите или зарегистрируйтесь
Можно чезез
rules + чтобы удобно выбрать кнопку rules_forms + чтобы был интерфейс управления rules_admin
- Для комментирования войдите или зарегистрируйтесь
Можно чезез rules + чтобы удобно выбрать кнопку rules_forms + чтобы был интерфейс управления rules_admin
Там я тоже нашел событие "После удаления", т.е. до удаления ноды проверить нельзя.
Играться с таблицами прав не хватает ума. Пошел другим путем.
- Для комментирования войдите или зарегистрируйтесь
Там я тоже нашел событие "После удаления",
А может перед просмотром контента
условие - тип материала = материал2
Действие - выполнение php кода - не отображать кнопку (удалить), если на эту ноду есть ссылки
Вообщем можно так сделать...
- Для комментирования войдите или зарегистрируйтесь
А может перед просмотром контента
условие - тип материала = материал2
Действие - выполнение php кода - не отображать кнопку (удалить), если на эту ноду есть ссылки
Вообщем можно так сделать...
Да такие "обходные" варианты есть. Я уже писал про один такой метод, где можно добавить валидатор в node_delete_confirm. В валидаторе запрещать или разрешать в зависимости от условий.
- Для комментирования войдите или зарегистрируйтесь


Комментарии