From 4666c34fa6eb6ca38964d761efc1044d551d5507 Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Wed, 16 Sep 2020 16:24:03 +0200 Subject: [PATCH 1/2] wip --- rest_normalizations.services.yml | 25 +- ...tityReferenceTargetFieldFieldGenerator.php | 228 ++++++++++++++++++ ...eferenceFieldItemFieldTargetNormalizer.php | 87 +++++++ 3 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php create mode 100644 src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php diff --git a/rest_normalizations.services.yml b/rest_normalizations.services.yml index 4a58d31..9289e1a 100644 --- a/rest_normalizations.services.yml +++ b/rest_normalizations.services.yml @@ -20,13 +20,18 @@ services: rest_normalizations.normalizer.entity_reference_field_item_target: class: Drupal\rest_normalizations\Normalizer\EntityReferenceFieldItemTargetNormalizer tags: - - { name: normalizer, priority: 25 } + - { name: normalizer, priority: 30 } arguments: ['@language_manager', '%rest_normalizations.target_identifiers%'] rest_normalizations.normalizer.image_entity: - class: Drupal\rest_normalizations\Normalizer\ImageNormalizer - tags: - - { name: normalizer, priority: 5 } - arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager', '%rest_normalizations.content_entity_operations_exclude%'] + class: Drupal\rest_normalizations\Normalizer\ImageNormalizer + tags: + - { name: normalizer, priority: 5 } + arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager', '%rest_normalizations.content_entity_operations_exclude%'] + rest_normalizations.normalizer.entity_reference_field_item_field_target: + class: Drupal\rest_normalizations\Normalizer\EntityReferenceFieldItemFieldTargetNormalizer + tags: + - { name: normalizer, priority: 25 } + arguments: ['@language_manager', '%rest_normalizations.field_target_identifiers%'] rest_normalizations.ts_generator_component.entity_file: class: Drupal\rest_normalizations\ComponentGenerator\FileGenerator @@ -71,18 +76,24 @@ services: rest_normalizations.ts_generator_component.field.entity_reference_target: class: Drupal\rest_normalizations\ComponentGenerator\EntityReferenceTargetFieldGenerator tags: - - { name: ts_generator_component, priority: 21 } + - { name: ts_generator_component, priority: 22 } arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.target_identifiers%'] rest_normalizations.ts_generator_component.field.file: class: Drupal\rest_normalizations\ComponentGenerator\FileFieldGenerator tags: - - { name: ts_generator_component, priority: 22 } + - { name: ts_generator_component, priority: 23 } arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.target_identifiers%'] + rest_normalizations.ts_generator_component.field.entity_reference_target_field: + class: Drupal\rest_normalizations\ComponentGenerator\EntityReferenceTargetFieldFieldGenerator + tags: + - { name: ts_generator_component, priority: 21 } + arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.field_target_identifiers%'] parameters: rest_normalizations.target_identifiers: - media - file - paragraph + rest_normalizations.field_target_identifiers: {} rest_normalizations.content_entity_operations_exclude: - commerce_product_variation diff --git a/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php new file mode 100644 index 0000000..7aa0697 --- /dev/null +++ b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php @@ -0,0 +1,228 @@ +field_target_identifiers = $field_target_identifiers; + } + + public function supportsGeneration($object) { + if (!parent::supportsGeneration($object)) { + return FALSE; + } + + return !!$this->getFieldData($object); + } + + protected function getFieldData($object) { + if (isset($this->field_target_identifiers[$object->getSettings()['target_type']])) { + return [ + '', + $this->field_target_identifiers[$object->getSettings()['target_type']] + ]; + } + + if (isset($this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getName()])) { + return [ + Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getName()), + $this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getName()] + ]; + } + + if ($object->getTargetBundle() && isset($this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getTargetBundle() . '-' . $object->getName()])) { + return [ + Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getTargetBundle()) . Container::camelize($object->getName()), + $this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getTargetBundle() . '-' . $object->getName()] + ]; + } + + return FALSE; + } + + protected function getItemProperties($object, Settings $settings, Result $result, ComponentResult $component_result) { + /** @var \Drupal\Core\Field\FieldDefinitionInterface $object */ + $storage_object = $object->getFieldStorageDefinition(); + + $properties = parent::getItemProperties($object, $settings, $result, $component_result); + + $properties['target'] = $component_result->getContext('target'); + +// list(, $field_identifiers) = $this->getFieldData($object); +// foreach ($field_identifiers as $field_names) { +// $properties[$field_names] = 'string'; // $this->generator->generate($object, $settings, $result, $component_result); +// } + + + return $properties; + } + + public function getItemMapping($object, $properties, Settings $settings, Result $result, ComponentResult $componentResult) { + $mapping = parent::getItemMapping($object, $properties, $settings, $result, $componentResult); + + $mapping['target'] = 'target'; + +// $field_identifiers = array_values($this->field_target_identifiers)[0]; +// foreach($field_identifiers as $field) { +// $mapping[$field] = $field; +// } + return $mapping; + } + + protected function getName($object, Settings $settings, Result $result, ComponentResult $component_result) { + /** @var \Drupal\Core\Field\FieldDefinitionInterface $object */ + // $entity_type = $this->entityTypeManager->getDefinition($object->getSettings()['target_type']); + + $name = parent::getName($object, $settings, $result, $component_result); + list($name_suffix, ) = $this->getFieldData($object); + return $name . $name_suffix; + + // return $name . Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getName()); + + +// if (!($object instanceof FieldConfigInterface)) { +// return $name; +// } +// +// $handler = $object->getSetting('handler'); +// if ($handler !== 'default:' . $entity_type->id()) { +// return $name; +// } +// +// $handler_settings = $object->getSetting('handler_settings'); +// if (empty($handler_settings) || empty($handler_settings['target_bundles'])) { +// return $name; +// } +// +// return $name . Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getTargetBundle()) . Container::camelize($object->getName()); + } + + public function getBundles($object) { + if (!($object instanceof FieldConfigInterface)) { + return NULL; + } + + $entity_type_id = $object->getSettings()['target_type']; + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + if ($bundle_entity_type_id = $entity_type->getBundleEntityType()) { + $bundles = []; + foreach ($this->entityTypeManager->getStorage($bundle_entity_type_id)->loadMultiple() as $entity) { + $bundles[] = $entity; + } + } else { + return NULL; + } + + $handler = $object->getSetting('handler'); + if ($handler !== 'default:' . $entity_type->id()) { + return $bundles; + } + + $handler_settings = $object->getSetting('handler_settings'); + if (empty($handler_settings) || empty($handler_settings['target_bundles'])) { + return $bundles; + } + + $negate = !empty($handler_settings['negate']); + $target_bundle_names = array_values(array_filter($handler_settings['target_bundles'])); + + $result_bundles = []; + foreach ($bundles as $bundle) { + if ($negate xor in_array($bundle->id(), $target_bundle_names)) { + $result_bundles[] = $bundle; + } + } + + return $result_bundles; + } + + public function preGenerateBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundle_list = $this->getBundles($object); + if (!$bundle_list) { + return FALSE; + } + + $bundles = []; + foreach ($bundle_list as $bundle) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target' . Container::camelize($bundle->id()); + $bundles[$bundle->id()] = new ComponentResult([ + 'type' => ':types/' . $name . ':', + 'target_type' => ':types/Parsed' . $name . ':', + 'parser' => ':parser/' . Container::underscore($name) . '_parser:', + 'guard' => ':parser/' . Container::underscore($name) . '_guard:', + ]); + } + return $bundles; + } + + public function generateTarget($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + + $bundles = $this->getBundles($object, $settings, $result, $componentResult); + if ($bundles) { + $targetComponentResult = new ComponentResult(); + $bundles_results = $componentResult->getContext('bundles'); + + $type = $targetComponentResult->setComponent('type', $result->setComponent( + 'types/' . $name, + 'type ' . $name . " = " . $this->generateUnionObject($bundles_results, 'type') + )); + if ($settings->generateParser()) { + $target_type = $targetComponentResult->setComponent('target_type', $result->setComponent( + 'types/Parsed' . $name, + 'type Parsed' . $name . " = " . $this->generateUnionObject($bundles_results, 'target_type') + )); + $targetComponentResult->setComponent('parser', $result->setComponent( + 'parser/' . Container::underscore($name) . '_parser', + 'const ' . Container::underscore($name) . '_parser' . ' = ' . $this->generateUnionParser( + $bundles_results, + $type, + $target_type + ) + )); + } + + return $targetComponentResult; + + } else { + + } + + + } + + protected function preGenerate($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundles = $componentResult->getContext('bundles'); + if (!isset($bundles)) { + $bundles = $this->preGenerateBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('bundles', $bundles); +// $bundles = $this->generateBundles($object, $settings, $result, $componentResult); +// $componentResult->setContext('bundles', $bundles); + } + + $target = $componentResult->getContext('target'); + if (!$target) { + $target = $this->generateTarget($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + } + + parent::preGenerate($object, $settings, $result, $componentResult); + } +} diff --git a/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php b/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php new file mode 100644 index 0000000..941ec73 --- /dev/null +++ b/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php @@ -0,0 +1,87 @@ +field_target_identifiers = $field_target_identifiers; + } + + public function supportsNormalization($data, $format = NULL) { + if (!parent::supportsNormalization($data, $format)) { + return FALSE; + } + + return !!$this->getFieldData($data); + } + + protected function getFieldData($data) { + $entity = $data->get('entity')->getValue(); + if (!$entity) { + return FALSE; + } + + $field_entity = $data->getEntity(); + $field_entity_identifiers = array_filter([ + $entity->getEntityTypeId(), + $field_entity->getEntityTypeId() . '-' . $data->getFieldDefinition()->getName(), + $field_entity->bundle() ? ( + $field_entity->getEntityTypeId() . '-' . $field_entity->bundle() . '-' . $data->getFieldDefinition()->getName() + ) : NULL, + ]); + + foreach ($field_entity_identifiers as $field_entity_identifier) { + if (isset($this->field_target_identifiers[$field_entity_identifier])) { + return $this->field_target_identifiers[$field_entity_identifier]; + } + } + + return FALSE; + } + + public function normalize($field_item, $format = NULL, array $context = []) { + $values = parent::normalize($field_item, $format, $context); + $field_identifiers = $this->getFieldData($field_item); + + $langcode = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + if ($entity = $field_item->get('entity')->getValue()) { + + if ($entity instanceof TranslatableInterface) { + $entity = Drupal::entityManager()->getTranslationFromContext($entity, $langcode); + } + + $entity_type = $entity->getEntityType(); + + $this->addCacheableDependency($context, $entity); + + $target = (object) []; + + /** @var \Drupal\Core\Entity\Entity $entity */ + foreach (TypedDataInternalPropertiesHelper::getNonInternalProperties($entity->getTypedData()) as $name => $field_items) { + if ($field_items->access('view', $context['account']) && ( + in_array($name, $field_identifiers) || + $name == $entity_type->getKey('bundle') + )) { + $target->{$name} = $this->serializer->normalize($field_items, $format, $context); + } + } + + $values['target'] = $target; + } + return $values; + } +} From 6e8e56abc21c2cc91569a1e195c8ad2f2339caed Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Tue, 22 Sep 2020 13:46:02 +0200 Subject: [PATCH 2/2] wip --- rest_normalizations.services.yml | 2 +- ...tityReferenceTargetFieldFieldGenerator.php | 250 +++++++++++++----- .../EntityReferenceTargetFieldGenerator.php | 4 +- 3 files changed, 185 insertions(+), 71 deletions(-) diff --git a/rest_normalizations.services.yml b/rest_normalizations.services.yml index 9289e1a..6e4f8c6 100644 --- a/rest_normalizations.services.yml +++ b/rest_normalizations.services.yml @@ -87,7 +87,7 @@ services: class: Drupal\rest_normalizations\ComponentGenerator\EntityReferenceTargetFieldFieldGenerator tags: - { name: ts_generator_component, priority: 21 } - arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.field_target_identifiers%'] + arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '@entity_field.manager', '%rest_normalizations.field_target_identifiers%'] parameters: rest_normalizations.target_identifiers: diff --git a/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php index 7aa0697..7e69255 100644 --- a/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php +++ b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php @@ -2,6 +2,7 @@ namespace Drupal\rest_normalizations\ComponentGenerator; +use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\FieldConfigInterface; use Drupal\Core\Field\FieldTypePluginManagerInterface; @@ -18,8 +19,15 @@ class EntityReferenceTargetFieldFieldGenerator extends EntityReferenceFieldGener */ protected $field_target_identifiers; - public function __construct(FieldTypePluginManagerInterface $fieldTypePluginManager, EntityTypeManagerInterface $entityTypeManager, $field_target_identifiers) { + /** + * @var EntityFieldManagerInterface + */ + protected $entityFieldManager; + + public function __construct(FieldTypePluginManagerInterface $fieldTypePluginManager, EntityTypeManagerInterface $entityTypeManager, EntityFieldManagerInterface $entityFieldManager, $field_target_identifiers) { parent::__construct($fieldTypePluginManager, $entityTypeManager); + + $this->entityFieldManager = $entityFieldManager; $this->field_target_identifiers = $field_target_identifiers; } @@ -31,6 +39,12 @@ public function supportsGeneration($object) { return !!$this->getFieldData($object); } + /** + * Generate name suffix and field target identifiers. + * + * @param $object + * @return [string, array]|bool + */ protected function getFieldData($object) { if (isset($this->field_target_identifiers[$object->getSettings()['target_type']])) { return [ @@ -64,12 +78,6 @@ protected function getItemProperties($object, Settings $settings, Result $result $properties['target'] = $component_result->getContext('target'); -// list(, $field_identifiers) = $this->getFieldData($object); -// foreach ($field_identifiers as $field_names) { -// $properties[$field_names] = 'string'; // $this->generator->generate($object, $settings, $result, $component_result); -// } - - return $properties; } @@ -78,39 +86,14 @@ public function getItemMapping($object, $properties, Settings $settings, Result $mapping['target'] = 'target'; -// $field_identifiers = array_values($this->field_target_identifiers)[0]; -// foreach($field_identifiers as $field) { -// $mapping[$field] = $field; -// } return $mapping; } protected function getName($object, Settings $settings, Result $result, ComponentResult $component_result) { /** @var \Drupal\Core\Field\FieldDefinitionInterface $object */ - // $entity_type = $this->entityTypeManager->getDefinition($object->getSettings()['target_type']); - $name = parent::getName($object, $settings, $result, $component_result); list($name_suffix, ) = $this->getFieldData($object); return $name . $name_suffix; - - // return $name . Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getName()); - - -// if (!($object instanceof FieldConfigInterface)) { -// return $name; -// } -// -// $handler = $object->getSetting('handler'); -// if ($handler !== 'default:' . $entity_type->id()) { -// return $name; -// } -// -// $handler_settings = $object->getSetting('handler_settings'); -// if (empty($handler_settings) || empty($handler_settings['target_bundles'])) { -// return $name; -// } -// -// return $name . Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getTargetBundle()) . Container::camelize($object->getName()); } public function getBundles($object) { @@ -172,55 +155,186 @@ public function preGenerateBundles($object, Settings $settings, Result $result, return $bundles; } - public function generateTarget($object, Settings $settings, Result $result, ComponentResult $componentResult) { + public function generateTargetFromBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; - $bundles = $this->getBundles($object, $settings, $result, $componentResult); - if ($bundles) { - $targetComponentResult = new ComponentResult(); - $bundles_results = $componentResult->getContext('bundles'); - - $type = $targetComponentResult->setComponent('type', $result->setComponent( - 'types/' . $name, - 'type ' . $name . " = " . $this->generateUnionObject($bundles_results, 'type') + $targetComponentResult = new ComponentResult(); + $bundles_results = $componentResult->getContext('bundles'); + + $type = $targetComponentResult->setComponent('type', $result->setComponent( + 'types/' . $name, + 'type ' . $name . " = " . $this->generateUnionObject($bundles_results, 'type') + )); + if ($settings->generateParser()) { + $target_type = $targetComponentResult->setComponent('target_type', $result->setComponent( + 'types/Parsed' . $name, + 'type Parsed' . $name . " = " . $this->generateUnionObject($bundles_results, 'target_type') + )); + $targetComponentResult->setComponent('parser', $result->setComponent( + 'parser/' . Container::underscore($name) . '_parser', + 'const ' . Container::underscore($name) . '_parser' . ' = ' . $this->generateUnionParser( + $bundles_results, + $type, + $target_type + ) )); - if ($settings->generateParser()) { - $target_type = $targetComponentResult->setComponent('target_type', $result->setComponent( - 'types/Parsed' . $name, - 'type Parsed' . $name . " = " . $this->generateUnionObject($bundles_results, 'target_type') - )); - $targetComponentResult->setComponent('parser', $result->setComponent( - 'parser/' . Container::underscore($name) . '_parser', - 'const ' . Container::underscore($name) . '_parser' . ' = ' . $this->generateUnionParser( - $bundles_results, - $type, - $target_type - ) - )); + } + + return $targetComponentResult; + } + + public function preGenerateTargetWithoutBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + + return new ComponentResult([ + 'type' => ':types/' . $name . ':', + 'target_type' => ':types/Parsed' . $name . ':', + 'parser' => ':parser/' . Container::underscore($name) . '_parser:' + ]); + } + + public function generateTargetWithoutBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + list(, $field_target_identifiers) = $this->getFieldData($object); + + $entity_type_id = $object->getSettings()['target_type']; + $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id); + + $properties = []; + $mapping = []; + + foreach ($base_field_definitions as $key => $field_definition) { + if ($field_definition->isInternal()) { + continue; } - return $targetComponentResult; + if (!in_array($key, $field_target_identifiers)) { + continue; + } - } else { + $property_value = $this->generator->generate($field_definition, $settings, $result); + $properties[$key] = $property_value; + $mapping[$key] = $key; + } + return $this->generatePropertiesComponentResult( + $properties, + $name, + 'Parsed' . $name, + Container::underscore($name) . '_parser', + $mapping, + $settings, + $result + ); + } + + /** + * @param $object + * @param Settings $settings + * @param Result $result + * @param ComponentResult $componentResult + * @return array|bool + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + */ + public function generateBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundle_list = $this->getBundles($object); + if (!$bundle_list) { + return FALSE; + } + + $bundles = []; + foreach ($bundle_list as $bundle) { + $bundles[$bundle->id()] = $this->generateBundle($object, $bundle, $settings, $result, $componentResult); } + return $bundles; + } + + /** + * @param $object + * @param $bundle + * @param Settings $settings + * @param Result $result + * @param ComponentResult $componentResult + * + */ + public function generateBundle($object, $bundle, Settings $settings, Result $result, ComponentResult $componentResult) { + list(, $field_target_identifiers) = $this->getFieldData($object); + $entity_type_id = $object->getSettings()['target_type']; + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + $bundle_id = $bundle->id(); + + $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id); + $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle_id); + + $_bundle_field_type = $this->generator->generate($base_field_definitions[$entity_type->getKey('bundle')], $settings, $result); + $bundle_field_type = $_bundle_field_type->getComponent('wrapper_type') . '<' . $_bundle_field_type->getComponent('specific_item_type') . "<" . json_encode($bundle_id) . ">>"; + + $properties = [ + $entity_type->getKey('bundle') => new ComponentResult([ + 'type' => $bundle_field_type, + 'target_type' => json_encode($bundle_id), + 'parser' => '((_: any): ' . json_encode($bundle_id) . ' => ' . json_encode($bundle_id) . ')', + 'guard' => '((t: any): t is ' . $bundle_field_type . ' => Array.isArray(t) && t[0] !== undefined && t[0].target_id !== undefined && t[0].target_id === ' . json_encode($bundle_id) . ')' + ]) + ]; + $mapping = [ + 'bundle' => $entity_type->getKey('bundle'), + ]; + + foreach ($field_definitions as $key => $field_definition) { + if ($field_definition->isInternal()) { + continue; + } + + if (!in_array($key, $field_target_identifiers)) { + continue; + } + + $property_value = $this->generator->generate($field_definition, $settings, $result); + $properties[$key] = $property_value; + $mapping[$key] = $key; + } + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target' . Container::camelize($bundle->id()); + + return $this->generatePropertiesComponentResult( + $properties, + $name, + 'Parsed' . $name, + Container::underscore($name) . '_parser', + $mapping, + $settings, + $result, + Container::underscore($name) . '_guard' + ); } protected function preGenerate($object, Settings $settings, Result $result, ComponentResult $componentResult) { - $bundles = $componentResult->getContext('bundles'); - if (!isset($bundles)) { - $bundles = $this->preGenerateBundles($object, $settings, $result, $componentResult); - $componentResult->setContext('bundles', $bundles); -// $bundles = $this->generateBundles($object, $settings, $result, $componentResult); -// $componentResult->setContext('bundles', $bundles); - } - - $target = $componentResult->getContext('target'); - if (!$target) { - $target = $this->generateTarget($object, $settings, $result, $componentResult); - $componentResult->setContext('target', $target); + $bundle_list = $this->getBundles($object); + if ($bundle_list) { + $bundles = $componentResult->getContext('bundles'); + if (!isset($bundles)) { + $bundles = $this->preGenerateBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('bundles', $bundles); + $bundles = $this->generateBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('bundles', $bundles); + } + + $target = $componentResult->getContext('target'); + if (!$target) { + $target = $this->generateTargetFromBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + } + } else { + $target = $componentResult->getContext('target'); + if (!$target) { + $target = $this->preGenerateTargetWithoutBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + $target = $this->generateTargetWithoutBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + } } parent::preGenerate($object, $settings, $result, $componentResult); diff --git a/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php b/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php index 7a2b8e5..3f338cf 100644 --- a/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php +++ b/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php @@ -154,11 +154,11 @@ public function generateParser($object, Settings $settings, Result $result, Comp $item_target_type = implode(' | ', array_diff(array_map('trim', explode('|', $item_target_type)), array('undefined'))); $item_properties = $this->getItemProperties($object, $settings, $result, $componentResult); - $item_mapping = $this->getItemMapping($object, $properties, $settings, $result, $componentResult); + $item_mapping = $this->getItemMapping($object, $item_properties, $settings, $result, $componentResult); $item_parser = $componentResult->getContext('item')->getComponent('parser'); $item_guard = $componentResult->getContext('item')->getComponent('guard'); - + if ($object->getFieldStorageDefinition()->getCardinality() == 1) { if ($object->isRequired()) { $name = 'singular_required_' . Container::underscore($this->getName($object, $settings, $result, $componentResult)) . '_parser';