Запретить удалять ноды

Прислано: files32

пн, 16/08/2010 - 06:43

Другие статьи по теме:

Здравствуйте.

Есть 2 вида материала. Материал1 ссылается на Материал2 при помощи CCK поля reference.
Требуется запретить удалять Материал2, если хоть один материал на него ссылается.

Из существующих модулей нашел только  cck_referential_integrity который просто удаляет ссылку из Материал1, если удален Материал2 на который тот ссылался.

Требуется написать этот функционал самому, но неясно какой хук позволит отловить удаление ноды и при этом запретить это действие.  hook_nodeapi отловить процесс удаление ноды позволяет, но нельзя запретить это делать в этом обработчике.

Какой хук мне тут подойдет?

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано igorek в пн, 16/08/2010 - 06:51.

А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?


Опубликовано RxB в пн, 16/08/2010 - 06:56.

Как раз таки, мне кажется из hook_nodeapi() проканает


Опубликовано files32 в пн, 16/08/2010 - 07:06.

"igorek" написал(а):

А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?

Нет, так не пойдет. Удалять надо разрешить.

"RxB" написал(а):

Как раз таки, мне кажется из hook_nodeapi() проканает

Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.


Опубликовано files32 в пн, 16/08/2010 - 07:14.

Можно попробовать перехватывать validate формы node_delete_confirm, но не нравится мне этот подход тем, что при помощи других операций ноду все таки можно будет удалить, там где подтвержден6ие не запрашивается.


Опубликовано RxB в пн, 16/08/2010 - 07:21.

"files32" написал(а):

Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.

да, посмотрел документацию, косячокс.
Тогда hook_menu_alter() на путь node/%node/delete и туда вставить свою функцию проверки доступа, т.е. динамически разрешать и запрещать путь node/%node/delete


Опубликовано George88 в пн, 16/08/2010 - 07:28.

files32 написал(а):
"igorek" написал(а):

А может просто снять галку разрешающую удаление материала2 для определенных ролей, то есть вообще этим ролям не удалять материал2 - и не морочиться?

Нет, так не пойдет. Удалять надо разрешить.

"RxB" написал(а):

Как раз таки, мне кажется из hook_nodeapi() проканает

Хорошо, само событие я там отловлю, но как мне дать понять друпалу, что удалять нельзя? В справке указано, что при значении $op == 'delete' возвращаемых значений нет.

А может когда вы отловили событие попробовать что-то типа drupal_access_denied()


Опубликовано tonyk в пн, 16/08/2010 - 07:56.

 hook_nodeapi вам не поможет. Если тип контента, для которого должно проверяться условие, создан вручную (а не модулем, как, например, forum), то вам нужно разбираться с правами доступа Друпала:
 hook_node_grants
 hook_node_access_records


Опубликовано files32 в пн, 16/08/2010 - 08:05.

<?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.


Опубликовано files32 в пн, 16/08/2010 - 08:13.

"tonyk" написал(а):

Если тип контента, для которого должно проверяться условие, создан вручную (а не модулем, как, например, forum), то вам нужно разбираться с правами доступа Друпала:
hook_node_grants
hook_node_access_records

Похоже эти хуки отвечают только за права на свой тип контента.


Опубликовано tonyk в пн, 16/08/2010 - 08:17.

Нет. За любой, как hook_nodeapi.


Опубликовано igorek в пн, 16/08/2010 - 12:03.

Можно чезез  rules + чтобы удобно выбрать кнопку rules_forms + чтобы был интерфейс управления rules_admin


Опубликовано files32 в пт, 20/08/2010 - 02:36.

"igorek" написал(а):

Можно чезез rules + чтобы удобно выбрать кнопку rules_forms + чтобы был интерфейс управления rules_admin

Там я тоже нашел событие "После удаления", т.е. до удаления ноды проверить нельзя.

Играться с таблицами прав не хватает ума. Пошел другим путем.


Опубликовано igorek в пт, 20/08/2010 - 11:12.

"files32" написал(а):

Там я тоже нашел событие "После удаления",

А может перед просмотром контента
условие - тип материала = материал2
Действие - выполнение php кода - не отображать кнопку (удалить), если на эту ноду есть ссылки
Вообщем можно так сделать...


Опубликовано files32 в пт, 20/08/2010 - 12:15.

"igorek" написал(а):

А может перед просмотром контента
условие - тип материала = материал2
Действие - выполнение php кода - не отображать кнопку (удалить), если на эту ноду есть ссылки
Вообщем можно так сделать...

Да такие "обходные" варианты есть. Я уже писал про один такой метод, где можно добавить валидатор в node_delete_confirm. В валидаторе запрещать или разрешать в зависимости от условий.


Ссылки партнёров