Вопрос по mFilter2. Фильтрация кастомных таблиц

Не получается подключить фильтрацию ресурсов из своих обьектов. Везде в документации используются либо modResource, либо msProducts, вкупе с miniShop. Мне нужно всего навсего подключить фильтрацию по своему полю своих xpdo обьектов.

[[!mFilter2?
                    			&loadModels=`thailand_phuket_rent`
                                        &class=`ThailandPhuketRent`
                                        &element=`pdoResources`
                                        &tpl=`catalog_villa_tpl`
                                        &where=`{"resource_id":"[[*id]]"}`
                                        &filters=`
                                            phuketrent|bedroom:default
                                        `
                                        &showLog=`1`
  ]]
Унаследовался от класса обработчика фильтра, и прописал метод получения моих объектов

class customFilter extends mse2FiltersHandler {

    	/**
	 * Retrieves values from ThailandPhuketRent table
	 *
	 * @param array $fields Names of resource fields
	 * @param array $ids Ids of needed resources
	 *
	 * @return array Array with resource fields as keys and resources ids as values
	 */
	public function getPhuketRentValues(array $fields, array $ids) {
		$filters = array();
		$no_id = false;
		if (!in_array('id', $fields)) {
			$fields[] = 'id';
			$no_id = true;
		}
		$q = $this->modx->newQuery('ThailandPhuketRent');
		$q->select(implode(',', $fields));
		$q->where(array('ThailandPhuketRent.id:IN' => $ids));
		$tstart = microtime(true);
		if ($q->prepare() && $q->stmt->execute()) {
			$this->modx->queryTime += microtime(true) - $tstart;
			$this->modx->executedQueries++;
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				foreach ($row as $k => $v) {
					$v = trim($v);
					if ($k == 'category_id') {
						if ($row['parent'] == $v) {continue;}
						else {$k = 'parent';}
					}
					if ($v == '' || ($k == 'id' && $no_id)) {
						continue;
					}
					elseif (isset($filters[$k][$v])) {
						$filters[$k][$v][] = $row['id'];
					}
					else {
						$filters[$k][$v] = array($row['id']);
					}
				}
			}
		}
		else {
			$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: ".$q->toSql()."\nResponse: ".print_r($q->stmt->errorInfo(),1));
		}

		return $filters;
	}
Обьекты выводятся, фильтр выводится, при фильтрации список перезагружается но фильтр не применяется.

в логе следующие ошибки

[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) Could not load class: ThailandPhuketRent from mysql.thailandphuketrent.
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) Could not load class 
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) Could not load class !
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
[2015-03-13 00:02:31] (ERROR @ /assets/components/msearch2/action.php) [mSearch2] Error on get filter params.
Query: SELECT `bedroom`, `id` FROM WHERE `ThailandPhuketRent`.`id` IN ('163','219','217','215','213','211','209','207','205','221','223','239','237','235','233','231','229','227','225','203','201','179','177','175','173','171','169','167','165','181','183','199','197','195','193','191','189','187','185','241','243','299','297','295','293','291','289','287','285','301','303','319','317','315','313','311','309','307','305','283','281','259','257','255','253','251','249','247','245','261','263','279','277','275','273','271','269','267','265','321','161','1','57','55','53','51','49','47','45','43','59','61','77','75','73','71','69','67','65','63','41','39','17','15','13','11','9','7','5','3','19','21','37','35','33','31','29','27','25','23','79','81','137','135','133','131','129','127','125','123','139','141','157','155','153','151','149','147','145','143','121','119','97','95','93','91','89','87','85','83','99','101','117','115','113','111','109','107','105','103','159') 
Response: Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `ThailandPhuketRent`.`id` IN ('163','219','217','215','213','211','209','20' at line 1
)
Где то не определен класс, но почему не пойму.
Нигде не видел мануала по подключению mFilter к своим таблицам. Подскажите плз куда копать.
kuzmin6969
12 марта 2015, 17:26
modx.pro
2
3 247
0

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

