94 lines
3.4 KiB
PHP
94 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace KupShop\RecommendersBundle\Util;
|
|
|
|
use KupShop\CatalogBundle\ProductList\ProductCollection;
|
|
use KupShop\ComponentsBundle\Twig\DataProvider\ProductDataProvider;
|
|
use KupShop\LuigisBoxBundle\Recommenders\LuigisBoxRecommender;
|
|
use KupShop\RecommendersBundle\Recommenders\RecommendersLocator;
|
|
use KupShop\RecommendersBundle\Translations\RecommendersTranslation;
|
|
use Query\Operator;
|
|
use Query\Translation;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
use Twig\Environment;
|
|
|
|
class RecommendersUtil
|
|
{
|
|
public function __construct(
|
|
protected RecommendersLocator $recommendersLocator,
|
|
protected ?ProductDataProvider $productDataProvider,
|
|
protected Environment $twig,
|
|
) {
|
|
}
|
|
|
|
public function getRecommenderByLabel(string $label)
|
|
{
|
|
return sqlQueryBuilder()->select('re.*')->from('recommenders', 're')
|
|
->where(Operator::equals(['label' => $label]))
|
|
->andWhere(Translation::coalesceTranslatedFields(RecommendersTranslation::class))
|
|
->execute()->fetchAssociative();
|
|
}
|
|
|
|
public function getRecommendersProducts(array &$data): ProductCollection
|
|
{
|
|
if (empty($data['label'])) {
|
|
throw new NotFoundHttpException('Empty label');
|
|
}
|
|
|
|
$labelRecommender = $this->getRecommenderByLabel($data['label']);
|
|
if ($type = $labelRecommender['type'] ?? null) {
|
|
$recommender = $this->recommendersLocator->getRecommender($type);
|
|
$config = $recommender->getConfigurationVariables($labelRecommender);
|
|
|
|
$productList = $recommender->execute($data['data'] ?? [], $config);
|
|
if (findModule(\Modules::COMPONENTS)) {
|
|
$this->productDataProvider->addProducts($productList->toArray());
|
|
}
|
|
if ($recommender instanceof LuigisBoxRecommender) {
|
|
$data['luigisbox'] = $recommender->getLogData();
|
|
}
|
|
|
|
return $productList;
|
|
} else {
|
|
throw new NotFoundHttpException("Recommender doesn't exist");
|
|
}
|
|
}
|
|
|
|
public function renderRecommendersProducts(array $data): string
|
|
{
|
|
$recommender = $this->getRecommenderByLabel($data['label']);
|
|
try {
|
|
$productList = $this->getRecommendersProducts($data);
|
|
} catch (\Throwable $e) {
|
|
if (getAdminUser()) {
|
|
// show error to admin
|
|
return "Recommender \"{$data['label']}\" error: ".$e->getMessage();
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
if (findModule(\Modules::COMPONENTS)) {
|
|
return $this->twig->createTemplate('{{ component(name, data) }}')
|
|
->render([
|
|
'name' => 'ProductList',
|
|
'data' => [
|
|
'productList' => $productList,
|
|
'list_show' => $data['list_show'],
|
|
],
|
|
]);
|
|
}
|
|
|
|
$smarty = createSmarty(false, true);
|
|
$smarty->assign($data['data'] ?? '');
|
|
$smarty->assign('products', $productList);
|
|
$smarty->assign('recommender', $recommender);
|
|
if (isset($data['luigisbox'])) {
|
|
$smarty->assign('luigisbox', $data['luigisbox']);
|
|
$smarty->assign('lbx_recommender', $data['luigisbox']['response'][0]['recommender'] ?? null);
|
|
}
|
|
|
|
return $smarty->fetch($data['template'] ?? 'block.products.recommender.tpl');
|
|
}
|
|
}
|