arch-8.x-1.x-dev/modules/stock/src/Manager/WarehouseManager.php
modules/stock/src/Manager/WarehouseManager.php
<?php
namespace Drupal\arch_stock\Manager;
use Drupal\arch_stock\Entity\Warehouse;
use Drupal\arch_stock\WarehouseDefault;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Warehouse manager.
*
* @package Drupal\arch_stock\Manager
*/
class WarehouseManager implements WarehouseManagerInterface, ContainerInjectionInterface {
/**
* Defined warehouse.
*
* @var \Drupal\arch_stock\Entity\WarehouseInterface[]
*/
protected $warehouses;
/**
* Default warehouse.
*
* @var \Drupal\arch_stock\WarehouseDefault
*/
protected $defaultWarehouse;
/**
* Config factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* WarehouseManager constructor.
*
* @param \Drupal\arch_stock\WarehouseDefault $default_warehouse
* Default warehouse.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* Config factory.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* Module handler.
*/
public function __construct(
WarehouseDefault $default_warehouse,
ConfigFactoryInterface $config_factory,
ModuleHandlerInterface $module_handler,
) {
$this->defaultWarehouse = $default_warehouse;
$this->configFactory = $config_factory;
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('warehouse.default'),
$container->get('config.factory'),
$container->get('module_handler')
);
}
/**
* Get default warehouse.
*
* @return \Drupal\arch_stock\Entity\WarehouseInterface
* Default warehouse.
*/
public function getDefaultWarehouse() {
return $this->defaultWarehouse->get();
}
/**
* List of defined warehouses.
*
* @return \Drupal\arch_stock\Entity\WarehouseInterface[]
* Warehouse list.
*/
public function getWarehouses() {
if (!isset($this->warehouses)) {
$default = $this->getDefaultWarehouse();
$warehouses = [$default->id() => $default];
$config_ids = $this->configFactory->listAll('arch_stock.warehouse.');
foreach ($this->configFactory->loadMultiple($config_ids) as $config) {
$data = $config->get();
$warehouses[$data['id']] = Warehouse::create($data);
}
uasort($warehouses, '\Drupal\arch_stock\Entity\Warehouse::sort');
$this->warehouses = $warehouses;
}
return $this->warehouses;
}
/**
* {@inheritdoc}
*/
public function getFormOptions() {
$options = [];
foreach ($this->getWarehouses() as $warehouse) {
if (!$warehouse->status()) {
continue;
}
$options[$warehouse->id()] = $warehouse->label();
}
return $options;
}
/**
* {@inheritdoc}
*/
public function getAvailableWarehouses(AccountInterface $account) {
$warehouses = array_filter($this->getWarehouses(), function ($warehouse) use ($account) {
/** @var \Drupal\arch_stock\Entity\WarehouseInterface $warehouse */
$result = $warehouse->access('view', $account, TRUE);
return !$result->isForbidden();
});
$context = [
'account' => $account,
];
$this->moduleHandler->alter('stock_available_warehouses', $warehouses, $context);
return $warehouses;
}
}
