mFilter2 и кастомные таблицы
Вчера начал делать фильтрацию таблицы с фирмами на mFilter2. Сначало я создал файл кастомного класса:
core/components/msearch2/custom/filters/custom.class.php со следующим содержимым:
Потом в Системных настройках mse2_filters_handler_class поставил класс своего обработчика CustomFilter.
Далее создал сниппет-обёртку sPromoPdoResources:
1. Дублируется запись первая и пагинация криво работает. Как это исправить?
2. Не могу заставить коректно работать подгрузку стран-регионов-городов. На странице haubau.pro/board/add/ работает эта подгрузка нормально.
3. В базе находится 250к записей, как вывести их в фильтр без диких тормозов и с выводом всех категорий и рубрик в фильтре?
core/components/msearch2/custom/filters/custom.class.php со следующим содержимым:
<?php
class CustomFilter extends mse2FiltersHandler {
function __construct(mSearch2 &$mse2,array $config = array()) {
parent::__construct($mse2, $config);
$this->modx->addPackage('spromo' ,MODX_CORE_PATH.'components/spromo/model/');
$this->modx->addPackage('gl' ,MODX_CORE_PATH.'components/gl/model/');
$this->modx->addPackage('voteforms' ,MODX_CORE_PATH.'components/voteforms/model/');
}
public function getSpromoCompaniesValues(array $fields, array $ids) {
$filters = array();
$no_id = false;
if (!in_array('id', $fields)) {
$fields[] = 'id';
$no_id = true;
}
$q = $this->modx->newQuery('SpromoCompanies');
$q->select(implode(',', $fields));
$q->where(array('SpromoCompanies.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;
}
}
Потом в Системных настройках mse2_filters_handler_class поставил класс своего обработчика CustomFilter.
Далее создал сниппет-обёртку sPromoPdoResources:
<?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);
Вывожу фильтр на странице тестовой по разделу ДСП / ДВП / Фанера haubau.pro/catalog/country/<div class="row">
[[!mFilter2?
&loadModels=`voteforms,spromo,gl`
&class=`SpromoCompanies`
&element=`sPromoPdoResources`
&tplOuter=`tpl.mFilter2.outer.firm`
&tpl=`tpl.sPromo.firms`
&tplFilter.outer.country=`tpl.mFilter2.filter.select.country`
&tplFilter.row.country=`tpl.mFilter2.filter.option.country`
&tplFilter.outer.region=`tpl.mFilter2.filter.select.region`
&tplFilter.row.region=`tpl.mFilter2.filter.option.region`
&tplFilter.outer.city=`tpl.mFilter2.filter.select.city`
&tplFilter.row.city=`tpl.mFilter2.filter.option.city`
&tplFilter.outer.infix=`tpl.mFilter2.filter.select.boolean`
&tplFilter.row.infix=`tpl.mFilter2.filter.option`
&tplFilter.outer.top1=`tpl.mFilter2.filter.select.boolean`
&tplFilter.row.top1=`tpl.mFilter2.filter.option`
&tplFilter.outer.top5=`tpl.mFilter2.filter.select.boolean`
&tplFilter.row.top5=`tpl.mFilter2.filter.option`
&tplFilter.outer.pro=`tpl.mFilter2.filter.select.boolean`
&tplFilter.row.pro=`tpl.mFilter2.filter.option`
&where=`{"section":"100"}`
&aliases=`
spromocompanies|country==country,
spromocompanies|region==region,
spromocompanies|city==city,
spromocompanies|subsection==subsection,
spromocompanies|section==section,
spromocompanies|infix==infix,
spromocompanies|top1==top1,
spromocompanies|top5==top5,
spromocompanies|pro==pro
`
&filters=`
spromocompanies|country:default,
spromocompanies|region:default,
spromocompanies|city:default,
spromocompanies|subsection:categories,
spromocompanies|section:categories,
spromocompanies|infix:boolean,
spromocompanies|top1:boolean,
spromocompanies|top5:boolean,
spromocompanies|pro:boolean
`
&leftJoin=`{
"VoteFormThread": {
"class": "VoteFormThread",
"on": "SpromoCompanies.id = VoteFormThread.resource AND VoteFormThread.form = 1"
},
"glCountry": {
"class": "glCountry",
"on": "SpromoCompanies.country = glCountry.iso"
},
"glRegion": {
"class": "glRegion",
"on": "SpromoCompanies.region = glRegion.id"
},
"glCity": {
"class": "glCity",
"on": "SpromoCompanies.city = glCity.id"
}
}`
&select=`{
"SpromoCompanies": "*",
"VoteFormThread": "VoteFormThread.rating AS rating, VoteFormThread.users_count AS totalVoted",
"glCountry": "glCountry.id AS country_id, glCountry.name_ru AS country_ru, glCountry.name_en AS country_en",
"glRegion": "glRegion.id AS region_id, glRegion.name_ru AS region_ru, glRegion.name_en AS region_en",
"glCity": "glCity.id AS city_id, glCity.name_ru AS city_ru, glCity.name_en AS city_en"
}`
&showLog=`0`
]]
<br /><br />
[[$tpl.HAUBAU.PRO.rightside]]
</div>
Возникло сразу несколько вопросов:1. Дублируется запись первая и пагинация криво работает. Как это исправить?
2. Не могу заставить коректно работать подгрузку стран-регионов-городов. На странице haubau.pro/board/add/ работает эта подгрузка нормально.
3. В базе находится 250к записей, как вывести их в фильтр без диких тормозов и с выводом всех категорий и рубрик в фильтре?