arch-8.x-1.x-dev/modules/stock/src/Plugin/Field/FieldType/Stock.php

modules/stock/src/Plugin/Field/FieldType/Stock.php
<?php

namespace Drupal\arch_stock\Plugin\Field\FieldType;

use Drupal\Core\Entity\TypedData\EntityDataDefinition;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\DataReferenceDefinition;
use Drupal\Core\TypedData\DataReferenceTargetDefinition;

/**
 * Plugin implementation of the 'stock' field type.
 *
 * @FieldType(
 *   id = "stock",
 *   label = @Translation("Stock", context = "arch_stock"),
 *   default_widget = "stock_default",
 *   default_formatter = "stock_default",
 *   list_class = "\Drupal\arch_stock\Plugin\Field\FieldType\StockFieldItemList"
 * )
 */
class Stock extends FieldItemBase implements StockInterface {

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties = [];

    $properties['warehouse'] = DataReferenceTargetDefinition::create('string')
      ->setLabel(t('Warehouse ID', [], ['context' => 'arch_stock']));

    $properties['warehouse_entity'] = DataReferenceDefinition::create('entity')
      ->setLabel(t('Warehouse entity', [], ['context' => 'arch_stock']))
      // The entity object is computed out of the entity ID.
      ->setComputed(TRUE)
      ->setReadOnly(FALSE)
      ->setTargetDefinition(EntityDataDefinition::create('warehouse'))
      // We can add a constraint for the target entity type. The list of
      // referenceable bundles is a field setting, so the corresponding
      // constraint is added dynamically in ::getConstraints().
      ->addConstraint('EntityType', 'warehouse');

    $properties['quantity'] = DataDefinition::create('float')
      ->setLabel(t('Quantity', [], ['context' => 'arch_stock']))
      ->setSetting('precision', 2)
      ->setSetting('size', 14);

    $properties['cart_quantity'] = DataDefinition::create('float')
      ->setLabel(t('Cart quantity', [], ['context' => 'arch_stock']))
      ->setSetting('precision', 2)
      ->setSetting('size', 14);

    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    return [
      'columns' => [
        'warehouse' => [
          'type' => 'varchar_ascii',
          'length' => 32,
        ],
        'quantity' => [
          'type' => 'numeric',
          'precision' => 14,
          'scale' => 2,
        ],
        'cart_quantity' => [
          'type' => 'numeric',
          'precision' => 14,
          'scale' => 2,
        ],
      ],
      'indexed' => [
        'type' => ['warehouse'],
        'stock' => ['warehouse', 'quantity', 'cart_quantity'],
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getWarehouseId() {
    return $this->get('warehouse')->getValue();
  }

  /**
   * {@inheritdoc}
   */
  public function getWarehouse() {
    $warehouse_id = $this->getWarehouseId();
    $storage = $this->getEntityTypeManager()->getStorage('warehouse');
    return $storage->load($warehouse_id);
  }

  /**
   * {@inheritdoc}
   */
  public function getQuantity() {
    return round((float) $this->get('quantity')->getValue(), 2);
  }

  /**
   * {@inheritdoc}
   */
  public function getCartQuantity() {
    return round((float) $this->get('cart_quantity')->getValue(), 2);
  }

  /**
   * {@inheritdoc}
   */
  public function isAvailable() {
    return $this->getQuantity() - $this->getCartQuantity() > 0;
  }

  /**
   * Entity type manager.
   *
   * @return \Drupal\Core\Entity\EntityTypeManagerInterface
   *   Entity type manager.
   */
  protected function getEntityTypeManager() {
    // @codingStandardsIgnoreStart
    return \Drupal::entityTypeManager();
    // @codingStandardsIgnoreEnd
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    if (
      !empty($this->cart_quantity)
      || !empty($this->quantity)
    ) {
      return FALSE;
    }

    return TRUE;
  }

}

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

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