* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ namespace PrestaShop\PrestaShop\Core\Grid; use PrestaShop\PrestaShop\Core\Grid\Data\Factory\GridDataFactoryInterface; use PrestaShop\PrestaShop\Core\Grid\Definition\Factory\GridDefinitionFactoryInterface; use PrestaShop\PrestaShop\Core\Grid\Filter\GridFilterFormFactoryInterface; use PrestaShop\PrestaShop\Core\Grid\Search\SearchCriteriaInterface; use PrestaShop\PrestaShop\Core\Hook\HookDispatcherInterface; use PrestaShopBundle\Event\Dispatcher\NullDispatcher; use Symfony\Component\DependencyInjection\Container; /** * Class GridFactory is responsible for creating final Grid instance. */ final class GridFactory implements GridFactoryInterface { /** * @var GridDefinitionFactoryInterface */ private $definitionFactory; /** * @var GridDataFactoryInterface */ private $dataFactory; /** * @var GridFilterFormFactoryInterface */ private $filterFormFactory; /** * @var HookDispatcherInterface */ private $hookDispatcher; /** * @param GridDefinitionFactoryInterface $definitionFactory * @param GridDataFactoryInterface $dataFactory * @param GridFilterFormFactoryInterface $filterFormFactory * @param HookDispatcherInterface|null $hookDispatcher */ public function __construct( GridDefinitionFactoryInterface $definitionFactory, GridDataFactoryInterface $dataFactory, GridFilterFormFactoryInterface $filterFormFactory, HookDispatcherInterface $hookDispatcher = null ) { $this->definitionFactory = $definitionFactory; $this->dataFactory = $dataFactory; $this->filterFormFactory = $filterFormFactory; if (null === $hookDispatcher) { @trigger_error('The $hookDispatcher parameter should not be null, inject your main HookDispatcherInterface service, or NullDispatcher if you don\'t need hooks.', E_USER_DEPRECATED); } $this->hookDispatcher = $hookDispatcher ? $hookDispatcher : new NullDispatcher(); } /** * {@inheritdoc} */ public function getGrid(SearchCriteriaInterface $searchCriteria) { $definition = $this->definitionFactory->getDefinition(); $data = $this->dataFactory->getData($searchCriteria); $this->hookDispatcher->dispatchWithParameters('action' . Container::camelize($definition->getId()) . 'GridDataModifier', [ 'data' => &$data, ]); $filterForm = $this->filterFormFactory->create($definition); $filterForm->setData($searchCriteria->getFilters()); return new Grid( $definition, $data, $searchCriteria, $filterForm ); } }