diff --git a/core/lib/Drupal/Core/Field/FieldItemBase.php b/core/lib/Drupal/Core/Field/FieldItemBase.php index 8ab3ad6..f168001 100644 --- a/core/lib/Drupal/Core/Field/FieldItemBase.php +++ b/core/lib/Drupal/Core/Field/FieldItemBase.php @@ -265,4 +265,14 @@ public static function preSaveSettings(array &$settings) { } */ public static function postLoadSettings(array &$settings) { } + /** + * {@inheritdoc} + */ + public static function preSaveInstanceSettings(array &$settings) { } + + /** + * {@inheritdoc} + */ + public static function postLoadInstanceSettings(array &$settings) { } + } diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php index f63d36a..8b624c7 100644 --- a/core/lib/Drupal/Core/Field/FieldItemInterface.php +++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php @@ -204,6 +204,27 @@ public static function preSaveSettings(array &$settings); public static function postLoadSettings(array &$settings); /** + * Defines behavior for transforming instance settings before being saved. + * + * May be used to alter settings to transform them to a storage-friendly form. + * + * @param array $settings + * Field settings. + */ + public static function preSaveInstanceSettings(array &$settings); + + /** + * Defines custom behavior for transforming instance settings when loading. + * + * May be used to alter settings to transform them from a storage-friendly + * form. + * + * @param array $settings + * Field settings. + */ + public static function postLoadInstanceSettings(array &$settings); + + /** * Defines custom insert behavior for field values. * * This method is called during the process of inserting an entity, just diff --git a/core/modules/field/src/Entity/FieldInstanceConfig.php b/core/modules/field/src/Entity/FieldInstanceConfig.php index 79830db..3a5314d 100644 --- a/core/modules/field/src/Entity/FieldInstanceConfig.php +++ b/core/modules/field/src/Entity/FieldInstanceConfig.php @@ -253,7 +253,7 @@ public function __construct(array $values, $entity_type = 'field_instance_config } // Discard the 'field_type' entry that is added in config records to ease - // schema generation. See self::toArray(). + // schema generation and data altering for storage. See self::toArray(). unset($values['field_type']); parent::__construct($values, $entity_type); @@ -287,7 +287,8 @@ public function getType() { public function toArray() { $properties = parent::toArray(); // Additionally, include the field type, that is needed to be able to - // generate the field-type-dependant parts of the config schema. + // generate the field-type-dependant parts of the config schema and to + // allow for altering data by field type. $properties['field_type'] = $this->getType(); return $properties; diff --git a/core/modules/field/src/FieldInstanceConfigStorage.php b/core/modules/field/src/FieldInstanceConfigStorage.php index 20dc083..26dc9f4 100644 --- a/core/modules/field/src/FieldInstanceConfigStorage.php +++ b/core/modules/field/src/FieldInstanceConfigStorage.php @@ -177,4 +177,25 @@ public function loadByProperties(array $conditions = array()) { return $matching_instances; } + /** + * {@inheritdoc} + */ + protected function postLoadData(array $data) { + // @todo Makes too much assumptions but it needs to. + $type_definition = \Drupal::typedDataManager() + ->getDefinition('field_item:' . $data['field_type']); + $type_definition['class']::postLoadInstanceSettings($data['settings']); + return $data; + } + + /** + * {@inheritdoc} + */ + protected function preSaveData(array $data) { + // @todo Makes too much assumptions but it needs to. + $type_definition = \Drupal::typedDataManager() + ->getDefinition('field_item:' . $data['field_type']); + $type_definition['class']::preSaveInstanceSettings($data['settings']); + return $data; + } }