【问题标题】:Argument 1 passed to EntityViewBuilder must implement interface, null given传递给 EntityViewBuilder 的参数 1 必须实现接口,给定 null
【发布时间】:2017-09-15 11:31:27
【问题描述】:
在我的 Drupal 项目中出现此错误:
可恢复的致命错误:参数 1 传递给
Drupal\Core\Entity\EntityViewBuilder::view() 必须实现接口
Drupal\Core\Entity\EntityInterface,给定 null,调用
/Users/team1/workspace/ga_p/modules/field_collection/src/Plugin/Field/FieldFormatter/FieldCollectionItemsFormatter.php
在第 33 行并在 Drupal\Core\Entity\EntityViewBuilder->view() 中定义
(core/lib/Drupal/Core/Entity/EntityViewBuilder.php 的第 110 行)。我愿意
不知道是不是因为创建了多个字段
(字段集合)
但我不知道如何消除这个错误。
Drupal 版本:8.3.4
【问题讨论】:
标签:
drupal-views
drupal-8
drupal-entities
【解决方案1】:
试试这个补丁
diff --git a/src/Plugin/Field/FieldType/FieldCollection.php b/src/Plugin/Field/FieldType/FieldCollection.php
index 8721220..c5335be 100644
--- a/src/Plugin/Field/FieldType/FieldCollection.php
+++ b/src/Plugin/Field/FieldType/FieldCollection.php
@@ -183,19 +183,15 @@ class FieldCollection extends EntityReferenceItem {
public function preSave() {
if ($field_collection_item = $this->getFieldCollectionItem()) {
- // TODO: Handle node cloning
- /*
- if (!empty($host_entity->is_new) && empty($entity->is_new)) {
+ $host = $this->getEntity();
+
+ // Handle node cloning
+ if($host->isNew() && !$field_collection_item->isNew()) {
// If the host entity is new but we have a field_collection that is not
// new, it means that its host is being cloned. Thus we need to clone
// the field collection entity as well.
- $new_entity = clone $entity;
- $new_entity->target_id = NULL;
- $new_entity->revision_id = NULL;
- $new_entity->is_new = TRUE;
- $entity = $new_entity;
+ $field_collection_item = $field_collection_item->createDuplicate();
}
- */
// TODO: Handle deleted items
/*
@@ -231,11 +227,10 @@ class FieldCollection extends EntityReferenceItem {
}
*/
- $this->newHostRevision = $this->getEntity()->isNewRevision();
+ $this->newHostRevision = $host->isNewRevision();
// If the host entity is saved as new revision, do the same for the item.
if ($this->newHostRevision) {
- $host = $this->getEntity();
$field_collection_item->setNewRevision();
diff --git a/src/Plugin/Field/FieldWidget/FieldCollectionEmbedWidget.php b/src/Plugin/Field/FieldWidget/FieldCollectionEmbedWidget.php
index 4d6ae09..800383f 100644
--- a/src/Plugin/Field/FieldWidget/FieldCollectionEmbedWidget.php
+++ b/src/Plugin/Field/FieldWidget/FieldCollectionEmbedWidget.php
@@ -104,9 +104,8 @@ class FieldCollectionEmbedWidget extends WidgetBase {
protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
// We don't want to render empty items on field collection fields
// unless a) the field collection is empty ; b) the form is rebuilding,
- // which means that the user clicked on "Add another item"; or
- // c) we are creating a new entity.
- if ((count($items) > 0) && !$form_state->isRebuilding() && !$items->getEntity()->isNew()) {
+ // which means that the user clicked on "Add another item"
+ if ((count($items) > 0) && !$form_state->isRebuilding()) {
$field_name = $this->fieldDefinition->getName();
$cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();
$parents = $form['#parents'];
提到了here。