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