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');
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc