Drupal 8 сиротских абзацев - PullRequest
       29

Drupal 8 сиротских абзацев

0 голосов
/ 25 апреля 2018

Я заметил, что сущности Paragraph не удаляются из базы данных. Они скорее отсоединяются от родительского узла.

Это заметно, если вы создаете представление, в котором перечислены абзацы, и прикрепляете контекстный фильтр, который фильтрует по Parent ID.

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

По-прежнему существует проблема наличия сотен потерянных абзацев и полевых данных в базе данных. Есть ли способ их почистить?

EDIT: Это, очевидно, серьезная ошибка, и ее можно найти в трекере ошибок модуля Paragraph: Удаленные объекты абзаца не удаляются из базы данных

1 Ответ

0 голосов
/ 25 апреля 2018

Теперь, когда я понял, что это ошибка, и она еще не исправлена, моя главная цель - просто очистить абзацы-сироты.

Кто-то создал этот модуль: Очистка абзаца , но я не фанат использования модулей для таких целей.

Итак, ниже я опубликую свою первую успешную попытку решить ее.Я должен предупредить , что это небезопасно , потому что оно удаляет абзацы!

Решение не проверено на использование ревизий, перевод контента и т. Д. Так что это может испортить ваш день. Сделайте резервную копию вашего сайта .

Используя модуль Devel, перейдите на Development> Execute PHP Code.Вставьте и выполните следующий код:

// get all paragraphs
$deleted = [];
$paragraph_ids = \Drupal::entityQuery('paragraph')->execute();
$paragraphs = \Drupal::entityTypeManager()->getStorage('paragraph')->loadMultiple($paragraph_ids);
foreach ($paragraphs as $target_id => $paragraph) {
  // get parent entity (node, taxonomy, paragraph, etc.)
  $parent = $paragraph->getParentEntity();
  $field_name = $paragraph->parent_field_name->value;

  // Check if current paragraph exists in parent entity field values
  $exists = FALSE;
  $values = is_null($parent) ? [] : $parent->get($field_name)->getValue();
  foreach($values as $value) {
    if ($value['target_id'] == $target_id) {
      $exists = TRUE;
    }
  }

  // Delete paragraphs that aren't linked to an entity they claim as a parent
  if (!$exists) {
    $paragraph->delete();
    $deleted[] = $target_id;
  }
}

print "Deleted paragraph IDs: " . implode(', ', $deleted);
...