<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Elasticsearch\PropertyBuilder;
use BitBag\OpenMarketplace\Component\Product\Entity\ProductInterface;
use BitBag\OpenMarketplace\Component\Taxonomy\Entity\TaxonInterface;
use BitBag\SyliusElasticsearchPlugin\PropertyBuilder\AbstractBuilder;
use Elastica\Document;
use FOS\ElasticaBundle\Event\PostTransformEvent;
use Sylius\Component\Core\Model\ProductTaxonInterface;
use Sylius\Component\Locale\Provider\LocaleProviderInterface;
final class CategoriesPropertyBuilder extends AbstractBuilder
{
public function __construct(
private LocaleProviderInterface $localeProvider,
private string $categoriesProperty,
) {
}
public function consumeEvent(PostTransformEvent $event): void
{
$locales = $this->localeProvider->getAvailableLocalesCodes();
$this->buildProperty(
$event,
ProductInterface::class,
function (ProductInterface $product, Document $document) use ($locales): void {
foreach ($locales as $localeCode) {
$document->set(
$this->resolvePropertyName($localeCode),
$this->resolveCategories($product, $localeCode),
);
}
}
);
}
private function resolvePropertyName(string $localeCode): string
{
return sprintf('%s_%s', $this->categoriesProperty, $localeCode);
}
private function resolveCategories(ProductInterface $product, string $localeCode): array
{
$categories = [];
/** @var ProductTaxonInterface $productTaxon */
foreach ($product->getProductTaxons() as $productTaxon) {
$taxon = $productTaxon->getTaxon();
if (!$taxon instanceof TaxonInterface) {
continue;
}
$name = $taxon->getTranslation($localeCode)->getName();
if (null === $name) {
continue;
}
$categories[] = $name;
}
return $categories;
}
}