Как подключить в MODX свой компонент к SeoFilter?

Александр
681
0
Александр Здравствуйте! Проблема в следующем, был расширен класс mFilter2, и создана отдельная таблица для фильтрации тв параметров, сделано всё было по руководству описанному Вами: itchief.ru/questions/591 огромное спасибо, за это подробное и отличное решение. Но возникла второстепенная проблема так как значения находятся в новой таблице, SeoFilter не может с ними нормально работать, и без помощи, решить эту проблему не получается.

Написал автору компонента, он предложил такое решение, расширить класс подсчётов и при добавлении поля в сеофильтре указывать его: extendResource

Создать новый класс подсчётов по адресу core/components/seofilter/custom/count/customcount.class.php с содержимым:
<?php

class customCount extends sfCountHandler {
    
    public function getExtendResourceConditions($value = '', $field = array(),$includeWhere = 1) {
        $conditions = array();
        $conditions['join'] = array(
            'extendResource'=> array('class' => 'extendResource', 'on' => 'extendResource.resource = modResource.id')
        );
 
         if($includeWhere) {
            $conditions = array_merge($conditions, $this->getModResourceConditions($value, $field));
        }

        return $conditions;
    }
    
}

И прописать в системную настройку seofilter_count_handler_class значение customCount

Но не заработало:


Далее было предложено:
<?php

class customCount extends sfCountHandler {
    
    public function __construct(modX &$modx, array $config = array()) {
           parent::contsruct($modx,$config)
           $this->modx->addPackage('extendResource' ,$this->modx->getOption('core_path').'components/extendresource/model/');
    }
    
    public function getExtendResourceConditions($value = '', $field = array(),$includeWhere = 1) {
        $conditions = array();
        $conditions['join'] = array(
            'extendResource'=> array('class' => 'extendResource', 'on' => 'extendResource.resource = modResource.id')
        );
 
         if($includeWhere) {
            $conditions = array_merge($conditions, $this->getModResourceConditions($value, $field));
        }

        return $conditions;
    }
    
}

При таком вызове сайт не грузиться выходит ошибка:
Parse error: syntax error, unexpected '$this' (T_VARIABLE) in C:\core\components\seofilter\custom\count\customcount.class.php on line 7
Если убераю:
$this->
получаю:
Parse error: syntax error, unexpected '$modx' (T_VARIABLE) in C:\core\components\seofilter\custom\count\customcount.class.php on line 7

Александр возможно Вы увидите в чём проблема? Может нужно делать аналогично тому как был расширен класс mFilter2, тогда как правильно расписать схему и остальное?

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

  1. Александр Мальцев
    03 октября 2019, 03:02
    Привет!
    Нет точки с запятой в конце:
    parent::contsruct($modx,$config);
    
    Убирать это не нужно:
    $this->
    
    1. Александр
      03 октября 2019, 03:13
      Выходят такие ошибки:
      Fatal error: Uncaught Error: Call to undefined method sfCountHandler::contsruct() in C:\core\components\seofilter\custom\count\customcount.class.php:6 Stack trace: #0 C:\core\components\seofilter\model\seofilter\sfmenu.class.php(659): customCount->__construct(Object(modX), Array) #1 C:\core\components\seofilter\model\seofilter\sfmenu.class.php(672): sfMenu->loadHandler() #2 C:\core\components\seofilter\model\seofilter\sfmenu.class.php(193): sfMenu->countChildren(Array) #3 C:\core\cache\includes\elements\modsnippet\84.include.cache.php(46): sfMenu->getTree('', '42') #4 C:\core\model\modx\modscript.class.php(76): include('C:\\OpenServer\\d...') #5 C:\core\model\modx\modparser.class.php(537): modScript->process(NULL) #6 C:\core\components\pdotools\model\pdotools\pdoparser.class.php(273): modParser->processTag(Array, true in C:\core\components\seofilter\custom\count\customcount.class.php on line 6
      1. Александр Мальцев
        03 октября 2019, 03:35
        Ошибка в этой строчке:
        parent::contsruct($modx,$config);
        
        Наверно должно быть так:
        parent::__construct($modx,$config);
        
        1. Александр
          03 октября 2019, 20:45
          Александр, Добрый вечер! Честно говоря так и не получается решить проблему с работой сеофильтра, не как не заводиться старичок:)

          Получил ответ от автора:
          Можете вообще убрать весь блок конструктора.
          Я говорил проверить без подключения компонента — он возможно уже будет подключен, если нет,
          можно через системную настройку, принудительно грузить его в память, как минишоп2 грузится.
          Настройка в ключе содержит что то вроде packages или extensions.


          Блок с конструктором, если я его правильно понял то я убирал:
          public function __construct(modX &$modx, array $config = array()) {
                     parent::contsruct($modx,$config)
                     $this->modx->addPackage('extendResource' ,$this->modx->getOption('core_path').'components/extendresource/model/');
          Честно говоря моло что понятно из этого, подскажите пожалуйста, каким образом реализовать то что он предложил?
          1. Александр Мальцев
            05 октября 2019, 09:39
            Это про системный параметр extension_packages.
            Нужно его найти и добавить в него расширение extendresource:
            {"1":{"collections":{"path":"[[++core_path]]components/collections/model/"}},"2":{"tickets":{"path":"[[++core_path]]components/tickets/model/"}},"3":{"extendresource":{"path":"[[++core_path]]components/extendresource/model/"}}}
            
            Находится настройка extension_packages в разделе core -> «Система и сервер».
            1. Александр
              06 октября 2019, 05:14
              Спасибо.
          2. Александр
            03 октября 2019, 03:49
            Александр, при таком раскладе, сайт грузиться но компонент не работает, аналогично тому как на скриншоте, ошибок сейчас нет, так же точно происходит, если я первый вариант скрипта ставлю
      Войдите, пожайлуста, в аккаунт, чтобы оставить комментарий.