Василий Столейков
03 февраля 2016, 19:44
0
Получилось тогда решить вашу проблему? У меня точно такая же! И точно те же ошибки сыпятся в логи.
Что ещё нужно было для реализации?
    Василий Столейков
    03 февраля 2016, 19:46
    0
    Те же самые ошибки и у меня:
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) Could not load class 
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) Could not load class !
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) No class specified for loadClass
    [2016-02-03 18:37:50] (ERROR @ /assets/components/msearch2/action.php) [mSearch2] Error on get filter params.
    Query: SELECT `id`, `export_country`, `export_city`, `import_country`, `import_city`, `cargo_type`, `cargo_volume`, `date_from`, `transport_type` FROM WHERE ``.`id` IN ('1','7','6','4','5','3','2','8','9','10') 
    Response: Array
    (
        [0] => 42000
        [1] => 1064
        [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ``.`id` IN ('1','7','6','4','5','3','2','8','9','10')' at line 1
    )
      kuzmin6969
      03 февраля 2016, 19:55
      1
      +1
      Попробую вам помочь.
      уже не помню почему но нужно писать обертку для pdoResources, в моем случае написал сниппет
      thaiPdoResources
      <?php
      $resources = $modx->getOption('resources', $scriptProperties, '');
      
      if(!empty($resources)) {
          if(!empty($scriptProperties['where'])) {
              $where = (array) json_decode($scriptProperties['where']);
              $where["id:IN"] = explode(',',$resources);
              $scriptProperties['where'] = json_encode($where);
          } else {
              $scriptProperties['where'] = '{"id:IN":['.$resources.']}';
          }
      }
      
      return $modx->runSnippet('pdoResources', $scriptProperties);
      Вот такого вида.
      И вызывать вот так mFilter2
      [[!mFilter2?
              &loadModels=`thailand_phuket_rent`
              &class=`ThailandPhuketRent`
              &element=`thaiPdoResources`
      	...
      пробуйте, отпишитесь
      Если не поможет поищу еще…
        Василий Столейков
        03 февраля 2016, 20:20
        0
        Классно, круто! Спасибо за помощь, друг — выручил!
        Обёртка помогла для правильной фильтрации результатов — правда ещё не разобрался почему так долго зависает, строк в таблице 10 штук тестовых, а фильтрует как будто там 10 тысяч…
        kuzmin6969
        03 февраля 2016, 19:59
        +1
        Ах да, то что я написал вам важное, но не самое главное))

        В своем обработчике фильтра надо вручную загрузить модели классов, иначе modx просто не может их найти
        пропишите в конструкторе фильтра вызовы для своих моделей addPackage(tablename, model_path).
        Вот пример как у меня:

        <?php
        class customFilter extends mse2FiltersHandler {
            
            function __construct(mSearch2 &$mse2,array $config = array()) {
                parent::__construct($mse2, $config);
                $this->modx->addPackage('thailand_phuket_sale' ,MODX_CORE_PATH.'components/thailand_phuket_sale/model/');
                $this->modx->addPackage('thailand_phuket_rent' ,MODX_CORE_PATH.'components/thailand_phuket_rent/model/');
                $this->modx->addPackage('thailand_samui_rent' ,MODX_CORE_PATH.'components/thailand_samui_rent/model/');
                $this->modx->addPackage('thailand_bali_rent' ,MODX_CORE_PATH.'components/thailand_bali_rent/model/');
                $this->modx->addPackage('thailand_phuket_tours' ,MODX_CORE_PATH.'components/thailand_phuket_tours/model/');
                $this->modx->addPackage('thailand_phuket_land' ,MODX_CORE_PATH.'components/thailand_phuket_land/model/');
            }
        Может быть можно в другом месте эти зависимости загрузить, но я сделал так.
        После этого modx будет знать как общаться с вашей таблицей.
          Василий Столейков
          03 февраля 2016, 20:21
          0
          Я думал о чём-то таком, но не додумал до конца! Спасибо за подсказку — ошибки исчезли, всё работает!
            kuzmin6969
            03 февраля 2016, 20:22
            +1
            Отлично) Пришло время и мне кому-то помочь, а год назад приходилось самому до посинения разбираться
              Василий Столейков
              03 февраля 2016, 20:25
              0
              Ага, и я потратил с этим 2 битых дня… Спасибо что спас от новых набитых шишек…
              Да и эти наши комментарии — они же часть документации, которая пишется нами в дополнение к стандартной — будет откуда вспомнить если снова нужно будет делать когда-то, или другим кто только начинает…
            Андрей Копп
            29 июля 2016, 22:17
            0
            В своем обработчике фильтра надо вручную загрузить модели классов
            Подскажите это в каком файле? Вот я создал core/components/msearch2/custom/filters/custom.class.php а куда его подключить, чтобы заработало?
        Александр
        29 сентября 2019, 21:47
        0
        Возможно кто-то будет искать информацию как создать свою таблицу и фильтровать по ней с помощью mFilter2 информации в сети по этой теме 0, мне очень помог этот способ, описанный Александром: itchief.ru/questions/591
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          10