错误:在删除段落时,在null上调用成员函数getTranslation()

时间:2019-05-03 20:21:12

标签: drupal drupal-8 paragraph

我想从节点中的字段中删除段落;如果字段中有段落。下面的代码引发以下错误:

错误:在Drupal \ Core \ Entity \ ContentEntityBase-> hasTranslationChanges()中,调用成员函数getTranslation()为null

    // 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()时,它不会引发错误,但是不会删除段落。

我已经尝试过尝试/抓住删除。我试过了是否在$ previous_paragraph和field_map_legends本身上设置了isset。我已经尽力想了一切。

如果这与其他地方重复,我深表歉意。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这里的问题是删除一个段落不会删除对该段落的引用。在这种情况下,即使该ID的段落不再存在,该节点上的field_map_legends仍通过target_id引用已删除的段落。

最安全的方法是从节点中删除引用,而不是直接删除该段落(尽管如果需要,您可以将两者一起执行)。

  // 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();
  }