yaroslavbr
9/21/2016 - 12:52 PM

WebsiteSearchProductIndexerListener.php

<?php

namespace Oro\Bundle\ProductBundle\EventListener;

use Oro\Bundle\EntityBundle\ORM\DoctrineHelper;
use Oro\Bundle\LocaleBundle\Helper\LocalizationHelper;
use Oro\Bundle\ProductBundle\Entity\Product;
use Oro\Bundle\SearchBundle\Query\Query;
use Oro\Bundle\WebsiteSearchBundle\Event\IndexEntityEvent;
use Oro\Bundle\WebsiteSearchBundle\Helper\FieldHelper;

class WebsiteSearchProductIndexerListener
{
    /**
     * @var LocalizationHelper
     */
    private $localizationHelper;

    /**
     * @var FieldHelper
     */
    private $fieldHelper;

    /**
     * @param DoctrineHelper $doctrineHelper
     * @param LocalizationHelper $localizationHelper
     * @param FieldHelper $fieldHelper
     */
    public function __construct(
        DoctrineHelper $doctrineHelper,
        LocalizationHelper $localizationHelper,
        FieldHelper $fieldHelper
    ) {
        $this->productRepository = $doctrineHelper->getEntityRepositoryForClass(Product::class);
        $this->localizationHelper = $localizationHelper;
        $this->fieldHelper = $fieldHelper;
    }

    /**
     * @param IndexEntityEvent $event
     */
    public function onWebsiteSearchIndex(IndexEntityEvent $event)
    {
        $entityClass = $event->getEntityClass();

        if (!is_a($entityClass, Product::class, true)) {
            return;
        }

        /** @var Product[] $products */
        $products = $event->getEntities();

        $localizations = $this->localizationHelper->getLocalizations();

        foreach ($products as $product) {
            // Non localized fields
            $event->addField(
                $product->getId(),
                Query::TYPE_TEXT,
                'sku',
                $product->getSku()
            );
            $event->addField(
                $product->getId(),
                Query::TYPE_TEXT,
                'status',
                $product->getStatus()
            );
            $event->addField(
                $product->getId(),
                Query::TYPE_TEXT,
                'inventory_status',
                $product->getInventoryStatus()->getId()
            );

            // Localized fields
            foreach ($localizations as $localization) {
                $strippedDescription = $this->fieldHelper->stripTagsAndSpaces($product->getDescription($localization));
                $strippedShortDescription = $this->fieldHelper->stripTagsAndSpaces(
                    $product->getShortDescription($localization)
                );

                $localizedFields = [
                    'title' => $product->getName($localization),
                    'description' => $strippedDescription,
                    'short_desc' => $strippedShortDescription
                ];

                foreach ($localizedFields as $fieldName => $fieldValue) {
                    $event->addField(
                        $product->getId(),
                        Query::TYPE_TEXT,
                        sprintf('%s_%s', $fieldName, $localization->getId()),
                        $fieldValue
                    );
                }

                // All text field
                $event->addField(
                    $product->getId(),
                    Query::TYPE_TEXT,
                    sprintf('all_text_%s', $localization->getId()),
                    implode(' ', $localizedFields)
                );
            }
        }
    }
}