Как использовать свои поля в поиске mSearch2

Александр
793
1
Александр, здравствуйте! С наступающим Вас! Пробую подключить свои поля в данном случае поле (poletest) в поиске «mSearch2», в вызове сниппета «mSearchForm» сделал так:
[[!mSearchForm?
&loadModels=`extendresource`
&leftJoin=`{
  "extendresource": {
      
      "class": "extendResource",
      "alias": "extFields",
      "on": "extFields.resource = modResource.id"
     
    }
  }`
  &select=`{"extFields": "extFields.poletest as poletest"
  }`  
]]
далее в чанк tpl.mSearch2.ac добавил это поле, так получилось вывести значения своего поля в предварительных результатах формы поиска «mSearch2» которые появляются на лету при вводе запроса в форме поиска, но в поиске свои поля не участвуют, как нужно и можно сделать, чтобы свои поля компонента extendresource участвовали в поиске, подскажите пожалуйста?

Комментарии ()

  1. Александр Мальцев
    04 января 2021, 13:11
    Здравствуйте! С новым годом!
    Чтобы их добавить в индекс нужно создать плагин для прослушивания события mse2OnBeforeSearchIndex:
    <?php
    switch ($modx->event->name) {
       case 'mse2OnBeforeSearchIndex':
          $key = 'poletest';
          $modx->addPackage('extendresource', $modx->getOption('core_path').'components/extendresource/model/');     
          $mSearch2->fields[$key] = 5;
          $c = $modx->newQuery('extendResource', array(
            'resource' => $resource->id
          ));
          $c->select('poletest');
          if ($c->prepare() && $c->stmt->execute()) {
            $value = $c->stmt->fetchAll(PDO::FETCH_COLUMN);
            if (!empty($value[0])) {
              $resource->set($key, $value);
            }
          }
          break;
    }
    
    1. Александр
      05 января 2021, 17:44
      Здравствуйте! Александр, огромное спасибо за решение. Пытаюсь добавить второе поле, в этих параметрах плагина:
      $key = 'poletest, poletest2';
      $c->select('poletest, poletest2');
      ошибок нет, но не работает, видимо делаю не правильно?
      1. Александр Мальцев
        24 января 2021, 09:12
        Здравствуйте! Пожалуйста!
        В этом случае плагин можно организовать следующим образом (в key указываем имя поля, а в weight — его вес):
        <?php
        switch ($modx->event->name) {
           case 'mse2OnBeforeSearchIndex':
              $modx->addPackage('extendresource', $modx->getOption('core_path').'components/extendresource/model/'); 
              $fields = [
                ['key' => 'poletest', 'weight' => 5],
                ['key' => 'poletest2', 'weight' => 5]      
              ];
              foreach ($fields as $field) {
                $key = $field['key'];
                $weight = $field['weight'];
                $mSearch2->fields[$key] = $weight;
                $c = $modx->newQuery('extendResource', array(
                  'resource' => $resource->id
                ));
                $c->select($key);
                if ($c->prepare() && $c->stmt->execute()) {
                  $value = $c->stmt->fetchAll(PDO::FETCH_COLUMN);
                  if (!empty($value[0])) {
                    $resource->set($key, $value);
                  }
                }
              }
              break;
        }
        1. Александр
          05 февраля 2021, 23:11
          Александр, здравствуйте! Большое спасибо.
    Войдите, пожайлуста, в аккаунт, чтобы оставить комментарий.