<?php
namespace WebBundle\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\DBAL\DBALException;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use FlexApp\Constant\TimeConstant;
use Import1CBundle\Helper\v3\BiConst;
use Import1CBundle\Helper\v3\TranslitNameHelper;
use WebBundle\Constant\CookieKeysConstant;
use WebBundle\Entity\Article;
use WebBundle\Entity\Collection;
use WebBundle\Entity\Interior;
use WebBundle\Helper\App;
use WebBundle\Helper\ArticleSettingsHelper;
use WebBundle\Helper\ChineseFixHelper;
use WebBundle\Helper\ConversionHelper;
use WebBundle\Helper\CookieHelper;
use WebBundle\Helper\CurrencyRateHelper;
use WebBundle\Helper\HideFactoryCountriesHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\StrHelper;
use WebBundle\Traits\RepoTrait;
/**
* @method Article|null find($id, $lockMode = null, $lockVersion = null)
* @method Article|null findOneBy(array $criteria, ?array $orderBy = null)
*/
class ArticleRepository extends ServiceEntityRepository
{
use RepoTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
/**
* @return mixed|null
*/
public function getArticleSale()
{
$q = $this->createQueryBuilder('a');
$q->select('a,c,f')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin('a.PRStatus ', 'PRStatus')
->andWhere('PRStatus.id IN (6,7) AND c.status IN (:status)')
->setParameter('status', BiConst::STATE_NOT_PUBLISHED);
$r = $q->getQuery()
->useQueryCache(true);
return $r->getResult();
}
/**
* @param $id
* @return int|mixed|string|null
*/
public function getItemUrlById($id)
{
$q = $this->createQueryBuilder('a')
->select('a.url')
->andWhere('a.id = :id')
->setParameter('id', $id)
->setMaxResults(1);
$r = $q->getQuery()->enableResultCache(3600);
try {
return $r->getSingleResult();
} catch (NoResultException | NonUniqueResultException $e) {
return null;
}
}
/**
* НЕ ИЗМЕНЯТЬ специальный запрос для API
*
* @param ?int $collectionId
* @param ?bool $lc
* @return ?array
*/
public function getArticleArrayAPI(?int $collectionId = null, ?bool $lc = false): ?array
{
$rsm = new ResultSetMapping();
$rsm->addEntityResult('WebBundle\Entity\Article', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$rsm->addFieldResult('a', 'code', 'code');
$rsm->addFieldResult('a', 'name', 'name');
$rsm->addFieldResult('a', 'alternate_name', 'alternateName');
$rsm->addFieldResult('a', 'size_x', 'sizeX');
$rsm->addFieldResult('a', 'size_y', 'sizeY');
$rsm->addFieldResult('a', 'price_euro', 'priceEuro');
$rsm->addFieldResult('a', 'price_mq_euro', 'priceMqEuro');
$rsm->addFieldResult('a', 'price_euro_de', 'priceEuroDe');
$rsm->addFieldResult('a', 'price_euro_at', 'priceEuroAt');
$rsm->addFieldResult('a', 'price_euro_fi', 'priceEuroFi');
$rsm->addFieldResult('a', 'price_euro_fr', 'priceEuroFr');
$rsm->addFieldResult('a', 'price_euro_it', 'priceEuroIt');
$rsm->addFieldResult('a', 'price_euro_be', 'priceEuroBe');
$rsm->addFieldResult('a', 'price_euro_ie', 'priceEuroIe');
$rsm->addFieldResult('a', 'price_euro_nl', 'priceEuroNl');
$rsm->addFieldResult('a', 'price_euro_es', 'priceEuroEs');
$rsm->addFieldResult('a', 'price_mq_euro_de', 'priceMqEuroDe');
$rsm->addFieldResult('a', 'price_mq_euro_at', 'priceMqEuroAt');
$rsm->addFieldResult('a', 'price_mq_euro_fr', 'priceMqEuroFr');
$rsm->addFieldResult('a', 'price_mq_euro_it', 'priceMqEuroIt');
$rsm->addFieldResult('a', 'price_mq_euro_be', 'priceMqEuroBe');
$rsm->addFieldResult('a', 'price_mq_euro_ie', 'priceMqEuroIe');
$rsm->addFieldResult('a', 'price_mq_euro_nl', 'priceMqEuroNl');
$rsm->addFieldResult('a', 'price_mq_euro_es', 'priceMqEuroEs');
$rsm->addFieldResult('a', 'price_rub', 'priceRUB');
$rsm->addFieldResult('a', 'price_rue', 'priceRUE');
$rsm->addFieldResult('a', 'price_mq_rub', 'priceMqRUB');
$rsm->addFieldResult('a', 'price_mq_rue', 'priceMqRUE');
$rsm->addFieldResult('a', 'price_gbp', 'priceGBP');
$rsm->addFieldResult('a', 'price_gbe', 'priceGBE');
$rsm->addFieldResult('a', 'price_mq_gbp', 'priceMqGBP');
$rsm->addFieldResult('a', 'price_mq_gbe', 'priceMqGBE');
$rsm->addFieldResult('a', 'price_usd', 'priceUSD');
$rsm->addFieldResult('a', 'price_use', 'priceUSE');
$rsm->addFieldResult('a', 'price_fq_usd', 'priceFqUSD');
$rsm->addFieldResult('a', 'price_fq_use', 'priceFqUSE');
$rsm->addFieldResult('a', 'price_mq_use', 'priceMqUSE');
$rsm->addFieldResult('a', 'price_cad', 'priceCAD');
$rsm->addFieldResult('a', 'price_cae', 'priceCAE');
$rsm->addFieldResult('a', 'price_fq_cad', 'priceFqCAD');
$rsm->addFieldResult('a', 'price_fq_cae', 'priceFqCAE');
$rsm->addFieldResult('a', 'price_mq_cae', 'priceMqCAE');
$rsm->addFieldResult('a', 'price_chf', 'priceCHF');
$rsm->addFieldResult('a', 'price_che', 'priceCHE');
$rsm->addFieldResult('a', 'price_mq_chf', 'priceMqCHF');
$rsm->addFieldResult('a', 'price_mq_che', 'priceMqCHE');
$rsm->addFieldResult('a', 'price_sek', 'priceSEK');
$rsm->addFieldResult('a', 'price_see', 'priceSEE');
$rsm->addFieldResult('a', 'price_mq_sek', 'priceMqSEK');
$rsm->addFieldResult('a', 'price_mq_see', 'priceMqSEE');
$rsm->addFieldResult('a', 'price_dkk', 'priceDKK');
$rsm->addFieldResult('a', 'price_dke', 'priceDKE');
$rsm->addFieldResult('a', 'price_mq_dkk', 'priceMqDKK');
$rsm->addFieldResult('a', 'price_mq_dke', 'priceMqDKE');
$rsm->addFieldResult('a', 'price_nok', 'priceNOK');
$rsm->addFieldResult('a', 'price_noe', 'priceNOE');
$rsm->addFieldResult('a', 'price_mq_nok', 'priceMqNOK');
$rsm->addFieldResult('a', 'price_mq_noe', 'priceMqNOE');
$rsm->addFieldResult('a', 'price_pln', 'pricePLN');
$rsm->addFieldResult('a', 'price_ple', 'pricePLE');
$rsm->addFieldResult('a', 'price_mq_pln', 'priceMqPLN');
$rsm->addFieldResult('a', 'price_mq_ple', 'priceMqPLE');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery', 'ld', 'a', 'delivery');
$rsm->addFieldResult('ld', 'ld_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure', 'lms', 'a', 'measure');
$rsm->addFieldResult('lms', 'lms_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount', 'apd', 'a', 'priceDiscounts');
$rsm->addFieldResult('apd', 'apd_id', 'id');
$rsm->addFieldResult('apd', 'apd_amount', 'amount');
$rsm->addFieldResult('apd', 'apd_amount_ft', 'amountFt');
$rsm->addFieldResult('apd', 'apd_fold', 'fold');
$rsm->addFieldResult('apd', 'apd_price', 'price');
$rsm->addFieldResult('apd', 'apd_price_euro', 'priceEuro');
$rsm->addFieldResult('apd', 'apd_price_euro_de', 'priceEuroDe');
$rsm->addFieldResult('apd', 'apd_price_euro_at', 'priceEuroAt');
$rsm->addFieldResult('apd', 'apd_price_euro_fi', 'priceEuroFi');
$rsm->addFieldResult('apd', 'apd_price_euro_fr', 'priceEuroFr');
$rsm->addFieldResult('apd', 'apd_price_euro_it', 'priceEuroIt');
$rsm->addFieldResult('apd', 'apd_price_euro_be', 'priceEuroBe');
$rsm->addFieldResult('apd', 'apd_price_euro_ie', 'priceEuroIe');
$rsm->addFieldResult('apd', 'apd_price_euro_nl', 'priceEuroNl');
$rsm->addFieldResult('apd', 'apd_price_euro_es', 'priceEuroEs');
$rsm->addFieldResult('apd', 'apd_price_rub', 'priceRUB');
$rsm->addFieldResult('apd', 'apd_price_rue', 'priceRUE');
$rsm->addFieldResult('apd', 'apd_price_gbp', 'priceGBP');
$rsm->addFieldResult('apd', 'apd_price_gbe', 'priceGBE');
$rsm->addFieldResult('apd', 'apd_price_usd', 'priceUSD');
$rsm->addFieldResult('apd', 'apd_price_use', 'priceUSE');
$rsm->addFieldResult('apd', 'apd_price_fq_usd', 'priceFqUSD');
$rsm->addFieldResult('apd', 'apd_price_fq_use', 'priceFqUSE');
$rsm->addFieldResult('apd', 'apd_price_chf', 'priceCHF');
$rsm->addFieldResult('apd', 'apd_price_che', 'priceCHE');
$rsm->addFieldResult('apd', 'apd_price_sek', 'priceSEK');
$rsm->addFieldResult('apd', 'apd_price_see', 'priceSEE');
$rsm->addFieldResult('apd', 'apd_price_dkk', 'priceDKK');
$rsm->addFieldResult('apd', 'apd_price_dke', 'priceDKE');
$rsm->addFieldResult('apd', 'apd_price_nok', 'priceNOK');
$rsm->addFieldResult('apd', 'apd_price_noe', 'priceNOE');
$rsm->addFieldResult('apd', 'apd_price_pln', 'pricePLN');
$rsm->addFieldResult('apd', 'apd_price_ple', 'pricePLE');
$rsm->addFieldResult('apd', 'apd_price_cad', 'priceCAD');
$rsm->addFieldResult('apd', 'apd_price_cae', 'priceCAE');
$rsm->addFieldResult('apd', 'apd_price_fq_cad', 'priceCAD');
$rsm->addFieldResult('apd', 'apd_price_fq_cae', 'priceCAE');
if ($lc) {
$rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery', 'ld', 'a', 'delivery');
$rsm->addFieldResult('ld', 'ld_id', 'id');
$rsm->addFieldResult('ld', 'ld_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListEdgeType', 'let', 'a', 'edgeType');
$rsm->addFieldResult('let', 'let_id', 'id');
$rsm->addFieldResult('let', 'let_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure', 'lms', 'a', 'measure');
$rsm->addFieldResult('lms', 'lms_id', 'id');
$rsm->addFieldResult('lms', 'lms_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial', 'lmt', 'a', 'material');
$rsm->addFieldResult('lmt', 'lmt_id', 'id');
$rsm->addFieldResult('lmt', 'lmt_alias', 'alias');
$rsm->addFieldResult('lmt', 'lmt_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListOffShade', 'los', 'a', 'offShade');
$rsm->addFieldResult('los', 'los_id', 'id');
$rsm->addFieldResult('los', 'los_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListSliding', 'lsl', 'a', 'sliding');
$rsm->addFieldResult('lsl', 'lsl_id', 'id');
$rsm->addFieldResult('lsl', 'lsl_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle', 'lst', 'a', 'style');
$rsm->addFieldResult('lst', 'lst_id', 'id');
$rsm->addFieldResult('lst', 'lst_alias', 'alias');
$rsm->addFieldResult('lst', 'lst_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface', 'lsf', 'a', 'surface');
$rsm->addFieldResult('lsf', 'lsf_id', 'id');
$rsm->addFieldResult('lsf', 'lsf_alias', 'alias');
$rsm->addFieldResult('lsf', 'lsf_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListType', 'ltp', 'a', 'type');
$rsm->addFieldResult('ltp', 'ltp_id', 'id');
$rsm->addFieldResult('ltp', 'ltp_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListUsing', 'lu', 'a', 'using');
$rsm->addFieldResult('lu', 'lu_id', 'id');
$rsm->addFieldResult('lu', 'lu_alias', 'alias');
$rsm->addFieldResult('lu', 'lu_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture', 'ltx', 'a', 'textures');
$rsm->addFieldResult('ltx', 'ltx_id', 'id');
$rsm->addFieldResult('ltx', 'ltx_alias', 'alias');
$rsm->addFieldResult('ltx', 'ltx_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListShape', 'lsh', 'a', 'shape');
$rsm->addFieldResult('lsh', 'lsh_id', 'id');
$rsm->addFieldResult('lsh', 'lsh_alias', 'alias');
$rsm->addFieldResult('lsh', 'lsh_hide', 'hide');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv', 'llm', 'a', 'motivs');
$rsm->addFieldResult('llm', 'llm_id', 'id');
$rsm->addFieldResult('llm', 'llm_alias', 'alias');
$rsm->addFieldResult('llm', 'llm_hide', 'hide');
// todo fix ltp - unable to resolve symbol ltp
$query = $this->_em->createNativeQuery(
'SELECT
a.id,
a.code,
a.name,
a.alternate_name,
a.size_x,
a.size_y,
a.price_euro,
a.price_mq_euro,
a.price_euro_de,
a.price_euro_at,
a.price_euro_fi,
a.price_euro_fr,
a.price_euro_it,
a.price_euro_be,
a.price_euro_ie,
a.price_euro_nl,
a.price_euro_es,
a.price_mq_euro_de,
a.price_mq_euro_at,
a.price_mq_euro_fr,
a.price_mq_euro_it,
a.price_mq_euro_be,
a.price_mq_euro_ie,
a.price_mq_euro_nl,
a.price_mq_euro_es,
a.price_rub,
a.price_rue,
a.price_mq_rub,
a.price_mq_rue,
a.price_gbp,
a.price_gbe,
a.price_mq_gbp,
a.price_mq_gbe,
a.price_usd,
a.price_use,
a.price_fq_usd,
a.price_fq_use,
a.price_mq_use,
a.price_chf,
a.price_che,
a.price_mq_chf,
a.price_mq_che,
a.price_sek,
a.price_see,
a.price_mq_sek,
a.price_mq_see,
a.price_dkk,
a.price_dke,
a.price_mq_dkk,
a.price_mq_dke,
a.price_nok,
a.price_noe,
a.price_mq_nok,
a.price_mq_noe,
a.price_pln,
a.price_ple,
a.price_mq_pln,
a.price_mq_ple,
a.price_cad,
a.price_cae,
a.price_fq_cad,
a.price_fq_cae,
a.price_mq_cae,
lms.id as lms_id,
ld.id as ld_id,
ld.alias as ld_alias,
let.id as let_id,
let.alias as let_alias,
lmt.id as lmt_id,
lmt.alias as lmt_alias,
lmt.hide as lmt_hide,
lms.id as lms_id,
lms.alias as lms_alias,
los.id as los_id,
los.alias as los_alias,
lsl.id as lsl_id,
lsl.alias as lsl_alias,
lst.id as lst_id,
lst.alias as lst_alias,
lst.hide as lst_hide,
lsf.id as lsf_id,
lsf.alias as lsf_alias,
lsf.hide as lsf_hide,
ltp.id as ltp_id,
ltp.alias as ltp_alias,
lu.id as lu_id,
lu.alias as lu_alias,
lu.hide as lu_hide,
ltx.id as ltx_id,
ltx.alias as ltx_alias,
ltx.hide as ltx_hide,
llm.id as llm_id,
llm.alias as llm_alias,
llm.hide as llm_hide,
lsh.id as lsh_id,
lsh.alias as lsh_alias,
lsh.hide as lsh_hide,
apd.id as apd_id,
apd.amount as apd_amount,
apd.amount_ft as apd_amount_ft,
apd.fold as apd_fold,
apd.price as apd_price,
apd.price_euro as apd_price_euro,
apd.price_euro_de as apd_price_euro_de,
apd.price_euro_at as apd_price_euro_at,
apd.price_euro_fi as apd_price_euro_fi,
apd.price_euro_fr as apd_price_euro_fr,
apd.price_euro_it as apd_price_euro_it,
apd.price_euro_be as apd_price_euro_be,
apd.price_euro_ie as apd_price_euro_ie,
apd.price_euro_nl as apd_price_euro_nl,
apd.price_euro_es as apd_price_euro_es,
apd.price_rub as apd_price_rub,
apd.price_rue as apd_price_rue,
apd.price_gbp as apd_price_gbp,
apd.price_gbe as apd_price_gbe,
apd.price_usd as apd_price_usd,
apd.price_use as apd_price_use,
apd.price_fq_usd as apd_price_fq_usd,
apd.price_fq_use as apd_price_fq_use,
apd.price_chf as apd_price_chf,
apd.price_che as apd_price_che,
apd.price_sek as apd_price_sek,
apd.price_see as apd_price_see,
apd.price_dkk as apd_price_dkk,
apd.price_dke as apd_price_dke,
apd.price_nok as apd_price_nok,
apd.price_noe as apd_price_noe,
apd.price_pln as apd_price_pln,
apd.price_ple as apd_price_ple,
apd.price_cad as apd_price_cad,
apd.price_cae as apd_price_cae,
apd.price_fq_cad as apd_price_fq_cad,
apd.price_fq_cae as apd_price_fq_cae
FROM article a
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_edge_type let ON a.edge_type = let.id
LEFT JOIN list_material lmt ON a.material = lmt.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN list_off_shade los ON a.off_shade = los.id
LEFT JOIN list_sliding lsl ON a.sliding = lsl.id
LEFT JOIN list_style lst ON a.style = lst.id
LEFT JOIN list_surface lsf ON a.surface = lsf.id
LEFT JOIN list_using lu ON a.using = lu.id
LEFT JOIN article_texture at ON a.id = at.article_id
LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN list_shape lsh ON lsh.id = a.shape
LEFT JOIN article_motiv alm ON a.id = alm.article_id
LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . '_euro' . '
WHERE a.collection = ?
ORDER BY apd.amount DESC',
$rsm
);
} else {
$query = $this->_em->createNativeQuery(
'SELECT
a.id,
a.code,
a.name,
a.alternate_name,
a.size_x,
a.size_y,
a.price_euro,
a.price_mq_euro,
a.price_euro_de,
a.price_euro_at,
a.price_euro_fi,
a.price_euro_fr,
a.price_euro_it,
a.price_euro_be,
a.price_euro_ie,
a.price_euro_nl,
a.price_euro_es,
a.price_mq_euro_de,
a.price_mq_euro_at,
a.price_mq_euro_fr,
a.price_mq_euro_it,
a.price_mq_euro_be,
a.price_mq_euro_ie,
a.price_mq_euro_nl,
a.price_mq_euro_es,
a.price_rub,
a.price_rue,
a.price_mq_rub,
a.price_mq_rue,
a.price_gbp,
a.price_gbe,
a.price_mq_gbp,
a.price_mq_gbe,
a.price_usd,
a.price_use,
a.price_fq_usd,
a.price_fq_use,
a.price_mq_use,
a.price_chf,
a.price_che,
a.price_mq_chf,
a.price_mq_che,
a.price_sek,
a.price_see,
a.price_mq_sek,
a.price_mq_see,
a.price_dkk,
a.price_dke,
a.price_mq_dkk,
a.price_mq_dke,
a.price_nok,
a.price_noe,
a.price_mq_nok,
a.price_mq_noe,
a.price_pln,
a.price_ple,
a.price_mq_pln,
a.price_mq_ple,
a.price_fq_cad,
a.price_fq_cae,
a.price_mq_cae,
ld.id as ld_id,
lms.id as lms_id,
apd.id as apd_id,
apd.amount as apd_amount,
apd.amount_ft as apd_amount_ft,
apd.fold as apd_fold,
apd.price as apd_price,
apd.price_euro as apd_price_euro,
apd.price_euro_de as apd_price_euro_de,
apd.price_euro_at as apd_price_euro_at,
apd.price_euro_fi as apd_price_euro_fi,
apd.price_euro_fr as apd_price_euro_fr,
apd.price_euro_it as apd_price_euro_it,
apd.price_euro_be as apd_price_euro_be,
apd.price_euro_ie as apd_price_euro_ie,
apd.price_euro_nl as apd_price_euro_nl,
apd.price_euro_es as apd_price_euro_es,
apd.price_rub as apd_price_rub,
apd.price_rue as apd_price_rue,
apd.price_gbp as apd_price_gbp,
apd.price_gbe as apd_price_gbe,
apd.price_usd as apd_price_usd,
apd.price_use as apd_price_use,
apd.price_fq_usd as apd_price_fq_usd,
apd.price_fq_use as apd_price_fq_use,
apd.price_chf as apd_price_chf,
apd.price_che as apd_price_che,
apd.price_sek as apd_price_sek,
apd.price_see as apd_price_see,
apd.price_dkk as apd_price_dkk,
apd.price_dke as apd_price_dke,
apd.price_nok as apd_price_nok,
apd.price_noe as apd_price_noe,
apd.price_pln as apd_price_pln,
apd.price_ple as apd_price_ple,
apd.price_cad as apd_price_cad,
apd.price_cae as apd_price_cae,
apd.price_fq_cad as apd_price_fq_cad,
apd.price_fq_cae as apd_price_fq_cae
FROM article a
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . '_euro' . '
WHERE a.collection = ?
ORDER BY apd.amount DESC',
$rsm
);
}
$query->setParameter(1, $collectionId);
return $query->getArrayResult();
}
/**
* @param $code
* @return mixed|null
* @throws NonUniqueResultException
*/
public function getArticleForPathByCode($code)
{
$q = $this->createQueryBuilder('a');
$q->select('a,c,f')
->leftJoin('a.details', 'ad')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->andWhere('a.code = :code')
->andWhere('ad.file IS NOT NULL')
->setParameter('code', $code);
$r = $q->getQuery()
->setMaxResults(1)
->useQueryCache(true);
try {
$items = $r->getSingleResult();
} catch (NoResultException $e) {
return null;
}
return $items;
}
public function getArticleForSetting(int $id, $locale = null): ?array
{
$locale = ($locale === null) ? App::getCurLocale() : $locale;
$locale = StrHelper::ucFirst($locale);
$locale = ChineseFixHelper::checkAndFixLocale($locale);
$q = $this->createQueryBuilder('a');
$q->select(
'
m.alias measure,
m.id measure_id,
dr.name draw,
t.id type_id,
t.alias type,
a.overflowSink,
a.drainSizeSink,
its.alias installationTypeSink,
a.faucetHoleSink,
ml.alias methLaying,
a.swimmingPool swimmingPool,
u.alias using,
u.id using_id,
mt.alias material,
mt.id material_id,
ad.typePainting,
a.dyedInMass,
a.durabilityClass,
sh.alias shape,
sh.id shape_id,
\'\' tShape,
a.mosaicEffect mosaicEffect,
a.square square,
a.sizeTessera sizeTessera,
a.tesseraSizeX tesseraSizeX,
a.tesseraSizeY tesseraSizeY,
a.tesseraSizeZ tesseraSizeZ,
mms.alias measurementSize_alias,
mms.id measurementSize_id,
a.thick thick,
\'\' surface,
\'\' texture,
\'\' style,
\'\' motive,
a.module,
a.repeatNumber repeatNumber,
a.glazedGranite glazedGranite,
a.thinGranite thinGranite,
et.alias edgeType,
rd.id repeatDrawId,
rd.alias repeatDraw,
os.id offShade_id,
os.alias offShade,
\'\' color,
a.pei pei,
a.weight weight,
d.alias delivery,
ad.description' . $locale . ' description,
ad.descriptionEn descriptionEn,
a.packagingCount packagingCount,
a.packagingCountFt packagingCountFt,
a.packagingCountPC packagingCountPC,
c.publishDate
'
)
->leftJoin('a.collection', 'c')
->leftJoin('a.details', 'ad')
->leftJoin('a.measure', 'm')
->leftJoin('a.draw', 'dr')
->leftJoin('a.measurementSize', 'mms')
->leftJoin('a.type', 't')
->leftJoin('a.delivery', 'd')
->leftJoin('a.edgeType', 'et')
->leftJoin('a.shape', 'sh')
->leftJoin('a.offShade', 'os')
->leftJoin('a.installationTypeSink', 'its')
->leftJoin('a.methLaying', 'ml')
->leftJoin('a.factoryColors', 'fc')
// не показываем наш цвет в свойствах артикула https://te.remote.team/#/discus/1B85346D-2DDE-356D-20F6-C70153702F0D/
// ->leftJoin('a.colors', 'cc')
->leftJoin('a.material', 'mt')
->leftJoin('a.using', 'u')
->leftJoin('a.repeatDraw', 'rd')
->andWhere('a.id = :id')
->setParameter('id', $id)
->groupBy('a.id');
$items = $q->getQuery()
->useQueryCache(true)
->getArrayResult();
return empty($items[0]) ? [] : $items[0];
}
/**
* @param $id
* @return mixed|null
* @throws NonUniqueResultException
*/
public function getArticle($id): ?Article
{
$q = $this->createQueryBuilder('a');
$q->select('a, c, f, priceDiscount')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin(
'a.priceDiscounts',
'priceDiscount',
Expr\Join::WITH,
$q->expr()->andX(
$q->expr()->neq('priceDiscount.priceEuro', 0)
)
)
->where('a.id = :id')
->setMaxResults(1)
->setParameter('id', $id);
$r = $q->getQuery()
->useQueryCache(true);
try {
return $r->getSingleResult();
} catch (NoResultException $e) {
// если нет результата по id ищем по коду
$q->resetDQLPart('where')
->where('a.code = :id')
->setParameter('id', $id);
$r = $q->getQuery()
->useQueryCache(true);
try {
return $r->getSingleResult();
} catch (NoResultException $e) {
$q->resetDQLPart('where')
->where('a.url = :id')
->setParameter('id', $id);
$r = $q->getQuery()
->useQueryCache(true);
try {
return $r->getSingleResult();
} catch (NoResultException $e) {
$q->resetDQLPart('where')
->where('a.name = :id')
->setParameter('id', $id);
$r = $q->getQuery()
->useQueryCache(true);
try {
return $r->getSingleResult();
} catch (NoResultException $e) {
return null;
}
}
}
}
}
/**
* Возвращает возможные варианты размеров
* @param string $size
* @return array
*/
public function getSizeValues($size)
{
$q = $this
->createQueryBuilder('a')
->select('a.id, a.thick, a.sizeX, a.sizeY, a.sizeGbX, a.sizeGbY')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin('a.details', 'ad')
->andWhere('a.' . $size . ' != 0')
->andWhere('a.delivery != 6')// кроме снятого с производства
->andWhere('a.material != 25')// кроме материала Строительные смеси
->andWhere('a.scheme = 0')// проверка на scheme
->andWhere('a.priceEuro > 0')// обязательная цена
->andWhere('ad.file IS NOT NULL')// проверка на file
->andWhere('f.status = 1')// проверка статуса фабрики todo добавить проверку скрытости
->andWhere('c.status = :c_status AND c.archive = :a_status')
->setParameter('a_status', BiConst::STATE_NOT_PUBLISHED)
->setParameter('c_status', BiConst::STATE_PUBLISHED)
->addOrderBy('a.' . $size)
->groupBy('a.' . $size)
->getQuery()
->useQueryCache(true)
->enableResultCache(3600 * 8);
$items = $q->getArrayResult();
$items = array_column($items, $size);
$items = array_map(function ($num) {
$n = round($num, 0, PHP_ROUND_HALF_DOWN);
return $n ?: $num;
}, $items);
return array_unique($items);
}
/**
* @param $collection
* @param ?bool $full
* @return ?array
* @throws Exception
*/
public function getArticleByCollection($collection, ?bool $full = true): ?array
{
$q = $this->createQueryBuilder('a');
if ($full) {
$q->select(
'
a,c,f,measure,type,texture,color,priceDiscount,
material,using,edgeType,offShade,sliding,style,styles,surface,delivery,
shape,factoryColors,details'
)
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin('a.measure', 'measure')
->leftJoin('a.type', 'type')
->leftJoin('a.delivery', 'delivery')
->leftJoin('a.edgeType', 'edgeType')
->leftJoin('a.offShade', 'offShade')
->leftJoin('a.sliding', 'sliding')
->leftJoin('a.style', 'style')
->leftJoin('a.styles', 'styles')
->leftJoin('a.surface', 'surface')
->leftJoin('a.textures', 'texture')
->leftJoin('a.motivs', 'motiv')
->leftJoin('a.colors', 'color')
->leftJoin('a.material', 'material')
->leftJoin('a.using', 'using')
->leftJoin('a.shape', 'shape')
->leftJoin('a.factoryColors', 'factoryColors')
->leftJoin(
'a.priceDiscounts',
'priceDiscount',
Expr\Join::WITH,
$q->expr()->andX(
$q->expr()->neq('priceDiscount.priceEuro', 0)
)
)
->leftJoin('a.details', 'details')
->andWhere('details.id is not null')
->andWhere('delivery.id != :_delivery')
->setParameter('_delivery', 6)
->orderBy('type.sort, a.scheme ASC, color.id, a.measure, a.sizeX DESC, a.sizeY DESC, a.thick', 'DESC');
} else {
$q->select('a, type')
->leftJoin('a.collection', 'c')
->leftJoin('a.type', 'type');
}
$r = $q
->andWhere('c.id = :collection')
->setParameter('collection', $collection)
->getQuery()
->useQueryCache(true);
return $this->orderArticlesOpt($r->getArrayResult(), 0, true);
}
/**
* Сортировка артикулов
*
* @param ?array $articles
* @param ?int $offset
* @param ?bool $full
* @return array
* @throws Exception
*/
public function orderArticlesOpt(?array $articles, ?int $offset = 0, ?bool $full = false): array
{
$resultOfArticles = [];
foreach ($articles as $key => $article) {
//todo временно
if (!empty($article['collection']['process'])) {
$article['file'] = preg_replace('#\.jpg#i', '.webp', $article['file']);
// $article['details']['file'] = preg_replace('#\.jpg#i', '.webp', $article['details']['file']);
// добавил проверку
if (isset($article['details']['file'])) {
$article['details']['file'] = preg_replace('#\.jpg#i', '.webp', $article['details']['file']);
}
$article['collection']['a_version'] = true;
} else {
$article['collection']['a_version'] = false;
}
// добавляем объект цены для "js"
$price = LocaleHelper::getPrice($article);
$woVATPrice = LocaleHelper::isWithoutVATPrice($price);
if ($woVATPrice) {
$article['discountsAmount'][] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $woVATPrice,
'fold' => 0
];
} else {
$article['discountsAmount'][] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $price,
'fold' => 0
];
}
// todo совместить после правки
// $articleAltNew = ArticleHelper::getArticleAltNewMessage($article);
$articleAltNew = join(' ', [
empty($article['alternateName']) ? $article['name'] : $article['alternateName'],
!empty($article['collection']['factory']['name']) ? $article['collection']['factory']['name'] : '',
!empty($article['collection']['name']) ? $article['collection']['name'] : ''
]);
$article['alt'] = $articleAltNew;
// рассчитываем размер в inch-ах
$article['sizeGbX'] = ConversionHelper::convertInch((float)$article['sizeX'], ConversionHelper::CM);
$article['sizeGbY'] = ConversionHelper::convertInch((float)$article['sizeY'], ConversionHelper::CM);
$article['sizeGbZ'] = ConversionHelper::convertInch((float)$article['sizeZ'], ConversionHelper::CM);
foreach ($article['colors'] ?? [] as &$color) {
$color['name'] = $this->getTranslateWithCheckToNull($color);
unset($color['alias']);
}
foreach ($article['textures'] ?? [] as &$texture) {
$texture['name'] = $this->getTranslateWithCheckToNull($texture);
}
foreach (($article['motivs'] ?? []) as &$motiv) {
$motiv['name'] = $this->getTranslateWithCheckToNull($motiv);
}
$article['material']['name'] = $this->getTranslateWithCheckToNull($article['material']);
$article['surface']['name'] = $this->getTranslateWithCheckToNull($article['surface']);
$article['measure']['name'] = $this->getTranslateWithCheckToNull($article['measure']);
$article['type']['name'] = $this->getTranslateWithCheckToNull($article['type']);
if ($article['shape'] ?? null) {
$article['shape']['name'] = $this->getTranslateWithCheckToNull($article['shape']);
}
// для того чтобы фейковая цена считалась под футы
if (LocaleHelper::measureGb() && in_array($article['measure']['id'], [1, 3])) {
$article['pricePrx'] = $article['pricePrx'] / 10.7;
}
if (!empty($article['priceDiscounts'])) {
foreach ($article['priceDiscounts'] as $k => $row) {
if ($row == null) {
continue;
}
$priceDiscount = LocaleHelper::getPriceDiscount($row, [
'measureId' => $article['measure']['id']
]);
if (
$k == 0 && $article['multiplePallet'] == 1 &&
$article['packagingCount'] >= $priceDiscount['amount']
) {
$article['discountsAmount'] = [];
} else {
$article['discountsAmount'][count(
$article['discountsAmount']
) - 1]['endAmount'] = $priceDiscount['amount'];
}
$woVATPrice = LocaleHelper::isWithoutVATPrice($priceDiscount['price']);
if (empty($priceDiscount['price'])) {
continue;
}
if ($woVATPrice) {
$article['discountsAmount'][] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $woVATPrice,
'fold' => $row['fold']
];
} else {
$article['discountsAmount'][] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $priceDiscount['price'],
'fold' => $row['fold']
];
}
}
}
$article['url'] = $article['url'] ?: $article['name'];
if (!empty($article['pricePrx']) && LocaleHelper::getCur()) {
$article['pricePrx'] = CurrencyRateHelper::convertPrice(
LocaleHelper::getCur(),
$article['pricePrx']
);
}
$article['importantInfo'] = null;
$lc = StrHelper::ucFirst(LocaleHelper::getCurLocale());
$lc = ChineseFixHelper::checkAndFixLocale($lc);
if (!empty($article['descriptionEn'])) {
$article['importantInfo'] = str_replace(
'¶',
' ',
$article['description' . $lc] ?? $article['descriptionEn']
);
$article['importantInfo'] = ArticleSettingsHelper::replaceLinkToReal($article['importantInfo'], $this);
}
unset($article['description' . $lc]);
unset($article['descriptionEn']);
if ($full) {
$collection = !empty($article['collection']) ? $article['collection'] : null;
if ($collection) {
$_collection['id'] = !empty($collection['id']) ? $collection['id'] : null;
$_collection['url'] = !empty($collection['url']) ? $collection['url'] : null;
$_collection['name'] = !empty($collection['name']) ? TranslitNameHelper::replacePrime(
$collection['name'],
false
) : null;
$_collection['alternateName'] = !empty($collection['alternateName']) ? TranslitNameHelper::replacePrime(
$collection['alternateName'],
false
) : null;
$_collection['status'] = !empty($collection['status']) ? $collection['status'] : null;
$_collection['factory'] = !empty($collection['factory']) ? $collection['factory'] : null;
unset($article['collection']);
$article['collection'] = $_collection;
}
$interiors = !empty($article['interiors']) ? $article['interiors'] : [];
if ($interiors) {
$_interiors = [];
foreach ($interiors as $interior) {
$collection = $interior['collection'];
$status = $interior['status'];
if ($collection and $collection['status'] != BiConst::STATE_NOT_PUBLISHED && $collection['status'] != BiConst::STATE_DISCONTINUED and $status != BiConst::STATE_DISCONTINUED) {
$_interiors[] = $interior;
}
}
unset($article['interiors']);
$article['interiors'] = $_interiors;
}
}
// $offset используем чтобы правильно выставить индекс элемента для порции
// так как иначе появляются ошибки перемешивания артикулов
$resultOfArticles[$key + $offset] = $article;
}
return $resultOfArticles;
}
/**
* @param string $name
* @return mixed|null
*/
public function getItemUrl(string $name): ?Article
{
$q = $this->createQueryBuilder('a')
->select('a')
->andWhere('a.name LIKE :name OR a.alternateName LIKE :name ')
->setParameter('name', $name)
->setMaxResults(1);
$r = $q->getQuery()->enableResultCache(3600);
try {
return $r->getSingleResult();
} catch (NoResultException | NonUniqueResultException $e) {
return null;
}
}
/**
* @param Interior $interior
* @return ?array
*/
public function getArticlesFromInteriorForDataImport(Interior $interior): ?array
{
$q = $this->createQueryBuilder('a')
->leftJoin('a.interiors', 'i')
->leftJoin('a.delivery', 'd')
//->andWhere('a.delivery is null or d.id != :_delivery')
//->setParameter('_delivery', 6)
->andWhere('i.id = :interior')
->setParameter('interior', $interior);
$r = $q
->getQuery()
->useQueryCache(true);
return $r->getResult();
}
/**
* @return ?array
*/
public function getList(): ?array
{
$q = $this
->createQueryBuilder('a')
->select('a.id, a.code')
->getQuery();
return $q->getArrayResult();
}
/**
* @param $ides
* @return ?array
*/
public function getArticlesForCheckList($ides): ?array
{
$IDES = explode(',', $ides);
$q = $this->createQueryBuilder('a')
->andWhere('a.id in (:where)')
->setParameter('where', $IDES);
$r = $q
->orderBy('a.name')
->getQuery();
return $r->getResult();
}
public function getArticlesCheckList(Collection $collection)
{
$q = $this->createQueryBuilder('a')
->leftJoin('a.collection', 'c')
->leftJoin('a.delivery', 'delivery')
->andWhere('delivery.id != :_delivery')
->setParameter('_delivery', 6)
->andWhere('c.id = :collection')
->setParameter('collection', $collection)
->getQuery()
->useQueryCache(true);
return $q->getResult();
}
public function getArticlesForCodes(array $codes): array
{
$q = $this
->createQueryBuilder('a')
->where('a.code IN (:codes)')
->setParameter('codes', $codes)
->getQuery();
$items = $q->getResult();
$out = [];
/** @var Article $item */
foreach ($items as $item) {
if ($item->getCode()) {
$out[$item->getCode()] = $item;
}
}
return $out;
}
/**
* Получить артикулы для переименования названия и файла
* @param array $params
* @return array|null
*/
public function getArticleForRename(array $params)
{
$id = $params['scope'];
$q = $this->createQueryBuilder('a')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->andWhere('c.status != :status')
->setParameter('status', BiConst::STATE_DISCONTINUED);
if ($id != 'all') {
$q
->andWhere('c.id = :id')
->setParameter('id', $id);
}
$r = $q->getQuery();
return $r->getResult();
}
/**
* Получение артикулов для вкладки распродажа
* @param $ides
* @return ?array
*/
public function getArticlesForSale($ides): ?array
{
$IDES = explode(',', $ides);
$q = $this->createQueryBuilder('a')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->andWhere('a.id in (:where)')
->setParameter('where', $IDES);
$r = $q
->orderBy('f.name, c.name')
->getQuery();
return $r->getResult();
}
/**
* Получаем логин пользователя по коду артикула
*
* @param $code
* @return bool|mixed
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getUserByArticleCode($code)
{
$q = $this->createQueryBuilder('a')
->select('u.username')
->innerJoin('a.collection', 'c')
->innerJoin('c.factory', 'f')
->innerJoin('f.user', 'u')
->andWhere('a.code = :code')
->setParameter('code', $code)
->setMaxResults(1)
->getQuery();
return $q->getSingleScalarResult();
}
/**
* @param $params
* @param ?bool $file
* @param ?bool $full
* @return ?array
* @throws DBALException
* @throws Exception|\Doctrine\DBAL\Driver\Exception
*/
public function getArticleNativeOpt($params, ?bool $file = true, ?bool $full = false): ?array
{
$articles = $this->getArticleNativeOptBase($params, $file, $full);
return $this->orderArticlesOpt($articles, $params['offset'] ?? 0);
}
/**
* @param $params
* @param ?bool $file
* @param ?bool $full
* @return ?array
* @throws DBALException
* @throws Exception
* @throws \Doctrine\DBAL\Driver\Exception
*/
private function getArticleNativeOptBase($params, ?bool $file = true, ?bool $full = false): ?array
{
$locale = LocaleHelper::getCurLocale();
$locale = ChineseFixHelper::checkAndFixLocale($locale);
$status = (!empty($params['status'])) ? $params['status'] : null;
$isInterior = (!empty($params['interior'])) ? $params['interior'] : null;
$oneSlide = (!empty($params['oneSlide'])) ? $params['oneSlide'] : null;
$rsm = new ResultSetMapping();
$rsm->addEntityResult('WebBundle\Entity\Article', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$rsm->addFieldResult('a', 'code', 'code');
$rsm->addFieldResult('a', 'name', 'name');
$rsm->addFieldResult('a', 'alternate_name', 'alternateName');
$rsm->addFieldResult('a', 'file', 'file');
$rsm->addFieldResult('a', 'not_sample', 'notSample');
$rsm->addFieldResult('a', 'express_sample', 'expressSample');
$rsm->addFieldResult('a', 'variant_image', 'variantImage');
$rsm->addFieldResult('a', 'file_w', 'fileW');
$rsm->addFieldResult('a', 'file_h', 'fileH');
$rsm->addFieldResult('a', 'file_w4000', 'fileW4000');
$rsm->addFieldResult('a', 'file_h4000', 'fileH4000');
$rsm->addFieldResult('a', 'scheme', 'scheme');
$rsm->addFieldResult('a', 'rotate', 'rotate');
$rsm->addFieldResult('a', 'file_rotation', 'fileRotation');
$rsm->addFieldResult('a', 'size_x', 'sizeX');
$rsm->addFieldResult('a', 'size_y', 'sizeY');
$rsm->addFieldResult('a', 'size_z', 'sizeZ');
$rsm->addFieldResult('a', 'file_size2_x', 'fileSize2X');
$rsm->addFieldResult('a', 'file_size2_y', 'fileSize2Y');
$rsm->addFieldResult('a', 'file_size3_x', 'fileSize3X');
$rsm->addFieldResult('a', 'file_size3_y', 'fileSize3Y');
$rsm->addFieldResult('a', 'file_size8_x', 'fileSize8X');
$rsm->addFieldResult('a', 'file_size8_y', 'fileSize8Y');
$rsm->addFieldResult('a', 'type_constraint', 'typeConstraint');
$rsm->addFieldResult('a', 'packaging_count', 'packagingCount');
$rsm->addFieldResult('a', 'packaging_count_ft', 'packagingCountFt');
$rsm->addFieldResult('a', 'packaging_count_pc', 'packagingCountPC');
$rsm->addFieldResult('a', 'reserve', 'reserve');
$rsm->addFieldResult('a', 'price_prx', 'pricePrx');
$rsm->addFieldResult('a', 'pallet', 'pallet');
$rsm->addFieldResult('a', 'pallet_ft', 'palletFt');
$rsm->addFieldResult('a', 'min_order', 'minOrder');
$rsm->addFieldResult('a', 'm2one_ps', 'm2OnePs');
$rsm->addFieldResult('a', 'multiple_pallet', 'multiplePallet');
$rsm->addFieldResult('a', 'urla', 'url');
$rsm->addFieldResult('a', 'background_white', 'backgroundWhite');
$rsm->addFieldResult('a', 'border_grey', 'borderGrey');
$rsm->addFieldResult('a', 'image_setting', 'imageSetting');
$rsm->addFieldResult('a', 'file_edit', 'fileEdit');
$rsm->addFieldResult('a', 'comment_scheme_image', 'commentSchemeImage');
$rsm->addFieldResult(
'a',
'description_' . $locale,
'description' . StrHelper::ucFirst($locale)
);
if ($locale != 'en') {
$rsm->addFieldResult('a', 'description_en', 'descriptionEn');
}
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticleDetail', 'ad', 'a', 'details');
$rsm->addFieldResult('ad', 'ad_id', 'id');
$rsm->addFieldResult('ad', 'ad_file', 'file');
// $rsm->addFieldResult('ad', 'ad_picture_in_title', 'pictureInTitle');
$rsm->addFieldResult('ad', 'ad_gtin', 'gtin');
$rsm->addFieldResult('ad', 'ad_file_size1_x', 'fileSize1X');
$rsm->addFieldResult('ad', 'ad_file_size1_y', 'fileSize1Y');
$rsm->addFieldResult('ad', 'ad_file_size2_x', 'fileSize2X');
$rsm->addFieldResult('ad', 'ad_file_size2_y', 'fileSize2Y');
$rsm->addFieldResult('ad', 'ad_file_size3_x', 'fileSize3X');
$rsm->addFieldResult('ad', 'ad_file_size3_y', 'fileSize3Y');
$rsm->addFieldResult('ad', 'ad_file_size8_x', 'fileSize8X');
$rsm->addFieldResult('ad', 'ad_file_size8_y', 'fileSize8Y');
$rsm->addFieldResult('ad', 'ad_file_size500_x', 'fileSize500X');
$rsm->addFieldResult('ad', 'ad_file_size500_y', 'fileSize500Y');
$rsm->addFieldResult('ad', 'ad_file_size740_x', 'fileSize740X');
$rsm->addFieldResult('ad', 'ad_file_size740_y', 'fileSize740Y');
$rsm->addFieldResult('ad', 'ad_file_size1_x', 'fileSize1X');
$rsm->addFieldResult('ad', 'ad_file_size1_y', 'fileSize1Y');
$rsm->addFieldResult(
'ad',
'ad_description_' . $locale,
'description' . StrHelper::ucFirst($locale)
);
if ($locale != 'en') {
$rsm->addFieldResult('ad', 'ad_description_en', 'descriptionEn');
}
$rsm->addFieldResult('ad', 'ad_comment', 'comment');
$rsm->addFieldResult('ad', 'ad_file_edit', 'fileEdit');
$rsm->addFieldResult('ad', 'ad_image_setting', 'imageSetting');
$rsm->addFieldResult('ad', 'ad_file_w', 'fileW');
$rsm->addFieldResult('ad', 'ad_file_h', 'fileH');
$rsm->addFieldResult('ad', 'ad_file_w4000', 'fileW4000');
$rsm->addFieldResult('ad', 'ad_file_h4000', 'fileH4000');
$rsm->addFieldResult('ad', 'ad_comment_scheme_image', 'commentSchemeImage');
$rsm->addFieldResult('ad', 'ad_variant_image', 'variantImage');
$rsm->addFieldResult('ad', 'ad_file_rotation', 'fileRotation');
$rsm->addFieldResult('ad', 'ad_rotate', 'rotate');
$rsm->addFieldResult('ad', 'ad_type_painting', 'typePainting');
$rsm->addFieldResult('ad', 'ad_big_size_scheme', 'bigSizeScheme');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery', 'ld', 'a', 'delivery');
$rsm->addFieldResult('ld', 'ld_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure', 'lms', 'a', 'measure');
$rsm->addFieldResult('lms', 'lms_id', 'id');
$rsm->addFieldResult('lms', 'lms_alias', 'alias');
$rsm->addFieldResult('lms', 'lms_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial', 'lmt', 'a', 'material');
$rsm->addFieldResult('lmt', 'lmt_id', 'id');
$rsm->addFieldResult('lmt', 'lmt_name', 'name');
$rsm->addFieldResult('lmt', 'lmt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount', 'apd', 'a', 'priceDiscounts');
$rsm->addFieldResult('apd', 'apd_id', 'id');
$rsm->addFieldResult('apd', 'apd_amount', 'amount');
$rsm->addFieldResult('apd', 'apd_amount_ft', 'amountFt');
$rsm->addFieldResult('apd', 'apd_fold', 'fold');
$rsm->addJoinedEntityResult('WebBundle\Entity\Collection', 'acl', 'a', 'collection');
$rsm->addFieldResult('acl', 'acl_id', 'id');
$rsm->addFieldResult('acl', 'acl_url', 'url');
$rsm->addFieldResult('acl', 'acl_name', 'name');
$rsm->addFieldResult('acl', 'acl_aname', 'alternateName');
$rsm->addFieldResult('acl', 'acl_status', 'status');
$rsm->addFieldResult('acl', 'acl_process', 'process');
$rsm->addFieldResult('acl', 'acl_settings', 'settings');
$rsm->addJoinedEntityResult('WebBundle\Entity\Factory', 'acf', 'acl', 'factory');
$rsm->addFieldResult('acf', 'acf_id', 'id');
$rsm->addFieldResult('acf', 'acf_url', 'url');
$rsm->addFieldResult('acf', 'acf_name', 'name');
$rsm->addFieldResult('acf', 'acf_aname', 'alternateName');
$rsm->addFieldResult('acf', 'acf_suspended', 'suspended');
$rsm->addFieldResult('acf', 'acf_status', 'status');
$rsm->addFieldResult('acf', 'acf_stated_at', 'statedAt');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry', 'lcnt', 'acf', 'country');
$rsm->addFieldResult('lcnt', 'lcnt_id', 'id');
$rsm->addFieldResult('lcnt', 'lcnt_code', 'code');
$rsm->addFieldResult('lcnt', 'lcnt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor', 'lfc', 'a', 'factoryColors');
$rsm->addFieldResult('lfc', 'lfc_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture', 'ltx', 'a', 'textures');
$rsm->addFieldResult('ltx', 'ltx_id', 'id');
$rsm->addFieldResult('ltx', 'ltx_alias', 'alias');
$rsm->addFieldResult('ltx', 'ltx_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle', 'ls', 'a', 'styles');
$rsm->addFieldResult('ls', 'ls_id', 'id');
$rsm->addFieldResult('ls', 'ls_alias', 'alias');
$rsm->addFieldResult('ls', 'ls_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface', 'lsf', 'a', 'surface');
$rsm->addFieldResult('lsf', 'lsf_id', 'id');
$rsm->addFieldResult('lsf', 'lsf_alias', 'alias');
$rsm->addFieldResult('lsf', 'lsf_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListType', 'lt', 'a', 'type');
$rsm->addFieldResult('lt', 'lt_id', 'id');
$rsm->addFieldResult('lt', 'lt_alias', 'alias');
$rsm->addFieldResult('lt', 'lt_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv', 'llm', 'a', 'motivs');
$rsm->addFieldResult('llm', 'llm_id', 'id');
$rsm->addFieldResult('llm', 'llm_alias', 'alias');
$rsm->addFieldResult('llm', 'llm_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListShape', 'lsh', 'a', 'shape');
$rsm->addFieldResult('lsh', 'lsh_id', 'id');
$rsm->addFieldResult('lsh', 'lsh_alias', 'alias');
$rsm->addFieldResult('lsh', 'lsh_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasureSize', 'lmss', 'a', 'measurementSize');
$rsm->addFieldResult('lmss', 'lmss_id', 'id');
$rsm->addFieldResult('lmss', 'lmss_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListColor', 'lc', 'a', 'colors');
$rsm->addFieldResult('lc', 'lc_id', 'id');
$rsm->addFieldResult('lc', 'lc_alias', 'alias');
$rsm->addFieldResult('lc', 'lc_name', 'name');
$queryFields = '';
$queryJoin = '';
if ($isInterior) {
$rsm->addJoinedEntityResult('WebBundle\Entity\ListType', 'lt', 'a', 'type');
$rsm->addFieldResult('lt', 'lt_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\Interior', 'aii', 'a', 'interiors');
$rsm->addFieldResult('aii', 'aii_id', 'id');
$rsm->addFieldResult('aii', 'aii_file', 'file');
$rsm->addFieldResult('aii', 'aii_name', 'name');
$rsm->addFieldResult('aii', 'aii_status', 'status');
$rsm->addFieldResult('aii', 'aii_url', 'url');
$rsm->addFieldResult('aii', 'aii_file_size_x', 'fileSizeX');
$rsm->addFieldResult('aii', 'aii_file_size_y', 'fileSizeY');
$rsm->addFieldResult('aii', 'ideaCount', 'ideasCount');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle', 'aii_istls', 'aii', 'styles');
$rsm->addFieldResult('aii_istls', 'aii_istls_id', 'id');
$rsm->addFieldResult('aii_istls', 'aii_istls_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture', 'aii_istlt', 'aii', 'textures');
$rsm->addFieldResult('aii_istlt', 'aii_istlt_id', 'id');
$rsm->addFieldResult('aii_istlt', 'aii_istlt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\Collection', 'iacl', 'aii', 'collection');
$rsm->addFieldResult('iacl', 'iacl_id', 'id');
$rsm->addFieldResult('iacl', 'iacl_url', 'url');
$rsm->addFieldResult('iacl', 'iacl_name', 'name');
$rsm->addFieldResult('iacl', 'iacl_aname', 'alternateName');
$rsm->addFieldResult('iacl', 'iacl_status', 'status');
$rsm->addFieldResult('iacl', 'iacl_process', 'process');
$rsm->addFieldResult('iacl', 'iacl_rating', 'rating');
$rsm->addFieldResult('iacl', 'iacl_settings', 'settings');
$rsm->addFieldResult('iacl', 'iacl_accessible', 'accessible');
$rsm->addJoinedEntityResult('WebBundle\Entity\Factory', 'iacf', 'iacl', 'factory');
$rsm->addFieldResult('iacf', 'iacf_id', 'id');
$rsm->addFieldResult('iacf', 'iacf_url', 'url');
$rsm->addFieldResult('iacf', 'iacf_name', 'name');
$rsm->addFieldResult('iacf', 'iacf_aname', 'alternateName');
$rsm->addFieldResult('iacf', 'iacf_suspended', 'suspended');
$rsm->addFieldResult('iacf', 'iacf_status', 'status');
$rsm->addFieldResult('iacf', 'iacf_stated_at', 'statedAt');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry', 'iacflc', 'iacf', 'country');
$rsm->addFieldResult('iacflc', 'iacflc_id', 'id');
$rsm->addFieldResult('iacflc', 'iacflc_code', 'code');
$rsm->addFieldResult('iacflc', 'iacflc_alias', 'alias');
$rsm->addFieldResult('iacflc', 'iacflc_name', 'name');
$queryFields = '
lt.id as lt_id,
aii.id as aii_id,
aii.file as aii_file,
aii.name as aii_name,
aii.status as aii_status,
aii.url as aii_url,
aii.file_size_x as aii_file_size_x,
aii.file_size_y as aii_file_size_y,
(SELECT COUNT(ii.idea_id) FROM `idea_interior` ii WHERE `ii`.`interior_id` = `aii`.id) as ideaCount,
aii_istls.id as aii_istls_id,
aii_istls.alias as aii_istls_alias,
aii_istlt.id as aii_istlt_id,
aii_istlt.alias as aii_istlt_alias,
iacl.id as iacl_id,
iacl.url as iacl_url,
iacl.name as iacl_name,
iacl.alternate_name as iacl_aname,
iacl.status as iacl_status,
iacl.process as iacl_process,
iacl.rating as iacl_rating,
iacl.settings as iacl_settings,
iacl.accessible as iacl_accessible,
iacf.id as iacf_id,
iacf.url as iacf_url,
iacf.name as iacf_name,
iacf.alternate_name as iacf_aname,
iacf.suspended as iacf_suspended,
iacf.status as iacf_status,
iacf.stated_at as iacf_stated_at,
iacflc.id as iacflc_id,
iacflc.code as iacflc_code,
iacflc.alias as iacflc_alias,
iacflc.name as iacflc_name,
';
$queryJoin = '
LEFT JOIN interior_article iarts ON iarts.article_id = a.id AND a.delivery <> 6
LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL and a.collection=aii.collection
LEFT JOIN collection iacl ON iacl.id = aii.collection
LEFT JOIN factory iacf ON iacf.id = iacl.factory
LEFT JOIN list_country iacflc ON iacflc.id = iacf.country
LEFT JOIN interior_style ist ON ist.interior_id = aii.id
LEFT JOIN list_style aii_istls ON aii_istls.id = ist.style_id
LEFT JOIN interior_texture istt ON istt.interior_id = aii.id
LEFT JOIN list_texture aii_istlt ON aii_istlt.id = istt.texture_id
';
}
// Собираем необходимые поля цен
switch (LocaleHelper::getCurCountry()) {
case 'de':
$priceList = [
'price' => 'price_euro_de',
'price_mq' => 'price_mq_euro_de',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_de',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_de',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'at':
$priceList = [
'price' => 'price_euro_at',
'price_mq' => 'price_mq_euro_at',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_at',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_at',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'fi':
$priceList = [
'price' => 'price_euro_fi',
'price_mq' => 'price_mq_euro_fi',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_fi',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_fi',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'fr':
$priceList = [
'price' => 'price_euro_fr',
'price_mq' => 'price_mq_euro_fr',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_fr',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_fr',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'it':
$priceList = [
'price' => 'price_euro_it',
'price_mq' => 'price_mq_euro_it',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_it',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_it',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'be':
$priceList = [
'price' => 'price_euro_be',
'price_mq' => 'price_mq_euro_be',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_be',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_be',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'ie':
$priceList = [
'price' => 'price_euro_ie',
'price_mq' => 'price_mq_euro_ie',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_ie',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_ie',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'nl':
$priceList = [
'price' => 'price_euro_nl',
'price_mq' => 'price_mq_euro_nl',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_nl',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_nl',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'es':
$priceList = [
'price' => 'price_euro_es',
'price_mq' => 'price_mq_euro_es',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_es',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_es',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'gb':
$priceList = [
'price' => 'price_GBP',
'price_mq' => 'price_mq_GBP',
'price_ue' => 'price_GBE',
'price_mq_ue' => 'price_mq_GBE',
'apd_price' => 'price_GBP',
'apd_price_ue' => 'price_GBE',
'prMin' => 'pr_min_GBP',
'prMinUe' => 'pr_min_GBE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'us':
$priceList = [
'price' => 'price_USD',
'price_mq' => 'price_mq_USD',
'price_fq' => 'price_fq_USD',
'price_ue' => 'price_USE',
'price_mq_ue' => 'price_mq_USE',
'price_fq_ue' => 'price_fq_USD',
'apd_price' => 'price_USD',
'apd_price_fq' => 'price_fq_USD',
'apd_price_ue' => 'price_USE',
'apd_price_fq_ue' => 'price_fq_USE',
'prMin' => 'pr_min_USD',
'prMinUe' => 'pr_min_USE',
'prMinF' => 'pr_min_f_USD',
'prMinUeF' => 'pr_min_f_USE',
];
break;
case 'ca':
$priceList = [
'price' => 'price_CAD',
'price_mq' => 'price_mq_CAD',
'price_fq' => 'price_fq_CAD',
'price_ue' => 'price_CAE',
'price_mq_ue' => 'price_mq_CAE',
'price_fq_ue' => 'price_fq_CAE',
'apd_price' => 'price_CAD',
'apd_price_fq' => 'price_fq_CAD',
'apd_price_ue' => 'price_CAE',
'apd_price_fq_ue' => 'price_fq_CAE',
'prMin' => 'pr_min_CAD',
'prMinUe' => 'pr_min_CAE',
'prMinF' => 'pr_min_f_USD',
'prMinUeF' => 'pr_min_f_USE',
];
break;
case 'ch':
$priceList = [
'price' => 'price_CHF',
'price_mq' => 'price_mq_CHF',
'price_ue' => 'price_CHE',
'price_mq_ue' => 'price_mq_CHE',
'apd_price' => 'price_CHF',
'apd_price_ue' => 'price_CHE',
'prMin' => 'pr_min_CHF',
'prMinUe' => 'pr_min_CHE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'se':
$priceList = [
'price' => 'price_SEK',
'price_mq' => 'price_mq_SEK',
'price_ue' => 'price_SEE',
'price_mq_ue' => 'price_mq_SEE',
'apd_price' => 'price_SEK',
'apd_price_ue' => 'price_SEE',
'prMin' => 'pr_min_SEK',
'prMinUe' => 'pr_min_SEE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'dk':
$priceList = [
'price' => 'price_DKK',
'price_mq' => 'price_mq_DKK',
'price_ue' => 'price_DKE',
'price_mq_ue' => 'price_mq_DKE',
'apd_price' => 'price_DKK',
'apd_price_ue' => 'price_DKE',
'prMin' => 'pr_min_DKK',
'prMinUe' => 'pr_min_DKE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'no':
$priceList = [
'price' => 'price_NOK',
'price_mq' => 'price_mq_NOK',
'price_ue' => 'price_NOE',
'price_mq_ue' => 'price_mq_NOE',
'apd_price' => 'price_NOK',
'apd_price_ue' => 'price_NOE',
'prMin' => 'pr_min_NOK',
'prMinUe' => 'pr_min_NOE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
case 'pl':
$priceList = [
'price' => 'price_PLN',
'price_mq' => 'price_mq_PLN',
'price_ue' => 'price_PLE',
'price_mq_ue' => 'price_mq_PLE',
'apd_price' => 'price_PLN',
'apd_price_ue' => 'price_PLE',
'prMin' => 'pr_min_PLN',
'prMinUe' => 'pr_min_PLE',
'prMinF' => null,
'prMinUeF' => null,
];
break;
default:
$priceList = [
'price' => 'price_euro',
'price_mq' => 'price_mq_euro',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null,
];
}
$priceSQL = '';
// Формируем выборку цен
foreach ($priceList as $key => $price) {
if (!$price) {
continue;
}
$columnName = lcfirst(
str_replace(' ', '', ucwords(str_replace('_', ' ', $price)))
);
$price = strtolower($price);
if (in_array($key, ['apd_price', 'apd_price_ue', 'apd_price_fq', 'apd_price_fq_ue'])) {
$alias = 'apd';
$priceSQL .= 'apd.' . $price . ' as apd_' . $price . ', ';
} elseif (in_array($key, ['prMin', 'prMinUe', 'prMinF', 'prMinUeF'])) {
$alias = 'acl';
$priceSQL .= 'acl.' . $price . ' as acl_' . $price . ', ';
if ($isInterior) {
$queryFields .= ' iacl.' . $price . ' as iacl_' . $price . ', ';
$rsm->addFieldResult('iacl', 'iacl_' . $price, $columnName);
}
} else {
$alias = 'a';
$priceSQL .= 'a.' . $price . ' as a_' . $price . ', ';
}
$rsm->addFieldResult($alias, $alias . '_' . $price, $columnName);
}
if (empty($params['isFreezed'])) {
if (is_numeric($full)) {
$where = ' AND (ld.id <> 6 OR a.id = ' . $full . ')';
} elseif ($full) {
$where = ' AND (ld.id <> 6 OR a.urla = "' . $full . '")';
} else {
$where = ' AND ld.id <> 6';
}
} else {
$where = '';
}
if ($status == BiConst::STATE_DISCONTINUED) {
$where = '';
}
if ($file) {
$where .= ' AND ad.file IS NOT NULL ';
} else {
$where .= ' AND (ad.file IS NULL) ';
}
if (!empty($params['collection'])) {
$where .= ' AND a.collection = \'' . $params['collection'] . '\'';
}
if (!empty($params['items'])) {
$where .= ' AND a.id IN (\'' . join('\',\'', $params['items']) . '\')';
}
if (!empty($params['notItems'])) {
$where .= ' AND a.id NOT IN (\'' . join('\',\'', $params['notItems']) . '\')';
}
if (!empty($params['cStatus'])) {
$where .= ' AND acl.status IN (\'' . join('\',\'', $params['cStatus']) . '\')';
}
if (!empty($params['fStatus'])) {
$where .= ' AND acf.status IN (\'' . join('\',\'', $params['fStatus']) . '\')';
}
$country = $params['country'] ?? App::getCurCountry();
$cur = '_euro';
if (
CookieHelper::get(CookieKeysConstant::CURRENCY)
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'EUR'
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'HKD'
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'SGD'
) {
$cur = '_' . StrHelper::toLower(CookieHelper::get(CookieKeysConstant::CURRENCY));
} elseif ($country == 'de') {
$cur = '_euro_de';
} elseif ($country == 'at') {
$cur = '_euro_at';
} elseif ($country == 'fi') {
$cur = '_euro_fi';
} elseif ($country == 'fr') {
$cur = '_euro_fr';
} elseif ($country == 'it') {
$cur = '_euro_it';
} elseif ($country == 'be') {
$cur = '_euro_be';
} elseif ($country == 'ie') {
$cur = '_euro_ie';
} elseif ($country == 'nl') {
$cur = '_euro_nl';
} elseif ($country == 'es') {
$cur = '_euro_es';
}
if ($oneSlide) {
$oneSlideLimit = ' limit 1 ';
} else {
$oneSlideLimit = ' ';
}
if (isset($params['limit']) && isset($params['offset'])) {
$portion = ' LIMIT ' . $params['limit'] . ' OFFSET ' . $params['offset'];
$sSqlCount = 'SELECT a.id FROM article a
LEFT JOIN list_type lt ON a.type = lt.id
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN list_material lmt ON a.material = lmt.id
LEFT JOIN list_surface lsf ON a.surface = lsf.id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . $cur . ' > 0
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN article_factory_color afc ON a.id = afc.article_id
LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
LEFT JOIN article_texture at ON a.id = at.article_id
LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
LEFT JOIN list_style ls ON a.style = ls.id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN collection acl ON acl.id = a.collection
LEFT JOIN factory acf ON acf.id = acl.factory
LEFT JOIN list_country lcnt ON lcnt.id = acf.country
LEFT JOIN article_motiv alm ON a.id = alm.article_id
LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
LEFT JOIN list_shape lsh ON lsh.id = a.shape
LEFT JOIN article_detail ad ON ad.article_id = a.id
WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR ld.id = 6)' . $where . ' GROUP BY a.id
ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC, apd.amount DESC,
a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC' . $portion;
#todo ************************************************************************************************************************************
$res = App::em()->getConnection()
->executeQuery(preg_replace('#[\s]+#', ' ', $sSqlCount))
->fetchAllAssociative();
if ($res && count($res) > 0) {
$ides = array_unique(array_column($res, 'id'));
$where .= ' AND a.id IN (\'' . join('\',\'', $ides) . '\')';
} else {
return [];
}
}
LocaleHelper::getCurCountry();
$sSql = '
SELECT
a.id,
a.code,
a.name,
a.not_sample,
a.alternate_name,
REPLACE(a.file, "~q~", "\'") AS file,
a.express_sample,
a.variant_image,
a.size_x,
a.size_y,
a.size_z,
a.file_size2_x,
a.file_size2_y,
a.file_size3_x,
a.file_size3_y,
a.file_size8_x,
a.file_size8_y,
a.type_constraint,
a.packaging_count,
a.packaging_count_ft,
a.packaging_count_pc,
a.price_prx,
a.pallet,
a.pallet_ft,
a.min_order,
a.m2one_ps,
a.multiple_pallet,
a.urla,
a.background_white,
a.border_grey,
a.image_setting,
a.file_w,
a.file_h,
a.file_w4000,
a.file_h4000,
a.scheme,
a.rotate,
a.file_rotation,
a.file_edit,
a.comment_scheme_image,
a.description_' . $locale . ',
' . ($locale != 'en' ? 'a.description_en,' : '') . '
ad.id as ad_id,
ad.file as ad_file,
ad.picture_in_title as ad_picture_in_title,
ad.gtin as ad_gtin,
ad.file_size1_x as ad_file_size1_x,
ad.file_size1_y as ad_file_size1_y,
ad.file_size2_x as ad_file_size2_x,
ad.file_size2_y as ad_file_size2_y,
ad.file_size3_x as ad_file_size3_x,
ad.file_size3_y as ad_file_size3_y,
ad.file_size8_x as ad_file_size8_x,
ad.file_size8_y as ad_file_size8_y,
ad.file_size500_x as ad_file_size500_x,
ad.file_size500_y as ad_file_size500_y,
ad.file_size740_x as ad_file_size740_x,
ad.file_size740_y as ad_file_size740_y,
ad.file_size1_x as ad_file_size1_x,
ad.file_size1_y as ad_file_size1_y,
ad.description_' . $locale . ' as ad_description_' . $locale . ',
' . ($locale != 'en' ? 'ad.description_en as ad_description_en,' : '') . '
ad.comment as ad_comment,
ad.file_edit as ad_file_edit,
ad.image_setting as ad_image_setting,
ad.file_w as ad_file_w,
ad.file_h as ad_file_h,
ad.file_w4000 as ad_file_w4000,
ad.file_h4000 as ad_file_h4000,
ad.comment_scheme_image as ad_comment_scheme_image,
ad.variant_image as ad_variant_image,
ad.file_rotation as ad_file_rotation,
ad.rotate as ad_rotate,
ad.type_painting as ad_type_painting,
ad.big_size_scheme as ad_big_size_scheme,
ld.id as ld_id,
lt.id as lt_id,
lt.alias as lt_alias,
lt.name as lt_name,
lms.id as lms_id,
lms.alias as lms_alias,
lms.name as lms_name,
lmt.id as lmt_id,
lmt.alias as lmt_alias,
lmt.name as lmt_name,
lsf.id as lsf_id,
lsf.alias as lsf_alias,
lsf.name as lsf_name,
lfc.id as lfc_id,
ltx.id as ltx_id,
ltx.alias as ltx_alias,
ltx.name as ltx_name,
ls.id as ls_id,
ls.alias as ls_alias,
ls.name as ls_name,
lsh.id as lsh_id,
lsh.alias as lsh_alias,
lsh.name as lsh_name,
llm.id as llm_id,
llm.alias as llm_alias,
llm.name as llm_name,
lmss.id as lmss_id,
lmss.alias as lmss_alias,
apd.id as apd_id,
apd.amount as apd_amount,
apd.amount_ft as apd_amount_ft,
apd.fold as apd_fold,
acl.id as acl_id,
acl.url as acl_url,
acl.name as acl_name,
acl.alternate_name as acl_aname,
acl.status as acl_status,
acl.process as acl_process,
acl.settings as acl_settings,
acf.id as acf_id,
acf.url as acf_url,
acf.name as acf_name,
acf.alternate_name as acf_aname,
acf.status as acf_status,
acf.suspended as acf_suspended,
acf.stated_at as acf_stated_at,
' . $priceSQL . '
' . $queryFields . '
lcnt.id as lcnt_id,
lcnt.code as lcnt_code,
lcnt.alias as lcnt_alias,
lc.id as lc_id,
lc.name as lc_name,
lc.alias as lc_alias
FROM
article a
LEFT JOIN list_type lt ON a.type = lt.id
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN list_material lmt ON a.material = lmt.id
LEFT JOIN list_surface lsf ON a.surface = lsf.id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . $cur . ' > 0
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN article_factory_color afc ON a.id = afc.article_id
LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
LEFT JOIN article_texture at ON a.id = at.article_id
LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
LEFT JOIN list_style ls ON a.style = ls.id
LEFT JOIN collection acl ON acl.id = a.collection
LEFT JOIN factory acf ON acf.id = acl.factory
LEFT JOIN list_country lcnt ON lcnt.id = acf.country
LEFT JOIN article_motiv alm ON a.id = alm.article_id
LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
LEFT JOIN list_shape lsh ON lsh.id = a.shape
LEFT JOIN list_measure_size lmss ON a.measurement_size = lmss.id
LEFT JOIN article_detail ad ON ad.article_id = a.id
' . $queryJoin . '
WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR a.delivery = 6)' . $where .
' ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,' .
' apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC ' . $oneSlideLimit;
$query = $this->_em->createNativeQuery($sSql, $rsm);
$result = $query->getArrayResult();
/**
* Пробовал тут разные варианты сортировки, чтобы порядок записей был как в $sSqlCount,
* например ORDER BY FIELD(a.id, ....), и все равно местами результат отличается.
* Пришел к решению просто пересобрать массив в соответствии с порядком в $sSqlCount.
* Это все для того, чтобы порядок артикулов был такой же, как и порядковый номер, когда открывается
* страница с артикулом.
*/
// При загрузке конкретного артикула, эти переменные не присваиваются.
if (isset($res) && isset($ides)) {
usort($result, function ($a, $b) use ($ides) {
$posA = array_search($a['id'], $ides);
$posB = array_search($b['id'], $ides);
return $posA - $posB;
});
return $result;
}
return $result;
}
/**
* @param string $name
* @param ?int $limit
* @param ?string $s
* @return ?array
*/
public function getIdByName(string $name, ?int $limit = 3, ?string $s = '%'): ?array
{
$q = $this->createQueryBuilder('a')
->select('a.id')
->innerJoin('a.collection', 'c')
->innerJoin('c.factory', 'f')
->leftJoin('a.details', 'ad')
->where('a.name LIKE :name OR a.alternateName LIKE :name')
->andWhere('a.priceEuro > 0')
->andWhere('a.delivery <> 6')
->andWhere('f.id <>398789')
->andWhere('ad.file IS NOT NULL')
->andWhere('c.status = 1')
->setParameter('name', $s . $name . $s)
->setMaxResults($limit)
->getQuery();
$res = $q->getArrayResult();
if (count($res) > 0) {
return $res;
}
return [];
}
/**
* @param $name
* @return mixed
* @throws NonUniqueResultException
*/
public function getArticlesForSearch($name)
{
$q = $this->createQueryBuilder('a')
->select('a, c, f')
->innerJoin('a.collection', 'c')
->innerJoin('c.factory', 'f')
->leftJoin('a.details', 'ad')
->where('a.name LIKE :name')
->andWhere('a.delivery <> 6')
->andWhere('a.priceEuro > 0')
->andWhere('ad.file IS NOT NULL')
->andWhere('c.status = 1')
->andWhere('f.status = 1');
if (HideFactoryCountriesHelper::length() > 0) {
$q->andWhere('f.id not in (' . implode(',', HideFactoryCountriesHelper::codes()) . ')');
}
$q->setParameter('name', '%' . $name . '%')
->setMaxResults(3);
return $q->getQuery()->getResult();
}
/**
* @param $article
* @return ?array
* @throws Exception
*/
public function getArticlePriceDiscounts($article): ?array
{
$ARTICLE = null;
// добавляем объект цены для js
$price = LocaleHelper::getPrice($article);
$woVATPrice = LocaleHelper::isWithoutVATPrice($price);
if ($woVATPrice) {
$ARTICLE[] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $woVATPrice,
'multiplicity' => 0,
'fold' => 0
];
} else {
$ARTICLE[] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $price,
'multiplicity' => 0,
'fold' => 0
];
}
if (!empty($article['priceDiscounts'])) {
foreach ($article['priceDiscounts'] as $k => $row) {
if ($row == null) {
continue;
}
$priceDiscount = LocaleHelper::getPriceDiscount($row, [
'measureId' => $article['measure']['id']
]);
if (
$k == 0 && $article['multiplePallet'] == 1 &&
$article['packagingCount'] >= $priceDiscount['amount']
) {
$ARTICLE = [];
} else {
$ARTICLE[count($ARTICLE) - 1]['endAmount'] = $priceDiscount['amount'];
}
$woVATPrice = LocaleHelper::isWithoutVATPrice($priceDiscount['price']);
if ($woVATPrice) {
$ARTICLE[] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $woVATPrice,
'fold' => $row['fold']
];
} else {
$ARTICLE[] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $priceDiscount['price'],
'fold' => $row['fold']
];
}
}
}
return $ARTICLE;
}
/**
* Возвращает количество доступных артикулов коллекции
*
* @param int $collectionId
* @param ?bool $full - если истина, то покажет и артикулы без картинок
* @param ?bool $all - если истина, то покажет и снятые с производства артикулы
* @param ?bool $noImg
* @return array|null
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function countArticlesColl(int $collectionId, ?bool $full = false, ?bool $all = false, ?bool $noImg = false)
{
$q = $this->createQueryBuilder('a')
->select('count(a.id)')
->leftJoin('a.details', 'ad')
->andWhere('a.collection = :collection')
->andWhere('a.priceEuro > 0')
->setParameter('collection', $collectionId);
if (!$all) {
$q->andWhere('a.delivery != 6');
}
if (!$full && !$noImg) {
$q->andWhere('ad.file is not null');
}
if ($noImg) {
$q->andWhere('(ad.file IS NULL)');
}
$r = $q->getQuery()
->enableResultCache(TimeConstant::HOUR);
return $r->getSingleScalarResult();
}
/**
* Получаем минимальные цены из артов по одной коллекции
* @param int $collectionId
* @param bool $withOutMeasureMq
* @return string|null
* @throws Exception
*/
public function getArticleMinPriceByCollectionId(int $collectionId, bool $withOutMeasureMq = true): ?string
{
$q = $this->createQueryBuilder('a')
->select(
'm.id m_id, m.name m_name, m.alias m_alias, a.id,
a.priceEuro, a.priceMqEuro,
a.priceEuroDe, a.priceMqEuroDe,
a.priceEuroAt, a.priceMqEuroAt,
a.priceEuroFi, a.priceMqEuroFi,
a.priceEuroFr, a.priceMqEuroFr,
a.priceEuroIt, a.priceMqEuroIt,
a.priceEuroBe, a.priceMqEuroBe,
a.priceEuroIe, a.priceMqEuroIe,
a.priceEuroNl, a.priceMqEuroNl,
a.priceEuroEs, a.priceMqEuroEs,
a.priceRUB, a.priceRUE, a.priceMqRUB, a.priceMqRUE,
a.priceGBP, a.priceGBE, a.priceMqGBP, a.priceMqGBE,
a.priceUSD, a.priceUSE, a.priceFqUSD, a.priceFqUSE, a.priceMqUSD, a.priceMqUSE,
a.priceCHF, a.priceCHE, a.priceMqCHF, a.priceMqCHE,
a.priceSEK, a.priceSEE, a.priceMqSEK, a.priceMqSEE,
a.priceDKK, a.priceDKE, a.priceMqDKK, a.priceMqDKE,
a.priceNOK, a.priceNOE, a.priceMqNOK, a.priceMqNOE,
a.pricePLN, a.pricePLE, a.priceMqPLN, a.priceMqPLE,
a.priceCAD, a.priceCAE, a.priceFqCAD, a.priceFqCAE, a.priceMqCAD, a.priceMqCAE'
)
->leftJoin('a.details', 'ad')
->leftJoin('a.measure', 'm')
->andWhere('a.collection = :collId')
->setParameter('collId', $collectionId)
->andWhere('a.priceEuro > 0')
->andWhere('a.delivery != 6')
->andWhere('ad.file is not null')
->orderBy('a.priceEuro', 'ASC')
->setMaxResults(1);
if ($withOutMeasureMq) {
$q->andWhere('m.alias = :measure')->setParameter('measure', 'measure_mq');
}
$cc = LocaleHelper::getCurCountry();
switch ($cc) {
case 'de':
$q->andWhere('a.priceEuroDe > 0');
break;
case 'at':
$q->andWhere('a.priceEuroAt > 0');
break;
case 'fi':
$q->andWhere('a.priceEuroFi > 0');
break;
case 'fr':
$q->andWhere('a.priceEuroFr > 0');
break;
case 'it':
$q->andWhere('a.priceEuroIt > 0');
break;
case 'be':
$q->andWhere('a.priceEuroBe > 0');
break;
case 'ie':
$q->andWhere('a.priceEuroIe > 0');
break;
case 'nl':
$q->andWhere('a.priceEuroNl > 0');
break;
case 'es':
$q->andWhere('a.priceEuroEs > 0');
break;
case 'ru':
$q->andWhere('a.priceRUB > 0');
break;
}
$r = $q->getQuery()
->enableResultCache(TimeConstant::DAY)
->getArrayResult();
$r = $r ? $r[0] : null;
$minPrice = null;
if ($r) {
$m = [
'id' => $r['m_id'],
'name' => $r['m_name'],
'alias' => $r['m_alias'],
];
unset($r['m_id']);
unset($r['m_name']);
unset($r['m_alias']);
$r['measure'] = $m;
$minPrice = LocaleHelper::getMinPriceStrForTitle($r);
} elseif ($withOutMeasureMq) {
$minPrice = $this->getArticleMinPriceByCollectionId($collectionId, false);
}
return $minPrice;
}
/**
* Получаем цену арта
* @param int $articleId
* @param ?bool $withOutMeasureMq
* @return string|null
* @throws Exception
*/
public function getArticleMinPriceById(int $articleId, ?bool $withOutMeasureMq = true): ?string
{
$q = $this->createQueryBuilder('a')
->select(
'm.id m_id, m.name m_name, m.alias m_alias, a.id,
a.priceEuro, a.priceMqEuro,
a.priceEuroDe, a.priceMqEuroDe,
a.priceEuroAt, a.priceMqEuroAt,
a.priceEuroFi, a.priceMqEuroFi,
a.priceEuroFr, a.priceMqEuroFr,
a.priceEuroIt, a.priceMqEuroIt,
a.priceEuroBe, a.priceMqEuroBe,
a.priceEuroIe, a.priceMqEuroIe,
a.priceEuroNl, a.priceMqEuroNl,
a.priceEuroEs, a.priceMqEuroEs,
a.priceRUB, a.priceRUE, a.priceMqRUB, a.priceMqRUE,
a.priceGBP, a.priceGBE, a.priceMqGBP, a.priceMqGBE,
a.priceUSD, a.priceUSE, a.priceFqUSD, a.priceFqUSE, a.priceMqUSD, a.priceMqUSE,
a.priceCHF, a.priceCHE, a.priceMqCHF, a.priceMqCHE,
a.priceSEK, a.priceSEE, a.priceMqSEK, a.priceMqSEE,
a.priceDKK, a.priceDKE, a.priceMqDKK, a.priceMqDKE,
a.priceNOK, a.priceNOE, a.priceMqNOK, a.priceMqNOE,
a.pricePLN, a.pricePLE, a.priceMqPLN, a.priceMqPLE,
a.priceCAD, a.priceCAE, a.priceFqCAD, a.priceFqCAE, a.priceMqCAD, a.priceMqCAE'
)
->leftJoin('a.measure', 'm')
->andWhere('a.id = :id')
->setParameter('id', $articleId)
->setMaxResults(1);
if ($withOutMeasureMq) {
$q->andWhere('m.alias = :measure')->setParameter('measure', 'measure_mq');
}
$r = $q->getQuery()
->enableResultCache(TimeConstant::DAY)
->getArrayResult();
$r = $r ? $r[0] : null;
$minPrice = null;
if ($r) {
$m = [
'id' => $r['m_id'],
'name' => $r['m_name'],
'alias' => $r['m_alias'],
];
unset($r['m_id']);
unset($r['m_name']);
unset($r['m_alias']);
$r['measure'] = $m;
$minPrice = LocaleHelper::getMinPriceStrForTitle($r);
} elseif ($withOutMeasureMq) {
$minPrice = $this->getArticleMinPriceById($articleId, false);
}
return $minPrice;
}
/**
* @param $collectionId
* @param ?bool $full - если истина, то покажет и артикулы без картинок
* @param ?bool $all - если истина, то покажет и снятые с производства артикулы
* @param ?bool $noImg
* @return ?array
* @throws Exception
*/
public function idesArticlesColl(
$collectionId,
?bool $full = false,
?bool $all = false,
?bool $noImg = false
): ?array {
$rsm = new ResultSetMapping();
$rsm->addEntityResult('WebBundle\Entity\Article', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$rsm->addFieldResult('a', 'urla', 'url');
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount', 'apd', 'a', 'priceDiscounts');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure', 'lms', 'a', 'measure');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor', 'lfc', 'a', 'factoryColors');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListColor', 'lc', 'a', 'colors');
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticleDetail', 'ad', 'a', 'details');
$where = ['a.collection = ' . $collectionId];
if (!$all) {
$where[] = 'a.delivery != 6';
}
if (!$full && !$noImg) {
$where[] = 'ad.file is not null';
}
if ($noImg) {
$where = '(ad.file IS NULL)';
}
$sSql = '
SELECT
a.id, a.urla
FROM
article a
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN article_price_discount apd ON a.id = apd.article
LEFT JOIN article_factory_color afc ON a.id = afc.article_id
LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN list_type lt ON a.type = lt.id
LEFT JOIN article_detail ad ON a.id = ad.article_id
WHERE ' . join(' AND ', $where) .
// убрал группировку иначе не все интерьеры попадают в выборку
' ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,
apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC';
$query = $this->_em->createNativeQuery($sSql, $rsm);//->enableResultCache(3600);
$res = $query->getArrayResult();
if (count($res)) {
return array_combine(array_column($query->getArrayResult(), 'id'), array_column($query->getArrayResult(), 'url'));
}
return [];
}
/**
* @param $key
* @param $elementIdes
* @return mixed|null
*/
public function articleId($key, $elementIdes)
{
$rsm = new ResultSetMapping();
$rsm->addEntityResult('WebBundle\Entity\Article', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$sSql = sprintf(
'
SELECT a.id FROM article a
left JOIN article_detail ad ON ad.article_id=a.id
WHERE (a.id = \'%s\' OR a.urla = \'%s\') AND a.id IN (%s) AND ad.file IS NOT NULL LIMIT %d',
$key,
$key,
join(',', $elementIdes),
1
);
$query = $this->_em->createNativeQuery($sSql, $rsm)
->enableResultCache(3600);
try {
return $query->getSingleScalarResult();
} catch (Exception $e) {
return null;
}
}
/**
* Возвращает ID доступных артикулов коллекции
*
* @param int $collectionId
* @param ?bool $file
* @return ?array
* @throws Exception
*/
public function getArticlesIdColl(int $collectionId, ?bool $file = true): ?array
{
$q = $this->createQueryBuilder('a')
->select('a.id as id')
->leftJoin('a.details', 'ad')
->andWhere('a.delivery != 6')
->andWhere('a.collection = :collection')
->andWhere('a.priceEuro > 0')
->setParameter('collection', $collectionId);
if ($file) {
$q->andWhere('ad.file is not null');
} else {
$q->andWhere('ad.file IS NULL');
}
$r = $q->getQuery()
->enableResultCache(TimeConstant::HOUR);
$ids = [];
$items = $r->getArrayResult();
foreach ($items as $item) {
$ids[] = $item['id'];
}
return $ids;
}
/**
* @param $params
* @param ?bool $file
* @param ?bool $full
* @return array
* @throws Exception|\Doctrine\DBAL\Driver\Exception
*/
public function getArticleNativeOptSlider($params, ?bool $file = true, ?bool $full = false): array
{
$articles = $this->getArticleNativeOptBase($params, $file, $full);
$out = [];
foreach ($articles as $article) {
$out[$article['id']] = $article;
}
return $out;
}
/**
* Получение статистики по всем артикулам.
*
* @param string $searchString - ID или имя фабрики, ищет любое что подходит
* @return array
*/
public function getStatisticByArticleOfOrders(string $searchString): array
{
$q = $this->createQueryBuilder('a')
/* WARNING ! Обязательно указать интересующие столбцы, т.к. оч много данных, может подвиснуть! */
->select(
'
a.id,
a.code,
a.name,
c.name collection,
c.views collViews,
f.name factory,
cc.code country,
a.priceRUB priceRUB,
a.priceEuro priceEUR,
a.addedToCart added2Cart,
a.soldOut soldOut,
a.soldOutVol soldOutVol'
)
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin('f.country', 'cc')
->leftJoin('a.delivery', 'd')
->andWhere('d.id != 6')
->andWhere('a.priceEuro > 0')
->andWhere('f.unid = :search OR a.code = :search OR f.url = :search OR f.name = :search')
->setParameter('search', str_replace('\'', '′', $searchString));
$all = $q->getQuery()->getArrayResult();
return [
'all' => $all,
'count' => count($all)
];
}
public function getArticlesByIds($ids = [])
{
if ($ids) {
$q = $this->createQueryBuilder('a');
$q->select('a, c, f, priceDiscount')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->leftJoin(
'a.priceDiscounts',
'priceDiscount',
Expr\Join::WITH,
$q->expr()->andX(
$q->expr()->neq('priceDiscount.priceEuro', 0)
)
)
->andWhere('a.id IN (:ids) OR a.code IN (:ids)')
->setParameters(['ids' => $ids]);
$r = $q->getQuery()->setMaxResults(100);
$items = $r->getResult();
}
return $items ?? false;
}
/**
* @param $cId
* @return ?Article
* @throws Exception
*/
public function getItemForSearch($cId): ?Article
{
$q = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.collection', 'c')
->innerJoin('c.factory', 'f')
->leftJoin('a.details', 'ad')
->where('a.collection = :id')
->andWhere('c.status = 1')
->andWhere('f.status = 1')
->andWhere('ad.file IS NOT NULL')
->andWhere('a.type IN (:type)')
->setParameters([
'id' => $cId,
'type' => [113, 24, 1]
])
->setMaxResults(1)
->getQuery();
try {
return $q->getSingleResult();
} catch (NoResultException | NonUniqueResultException $e) {
return null;
}
}
/**
* Получение артикулов для выгрузки в Google Recommendations AI
*
* @param array $params
* @param ?int $limit
* @param ?int $offset
* @return ?array
*/
public function getArticleForGoogleRecommendationAi(array $params = [], ?int $limit = 10, ?int $offset = 0): ?array
{
$builder = $this->createQueryBuilder('a');
$builder->leftJoin('a.type', 't')
->leftJoin('a.edgeType', 'edgeType')
->leftJoin('a.shape', 'shape')
->leftJoin('a.material', 'material')
->leftJoin('a.sliding', 'sliding')
->leftJoin('a.offShade', 'offShade')
->leftJoin('a.using', 'u')
->leftJoin('a.collection', 'coll')
->leftJoin('a.categoryPrice', 'categoryPrice')
->leftJoin('a.delivery', 'delivery')
->leftJoin('a.details', 'ad')
->leftJoin('coll.factory', 'factory')
->leftJoin('factory.country', 'country');
$builder->select(
'a.id',
'a.code',
'a.alternateName',
'a.url',
'ad.file',
'a.priceEuro',
'a.priceUSD',
'a.pricePrx',
'a.sizeX',
'a.sizeY',
'a.sizeGbX',
'a.sizeGbY',
'a.thick',
'a.weight',
'ad.fileSize2X',
'ad.fileSize2Y',
't.alias AS list_type_name',
'edgeType.alias AS egde_type_name',
'shape.alias AS shape_name',
'material.alias AS material_name',
'sliding.alias AS sliding_name',
'offShade.alias AS off_shade_name', // разнотон
'coll.code AS collection_code',
'coll.name AS collection_name',
'coll.alternateName AS collection_alternate_name',
'coll.url AS collectionUrl',
'factory.name AS factory_name',
'factory.url AS factoryUrl',
'u.alias AS using_name',
'country.alias AS country_name',
'categoryPrice.alias AS category_price_alias'
);
// $builder->andWhere('a.id = 38511'); // с несколькими текстурами П000000143
// $builder->andWhere('a.id = 24928'); // с несколькими поверхностями
// $builder->andWhere('a.id = 2592'); // с несколькими цветами
// $builder->andWhere('a.id = 180897094'); // с несколькими стилями
// $builder->andWhere('a.id = 2913'); // с несколькими мотивами
// $builder->andWhere('a.id = 713140'); // с несколькими применениями
// $builder->andWhere('a.id = 405562037'); // с выставкой
// $builder->andWhere('a.id = 259547853'); // с наградой
// $builder->andWhere('a.id = 1996'); // с отзывом
$builder->andWhere('coll IS NOT NULL')
->andWhere('delivery.id <> 6')
->andWhere('a.priceEuro > 0')
->andWhere('coll.status IN (1,2,3,4,7)')
->andWhere('coll.url IS NOT NULL AND coll.url <> \'\'')
->andWhere('factory.status = 1')
->andWhere('ad.file IS NOT NULL');
$builder->setMaxResults($limit);
$builder->setFirstResult($offset);
if (array_key_exists('ids', $params) && is_array($params['ids'])) {
$builder->andWhere('a.id IN (:ids)')
->setParameter('ids', $params['ids']);
$builder->setMaxResults(null);
$builder->setFirstResult(null);
}
$query = $builder->getQuery();
$rows = $query->getResult();
if (empty($rows)) {
return [];
}
// Собираем полученные ID
$rowIds = array_map(function ($row) {
return $row['id'];
}, $rows);
// Ищем эффекты артикулов
$textureBuilder = $this->createQueryBuilder('a')
->innerJoin('a.textures', 'textures')
->select('a.id', 'textures.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$textureRows = $textureBuilder->getQuery()->getArrayResult();
$textureResult = [];
foreach ($textureRows as $textureRow) {
$textureResult[$textureRow['id']][] = $textureRow['alias'];
}
// Ищем поверхности артикулов
$surfaceBuilder = $this->createQueryBuilder('a')
->innerJoin('a.surfaces', 'surfaces')
->select('a.id', 'surfaces.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$surfaceRows = $surfaceBuilder->getQuery()->getArrayResult();
$surfaceResult = [];
foreach ($surfaceRows as $surfaceRow) {
$surfaceResult[$surfaceRow['id']][] = $surfaceRow['alias'];
}
// Ищем цвета артикулов
$colorsBuilder = $this->createQueryBuilder('a')
->innerJoin('a.colors', 'colors')
->select('a.id', 'colors.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$colorsRows = $colorsBuilder->getQuery()->getArrayResult();
$colorsResult = [];
foreach ($colorsRows as $colorsRow) {
$colorsResult[$colorsRow['id']][] = $colorsRow['alias'];
}
// Ищем стили артикулов
$stylesBuilder = $this->createQueryBuilder('a')
->innerJoin('a.styles', 'styles')
->select('a.id', 'styles.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$stylesRows = $stylesBuilder->getQuery()->getArrayResult();
$stylesResult = [];
foreach ($stylesRows as $stylesRow) {
$stylesResult[$stylesRow['id']][] = $stylesRow['alias'];
}
// Ищем мотивы рисунков
$motivsBuilder = $this->createQueryBuilder('a')
->innerJoin('a.motivs', 'motivs')
->select('a.id', 'motivs.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$motivsRows = $motivsBuilder->getQuery()->getArrayResult();
$motivsResult = [];
foreach ($motivsRows as $motivsRow) {
$motivsResult[$motivsRow['id']][] = $motivsRow['alias'];
}
// Ищем применения
$applyBuilder = $this->createQueryBuilder('a')
->leftJoin('a.interiors', 'interiors')
->innerJoin('interiors.applies', 'applies')
->select('a.id', 'applies.alias')
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds)
->distinct();
$applyRows = $applyBuilder->getQuery()->getArrayResult();
$applyResult = [];
foreach ($applyRows as $applyRow) {
$applyResult[$applyRow['id']][] = $applyRow['alias'];
}
// Ищем выставки
$exhibitionBuilder = $this->createQueryBuilder('a');
$exhibitionBuilder->select('a.id', 'filters.name')
->leftJoin('a.collection', 'collection')
->leftJoin('collection.filters', 'filters')
->innerJoin(
'filters.groups',
'groups',
Expr\Join::WITH,
$exhibitionBuilder->expr()->andX('groups.id = 420')
)
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$exhibitionRows = $exhibitionBuilder->getQuery()->getArrayResult();
$exhibitionResult = [];
foreach ($exhibitionRows as $exhibitionRow) {
$exhibitionResult[$exhibitionRow['id']][] = $exhibitionRow['name'];
}
// Ищем награды
$awardsBuilder = $this->createQueryBuilder('a');
$awardsBuilder->select('a.id', 'filters.name')
->leftJoin('a.collection', 'collection')
->leftJoin('collection.filters', 'filters')
->innerJoin(
'filters.groups',
'groups',
Expr\Join::WITH,
$awardsBuilder->expr()->andX('groups.id = 417 AND filters.id <> 10546')
) // убираем фильтр 10546 где название "Премированые"
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$awardsRows = $awardsBuilder->getQuery()->getArrayResult();
$awardsResult = [];
foreach ($awardsRows as $awardsRow) {
$awardsResult[$awardsRow['id']][] = $awardsRow['name'];
}
// Ищем отзывы
$reviewBuilder = $this->createQueryBuilder('a');
$reviewBuilder->select(
'a.id',
'filter_page.nameSingleEn',
'filter_page.nameSingleIt',
'filter_page.nameSingleEs',
'filter_page.nameSingleFr',
'filter_page.nameSingleDe',
'filter_page.nameSinglePl',
'filter_page.nameSingleUa',
'filter_page.nameSingleRu',
'filter_page.nameSingleSv',
'filter_page.nameSingleDa'
)
->leftJoin('a.collection', 'collection')
->leftJoin('collection.filters', 'filters')
->leftJoin('filters.page', 'filter_page')
->innerJoin('filters.groups', 'groups', Expr\Join::WITH, $reviewBuilder->expr()->andX('groups.id = 419'))
->andWhere('a.id IN (:p_ids)')
->setParameter('p_ids', $rowIds);
$reviewsRows = $reviewBuilder->getQuery()->getArrayResult();
$reviewsResult = [];
foreach ($reviewsRows as $reviewsRow) {
$reviewsResult[$reviewsRow['id']]['nameSingleEn'] = $reviewsRow['nameSingleEn'];
$reviewsResult[$reviewsRow['id']]['nameSingleIt'] = $reviewsRow['nameSingleIt'];
$reviewsResult[$reviewsRow['id']]['nameSingleEs'] = $reviewsRow['nameSingleEs'];
$reviewsResult[$reviewsRow['id']]['nameSingleFr'] = $reviewsRow['nameSingleFr'];
$reviewsResult[$reviewsRow['id']]['nameSingleDe'] = $reviewsRow['nameSingleDe'];
$reviewsResult[$reviewsRow['id']]['nameSinglePl'] = $reviewsRow['nameSinglePl'];
$reviewsResult[$reviewsRow['id']]['nameSingleUa'] = $reviewsRow['nameSingleUa'];
$reviewsResult[$reviewsRow['id']]['nameSingleRu'] = $reviewsRow['nameSingleRu'];
$reviewsResult[$reviewsRow['id']]['nameSingleSv'] = $reviewsRow['nameSingleSv'];
$reviewsResult[$reviewsRow['id']]['nameSingleDa'] = $reviewsRow['nameSingleDa'];
}
// Совмещаем полученные много-ко-многим эффекты с артикулами
foreach ($rows as &$row) {
$row['textures'] = array_key_exists($row['id'], $textureResult) ? $textureResult[$row['id']] : [];
$row['surfaces'] = array_key_exists($row['id'], $surfaceResult) ? $surfaceResult[$row['id']] : [];
$row['colors'] = array_key_exists($row['id'], $colorsResult) ? $colorsResult[$row['id']] : [];
$row['styles'] = array_key_exists($row['id'], $stylesResult) ? $stylesResult[$row['id']] : [];
$row['motivs'] = array_key_exists($row['id'], $motivsResult) ? $motivsResult[$row['id']] : [];
$row['applies'] = array_key_exists($row['id'], $applyResult) ? $applyResult[$row['id']] : [];
$row['exhibitions'] = array_key_exists($row['id'], $exhibitionResult) ? $exhibitionResult[$row['id']] : [];
$row['rewards'] = array_key_exists($row['id'], $awardsResult) ? $awardsResult[$row['id']] : [];
$row['reviews'] = array_key_exists($row['id'], $reviewsResult) ? $reviewsResult[$row['id']] : [];
}
return $rows;
}
/**
* @return ?array
*/
public function getArticleForParseDesigner(): ?array
{
$q = $this
->createQueryBuilder('a')
->select('a')
->andWhere('a.designerId IS NOT NULL');
return $q->getQuery()->getResult();
}
private function getTranslateWithCheckToNull($field): string
{
if ($field['alias'] ?? null) {
return App::trans($field['alias']);
}
return $field['name'] ?? '';
}
/**
* Получение текстур для артикула
*/
public function getTexturesForArticle(int $id): array
{
$q1 = $this->createQueryBuilder('a')
->select(
'
t.id id,
t.alias texture'
)
->leftJoin('a.textures', 't')
->groupBy('t.id')
->andWhere('a.id = :id')
->andWhere('t.id IS NOT NULL')
->setParameter('id', $id);
return $q1->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение текстур камня для артикула
*/
public function getStoneTexturesForArticle(int $id): array
{
$qSub = $this->createQueryBuilder('a')
->select(
'
st.id id,
st.alias texture'
)
->leftJoin('a.stoneTextures', 'st')
->groupBy('st.id')
->andWhere('a.id = :id')
->andWhere('st.id IS NOT NULL')
->setParameter('id', $id);
return $qSub->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение типа поверхности для артикула
*/
public function getSurfaceForArticle(int $id): array
{
$q2 = $this->createQueryBuilder('a')
->select(
'
sr.id surface_id,
sr.alias surface,
sl.id sliding_id,
sl.alias sliding'
)
->leftJoin('a.surfaces', 'sr')
->leftJoin('a.sliding', 'sl')
->groupBy('sr.id')
->andWhere('a.id = :id')
->andWhere('sr.id IS NOT NULL')
->setParameter('id', $id);
return $q2->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение мотивов для артикула
*/
public function getMotivesForArticle(int $id): array
{
$q3 = $this->createQueryBuilder('a')
->select('m.id id, m.alias motive')
->leftJoin('a.motivs', 'm')
->groupBy('m.id')
->andWhere('a.id = :id')
->andWhere('m.id IS NOT NULL')
->setParameter('id', $id);
return $q3->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение стиля для артикула
*/
public function getStyleForArticle(int $id): array
{
$q4 = $this->createQueryBuilder('a')
->select('s.id id, s.alias style')
->leftJoin('a.styles', 's')
->groupBy('s.id')
->andWhere('a.id = :id')
->andWhere('s.id IS NOT NULL')
->setParameter('id', $id);
return $q4->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение цветов фабрики для артикула
*/
public function getColorsForArticle(int $id): array
{
$q5 = $this->createQueryBuilder('a')
->select('fc.name name')
->leftJoin('a.factoryColors', 'fc')
->groupBy('fc.id')
->andWhere('a.id = :id')
->setParameter('id', $id);
return $q5->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение формы чипа для артикула
*/
public function getShapesForArticle(int $id): array
{
$q6 = $this->createQueryBuilder('a')
->select('tsh.alias alias')
->leftJoin('a.tesseraShapes', 'tsh')
->where('tsh.alias IS NOT NULL')
->andWhere('a.id = :id')
->setParameter('id', $id);
return $q6->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получение типа края для артикула
*/
public function getEdgeTypeForArticle(int $id): array
{
$q7 = $this->createQueryBuilder('a')
->select('ets.id id, ets.alias alias')
->leftJoin('a.edgeTypes', 'ets')
->andWhere('ets.id IS NOT NULL')
->andWhere('a.id = :id')
->setParameter('id', $id);
return $q7->getQuery()->useQueryCache(true)->getArrayResult();
}
/**
* Получаем список статей (артикулов) для генерации sitemap.
*/
public function findArticlesForSitemap(): array
{
return $this->createQueryBuilder('a')
->select('a, c, f')
->leftJoin('a.collection', 'c')
->leftJoin('c.factory', 'f')
->andWhere('f.url != :factoryTesting')
->setParameter('factoryTesting', 'testing-factory')
->andWhere('a.file IS NOT NULL')
->andWhere('c.status = 1')
->andWhere('f.status = 1')
->andWhere('a.priceEuro > 0')
->andWhere('a.delivery != 6')
->getQuery()
->getResult();
}
public function getArticleFromCompare($params, ?bool $file = true, ?bool $full = false): ?array
{
$articles = $this->getArticleCompare($params, $file, $full);
return $this->orderArticlesOpt($articles, $params['offset'] ?? 0);
}
private function getArticleCompare($params, ?bool $file = true, ?bool $full = false): ?array
{
$status = (!empty($params['status'])) ? $params['status'] : null;
$isInterior = (!empty($params['interior'])) ? $params['interior'] : null;
$oneSlide = (!empty($params['oneSlide'])) ? $params['oneSlide'] : null;
$rsm = new ResultSetMapping();
$rsm->addEntityResult('WebBundle\Entity\Article', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$rsm->addFieldResult('a', 'code', 'code');
$rsm->addFieldResult('a', 'name', 'name');
$rsm->addFieldResult('a', 'alternate_name', 'alternateName');
$rsm->addFieldResult('a', 'file', 'file');
$rsm->addFieldResult('a', 'not_sample', 'notSample');
$rsm->addFieldResult('a', 'scheme', 'scheme');
$rsm->addFieldResult('a', 'size_x', 'sizeX');
$rsm->addFieldResult('a', 'size_y', 'sizeY');
$rsm->addFieldResult('a', 'size_z', 'sizeZ');
$rsm->addFieldResult('a', 'file_size3_x', 'fileSize3X');
$rsm->addFieldResult('a', 'file_size3_y', 'fileSize3Y');
$rsm->addFieldResult('a', 'file_size8_x', 'fileSize8X');
$rsm->addFieldResult('a', 'file_size8_y', 'fileSize8Y');
$rsm->addFieldResult('a', 'type_constraint', 'typeConstraint');
$rsm->addFieldResult('a', 'packaging_count', 'packagingCount');
$rsm->addFieldResult('a', 'packaging_count_ft', 'packagingCountFt');
$rsm->addFieldResult('a', 'packaging_count_pc', 'packagingCountPC');
$rsm->addFieldResult('a', 'reserve', 'reserve');
$rsm->addFieldResult('a', 'price_prx', 'pricePrx');
$rsm->addFieldResult('a', 'pallet', 'pallet');
$rsm->addFieldResult('a', 'pallet_ft', 'palletFt');
$rsm->addFieldResult('a', 'min_order', 'minOrder');
$rsm->addFieldResult('a', 'm2one_ps', 'm2OnePs');
$rsm->addFieldResult('a', 'multiple_pallet', 'multiplePallet');
$rsm->addFieldResult('a', 'urla', 'url');
$rsm->addFieldResult('a', 'background_white', 'backgroundWhite');
$rsm->addFieldResult('a', 'image_setting', 'imageSetting');
$rsm->addFieldResult('a', 'file_edit', 'fileEdit');
$rsm->addFieldResult('a', 'comment_scheme_image', 'commentSchemeImage');
$rsm->addFieldResult(
'a',
'description_' . LocaleHelper::getCurLocale(),
'description' . StrHelper::ucFirst(LocaleHelper::getCurLocale())
);
if (LocaleHelper::getCurLocale() != 'en') {
$rsm->addFieldResult('a', 'description_en', 'descriptionEn');
}
$rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery', 'ld', 'a', 'delivery');
$rsm->addFieldResult('ld', 'ld_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure', 'lms', 'a', 'measure');
$rsm->addFieldResult('lms', 'lms_id', 'id');
$rsm->addFieldResult('lms', 'lms_alias', 'alias');
$rsm->addFieldResult('lms', 'lms_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial', 'lmt', 'a', 'material');
$rsm->addFieldResult('lmt', 'lmt_id', 'id');
$rsm->addFieldResult('lmt', 'lmt_name', 'name');
$rsm->addFieldResult('lmt', 'lmt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount', 'apd', 'a', 'priceDiscounts');
$rsm->addFieldResult('apd', 'apd_id', 'id');
$rsm->addFieldResult('apd', 'apd_amount', 'amount');
$rsm->addFieldResult('apd', 'apd_amount_ft', 'amountFt');
$rsm->addFieldResult('apd', 'apd_fold', 'fold');
$rsm->addJoinedEntityResult('WebBundle\Entity\Collection', 'acl', 'a', 'collection');
$rsm->addFieldResult('acl', 'acl_id', 'id');
$rsm->addFieldResult('acl', 'acl_url', 'url');
$rsm->addFieldResult('acl', 'acl_name', 'name');
$rsm->addFieldResult('acl', 'acl_aname', 'alternateName');
$rsm->addFieldResult('acl', 'acl_status', 'status');
$rsm->addFieldResult('acl', 'acl_process', 'process');
$rsm->addFieldResult('acl', 'acl_settings', 'settings');
$rsm->addJoinedEntityResult('WebBundle\Entity\Factory', 'acf', 'acl', 'factory');
$rsm->addFieldResult('acf', 'acf_id', 'id');
$rsm->addFieldResult('acf', 'acf_url', 'url');
$rsm->addFieldResult('acf', 'acf_name', 'name');
$rsm->addFieldResult('acf', 'acf_aname', 'alternateName');
$rsm->addFieldResult('acf', 'acf_suspended', 'suspended');
$rsm->addFieldResult('acf', 'acf_status', 'status');
$rsm->addFieldResult('acf', 'acf_stated_at', 'statedAt');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry', 'lcnt', 'acf', 'country');
$rsm->addFieldResult('lcnt', 'lcnt_id', 'id');
$rsm->addFieldResult('lcnt', 'lcnt_code', 'code');
$rsm->addFieldResult('lcnt', 'lcnt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor', 'lfc', 'a', 'factoryColors');
$rsm->addFieldResult('lfc', 'lfc_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture', 'ltx', 'a', 'textures');
$rsm->addFieldResult('ltx', 'ltx_id', 'id');
$rsm->addFieldResult('ltx', 'ltx_alias', 'alias');
$rsm->addFieldResult('ltx', 'ltx_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle', 'ls', 'a', 'styles');
$rsm->addFieldResult('ls', 'ls_id', 'id');
$rsm->addFieldResult('ls', 'ls_alias', 'alias');
$rsm->addFieldResult('ls', 'ls_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface', 'lsf', 'a', 'surface');
$rsm->addFieldResult('lsf', 'lsf_id', 'id');
$rsm->addFieldResult('lsf', 'lsf_alias', 'alias');
$rsm->addFieldResult('lsf', 'lsf_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListType', 'lt', 'a', 'type');
$rsm->addFieldResult('lt', 'lt_id', 'id');
$rsm->addFieldResult('lt', 'lt_alias', 'alias');
$rsm->addFieldResult('lt', 'lt_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv', 'llm', 'a', 'motivs');
$rsm->addFieldResult('llm', 'llm_id', 'id');
$rsm->addFieldResult('llm', 'llm_alias', 'alias');
$rsm->addFieldResult('llm', 'llm_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListShape', 'lsh', 'a', 'shape');
$rsm->addFieldResult('lsh', 'lsh_id', 'id');
$rsm->addFieldResult('lsh', 'lsh_alias', 'alias');
$rsm->addFieldResult('lsh', 'lsh_name', 'name');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasureSize', 'lmss', 'a', 'measurementSize');
$rsm->addFieldResult('lmss', 'lmss_id', 'id');
$rsm->addFieldResult('lmss', 'lmss_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListColor', 'lc', 'a', 'colors');
$rsm->addFieldResult('lc', 'lc_id', 'id');
$rsm->addFieldResult('lc', 'lc_alias', 'alias');
$rsm->addFieldResult('lc', 'lc_name', 'name');
$queryFields = '';
$queryJoin = '';
if ($isInterior) {
$rsm->addJoinedEntityResult('WebBundle\Entity\ListType', 'lt', 'a', 'type');
$rsm->addFieldResult('lt', 'lt_id', 'id');
$rsm->addJoinedEntityResult('WebBundle\Entity\Interior', 'aii', 'a', 'interiors');
$rsm->addFieldResult('aii', 'aii_id', 'id');
$rsm->addFieldResult('aii', 'aii_file', 'file');
$rsm->addFieldResult('aii', 'aii_name', 'name');
$rsm->addFieldResult('aii', 'aii_status', 'status');
$rsm->addFieldResult('aii', 'aii_url', 'url');
$rsm->addFieldResult('aii', 'aii_file_size_x', 'fileSizeX');
$rsm->addFieldResult('aii', 'aii_file_size_y', 'fileSizeY');
$rsm->addFieldResult('aii', 'ideaCount', 'ideasCount');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle', 'aii_istls', 'aii', 'styles');
$rsm->addFieldResult('aii_istls', 'aii_istls_id', 'id');
$rsm->addFieldResult('aii_istls', 'aii_istls_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture', 'aii_istlt', 'aii', 'textures');
$rsm->addFieldResult('aii_istlt', 'aii_istlt_id', 'id');
$rsm->addFieldResult('aii_istlt', 'aii_istlt_alias', 'alias');
$rsm->addJoinedEntityResult('WebBundle\Entity\Collection', 'iacl', 'aii', 'collection');
$rsm->addFieldResult('iacl', 'iacl_id', 'id');
$rsm->addFieldResult('iacl', 'iacl_url', 'url');
$rsm->addFieldResult('iacl', 'iacl_name', 'name');
$rsm->addFieldResult('iacl', 'iacl_aname', 'alternateName');
$rsm->addFieldResult('iacl', 'iacl_status', 'status');
$rsm->addFieldResult('iacl', 'iacl_process', 'process');
$rsm->addFieldResult('iacl', 'iacl_rating', 'rating');
$rsm->addFieldResult('iacl', 'iacl_settings', 'settings');
$rsm->addFieldResult('iacl', 'iacl_accessible', 'accessible');
$rsm->addJoinedEntityResult('WebBundle\Entity\Factory', 'iacf', 'iacl', 'factory');
$rsm->addFieldResult('iacf', 'iacf_id', 'id');
$rsm->addFieldResult('iacf', 'iacf_url', 'url');
$rsm->addFieldResult('iacf', 'iacf_name', 'name');
$rsm->addFieldResult('iacf', 'iacf_aname', 'alternateName');
$rsm->addFieldResult('iacf', 'iacf_suspended', 'suspended');
$rsm->addFieldResult('iacf', 'iacf_status', 'status');
$rsm->addFieldResult('iacf', 'iacf_stated_at', 'statedAt');
$rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry', 'iacflc', 'iacf', 'country');
$rsm->addFieldResult('iacflc', 'iacflc_id', 'id');
$rsm->addFieldResult('iacflc', 'iacflc_code', 'code');
$rsm->addFieldResult('iacflc', 'iacflc_alias', 'alias');
$rsm->addFieldResult('iacflc', 'iacflc_name', 'name');
$queryFields = '
lt.id as lt_id,
aii.id as aii_id,
aii.file as aii_file,
aii.name as aii_name,
aii.status as aii_status,
aii.url as aii_url,
aii.file_size_x as aii_file_size_x,
aii.file_size_y as aii_file_size_y,
(SELECT COUNT(ii.idea_id) FROM `idea_interior` ii WHERE `ii`.`interior_id` = `aii`.id) as ideaCount,
aii_istls.id as aii_istls_id,
aii_istls.alias as aii_istls_alias,
aii_istlt.id as aii_istlt_id,
aii_istlt.alias as aii_istlt_alias,
iacl.id as iacl_id,
iacl.url as iacl_url,
iacl.name as iacl_name,
iacl.alternate_name as iacl_aname,
iacl.status as iacl_status,
iacl.process as iacl_process,
iacl.rating as iacl_rating,
iacl.settings as iacl_settings,
iacl.accessible as iacl_accessible,
iacf.id as iacf_id,
iacf.url as iacf_url,
iacf.name as iacf_name,
iacf.alternate_name as iacf_aname,
iacf.suspended as iacf_suspended,
iacf.status as iacf_status,
iacf.stated_at as iacf_stated_at,
iacflc.id as iacflc_id,
iacflc.code as iacflc_code,
iacflc.alias as iacflc_alias,
iacflc.name as iacflc_name,
';
$queryJoin = '
LEFT JOIN interior_article iarts ON iarts.article_id = a.id AND a.delivery <> 6
LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL and a.collection=aii.collection LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL
LEFT JOIN collection iacl ON iacl.id = aii.collection
LEFT JOIN factory iacf ON iacf.id = iacl.factory
LEFT JOIN list_country iacflc ON iacflc.id = iacf.country
LEFT JOIN interior_style ist ON ist.interior_id = aii.id
LEFT JOIN list_style aii_istls ON aii_istls.id = ist.style_id
LEFT JOIN interior_texture istt ON istt.interior_id = aii.id
LEFT JOIN list_texture aii_istlt ON aii_istlt.id = istt.texture_id
';
}
// Собираем необходимые поля цен
switch (LocaleHelper::getCurCountry()) {
case 'de':
$priceList = [
'price' => 'price_euro_de',
'price_mq' => 'price_mq_euro_de',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_de',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_de',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'at':
$priceList = [
'price' => 'price_euro_at',
'price_mq' => 'price_mq_euro_at',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_at',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_at',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'fi':
$priceList = [
'price' => 'price_euro_fi',
'price_mq' => 'price_mq_euro_fi',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_fi',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_fi',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'fr':
$priceList = [
'price' => 'price_euro_fr',
'price_mq' => 'price_mq_euro_fr',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_fr',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_fr',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'it':
$priceList = [
'price' => 'price_euro_it',
'price_mq' => 'price_mq_euro_it',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_it',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_it',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'be':
$priceList = [
'price' => 'price_euro_be',
'price_mq' => 'price_mq_euro_be',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_be',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_be',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'ie':
$priceList = [
'price' => 'price_euro_ie',
'price_mq' => 'price_mq_euro_ie',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_ie',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_ie',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'nl':
$priceList = [
'price' => 'price_euro_nl',
'price_mq' => 'price_mq_euro_nl',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_nl',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_nl',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'es':
$priceList = [
'price' => 'price_euro_es',
'price_mq' => 'price_mq_euro_es',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro_es',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro_es',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'gb':
$priceList = [
'price' => 'price_GBP',
'price_mq' => 'price_mq_GBP',
'price_ue' => 'price_GBE',
'price_mq_ue' => 'price_mq_GBE',
'apd_price' => 'price_GBP',
'apd_price_ue' => 'price_GBE',
'prMin' => 'pr_min_GBP',
'prMinUe' => 'pr_min_GBE',
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'us':
$priceList = [
'price' => 'price_USD',
'price_mq' => 'price_mq_USD',
'price_fq' => 'price_fq_USD',
'price_ue' => 'price_USE',
'price_mq_ue' => 'price_mq_USE',
'price_fq_ue' => 'price_fq_USD',
'apd_price' => 'price_USD',
'apd_price_fq' => 'price_fq_USD',
'apd_price_ue' => 'price_USE',
'apd_price_fq_ue' => 'price_fq_USE',
'prMin' => 'pr_min_USD',
'prMinUe' => 'pr_min_USE',
'prMinF' => 'pr_min_f_USD',
'prMinUeF' => 'pr_min_f_USE',
];
break;
case 'ca':
$priceList = [
'price' => 'price_CAD',
'price_mq' => 'price_mq_CAD',
'price_fq' => 'price_fq_CAD',
'price_ue' => 'price_CAE',
'price_mq_ue' => 'price_mq_CAE',
'price_fq_ue' => 'price_fq_CAE',
'apd_price' => 'price_CAD',
'apd_price_fq' => 'price_fq_CAD',
'apd_price_ue' => 'price_CAE',
'apd_price_fq_ue' => 'price_fq_CAE',
'prMin' => 'pr_min_CAD',
'prMinUe' => 'pr_min_CAE',
'prMinF' => 'pr_min_f_USD',
'prMinUeF' => 'pr_min_f_USE'
];
break;
case 'ch':
$priceList = [
'price' => 'price_CHF',
'price_mq' => 'price_mq_CHF',
'price_ue' => 'price_CHE',
'price_mq_ue' => 'price_mq_CHE',
'apd_price' => 'price_CHF',
'apd_price_ue' => 'price_CHE',
'prMin' => 'pr_min_CHF',
'prMinUe' => 'pr_min_CHE',
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'se':
$priceList = [
'price' => 'price_SEK',
'price_mq' => 'price_mq_SEK',
'price_ue' => 'price_SEE',
'price_mq_ue' => 'price_mq_SEE',
'apd_price' => 'price_SEK',
'apd_price_ue' => 'price_SEE',
'prMin' => 'pr_min_SEK',
'prMinUe' => 'pr_min_SEE',
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'dk':
$priceList = [
'price' => 'price_DKK',
'price_mq' => 'price_mq_DKK',
'price_ue' => 'price_DKE',
'price_mq_ue' => 'price_mq_DKE',
'apd_price' => 'price_DKK',
'apd_price_ue' => 'price_DKE',
'prMin' => 'pr_min_DKK',
'prMinUe' => 'pr_min_DKE',
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'no':
$priceList = [
'price' => 'price_NOK',
'price_mq' => 'price_mq_NOK',
'price_ue' => 'price_NOE',
'price_mq_ue' => 'price_mq_NOE',
'apd_price' => 'price_NOK',
'apd_price_ue' => 'price_NOE',
'prMin' => 'pr_min_NOK',
'prMinUe' => 'pr_min_NOE',
'prMinF' => null,
'prMinUeF' => null
];
break;
case 'pl':
$priceList = [
'price' => 'price_PLN',
'price_mq' => 'price_mq_PLN',
'price_ue' => 'price_PLE',
'price_mq_ue' => 'price_mq_PLE',
'apd_price' => 'price_PLN',
'apd_price_ue' => 'price_PLE',
'prMin' => 'pr_min_PLN',
'prMinUe' => 'pr_min_PLE',
'prMinF' => null,
'prMinUeF' => null
];
break;
default:
$priceList = [
'price' => 'price_euro',
'price_mq' => 'price_mq_euro',
'price_ue' => null,
'price_mq_ue' => null,
'apd_price' => 'price_euro',
'apd_price_ue' => null,
'prMin' => 'pr_min_euro',
'prMinUe' => null,
'prMinF' => null,
'prMinUeF' => null
];
}
$priceSQL = '';
// Формируем выборку цен
foreach ($priceList as $key => $price) {
if (!$price) {
continue;
}
$columnName = lcfirst(
str_replace(' ', '', ucwords(str_replace('_', ' ', $price)))
);
$price = strtolower($price);
if (in_array($key, ['apd_price', 'apd_price_ue', 'apd_price_fq', 'apd_price_fq_ue'])) {
$alias = 'apd';
$priceSQL .= 'apd.' . $price . ' as apd_' . $price . ', ';
} elseif (in_array($key, ['prMin', 'prMinUe', 'prMinF', 'prMinUeF'])) {
$alias = 'acl';
$priceSQL .= 'acl.' . $price . ' as acl_' . $price . ', ';
if ($isInterior) {
$queryFields .= ' iacl.' . $price . ' as iacl_' . $price . ', ';
$rsm->addFieldResult('iacl', 'iacl_' . $price, $columnName);
}
} else {
$alias = 'a';
$priceSQL .= 'a.' . $price . ' as a_' . $price . ', ';
}
$rsm->addFieldResult($alias, $alias . '_' . $price, $columnName);
}
if (empty($params['isFreezed'])) {
if (is_numeric($full)) {
$where = ' AND (ld.id <> 6 OR a.id = ' . $full . ')';
} elseif ($full) {
$where = ' AND (ld.id <> 6 OR a.urla = "' . $full . '")';
} else {
$where = ' AND ld.id <> 6';
}
} else {
$where = '';
}
if ($status == BiConst::STATE_DISCONTINUED) {
$where = '';
}
if (!empty($params['collection'])) {
$where .= ' AND a.collection = \'' . $params['collection'] . '\'';
}
if (!empty($params['items'])) {
$where .= ' AND a.id IN (\'' . join('\',\'', $params['items']) . '\')';
}
if (!empty($params['notItems'])) {
$where .= ' AND a.id NOT IN (\'' . join('\',\'', $params['notItems']) . '\')';
}
if (!empty($params['cStatus'])) {
$where .= ' AND acl.status IN (\'' . join('\',\'', $params['cStatus']) . '\')';
}
if (!empty($params['fStatus'])) {
$where .= ' AND acf.status IN (\'' . join('\',\'', $params['fStatus']) . '\')';
}
$country = $params['country'] ?? App::getCurCountry();
$cur = '_euro';
if (
CookieHelper::get(CookieKeysConstant::CURRENCY)
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'EUR'
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'HKD'
&& CookieHelper::get(CookieKeysConstant::CURRENCY) != 'SGD'
) {
$cur = '_' . StrHelper::toLower(CookieHelper::get(CookieKeysConstant::CURRENCY));
} elseif ($country == 'de') {
$cur = '_euro_de';
} elseif ($country == 'at') {
$cur = '_euro_at';
} elseif ($country == 'fi') {
$cur = '_euro_fi';
} elseif ($country == 'fr') {
$cur = '_euro_fr';
} elseif ($country == 'it') {
$cur = '_euro_it';
} elseif ($country == 'be') {
$cur = '_euro_be';
} elseif ($country == 'ie') {
$cur = '_euro_ie';
} elseif ($country == 'nl') {
$cur = '_euro_nl';
} elseif ($country == 'es') {
$cur = '_euro_es';
}
if ($oneSlide) {
$oneSlideLimit = ' limit 1 ';
} else {
$oneSlideLimit = ' ';
}
if (isset($params['limit']) && isset($params['offset'])) {
$portion = ' LIMIT ' . $params['limit'] . ' OFFSET ' . $params['offset'];
$sSqlCount = 'SELECT a.id FROM article a
LEFT JOIN list_type lt ON a.type = lt.id
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN list_material lmt ON a.material = lmt.id
LEFT JOIN list_surface lsf ON a.surface = lsf.id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . $cur . ' > 0
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN article_factory_color afc ON a.id = afc.article_id
LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
LEFT JOIN article_texture at ON a.id = at.article_id
LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
LEFT JOIN list_style ls ON a.style = ls.id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN collection acl ON acl.id = a.collection
LEFT JOIN factory acf ON acf.id = acl.factory
LEFT JOIN list_country lcnt ON lcnt.id = acf.country
LEFT JOIN article_motiv alm ON a.id = alm.article_id
LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
LEFT JOIN list_shape lsh ON lsh.id = a.shape
LEFT JOIN article_detail ad ON ad.article_id = a.id
WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR ld.id = 6)' . $where . ' GROUP BY a.id
ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC, apd.amount DESC,
a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC' . $portion;
#todo ************************************************************************************************************************************
$res = App::em()->getConnection()
->executeQuery(preg_replace('#[\s]+#', ' ', $sSqlCount))
->fetchAllAssociative();
if ($res && count($res) > 0) {
$ides = array_unique(array_column($res, 'id'));
$where .= ' AND a.id IN (\'' . join('\',\'', $ides) . '\')';
} else {
return [];
}
}
LocaleHelper::getCurCountry();
$sSql = '
SELECT
a.id,
a.code,
a.name,
a.not_sample,
a.alternate_name,
REPLACE(a.file, "~q~", "\'") AS file,
a.express_sample,
a.variant_image,
a.size_x,
a.size_y,
a.size_z,
a.file_size2_x,
a.file_size2_y,
a.file_size3_x,
a.file_size3_y,
a.file_size8_x,
a.file_size8_y,
a.type_constraint,
a.packaging_count,
a.packaging_count_ft,
a.packaging_count_pc,
a.price_prx,
a.pallet,
a.pallet_ft,
a.min_order,
a.m2one_ps,
a.multiple_pallet,
a.urla,
a.background_white,
a.border_grey,
a.image_setting,
a.file_w,
a.file_h,
a.file_w4000,
a.file_h4000,
a.scheme,
a.rotate,
a.file_rotation,
a.file_edit,
a.comment_scheme_image,
a.description_' . LocaleHelper::getCurLocale() . ',
' . (LocaleHelper::getCurLocale() != 'en' ? 'a.description_en,' : '') . '
ad.id as ad_id,
ad.file as ad_file,
ad.picture_in_title as ad_picture_in_title,
ad.gtin as ad_gtin,
ad.file_size1_x as ad_file_size1_x,
ad.file_size1_y as ad_file_size1_y,
ad.file_size2_x as ad_file_size2_x,
ad.file_size2_y as ad_file_size2_y,
ad.file_size3_x as ad_file_size3_x,
ad.file_size3_y as ad_file_size3_y,
ad.file_size8_x as ad_file_size8_x,
ad.file_size8_y as ad_file_size8_y,
ad.file_size500_x as ad_file_size500_x,
ad.file_size500_y as ad_file_size500_y,
ad.file_size740_x as ad_file_size740_x,
ad.file_size740_y as ad_file_size740_y,
ad.file_size1_x as ad_file_size1_x,
ad.file_size1_y as ad_file_size1_y,
ad.description_' . LocaleHelper::getCurLocale() . ' as ad_description_' . LocaleHelper::getCurLocale() . ',
' . (LocaleHelper::getCurLocale() != 'en' ? 'ad.description_en as ad_description_en,' : '') . '
ad.comment as ad_comment,
ad.file_edit as ad_file_edit,
ad.image_setting as ad_image_setting,
ad.file_w as ad_file_w,
ad.file_h as ad_file_h,
ad.file_w4000 as ad_file_w4000,
ad.file_h4000 as ad_file_h4000,
ad.comment_scheme_image as ad_comment_scheme_image,
ad.variant_image as ad_variant_image,
ad.file_rotation as ad_file_rotation,
ad.rotate as ad_rotate,
ad.type_painting as ad_type_painting,
ad.big_size_scheme as ad_big_size_scheme,
ld.id as ld_id,
lt.id as lt_id,
lt.alias as lt_alias,
lt.name as lt_name,
lms.id as lms_id,
lms.alias as lms_alias,
lms.name as lms_name,
lmt.id as lmt_id,
lmt.alias as lmt_alias,
lmt.name as lmt_name,
lsf.id as lsf_id,
lsf.alias as lsf_alias,
lsf.name as lsf_name,
lfc.id as lfc_id,
ltx.id as ltx_id,
ltx.alias as ltx_alias,
ltx.name as ltx_name,
ls.id as ls_id,
ls.alias as ls_alias,
ls.name as ls_name,
lsh.id as lsh_id,
lsh.alias as lsh_alias,
lsh.name as lsh_name,
llm.id as llm_id,
llm.alias as llm_alias,
llm.name as llm_name,
lmss.id as lmss_id,
lmss.alias as lmss_alias,
apd.id as apd_id,
apd.amount as apd_amount,
apd.amount_ft as apd_amount_ft,
apd.fold as apd_fold,
acl.id as acl_id,
acl.url as acl_url,
acl.name as acl_name,
acl.alternate_name as acl_aname,
acl.status as acl_status,
acl.process as acl_process,
acl.settings as acl_settings,
acf.id as acf_id,
acf.url as acf_url,
acf.name as acf_name,
acf.alternate_name as acf_aname,
acf.status as acf_status,
acf.suspended as acf_suspended,
acf.stated_at as acf_stated_at,
' . $priceSQL . '
' . $queryFields . '
lcnt.id as lcnt_id,
lcnt.code as lcnt_code,
lcnt.alias as lcnt_alias,
lc.id as lc_id,
lc.name as lc_name,
lc.alias as lc_alias
FROM
article a
LEFT JOIN list_type lt ON a.type = lt.id
LEFT JOIN list_delivery ld ON a.delivery = ld.id
LEFT JOIN list_measure lms ON a.measure = lms.id
LEFT JOIN list_material lmt ON a.material = lmt.id
LEFT JOIN list_surface lsf ON a.surface = lsf.id
LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' . $cur . ' > 0
LEFT JOIN article_color ac ON a.id = ac.article_id
LEFT JOIN list_color lc ON lc.id = ac.color_id
LEFT JOIN article_factory_color afc ON a.id = afc.article_id
LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
LEFT JOIN article_texture at ON a.id = at.article_id
LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
LEFT JOIN list_style ls ON a.style = ls.id
LEFT JOIN collection acl ON acl.id = a.collection
LEFT JOIN factory acf ON acf.id = acl.factory
LEFT JOIN list_country lcnt ON lcnt.id = acf.country
LEFT JOIN article_motiv alm ON a.id = alm.article_id
LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
LEFT JOIN list_shape lsh ON lsh.id = a.shape
LEFT JOIN list_measure_size lmss ON a.measurement_size = lmss.id
LEFT JOIN article_detail ad ON ad.article_id = a.id
' . $queryJoin . '
WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR a.delivery = 6)' . $where .
' ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,' .
' apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC ' . $oneSlideLimit;
$query = $this->_em->createNativeQuery($sSql, $rsm);
$result = $query->getArrayResult();
/**
* Пробовал тут разные варианты сортировки, чтобы порядок записей был как в $sSqlCount,
* например ORDER BY FIELD(a.id, ....), и все равно местами результат отличается.
* Пришел к решению просто пересобрать массив в соответствии с порядком в $sSqlCount.
* Это все для того, чтобы порядок артикулов был такой же, как и порядковый номер, когда открывается
* страница с артикулом.
*/
// При загрузке конкретного артикула, эти переменные не присваиваются.
if (isset($res) && isset($ides)) {
usort($result, function ($a, $b) use ($ides) {
$posA = array_search($a['id'], $ides);
$posB = array_search($b['id'], $ides);
return $posA - $posB;
});
return $result;
}
return $result;
}
}