commerce_api-8.x-1.x-dev/src/Plugin/Field/FieldType/OrderProfile.php
src/Plugin/Field/FieldType/OrderProfile.php
<?php declare(strict_types=1); namespace Drupal\commerce_api\Plugin\Field\FieldType; use Drupal\commerce_api\TypedData\AddressDataDefinition; use Drupal\commerce_api\TypedData\TaxNumberDataDefinition; use Drupal\commerce_order\Entity\OrderInterface; use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\TypedData\EntityDataDefinition; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Field\FieldItemBase; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\TypedData\DataReferenceDefinition; /** * @FieldType( * id = "order_profile", * label = @Translation("Order profile"), * no_ui = TRUE, * list_class = "\Drupal\commerce_api\Plugin\Field\FieldType\OrderProfileItemList", * ) * * @property \Drupal\profile\Entity\ProfileInterface|null $entity * @property string[] $address * @property string[] $tax_number */ final class OrderProfile extends FieldItemBase { /** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties = []; $properties['entity'] = DataReferenceDefinition::create('entity') ->setLabel(t('Profile entity')) ->setTargetDefinition(EntityDataDefinition::create('profile')) ->setComputed(TRUE) ->setInternal(TRUE); $profile_type = $field_definition->getSetting('profile_bundle') ?: 'customer'; $entity_type = \Drupal::entityTypeManager()->getDefinition('profile'); assert($entity_type instanceof ContentEntityType); $entity_field_manager = \Drupal::getContainer()->get('entity_field.manager'); assert($entity_field_manager instanceof EntityFieldManagerInterface); $fields = $entity_field_manager->getFieldDefinitions('profile', $profile_type); // Exclude keys, revision keys, and other base fields. $fields = array_filter($fields, function ($item) { return !($item instanceof BaseFieldDefinition); }); foreach ($fields as $field) { if ($field->getType() === 'address') { $data_definition = AddressDataDefinition::create('address') ->setLabel(t('Address')); } elseif ($field->getType() === 'commerce_tax_number') { $data_definition = TaxNumberDataDefinition::create('tax_number') ->setLabel(t('Tax number')); } else { $data_definition = $field->getItemDefinition(); } $properties[$field->getName()] = $data_definition; } return $properties; } /** * {@inheritdoc} */ public static function schema(FieldStorageDefinitionInterface $field_definition) { return []; } /** * {@inheritdoc} */ public static function mainPropertyName() { return NULL; } /** * {@inheritdoc} */ public function isEmpty() { foreach ($this->getValue() as $property_value) { if (!empty($property_value)) { return FALSE; } } return TRUE; } /** * {@inheritdoc} */ public function preSave() { $order = $this->getEntity(); assert($order instanceof OrderInterface); $profile_type = $this->getSetting('profile_type') ?: 'billing'; $profile = $this->entity; if ($profile && ($profile->isNew() || $profile->hasTranslationChanges())) { $profile->save(); if ($profile_type === 'shipping') { $order->setData('shipping_profile_id', $profile->id()); } } // Ensure we don't store the shipping profile in the order's data. if ($order->getData('shipping_profile')) { $order->unsetData('shipping_profile'); } } }