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

Александр
Александр
1.7K
7
Александр Здравствуйте! Проблема в следующем, был расширен класс mFilter2, и создана отдельная таблица для фильтрации тв параметров, сделано всё было по руководству описанному Вами: https://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. Александр Мальцев
    Александр Мальцев
    03.10.2019, 03:02
    Привет!
    Нет точки с запятой в конце:
    parent::contsruct($modx,$config);
    
    Убирать это не нужно:
    $this->
    
    1. Александр
      Александр
      03.10.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
    2. Александр Мальцев
      Александр Мальцев
      03.10.2019, 03:35
      Ошибка в этой строчке:
      parent::contsruct($modx,$config);
      
      Наверно должно быть так:
      parent::__construct($modx,$config);
      
    3. Александр
      Александр
      03.10.2019, 03:49
      Александр, при таком раскладе, сайт грузиться но компонент не работает, аналогично тому как на скриншоте, ошибок сейчас нет, так же точно происходит, если я первый вариант скрипта ставлю
    4. Александр
      Александр
      03.10.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/');
      Честно говоря моло что понятно из этого, подскажите пожалуйста, каким образом реализовать то что он предложил?
    5. Александр Мальцев
      Александр Мальцев
      05.10.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 -> «Система и сервер».
    6. Александр
      Александр
      06.10.2019, 05:14
      Спасибо.