arch-8.x-1.x-dev/modules/stock/modules/search_api/src/Plugin/views/filter/SearchApiHasStockFilter.php
modules/stock/modules/search_api/src/Plugin/views/filter/SearchApiHasStockFilter.php
<?php namespace Drupal\arch_stock_search_api\Plugin\views\filter; use Drupal\arch_stock\StockKeeperInterface; use Drupal\Core\Session\AccountInterface; use Drupal\search_api\Plugin\views\filter\SearchApiBoolean; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines a stock filter to the view. * * @ingroup views_filter_handlers * * @ViewsFilter("arch_stock_has_stock_search_api") */ class SearchApiHasStockFilter extends SearchApiBoolean { /** * Current user. * * @var \Drupal\Core\Session\AccountInterface */ protected $currentUser; /** * Stock keeper. * * @var \Drupal\arch_stock\StockKeeperInterface */ protected $stockKeeper; /** * {@inheritdoc} */ public function __construct( array $configuration, $plugin_id, $plugin_definition, AccountInterface $current_user, StockKeeperInterface $stock_keeper, ) { parent::__construct( $configuration, $plugin_id, $plugin_definition ); $this->currentUser = $current_user; $this->stockKeeper = $stock_keeper; } /** * {@inheritdoc} */ public static function create( ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, ) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('current_user'), $container->get('arch_stock.stock_keeper') ); } /** * {@inheritdoc} */ public function query() { $this->ensureMyTable(); $info = $this->operators(); if (!empty($info[$this->operator]['method'])) { $fields = $this->getFilteringFields(); $group = $this->getQuery()->createConditionGroup('or', ['arch_stock']); foreach ($fields as $field) { $group->addCondition($field['property'], 0, '>'); } $this->getQuery()->addConditionGroup($group); } } /** * Get filtering fields. * * @return string[][] * List of filtering fields. */ public function getFilteringFields() { $fields = []; foreach ($this->stockKeeper->selectWarehouses($this->currentUser) as $warehouse_id) { $field = strtolower('arch_stock_' . $warehouse_id); $fields[$field] = [ 'property' => $field, ]; } return $fields; } }