* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ declare(strict_types=1); namespace PrestaShop\PrestaShop\Core\Grid\Query; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Query\QueryBuilder; use PrestaShop\PrestaShop\Core\Grid\Search\SearchCriteriaInterface; /** * Class TitleQueryBuilder provides query builders for titles grid. */ class TitleQueryBuilder extends AbstractDoctrineQueryBuilder { /** * @var DoctrineSearchCriteriaApplicatorInterface */ private $searchCriteriaApplicator; /** * @var int */ private $languageId; /** * @param Connection $connection * @param string $dbPrefix * @param DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator * @param int $languageId */ public function __construct( Connection $connection, string $dbPrefix, DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator, int $languageId ) { parent::__construct($connection, $dbPrefix); $this->searchCriteriaApplicator = $searchCriteriaApplicator; $this->languageId = $languageId; } /** * {@inheritdoc} */ public function getSearchQueryBuilder(SearchCriteriaInterface $searchCriteria) { $builder = $this->getTitleQueryBuilder($searchCriteria) ->select('g.*, gl.name'); $this->searchCriteriaApplicator ->applySorting($searchCriteria, $builder) ->applyPagination($searchCriteria, $builder); return $builder; } /** * {@inheritdoc} */ public function getCountQueryBuilder(SearchCriteriaInterface $searchCriteria) { return $this->getTitleQueryBuilder($searchCriteria)->select('COUNT(g.id_gender)'); } /** * @param SearchCriteriaInterface $searchCriteria * * @return QueryBuilder */ private function getTitleQueryBuilder(SearchCriteriaInterface $searchCriteria): QueryBuilder { $builder = $this->connection->createQueryBuilder() ->from($this->dbPrefix . 'gender', 'g') ->innerJoin('g', $this->dbPrefix . 'gender_lang', 'gl', 'g.id_gender = gl.id_gender') ->andWhere('gl.`id_lang`= :language') ->setParameter('language', $this->languageId) ; $this->applyFilters($builder, $searchCriteria); return $builder; } /** * @param QueryBuilder $builder * @param SearchCriteriaInterface $searchCriteria */ private function applyFilters(QueryBuilder $builder, SearchCriteriaInterface $searchCriteria): void { $allowedFiltersMap = [ 'id_gender' => 'g.id_gender', 'type' => 'g.type', 'name' => 'gl.name', ]; foreach ($searchCriteria->getFilters() as $filterName => $filterValue) { if (!array_key_exists($filterName, $allowedFiltersMap)) { continue; } if ($filterName === 'type') { $builder ->andWhere($allowedFiltersMap[$filterName] . ' = :' . $filterName) ->setParameter($filterName, $filterValue); continue; } $builder ->andWhere($allowedFiltersMap[$filterName] . ' LIKE :' . $filterName) ->setParameter($filterName, '%' . $filterValue . '%'); } } }