vendor/bitbag/elasticsearch-plugin/src/PropertyBuilder/AttributeBuilder.php line 38

  1. <?php
  2. /*
  3.  * This file has been created by developers from BitBag.
  4.  * Feel free to contact us once you face any issues or want to start
  5.  * another great project.
  6.  * You can find more information about us on https://bitbag.io and write us
  7.  * an email on hello@bitbag.io.
  8.  */
  9. declare(strict_types=1);
  10. namespace BitBag\SyliusElasticsearchPlugin\PropertyBuilder;
  11. use BitBag\SyliusElasticsearchPlugin\Formatter\StringFormatterInterface;
  12. use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolverInterface;
  13. use Elastica\Document;
  14. use FOS\ElasticaBundle\Event\PostTransformEvent;
  15. use function sprintf;
  16. use Sylius\Component\Attribute\Model\AttributeInterface;
  17. use Sylius\Component\Core\Model\ProductInterface;
  18. use Sylius\Component\Product\Model\ProductAttributeValue;
  19. final class AttributeBuilder extends AbstractBuilder
  20. {
  21.     private ConcatedNameResolverInterface $attributeNameResolver;
  22.     private StringFormatterInterface $stringFormatter;
  23.     public function __construct(
  24.         ConcatedNameResolverInterface $attributeNameResolver,
  25.         StringFormatterInterface $stringFormatter
  26.     ) {
  27.         $this->attributeNameResolver $attributeNameResolver;
  28.         $this->stringFormatter $stringFormatter;
  29.     }
  30.     public function consumeEvent(PostTransformEvent $event): void
  31.     {
  32.         $this->buildProperty(
  33.             $event,
  34.             ProductInterface::class,
  35.             function (ProductInterface $productDocument $document): void {
  36.                 $this->resolveProductAttributes($product$document);
  37.             }
  38.         );
  39.     }
  40.     private function resolveProductAttributes(ProductInterface $productDocument $document): void
  41.     {
  42.         foreach ($product->getAttributes() as $productAttribute) {
  43.             $attribute $productAttribute->getAttribute();
  44.             if (!$attribute) {
  45.                 continue;
  46.             }
  47.             $this->processAttribute($attribute$productAttribute$document);
  48.         }
  49.     }
  50.     private function resolveProductAttribute(
  51.         array $attributeConfiguration,
  52.         $attributeValue,
  53.         ProductAttributeValue $productAttribute
  54.     ): array {
  55.         if ('select' === $productAttribute->getAttribute()->getType()) {
  56.             $choices $attributeConfiguration['choices'];
  57.             if (is_array($attributeValue)) {
  58.                 foreach ($attributeValue as $i => $item) {
  59.                     $attributeValue[$i] = $choices[$item][$productAttribute->getLocaleCode()] ?? $item;
  60.                 }
  61.             } else {
  62.                 $attributeValue $choices[$attributeValue][$productAttribute->getLocaleCode()] ?? $attributeValue;
  63.             }
  64.         }
  65.         $attributes = [];
  66.         if (is_array($attributeValue)) {
  67.             foreach ($attributeValue as $singleElement) {
  68.                 $attributes[] = $this->stringFormatter->formatToLowercaseWithoutSpaces((string) $singleElement);
  69.             }
  70.         } else {
  71.             $attributeValue is_string($attributeValue)
  72.                 ? $this->stringFormatter->formatToLowercaseWithoutSpaces($attributeValue) : $attributeValue;
  73.             $attributes[] = $attributeValue;
  74.         }
  75.         return $attributes;
  76.     }
  77.     private function processAttribute(
  78.         AttributeInterface $attribute,
  79.         ProductAttributeValue $productAttribute,
  80.         Document $document
  81.     ): void {
  82.         $attributeCode $attribute->getCode();
  83.         $attributeConfiguration $attribute->getConfiguration();
  84.         $value $productAttribute->getValue();
  85.         $documentKey $this->attributeNameResolver->resolvePropertyName($attributeCode);
  86.         $code sprintf('%s_%s'$documentKey$productAttribute->getLocaleCode());
  87.         $values $this->resolveProductAttribute(
  88.             $attributeConfiguration,
  89.             $value,
  90.             $productAttribute
  91.         );
  92.         $document->set($code$values);
  93.     }
  94. }