arch-8.x-1.x-dev/modules/stock/src/Plugin/search_api/processor/Stock.php
modules/stock/src/Plugin/search_api/processor/Stock.php
<?php
namespace Drupal\arch_stock\Plugin\search_api\processor;
use Drupal\arch_product\Entity\ProductInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\search_api\Datasource\DatasourceInterface;
use Drupal\search_api\Item\ItemInterface;
use Drupal\search_api\Processor\ProcessorPluginBase;
use Drupal\search_api\Processor\ProcessorProperty;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Adds stock info fields to indexed data.
*
* @SearchApiProcessor(
* id = "search_api_arch_stock_value",
* label = @Translation("Stock value"),
* stages = {
* "add_properties" = 0,
* },
* locked = true,
* hidden = true,
* )
*/
class Stock extends ProcessorPluginBase {
/**
* Entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Warehouse storage.
*
* @var \Drupal\arch_stock\Entity\Storage\WarehouseStorageInterface
*/
protected $warehouseStorage;
/**
* {@inheritdoc}
*/
public static function create(
ContainerInterface $container,
array $configuration,
$plugin_id,
$plugin_definition,
) {
/** @var static $processor */
$processor = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$processor->setEntityTypeManager($container->get('entity_type.manager'));
return $processor;
}
/**
* Sets entity type manager.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* Entity type manager.
*
* @return $this
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager) {
$this->entityTypeManager = $entity_type_manager;
$this->warehouseStorage = $entity_type_manager->getStorage('warehouse');
return $this;
}
/**
* {@inheritdoc}
*/
public function getPropertyDefinitions(?DatasourceInterface $datasource = NULL) {
$properties = [];
if ($datasource) {
/** @var \Drupal\Core\Entity\ContentEntityType $entity_type */
$entity_type = $this->entityTypeManager->getDefinition($datasource->getEntityTypeId());
if ($entity_type->entityClassImplements(ProductInterface::class)) {
foreach ($this->getDefinitions($datasource) as $property => $definition) {
$properties[$property] = new ProcessorProperty($definition);
}
}
}
return $properties;
}
/**
* Get property definition arrays.
*
* @param \Drupal\search_api\Datasource\DatasourceInterface $datasource
* The datasource this set of properties belongs to.
*
* @return array
* Property definition array.
*/
protected function getDefinitions(DatasourceInterface $datasource) {
$properties = [];
foreach ($this->warehouseStorage->loadMultiple() as $warehouse) {
/** @var \Drupal\arch_stock\Entity\WarehouseInterface $warehouse */
$properties['arch_stock_' . $warehouse->id()] = [
'label' => $this->t('Warehouse: @warehouse stock', ['@warehouse' => $warehouse->label()], ['context' => 'arch_stock']),
'type' => 'decimal',
'fields' => ['quantity'],
'computed' => TRUE,
'processor_id' => $this->getPluginId(),
'datasource' => $datasource,
'is_list' => FALSE,
'warehouse' => $warehouse->id(),
];
}
return $properties;
}
/**
* {@inheritdoc}
*/
public function addFieldValues(ItemInterface $item) {
/** @var \Drupal\arch_product\Entity\ProductInterface $product */
$product = $item->getOriginalObject()->getValue();
if (
!$product->hasField('stock')
|| $product->get('stock')->isEmpty()
) {
return;
}
foreach ($product->get('stock')->getValue() as $value) {
if (empty($value)) {
continue;
}
$property = 'arch_stock_' . $value['warehouse'];
$definitions = $this->getDefinitions($item->getDatasource());
if (!isset($definitions[$property])) {
continue;
}
$definition = $definitions[$property];
if ($definition['warehouse'] != $value['warehouse']) {
continue;
}
/** @var \Drupal\search_api\Item\Field[] $fields */
$fields = $this->getFieldsHelper()->filterForPropertyPath($item->getFields(), $item->getDatasourceId(), $property);
if (empty($fields)) {
continue;
}
foreach ($fields as $field) {
$field->setValues([(float) $value['quantity']]);
}
}
}
}
