trait FieldUtilsTrait in Scheduled Updates 8
Hierarchy
- trait \Drupal\scheduled_updates\FieldUtilsTrait
3 files declare their use of FieldUtilsTrait
- FieldClonerForm.php in src/
Form/ FieldClonerForm.php - Contains \Drupal\scheduled_updates\Form\FieldClonerForm.
- ScheduledUpdateTypeBaseForm.php in src/
Form/ ScheduledUpdateTypeBaseForm.php - Contains \Drupal\scheduled_updates\Form\ScheduledUpdateTypeBaseForm.
- ScheduledUpdateTypeForm.php in src/
Form/ ScheduledUpdateTypeForm.php - Contains \Drupal\scheduled_updates\Form\ScheduledUpdateTypeForm.
File
- src/
FieldUtilsTrait.php, line 17 - Contains \Drupal\scheduled_updates\FieldUtilsTrait.
Namespace
Drupal\scheduled_updatesView source
trait FieldUtilsTrait {
protected function getDestinationFieldsOptions($entity_type_id, $source_field) {
$destination_fields = $this
->getDestinationFields($entity_type_id, $source_field);
$options = [];
foreach ($destination_fields as $field_id => $destination_field) {
$options[$field_id] = $destination_field
->getName();
}
return $options;
}
/**
* Return all fields that can be used as destinations fields.
*
* @param $entity_type_id
* @param \Drupal\field\Entity\FieldConfig $source_field
*
* @return \Drupal\Core\Field\FieldStorageDefinitionInterface[]
*/
protected function getDestinationFields($entity_type_id, FieldConfig $source_field = NULL) {
$destination_fields = [];
$fields = $this
->FieldManager()
->getFieldStorageDefinitions($entity_type_id);
foreach ($fields as $field_id => $field) {
if ($this
->isDestinationFieldCompatible($field, $source_field)) {
$destination_fields[$field_id] = $field;
}
}
return $destination_fields;
}
protected function getBundleDestinationOptions($entity_type_id, $bundle) {
$destination_fields = [];
$fields = $this
->FieldManager()
->getFieldDefinitions($entity_type_id, $bundle);
foreach ($fields as $field_id => $field) {
if ($this
->isDestinationFieldCompatible($field
->getFieldStorageDefinition())) {
$destination_fields[$field_id] = $field
->getLabel();
}
}
return $destination_fields;
}
protected function getFieldLabel($entity_type_id, $bundle, $field_name) {
$fields = $this
->FieldManager()
->getFieldDefinitions($entity_type_id, $bundle);
if (isset($fields[$field_name])) {
return $fields[$field_name]
->getLabel();
}
return '';
}
protected function getEntityDestinationOptions($entity_type_id) {
$definitions = $this
->getDestinationFields($entity_type_id);
$options = [];
foreach ($definitions as $definition) {
$options[$definition
->getName()] = $definition
->getLabel();
}
return $options;
}
/**
* Get Fields that can used as a destination field for this type.
*
* @param string $type
*
* @return array
*/
protected function getMatchingFieldTypes($type) {
// @todo which types can be interchanged
return [
$type,
];
}
/**
* Check if a field on the entity type to update is a possible destination field.
*
* @todo Should this be on our FieldManager service?
*
* @param \Drupal\Core\Field\FieldStorageDefinitionInterface $definition
* Field definition on entity type to update to check.
* @param \Drupal\Core\Field\FieldDefinitionInterface $source_field
* Source field to check compatibility against. If none then check generally.
*
* @return bool
*/
protected function isDestinationFieldCompatible(FieldStorageDefinitionInterface $definition, FieldDefinitionInterface $source_field = NULL) {
// @todo Create field definition wrapper class to treat FieldDefinitionInterface and FieldStorageDefinitionInterface the same.
if ($definition instanceof BaseFieldDefinition && $definition
->isReadOnly()) {
return FALSE;
}
// Don't allow updates on updates!
if ($definition
->getType() == 'entity_reference') {
if ($definition
->getSetting('target_type') == 'scheduled_update') {
return FALSE;
}
}
if ($source_field) {
$matching_types = $this
->getMatchingFieldTypes($source_field
->getType());
if (!in_array($definition
->getType(), $matching_types)) {
return FALSE;
}
// Check cardinality
$destination_cardinality = $definition
->getCardinality();
$source_cardinality = $source_field
->getFieldStorageDefinition()
->getCardinality();
// $destination_cardinality is unlimited. It doesn't matter what source is.
if ($destination_cardinality != -1) {
if ($source_cardinality == -1) {
return FALSE;
}
if ($source_cardinality > $destination_cardinality) {
return FALSE;
}
}
switch ($definition
->getType()) {
case 'entity_reference':
// Entity reference field must match entity target types.
if ($definition
->getSetting('target_type') != $source_field
->getSetting('target_type')) {
return FALSE;
}
// @todo Check bundles
break;
}
}
return TRUE;
}
/**
* @param \Drupal\scheduled_updates\ScheduledUpdateTypeInterface $updateType
*
* @return FieldConfig[] array
*/
protected function getSourceFields(ScheduledUpdateTypeInterface $updateType) {
$source_fields = [];
$fields = $this
->FieldManager()
->getFieldDefinitions('scheduled_update', $updateType
->id());
foreach ($fields as $field_id => $field) {
if (!$field instanceof BaseFieldDefinition) {
$source_fields[$field_id] = $field;
}
}
return $source_fields;
}
/**
* Utility Function to load a single field definition.
*
* @param $entity_type_id
* @param $field_name
*
* @return \Drupal\Core\Field\FieldStorageDefinitionInterface|null
*/
protected function getFieldStorageDefinition($entity_type_id, $field_name) {
$definitions = $this
->FieldManager()
->getFieldStorageDefinitions($entity_type_id);
if (!isset($definitions[$field_name])) {
return NULL;
}
return $definitions[$field_name];
}
/**
* Get field definition on bundle.
*
* @param $entity_type_id
* @param $bundle
* @param $field_name
*
* @return \Drupal\Core\Field\FieldDefinitionInterface|null
*/
public function getFieldDefinition($entity_type_id, $bundle, $field_name) {
$bundle_definitions = $this
->FieldManager()
->getFieldDefinitions($entity_type_id, $bundle);
if (isset($bundle_definitions[$field_name])) {
return $bundle_definitions[$field_name];
}
return NULL;
}
/**
* @return EntityFieldManagerInterface;
*/
abstract function FieldManager();
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
FieldUtilsTrait:: |
abstract | function | 3 | |
FieldUtilsTrait:: |
protected | function | ||
FieldUtilsTrait:: |
protected | function | Return all fields that can be used as destinations fields. | |
FieldUtilsTrait:: |
protected | function | ||
FieldUtilsTrait:: |
protected | function | ||
FieldUtilsTrait:: |
public | function | Get field definition on bundle. | |
FieldUtilsTrait:: |
protected | function | ||
FieldUtilsTrait:: |
protected | function | Utility Function to load a single field definition. | |
FieldUtilsTrait:: |
protected | function | Get Fields that can used as a destination field for this type. | |
FieldUtilsTrait:: |
protected | function | ||
FieldUtilsTrait:: |
protected | function | Check if a field on the entity type to update is a possible destination field. |