Files
kupshop/bundles/KupShop/RecommendersBundle/Util/RecommendersUtil.php
2025-08-02 16:30:27 +02:00

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');
}
}