mFilter2 и кастомные таблицы

Вчера начал делать фильтрацию таблицы с фирмами на mFilter2. Сначало я создал файл кастомного класса:

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к записей, как вывести их в фильтр без диких тормозов и с выводом всех категорий и рубрик в фильтре?
Андрей Копп
30 июля 2016, 12:49
modx.pro
4
2 727
+1

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0