Issue #2156337 by yched, amateescu, smiletrl: Merge ConfigEntityReferenceItemBase up into EntityReferenceItem, and fix inconsistencies.

8.0.x
Alex Pott 2014-02-12 02:12:01 +00:00
parent 44b98ffa10
commit f5ba64c9c1
10 changed files with 72 additions and 88 deletions

View File

@ -1,63 +0,0 @@
<?php
/**
* @file
* Contains \Drupal\Core\Field\ConfigEntityReferenceItemBase.
*/
namespace Drupal\Core\Field;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
/**
* A common base class for configurable entity reference fields.
*
* Extends the Core 'entity_reference' entity field item with common methods
* used in general configurable entity reference field.
*/
class ConfigEntityReferenceItemBase extends EntityReferenceItem {
/**
* {@inheritdoc}
*/
public function isEmpty() {
// Avoid loading the entity by first checking the 'target_id'.
$target_id = $this->target_id;
if (!empty($target_id)) {
return FALSE;
}
// Allow auto-create entities.
if (empty($target_id) && ($entity = $this->get('entity')->getValue()) && $entity->isNew()) {
return FALSE;
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function getValue() {
$values = parent::getValue();
// If there is an unsaved entity, return it as part of the field item values
// to ensure idempotency of getValue() / setValue().
if (empty($this->target_id) && !empty($this->entity)) {
$values['entity'] = $this->entity;
}
return $values;
}
/**
* {@inheritdoc}
*/
public function preSave() {
$entity = $this->get('entity')->getValue();
$target_id = $this->get('target_id')->getValue();
if (!$target_id && !empty($entity) && $entity->isNew()) {
$entity->save();
$this->set('target_id', $entity->id());
}
}
}

View File

@ -166,6 +166,20 @@ class EntityReferenceItem extends FieldItemBase {
}
}
/**
* {@inheritdoc}
*/
public function getValue($include_computed = FALSE) {
$values = parent::getValue($include_computed);
// If there is an unsaved entity, return it as part of the field item values
// to ensure idempotency of getValue() / setValue().
if ($this->hasUnsavedEntity()) {
$values['entity'] = $this->entity;
}
return $values;
}
/**
* {@inheritdoc}
*/
@ -187,4 +201,44 @@ class EntityReferenceItem extends FieldItemBase {
return 'target_id';
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
// Avoid loading the entity by first checking the 'target_id'.
$target_id = $this->target_id;
if ($target_id !== NULL) {
return FALSE;
}
// Allow auto-create entities.
if ($this->hasUnsavedEntity()) {
return FALSE;
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function preSave() {
if ($this->hasUnsavedEntity()) {
$this->entity->save();
$this->target_id = $this->entity->id();
}
}
/**
* Determines whether the item holds an unsaved entity.
*
* This is notably used for "autocreate" widgets, and more generally to
* support referencing freshly created entities (they will get saved
* automatically as the hosting entity gets saved).
*
* @return bool
* TRUE if the item holds an unsaved entity.
*/
public function hasUnsavedEntity() {
return $this->target_id === NULL && ($entity = $this->entity) && $entity->isNew();
}
}

View File

@ -8,12 +8,12 @@
namespace Drupal\entity_reference;
use Drupal\Component\Utility\String;
use Drupal\Core\Field\ConfigFieldItemInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\TypedData\AllowedValuesInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\ConfigEntityReferenceItemBase;
use Drupal\Core\Field\ConfigFieldItemInterface;
use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
/**
@ -26,9 +26,8 @@ use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
* - target_type: The entity type to reference.
*
* @see entity_reference_field_info_alter().
*
*/
class ConfigurableEntityReferenceItem extends ConfigEntityReferenceItemBase implements ConfigFieldItemInterface, AllowedValuesInterface {
class ConfigurableEntityReferenceItem extends EntityReferenceItem implements ConfigFieldItemInterface, AllowedValuesInterface {
/**
* {@inheritdoc}
@ -48,7 +47,7 @@ class ConfigurableEntityReferenceItem extends ConfigEntityReferenceItemBase impl
* {@inheritdoc}
*/
public function getSettableValues(AccountInterface $account = NULL) {
// Flatten options firstly, because Settable Options may contain group
// Flatten options first, because "settable options" may contain group
// arrays.
$flatten_options = \Drupal::formBuilder()->flattenOptions($this->getSettableOptions($account));
return array_keys($flatten_options);

View File

@ -7,8 +7,6 @@
namespace Drupal\entity_reference\Plugin\Field\FieldWidget;
use Drupal\entity_reference\Plugin\Field\FieldWidget\AutocompleteWidgetBase;
/**
* Plugin implementation of the 'entity_reference autocomplete-tags' widget.
*
@ -64,9 +62,10 @@ class AutocompleteTagsWidget extends AutocompleteWidgetBase {
$value[] = array('target_id' => $match);
}
elseif ($auto_create && (count($this->getSelectionHandlerSetting('target_bundles')) == 1 || count($bundles) == 1)) {
// Auto-create item. see entity_reference_field_presave().
// Auto-create item. See
// \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::presave().
$value[] = array(
'target_id' => 0,
'target_id' => NULL,
'entity' => $this->createNewEntity($input, $element['#autocreate_uid']),
);
}

View File

@ -8,7 +8,6 @@
namespace Drupal\entity_reference\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\entity_reference\Plugin\Field\FieldWidget\AutocompleteWidgetBase;
/**
* Plugin implementation of the 'entity_reference autocomplete' widget.
@ -54,7 +53,7 @@ class AutocompleteWidget extends AutocompleteWidgetBase {
$auto_create = $this->getSelectionHandlerSetting('auto_create');
// If a value was entered into the autocomplete.
$value = '';
$value = NULL;
if (!empty($element['#value'])) {
// Take "label (entity id)', match the id from parenthesis.
// @todo: Lookup the entity type's ID data type and use it here.
@ -73,9 +72,10 @@ class AutocompleteWidget extends AutocompleteWidgetBase {
}
if (!$value && $auto_create && (count($this->getSelectionHandlerSetting('target_bundles')) == 1)) {
// Auto-create item. see entity_reference_field_presave().
// Auto-create item. See
// \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::presave().
$value = array(
'target_id' => 0,
'target_id' => NULL,
'entity' => $this->createNewEntity($element['#value'], $element['#autocreate_uid']),
// Keep the weight property.
'_weight' => $element['#weight'],

View File

@ -196,13 +196,6 @@ class FileItem extends EntityReferenceItem implements ConfigFieldItemInterface {
return $element;
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
return empty($this->target_id);
}
/**
* Form API callback
*

View File

@ -421,7 +421,7 @@ function image_filter_keyword($value, $current_pixels, $new_pixels) {
*
* Transforms default image of image field from array into single value at save.
*/
function image_entity_presave(EntityInterface $entity, $type) {
function image_entity_presave(EntityInterface $entity) {
$field = FALSE;
if ($entity instanceof FieldInstance) {
$field = $entity->getField();

View File

@ -284,6 +284,8 @@ class ImageItem extends FileItem {
* {@inheritdoc}
*/
public function preSave() {
parent::preSave();
$width = $this->width;
$height = $this->height;

View File

@ -48,7 +48,7 @@ abstract class TaxonomyFormatterBase extends FormatterBase {
$item->entity = $terms[$item->target_id];
}
// Terms to be created are not in $terms, but are still legitimate.
elseif ($item->target_id === NULL && isset($item->entity)) {
elseif ($item->hasUnsavedEntity()) {
// Leave the item in place.
}
// Otherwise, unset the instance value, since the term does not exist.

View File

@ -7,9 +7,9 @@
namespace Drupal\taxonomy\Plugin\Field\FieldType;
use Drupal\Core\Field\ConfigEntityReferenceItemBase;
use Drupal\Core\Field\ConfigFieldItemInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\TypedData\AllowedValuesInterface;
@ -35,7 +35,7 @@ use Drupal\Core\TypedData\AllowedValuesInterface;
* list_class = "\Drupal\taxonomy\Plugin\Field\FieldType\TaxonomyTermReferenceFieldItemList"
* )
*/
class TaxonomyTermReferenceItem extends ConfigEntityReferenceItemBase implements ConfigFieldItemInterface, AllowedValuesInterface {
class TaxonomyTermReferenceItem extends EntityReferenceItem implements ConfigFieldItemInterface, AllowedValuesInterface {
/**
* {@inheritdoc}