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

Александр
Александр
1,5K
7
Содержание:
  1. Комментарии
Александр Здравствуйте! Проблема в следующем, был расширен класс 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, тогда как правильно расписать схему и остальное?

Комментарии: 7

  1. Александр Мальцев
    Александр Мальцев
    2019-10-03 03:02:08
    Привет!
    Нет точки с запятой в конце:
    parent::contsruct($modx,$config);
    
    Убирать это не нужно:
    $this->
    
  1. Александр
    Александр
    2019-10-03 03:13:17
    Выходят такие ошибки:
    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
  • Александр Мальцев
    Александр Мальцев
    2019-10-03 03:35:03
    Ошибка в этой строчке:
    parent::contsruct($modx,$config);
    
    Наверно должно быть так:
    parent::__construct($modx,$config);
    
  • Александр
    Александр
    2019-10-03 03:49:51
    Александр, при таком раскладе, сайт грузиться но компонент не работает, аналогично тому как на скриншоте, ошибок сейчас нет, так же точно происходит, если я первый вариант скрипта ставлю
  • Александр
    Александр
    2019-10-03 20:45:03
    Александр, Добрый вечер! Честно говоря так и не получается решить проблему с работой сеофильтра, не как не заводиться старичок:)

    Получил ответ от автора:
    Можете вообще убрать весь блок конструктора.
    Я говорил проверить без подключения компонента — он возможно уже будет подключен, если нет,
    можно через системную настройку, принудительно грузить его в память, как минишоп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/');
    Честно говоря моло что понятно из этого, подскажите пожалуйста, каким образом реализовать то что он предложил?
  • Александр Мальцев
    Александр Мальцев
    2019-10-05 09:39:33
    Это про системный параметр 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 -> «Система и сервер».
  • Александр
    Александр
    2019-10-06 05:14:37
    Спасибо.