То, что нужно каждому — для контроля здоровья, для решения финансовых проблем, для общения, для хранения истории семьи

Как сохранить UR-node_access, используя node_save()

Drupal 6. Если для ограничения доступа используется модуль User Relationship Node Access, то функция node_save() неожиданным образом эти ограничения снимает. Это связано с тем что модуль UR Node Access сам снимает эти права во время обработки операции update в своем hook_nodeapi(). Чтобы эти права восстанавливались во время обработки других операций пришлось перед каждым использованием node_save() добавлять несколько строк дополнительного кода:

$array_keys =  array_keys($node->user_relationship_node_access);
foreach ($array_keys as $key => $value) {
    $node->user_relationship_node_access['view'][$value] = TRUE;
}

node_save($node);

Ничего не поделаешь, так уж устроен на сегодня User Relationship Node Access.

P.S. Использовать drupal_execute() вместо node_save(), как предлагалось в одном из комментариев к публикации с вышеприведенным англоязычным заголовком, не удалось. Похоже, функция drupal_execute() в новой версии Drupal была изменена. И находится не там, и аргументы другие, и работать отказывается.

Комментарии

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