<?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\WebsiteSearchBundle\Event\IndexEntityEvent;
class WebsiteSearchProductIndexerListener
{
/**
* @var LocalizationHelper
*/
private $localizationHelper;
/**
* @param DoctrineHelper $doctrineHelper
* @param LocalizationHelper $localizationHelper
*/
public function __construct(
DoctrineHelper $doctrineHelper,
LocalizationHelper $localizationHelper
) {
$this->productRepository = $doctrineHelper->getEntityRepositoryForClass(Product::class);
$this->localizationHelper = $localizationHelper;
}
/**
* @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(),
'sku',
$product->getSku()
);
$event->addField(
$product->getId(),
'status',
$product->getStatus()
);
$event->addField(
$product->getId(),
'inventory_status',
$product->getInventoryStatus()->getId()
);
// Localized fields
foreach ($localizations as $localization) {
$localizedFields = [
'title' => $product->getName($localization),
'description' => $product->getDescription($localization),
'short_desc' => $product->getShortDescription($localization)
];
foreach ($localizedFields as $fieldName => $fieldValue) {
$event->addLocalizedField(
$product->getId(),
$fieldName,
$fieldValue,
$localization->getId()
);
}
$allLocalizedTexts = array_merge($localizedFields, ['sku' => $product->getSku()]);
// All text field
$event->addAllTextField(
$product->getId(),
$allLocalizedTexts,
$localization->getId()
);
}
}
}
}