Рейтинг:0

Как получить ревизию абзаца

флаг sa

У меня есть код, который работает в hook_node_update. Этот код захватывает ревизию сохраненного узла и сравнивает значения полей между текущим узлом и его ревизией, чтобы создать своего рода исторический журнал (что было удалено/обновлено/добавлено).

Это работает очень хорошо, за исключением поля абзаца... Когда мой код пытается получить версию абзаца (рекурсивно), я каждый раз получаю один и тот же абзац вместо старой версии (таким образом, никаких различий в журнале)

Вот мой код для получения версии сохраненного узла (работает хорошо). Этот код также используется для абзацев (не работает)

$updated_entity : узел/абзац, который в данный момент находится в процессе сохранения

$old_entity : ревизия для сравнения с

  $old_entity = $updated_entity->оригинал;
  если (!$old_entity) {
    $storage = $this->getStorage($updated_entity);
    // нет необходимости проверять, можно ли пересматривать, так как мы используем только Node и Paragraphs
    если ($revision_id = $updated_entity->getLoadedRevisionId()) {
      $old_entity = $storage->loadRevision($revision_id);
     }
    еще {
      //... обработка новой сущности
      ]);
    }
  }

Этот код, примененный к абзацам, создает $old_entity == $updated_entity

Абзацы извлекаются из текущего сохраненного узла следующим образом:

$paragraphs = $updated_entity->get($paragraph_field)->referencedEntities();

после этого они становятся $updated_entity переменная в верхней функции, которая пытается получить ревизию...

Рейтинг:1
флаг cn

Безымянный верхний функция работает только для одного конкретного узла, который вы получаете через хук в качестве параметра. Загрузите старые ссылочные абзацы через исходный объект:

$old_paragraphs = $node->original->get($paragraph_field)->referencedEntities();

Для вложенных абзацев можно применить рекурсивную загрузку, но каждую ветку (старую/новую) отдельно, а не с верхний используйте функцию ->referencedEntities() для множественных элементов и ->entity для элементов с одним полем, эти функции загружают ревизии.

На многоязычном сайте вы должны получить перевод абзаца, используя язык узла:

$node_language = $node->language()->getId();
$value = $paragraph->getTranslation($node_language)->field_foo->value;
флаг cn
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (https://chat.stackexchange.com/rooms/131668/discussion-on-answer-by-4k4-how-to-get-the-revision-of-a-paragraph) .
флаг cn
Но что, если абзацы будут переупорядочены? Данный ключ массива в массиве, возвращаемом referencedEntities, может не указывать на один и тот же объект. Я думаю, вместо этого мы должны загрузить более старую сущность из идентификатора сущности записи абзаца.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.