class FieldDefinition
Same name in other branches
- 9 core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition
- 8.9.x core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition
- 10 core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition
A class for defining entity field definitions.
A field definition in the context of a bundle field is different from a base field in that it may exist only for one or more bundles of an entity type. A bundle field definition may also override the definition of an existing base field definition on a per bundle basis. The bundle field definition is used for code driven overrides, while the \Drupal\Core\Field\Entity\BaseFieldOverride uses config to override the base field definition.
Bundle fields can be defined in code using hook_entity_bundle_field_info() or via the \Drupal\Core\Entity\FieldableEntityInterface::bundleFieldDefinitions() method when defining an entity type. All bundle fields require an associated storage definition. A storage definition may have automatically been defined when overriding a base field or it may be manually provided via hook_entity_field_storage_info().
Hierarchy
- class \Drupal\Core\TypedData\DataDefinition implements \Drupal\Core\TypedData\DataDefinitionInterface, \Drupal\Core\TypedData\ArrayAccess uses \Drupal\Core\TypedData\TypedDataTrait
- class \Drupal\Core\TypedData\ListDataDefinition extends \Drupal\Core\TypedData\DataDefinition implements \Drupal\Core\TypedData\ListDataDefinitionInterface
- class \Drupal\Core\Field\FieldDefinition extends \Drupal\Core\TypedData\ListDataDefinition implements \Drupal\Core\Field\FieldDefinitionInterface uses \Drupal\Core\Cache\UnchangingCacheableDependencyTrait, \Drupal\Core\Field\FieldInputValueNormalizerTrait
- class \Drupal\Core\TypedData\ListDataDefinition extends \Drupal\Core\TypedData\DataDefinition implements \Drupal\Core\TypedData\ListDataDefinitionInterface
Expanded class hierarchy of FieldDefinition
See also
\Drupal\Core\Entity\FieldableEntityInterface::bundleFieldDefinitions()
\Drupal\Core\Field\FieldDefinitionInterface
\Drupal\Core\Field\FieldStorageDefinitionInterface
hook_entity_bundle_field_info()
hook_entity_field_storage_info()
6 files declare their use of FieldDefinition
- entity.api.php in core/
lib/ Drupal/ Core/ Entity/ entity.api.php - Hooks and documentation related to entities.
- EntityFieldManager.php in core/
lib/ Drupal/ Core/ Entity/ EntityFieldManager.php - EntitySchemaTestHooks.php in core/
modules/ system/ tests/ modules/ entity_schema_test/ src/ Hook/ EntitySchemaTestHooks.php - EntityTestComputedBundleField.php in core/
modules/ system/ tests/ modules/ entity_test/ src/ Entity/ EntityTestComputedBundleField.php - entity_schema_test.module in core/
modules/ system/ tests/ modules/ entity_schema_test/ entity_schema_test.module
File
-
core/
lib/ Drupal/ Core/ Field/ FieldDefinition.php, line 35
Namespace
Drupal\Core\FieldView source
class FieldDefinition extends ListDataDefinition implements FieldDefinitionInterface {
use UnchangingCacheableDependencyTrait;
use FieldInputValueNormalizerTrait;
/**
* The associated field storage definition.
*
* @var \Drupal\Core\Field\FieldStorageDefinitionInterface
*/
protected $fieldStorageDefinition;
/**
* Creates a new field definition.
*
* @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storageDefinition
* The associated field storage definition.
*
* @return static
*/
public static function createFromFieldStorageDefinition(FieldStorageDefinitionInterface $storageDefinition) {
$field_definition = new static();
$field_definition->setFieldStorageDefinition($storageDefinition);
return $field_definition;
}
/**
* {@inheritdoc}
*/
public function getName() {
return $this->getFieldStorageDefinition()
->getName();
}
/**
* {@inheritdoc}
*/
public function getType() {
return $this->getFieldStorageDefinition()
->getType();
}
/**
* {@inheritdoc}
*/
public function getTargetEntityTypeId() {
return $this->getFieldStorageDefinition()
->getTargetEntityTypeId();
}
/**
* Set the target bundle.
*
* @param string $bundle
* The target bundle.
*
* @return $this
*/
public function setTargetBundle($bundle) {
$this->definition['bundle'] = $bundle;
return $this;
}
/**
* {@inheritdoc}
*/
public function getTargetBundle() {
return $this->definition['bundle'];
}
/**
* Sets whether the display for the field can be configured.
*
* @param string $display_context
* The display context. Either 'view' or 'form'.
* @param bool $configurable
* Whether the display options can be configured (e.g., via the "Manage
* display" / "Manage form display" UI screens). If TRUE, the options
* specified via getDisplayOptions() act as defaults.
*
* @return $this
*/
public function setDisplayConfigurable($display_context, $configurable) {
// If no explicit display options have been specified, default to 'hidden'.
if (empty($this->definition['display'][$display_context])) {
$this->definition['display'][$display_context]['options'] = [
'region' => 'hidden',
];
}
$this->definition['display'][$display_context]['configurable'] = $configurable;
return $this;
}
/**
* {@inheritdoc}
*/
public function isDisplayConfigurable($display_context) {
return $this->definition['display'][$display_context]['configurable'] ?? FALSE;
}
/**
* Sets the display options for the field in forms or rendered entities.
*
* This enables generic rendering of the field with widgets / formatters,
* including automated support for "In place editing", and with optional
* configurability in the "Manage display" / "Manage form display" UI screens.
*
* Unless this method is called, the field remains invisible (or requires
* ad-hoc rendering logic).
*
* @param string $display_context
* The display context. Either 'view' or 'form'.
* @param array $options
* An array of display options. Refer to
* \Drupal\Core\Field\FieldDefinitionInterface::getDisplayOptions() for
* a list of supported keys. The options should include at least a 'weight',
* or specify 'region' = 'hidden'. The 'default_widget'/'default_formatter'
* for the field type will be used if no 'type' is specified.
*
* @return $this
*/
public function setDisplayOptions($display_context, array $options) {
$this->definition['display'][$display_context]['options'] = $options;
return $this;
}
/**
* {@inheritdoc}
*/
public function getDisplayOptions($display_context) {
return $this->definition['display'][$display_context]['options'] ?? NULL;
}
/**
* {@inheritdoc}
*/
public function getDefaultValueLiteral() {
return $this->definition['default_value'] ?? [];
}
/**
* Set the default value callback for the field.
*
* @param string $callback
* The default value callback.
*
* @return $this
*/
public function setDefaultValueCallback($callback) {
if (isset($callback) && !is_string($callback)) {
throw new \InvalidArgumentException('Default value callback must be a string, like "function_name" or "ClassName::methodName"');
}
$this->definition['default_value_callback'] = $callback;
return $this;
}
/**
* {@inheritdoc}
*/
public function getDefaultValueCallback() {
return $this->definition['default_value_callback'] ?? NULL;
}
/**
* Set a default value for the field.
*
* @param mixed $value
* The default value.
*
* @return $this
*/
public function setDefaultValue($value) {
$this->definition['default_value'] = $this->normalizeValue($value, $this->getFieldStorageDefinition()
->getMainPropertyName());
return $this;
}
/**
* {@inheritdoc}
*/
public function getDefaultValue(FieldableEntityInterface $entity) {
// Allow custom default values function.
if ($callback = $this->getDefaultValueCallback()) {
$value = call_user_func($callback, $entity, $this);
}
else {
$value = $this->getDefaultValueLiteral();
}
$value = $this->normalizeValue($value, $this->getFieldStorageDefinition()
->getMainPropertyName());
// Allow the field type to process default values.
$field_item_list_class = $this->getClass();
return $field_item_list_class::processDefaultValue($value, $entity, $this);
}
/**
* Sets whether the field is translatable.
*
* @param bool $translatable
* Whether the field is translatable.
*
* @return $this
*/
public function setTranslatable($translatable) {
$this->definition['translatable'] = $translatable;
return $this;
}
/**
* {@inheritdoc}
*/
public function isTranslatable() {
return !empty($this->definition['translatable']) && $this->getFieldStorageDefinition()
->isTranslatable();
}
/**
* Set the field storage definition.
*
* @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storageDefinition
* The field storage definition associated with this field definition.
*
* @return $this
*/
public function setFieldStorageDefinition(FieldStorageDefinitionInterface $storageDefinition) {
$this->fieldStorageDefinition = $storageDefinition;
$this->itemDefinition = FieldItemDataDefinition::create($this);
// Create a definition for the items, and initialize it with the default
// settings for the field type.
$field_type_manager = \Drupal::service('plugin.manager.field.field_type');
$default_settings = $field_type_manager->getDefaultFieldSettings($storageDefinition->getType());
$this->itemDefinition
->setSettings($default_settings);
return $this;
}
/**
* {@inheritdoc}
*/
public function getFieldStorageDefinition() {
return $this->fieldStorageDefinition;
}
/**
* {@inheritdoc}
*/
public function getConfig($bundle) {
// @todo provide a FieldDefinitionOverride config entity in
// https://www.drupal.org/project/drupal/issues/2935978.
throw new \Exception('Field definitions do not currently have an override config entity.');
}
/**
* {@inheritdoc}
*/
public function getUniqueIdentifier() {
return $this->getTargetEntityTypeId() . '-' . $this->getTargetBundle() . '-' . $this->getName();
}
/**
* {@inheritdoc}
*/
public function getSetting($setting_name) {
if (array_key_exists($setting_name, $this->itemDefinition
->getSettings())) {
return $this->itemDefinition
->getSetting($setting_name);
}
else {
return $this->getFieldStorageDefinition()
->getSetting($setting_name);
}
}
/**
* {@inheritdoc}
*/
public function getSettings() {
return $this->getItemDefinition()
->getSettings() + $this->getFieldStorageDefinition()
->getSettings();
}
/**
* {@inheritdoc}
*/
public function setSetting($setting_name, $value) {
$this->getItemDefinition()
->setSetting($setting_name, $value);
return $this;
}
/**
* {@inheritdoc}
*/
public function setSettings(array $settings) {
// Assign settings individually, in order to keep the current values
// of settings not specified in $settings.
foreach ($settings as $setting_name => $setting) {
$this->getItemDefinition()
->setSetting($setting_name, $setting);
}
return $this;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides |
---|---|---|---|---|---|
DataDefinition::$definition | protected | property | The array holding values for all definition keys. | ||
DataDefinition::addConstraint | public | function | Adds a validation constraint. | Overrides DataDefinitionInterface::addConstraint | |
DataDefinition::getConstraint | public | function | Returns a validation constraint. | Overrides DataDefinitionInterface::getConstraint | |
DataDefinition::getConstraints | public | function | Returns an array of validation constraints. | Overrides DataDefinitionInterface::getConstraints | 1 |
DataDefinition::getDescription | public | function | Returns a human readable description. | Overrides DataDefinitionInterface::getDescription | |
DataDefinition::getLabel | public | function | Returns a human readable label. | Overrides DataDefinitionInterface::getLabel | 1 |
DataDefinition::isComputed | public | function | Determines whether the data value is computed. | Overrides DataDefinitionInterface::isComputed | |
DataDefinition::isInternal | public | function | Determines whether the data value is internal. | Overrides DataDefinitionInterface::isInternal | 1 |
DataDefinition::isList | public | function | Returns whether the data is multi-valued, i.e. a list of data items. | Overrides DataDefinitionInterface::isList | |
DataDefinition::isReadOnly | public | function | Determines whether the data is read-only. | Overrides DataDefinitionInterface::isReadOnly | |
DataDefinition::isRequired | public | function | Determines whether a data value is required. | Overrides DataDefinitionInterface::isRequired | |
DataDefinition::offsetExists | public | function | This is for BC support only. @todo Remove in https://www.drupal.org/node/1928868. |
||
DataDefinition::offsetGet | public | function | This is for BC support only. @todo Remove in https://www.drupal.org/node/1928868. |
||
DataDefinition::offsetSet | public | function | This is for BC support only. @todo Remove in https://www.drupal.org/node/1928868. |
||
DataDefinition::offsetUnset | public | function | This is for BC support only. @todo Remove in https://www.drupal.org/node/1928868. |
||
DataDefinition::setClass | public | function | Sets the class used for creating the typed data object. | ||
DataDefinition::setComputed | public | function | Sets whether the data is computed. | ||
DataDefinition::setConstraints | public | function | Sets an array of validation constraints. | ||
DataDefinition::setDescription | public | function | Sets the human-readable description. | ||
DataDefinition::setInternal | public | function | Sets the whether the data value should be internal. | ||
DataDefinition::setLabel | public | function | Sets the human-readable label. | ||
DataDefinition::setReadOnly | public | function | Sets whether the data is read-only. | ||
DataDefinition::setRequired | public | function | Sets whether the data is required. | ||
DataDefinition::toArray | public | function | Returns all definition values as array. | ||
DataDefinition::__sleep | public | function | 2 | ||
FieldDefinition::$fieldStorageDefinition | protected | property | The associated field storage definition. | ||
FieldDefinition::createFromFieldStorageDefinition | public static | function | Creates a new field definition. | ||
FieldDefinition::getConfig | public | function | Gets an object that can be saved in configuration. | Overrides FieldDefinitionInterface::getConfig | |
FieldDefinition::getDefaultValue | public | function | Returns the default value for the field in a newly created entity. | Overrides FieldDefinitionInterface::getDefaultValue | |
FieldDefinition::getDefaultValueCallback | public | function | Returns the default value callback for the field. | Overrides FieldDefinitionInterface::getDefaultValueCallback | |
FieldDefinition::getDefaultValueLiteral | public | function | Returns the default value literal for the field. | Overrides FieldDefinitionInterface::getDefaultValueLiteral | |
FieldDefinition::getDisplayOptions | public | function | Returns the default display options for the field. | Overrides FieldDefinitionInterface::getDisplayOptions | |
FieldDefinition::getFieldStorageDefinition | public | function | Returns the field storage definition. | Overrides FieldDefinitionInterface::getFieldStorageDefinition | |
FieldDefinition::getName | public | function | Returns the machine name of the field. | Overrides FieldDefinitionInterface::getName | |
FieldDefinition::getSetting | public | function | Returns the value of a given setting. | Overrides DataDefinition::getSetting | |
FieldDefinition::getSettings | public | function | Returns the array of settings, as required by the used class. | Overrides DataDefinition::getSettings | |
FieldDefinition::getTargetBundle | public | function | Gets the bundle the field is attached to. | Overrides FieldDefinitionInterface::getTargetBundle | |
FieldDefinition::getTargetEntityTypeId | public | function | Returns the ID of the entity type the field is attached to. | Overrides FieldDefinitionInterface::getTargetEntityTypeId | |
FieldDefinition::getType | public | function | Returns the field type. | Overrides FieldDefinitionInterface::getType | |
FieldDefinition::getUniqueIdentifier | public | function | Returns a unique identifier for the field. | Overrides FieldDefinitionInterface::getUniqueIdentifier | |
FieldDefinition::isDisplayConfigurable | public | function | Returns whether the display for the field can be configured. | Overrides FieldDefinitionInterface::isDisplayConfigurable | |
FieldDefinition::isTranslatable | public | function | Returns whether the field is translatable. | Overrides FieldDefinitionInterface::isTranslatable | |
FieldDefinition::setDefaultValue | public | function | Set a default value for the field. | ||
FieldDefinition::setDefaultValueCallback | public | function | Set the default value callback for the field. | ||
FieldDefinition::setDisplayConfigurable | public | function | Sets whether the display for the field can be configured. | ||
FieldDefinition::setDisplayOptions | public | function | Sets the display options for the field in forms or rendered entities. | ||
FieldDefinition::setFieldStorageDefinition | public | function | Set the field storage definition. | ||
FieldDefinition::setSetting | public | function | Sets a definition setting. | Overrides DataDefinition::setSetting | |
FieldDefinition::setSettings | public | function | Sets the array of settings, as required by the used class. | Overrides DataDefinition::setSettings | |
FieldDefinition::setTargetBundle | public | function | Set the target bundle. | ||
FieldDefinition::setTranslatable | public | function | Sets whether the field is translatable. | ||
FieldInputValueNormalizerTrait::normalizeValue | protected static | function | Ensure a field value is transformed into a format keyed by delta. | ||
ListDataDefinition::$itemDefinition | protected | property | The data definition of a list item. | ||
ListDataDefinition::create | public static | function | Creates a new list definition. | Overrides DataDefinition::create | 1 |
ListDataDefinition::createFromDataType | public static | function | Creates a new data definition object. | Overrides DataDefinition::createFromDataType | |
ListDataDefinition::createFromItemType | public static | function | Creates a new list data definition for items of the given data type. | Overrides ListDataDefinitionInterface::createFromItemType | 1 |
ListDataDefinition::getClass | public | function | Returns the class used for creating the typed data object. | Overrides DataDefinition::getClass | |
ListDataDefinition::getDataType | public | function | Returns the data type of the data. | Overrides DataDefinition::getDataType | 1 |
ListDataDefinition::getItemDefinition | public | function | Gets the data definition of an item of the list. | Overrides ListDataDefinitionInterface::getItemDefinition | |
ListDataDefinition::setDataType | public | function | Sets the data type. | Overrides DataDefinition::setDataType | |
ListDataDefinition::setItemDefinition | public | function | Sets the item definition. | ||
ListDataDefinition::__clone | public | function | Magic method: Implements a deep clone. | 1 | |
ListDataDefinition::__construct | public | function | Constructs a new data definition object. | Overrides DataDefinition::__construct | |
TypedDataTrait::$typedDataManager | protected | property | The typed data manager used for creating the data types. | ||
TypedDataTrait::getTypedDataManager | public | function | Gets the typed data manager. | 2 | |
TypedDataTrait::setTypedDataManager | public | function | Sets the typed data manager. | 2 | |
UnchangingCacheableDependencyTrait::getCacheContexts | public | function | 1 | ||
UnchangingCacheableDependencyTrait::getCacheMaxAge | public | function | 3 | ||
UnchangingCacheableDependencyTrait::getCacheTags | public | function | 1 |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.