Заполнение поля Entity Reference всеми дочерними объектами от определенного уровня

Главные вкладки

Аватар пользователя bad.shape.guy bad.shape.guy 12 апреля 2023 в 8:51

Добрый день, подскажите пожалуйста, в какую сторону копать.
Имеется допустим тип материала: 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());
      
    }  
  }
}
?>

Комментарии

Аватар пользователя marassa marassa 14 апреля 2023 в 9:18

Не могу комментировать семерочный код - не знаком с семеркой, но очень интересно понять зачем Вам понадобилось хранить в базе избыточную информацию? Что Вы будете делать, если понадобится поменять структуру фолдеров/категорий (например разбить категорию на две или объединить две категории и т.п.) а у Вас в куче документов жестко прописана вся старая структура категорий?
И второй вопрос: почему фолдеры/категории реализованы не на таксономии? Ведь для таксономии Друпал из коробки предоставляет механизмы работы с иерархиями.

Аватар пользователя bad.shape.guy bad.shape.guy 14 апреля 2023 в 18:56

Скажем так мне необходимо использовать ноды, т.к. мне нужен функционал разграничение прав, т.е. обычному пользователю нужно давать возможность создание, редактирование и удаление своих материалов, а также нужна возможность определенным пользователям показывать, а кому то скрывать материалы типа ПАПКА