Вопрос по mFilter2. Фильтрация кастомных таблиц
Не получается подключить фильтрацию ресурсов из своих обьектов. Везде в документации используются либо modResource, либо msProducts, вкупе с miniShop. Мне нужно всего навсего подключить фильтрацию по своему полю своих xpdo обьектов.
в логе следующие ошибки
Нигде не видел мануала по подключению mFilter к своим таблицам. Подскажите плз куда копать.
[[!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 к своим таблицам. Подскажите плз куда копать.
Комментарии: 10
Получилось тогда решить вашу проблему? У меня точно такая же! И точно те же ошибки сыпятся в логи.
Что ещё нужно было для реализации?
Что ещё нужно было для реализации?
Те же самые ошибки и у меня:
[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
)
Попробую вам помочь.
уже не помню почему но нужно писать обертку для pdoResources, в моем случае написал сниппет
thaiPdoResources
И вызывать вот так mFilter2
Если не поможет поищу еще…
уже не помню почему но нужно писать обертку для 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`
...
пробуйте, отпишитесьЕсли не поможет поищу еще…
Классно, круто! Спасибо за помощь, друг — выручил!
Обёртка помогла для правильной фильтрации результатов — правда ещё не разобрался почему так долго зависает, строк в таблице 10 штук тестовых, а фильтрует как будто там 10 тысяч…
Обёртка помогла для правильной фильтрации результатов — правда ещё не разобрался почему так долго зависает, строк в таблице 10 штук тестовых, а фильтрует как будто там 10 тысяч…
Ах да, то что я написал вам важное, но не самое главное))
В своем обработчике фильтра надо вручную загрузить модели классов, иначе modx просто не может их найти
пропишите в конструкторе фильтра вызовы для своих моделей addPackage(tablename, model_path).
Вот пример как у меня:
После этого modx будет знать как общаться с вашей таблицей.
В своем обработчике фильтра надо вручную загрузить модели классов, иначе 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 будет знать как общаться с вашей таблицей.
Я думал о чём-то таком, но не додумал до конца! Спасибо за подсказку — ошибки исчезли, всё работает!
Отлично) Пришло время и мне кому-то помочь, а год назад приходилось самому до посинения разбираться
Ага, и я потратил с этим 2 битых дня… Спасибо что спас от новых набитых шишек…
Да и эти наши комментарии — они же часть документации, которая пишется нами в дополнение к стандартной — будет откуда вспомнить если снова нужно будет делать когда-то, или другим кто только начинает…
Да и эти наши комментарии — они же часть документации, которая пишется нами в дополнение к стандартной — будет откуда вспомнить если снова нужно будет делать когда-то, или другим кто только начинает…
В своем обработчике фильтра надо вручную загрузить модели классовПодскажите это в каком файле? Вот я создал core/components/msearch2/custom/filters/custom.class.php а куда его подключить, чтобы заработало?
Возможно кто-то будет искать информацию как создать свою таблицу и фильтровать по ней с помощью mFilter2 информации в сети по этой теме 0, мне очень помог этот способ, описанный Александром: itchief.ru/questions/591
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.