Ошибка: вызов функции-члена getTranslation () при нулевом удалении абзаца - PullRequest
0 голосов
/ 03 мая 2019

Я хочу удалить абзацы из поля в узле;если поле имеет абзацы там или нет.Приведенный ниже код генерирует следующую ошибку:

Ошибка: вызов функции-члена getTranslation () для null в Drupal \ Core \ Entity \ ContentEntityBase-> hasTranslationChanges ()

    // delete all map_legend and map_item paragraphs before
    if (!empty($d8_node->field_map_legends->getValue())) {
        foreach ($d8_node->field_map_legends->getValue() as $paragraph) {
            if ($paragraph["target_id"]) {
                $previous_paragraph = Paragraph::load($paragraph["target_id"]);

                if ($previous_paragraph) {
                    $previous_paragraph->delete();
                }
             }
        }
    }

Когда язакомментируйте $ previous_paragraph-> delete (), это не выдает ошибку, но абзацы не удаляются.

Я попытался попытаться обойти удаление.Я пытался, если isset на $ previous_paragraph и на самом field_map_legends.Я перепробовал все, что мог придумать.

Прошу прощения, если это дубликат где-то еще.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 07 мая 2019

Проблема в том, что удаление абзаца не удаляет ссылки на этот абзац.В этом случае field_map_legends на этом узле по-прежнему ссылается на удаленный абзац через target_id, даже несмотря на то, что Paragraph с таким идентификатором больше не существует.

Самый безопасный способ сделать это - удалить ссылку с узла вместопрямое удаление абзаца (хотя вы можете сделать оба вместе, если хотите).

  // delete all map_legend and map_item paragraphs before
  if ($d8_node->hasField('field_map_legends')) {

    // Optional. Delete the Paragraph entities.
/*
    foreach ($d8_node->field_map_legends->getValue() as $paragraph) {
      if ($paragraph["target_id"]) {
        $previous_paragraph = Paragraph::load($paragraph["target_id"]);

        if ($previous_paragraph) {
          $previous_paragraph->delete();
        }
      }
    }
*/

    // Remove all of the Paragraph references from this field.
    $d8_node->set('field_map_legends', []);
    // Save our changes to the node.
    $d8_node->save();
  }
...