src/AppBundle/EventListeners/SearchDataImprover.php line 17

Open in your IDE?
  1. <?php
  2. namespace AppBundle\EventListeners;
  3. use Pimcore\Event\Model\SearchBackendEvent;
  4. use Pimcore\Model\DataObject\AbstractObject;
  5. use Pimcore\Model\DataObject\Product;
  6. use Pimcore\Model\Search\Backend\Data;
  7. class SearchDataImprover
  8. {
  9.     /**
  10.      * @param SearchBackendEvent $e
  11.      */
  12.     public function improveData(SearchBackendEvent $e)
  13.     {
  14.         /** @var Data $element */
  15.         $element $e->getData();
  16.         if ($element->getType() === 'object' && $element->getSubtype() === 'Product') {
  17.             $data $this->getImprovedData($element);
  18.             if ($data) {
  19.                 $element->data $data;
  20.             }
  21.         }
  22.     }
  23.     /**
  24.      * @param Data $element
  25.      * @return string|void
  26.      */
  27.     protected function getImprovedData(Data $element)
  28.     {
  29.         $product Product::getById($element->getId()->getId());
  30.         if (!$product) {
  31.             return;
  32.         }
  33.         $data '';
  34.         $getInheritedValues AbstractObject::doGetInheritedValues();
  35.         AbstractObject::setGetInheritedValues(true);
  36.         foreach ($product->getClass()->getFieldDefinitions() as $key => $value) {
  37.             $data .= ' ' $value->getDataForSearchIndex($product);
  38.         }
  39.         AbstractObject::setGetInheritedValues($getInheritedValues);
  40.         // replace all occurrences of @ to # because when using InnoDB @ is reserved for the @distance operator
  41.         $data str_replace('@''#'$data);
  42.         $pathWords str_replace(['-''_''/''.''('')'], ' '$element->getFullPath());
  43.         $data .= ' ' $pathWords;
  44.         return 'ID: ' $product->getId() . "  \nPath: " $element->getFullPath() . "  \n" $this->cleanupData($data);
  45.     }
  46.     /**
  47.      * @param $data
  48.      * @return string
  49.      */
  50.     protected function cleanupData($data)
  51.     {
  52.         $data html_entity_decode($dataENT_QUOTES'UTF-8');
  53.         // we don't remove ".", otherwise it would be impossible to search for email addresses
  54.         $data str_replace([','':'';'"'"'"'], ' '$data);
  55.         $data str_replace("\r\n"' '$data);
  56.         $data str_replace("\n"' '$data);
  57.         $data str_replace("\r"' '$data);
  58.         $data str_replace("\t"''$data);
  59.         $data preg_replace('#[ ]+#'' '$data);
  60.         // deduplication
  61.         $arr explode(' '$data);
  62.         $arr array_unique($arr);
  63.         $data implode(' '$arr);
  64.         return $data;
  65.     }
  66. }