Добрый день, подскажите пожалуйста, в какую сторону копать.
Имеется допустим тип материала: FOLDER и DOCUMENT
В первом типе материала (FOLDER) кроме стандартных полей TITLE и BODY есть PARENT, это Entity Reference которое ссылается на тот же самый тип материала, т.е. используется для построение иерархии категорий
Соответственно во втором типе (DOCUMENT) кроме стандартных есть FOLDER, это Entity Reference на тип материала FOLDER и FOLDERS также Entity Reference но только с неограниченным количеством,
Т.е. всё стандартно, документ с папкой. Однако нужно сделать так, что:
При создании/обновлении материала DOCUMENT, в момент его сохранения брать указанное значение FOLDER и рекурсивно к самому последнему родителю достать все объекты, после чего именно весь этот перечень занести в поле FOLDERS. Т.е. чтобы в результате в поле FOLDERS хранилась вся иерархия выбранная пользователем поля FOLDER
Каким это образом правильнее сделать
Сделал следующим образом, но боюсь в программировании не силён, и можно было наверное ещё лучше и компактнее сделать, посоветуйте пожалуйста
<?php
/**
* Implements hook_node_presave().
*/
function mymodule_node_presave($node) {
if ($node->type == 'document') {
$folder = field_get_items('node', $node, 'field_document_folder');
$nids = array();
if ($folder) {
$root_folder = $folder[0]['target_id'];
$nids[] = $root_folder;
$parent_folder = node_load($root_folder);
do {
$deep_folder = field_get_items('node', $parent_folder, 'field_folder_parent');
if ($deep_folder) {
$parent_folder = node_load($deep_folder[0]['target_id']);
$nids[] = $deep_folder[0]['target_id'];
}
}
while ($deep_folder);
$update_node = entity_metadata_wrapper('node', $node);
$update_node->field_document_folders->set(array_reverse($nids));
} else {
$update_node = entity_metadata_wrapper('node', $node);
$update_node->field_document_folders->set(array());
}
}
}
?>
Комментарии
Не могу комментировать семерочный код - не знаком с семеркой, но очень интересно понять зачем Вам понадобилось хранить в базе избыточную информацию? Что Вы будете делать, если понадобится поменять структуру фолдеров/категорий (например разбить категорию на две или объединить две категории и т.п.) а у Вас в куче документов жестко прописана вся старая структура категорий?
И второй вопрос: почему фолдеры/категории реализованы не на таксономии? Ведь для таксономии Друпал из коробки предоставляет механизмы работы с иерархиями.
Скажем так мне необходимо использовать ноды, т.к. мне нужен функционал разграничение прав, т.е. обычному пользователю нужно давать возможность создание, редактирование и удаление своих материалов, а также нужна возможность определенным пользователям показывать, а кому то скрывать материалы типа ПАПКА