Расширяем класс фильтрации
Все стандартные фильтры mSearch2 находятся в файле /core/components/msearch2/model/msearch2/filters.class.php. Нам нужно унаследовать его, расширить и указать новый класс в системных настройках.
Создаём новый файл в /core/components/msearch2/custom/filters/custom.class.php и пишем в него:
<?php
class myCustomFilter extends mse2FiltersHandler {}
Указывем его в системной настройке mse2_filters_handler_class.
С этого момента mSearch2 использует для работы ваш класс фильтрации, в котором вы можете писать новые методы, или переопределять стандартные.
Для получения данных используются методы getИмяМетодаValues(), для подготовки фильтра — buildИмяМетодаFilter(), а для фильтрации filterИмяМетода. Можно посмотреть, как работают эти 3 типа методов в filters.class.php.
И прописать исправленный метод getTvValues в классе myCustomFilter.
<?php
class myCustomFilter extends mse2FiltersHandler {
/**
* Retrieves values from Template Variables table
*
* @param array $tvs Names of tvs
* @param array $ids Ids of needed resources
*
* @return array Array with tvs values as keys and resources ids as values
*/
public function getTvValues(array $tvs, array $ids) {
$filters = array();
$q = $this->modx->newQuery('modResource', array('modResource.id:IN' => $ids));
$q->leftJoin('modTemplateVarTemplate', 'TemplateVarTemplate',
'TemplateVarTemplate.tmplvarid IN (SELECT id FROM ' . $this->modx->getTableName('modTemplateVar') . ' WHERE name IN ("' . implode('","', $tvs) . '") )
AND modResource.template = TemplateVarTemplate.templateid'
);
$q->leftJoin('modTemplateVar', 'TemplateVar', 'TemplateVarTemplate.tmplvarid = TemplateVar.id');
$q->leftJoin('modTemplateVarResource', 'TemplateVarResource', 'TemplateVarResource.tmplvarid = TemplateVar.id AND TemplateVarResource.contentid = modResource.id');
$q->select('TemplateVar.name, TemplateVarResource.contentid as id, TemplateVarResource.value, TemplateVar.type, TemplateVar.default_text');
$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)) {
if (empty($row['id'])) {
continue;
}
elseif (is_null($row['value']) || trim($row['value']) == '') {
$row['value'] = $row['default_text'];
}
if ($row['type'] == 'tag' || $row['type'] == 'autotag') {
$row['value'] = str_replace(',', '||', $row['value']);
}
$tmp = strpos($row['value'], '||') !== false
? explode('||', $row['value'])
: array($row['value']);
foreach ($tmp as $v) {
$v = str_replace('"', '"', trim($v));
if ($v == '') {
continue;
}
$name = strtolower($row['name']);
if($name == 'ten-long') $v=(int)$v;
if (isset($filters[$name][$v])) {
$filters[$name][$v][$row['id']] = $row['id'];
}
else {
$filters[$name][$v] = array($row['id'] => $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;
}
}
Сколько использовал тупняков при виборке из базы не замечал. В пределах секунды грузиться.
Если устроит, то напишу как использовать.
ИИ круто и в будущем поможет снять часть рутины, но уметь правильно ему вопросы задавать мешает. Вообще хотелось бы чтоб был в контексте твоих задач и понимал с полуслова :-)
Нет.
Пока в планах. Но насколько я смотрел там ничего сложного нет. Просто немного переписать js SeoFillter.
Ну он не будет ничего загружать на мой хостинг и соответственно место не будет занимать. А к чему вопрос?
надо
Тогда примерно так:
И прописать исправленный метод getTvValues в классе myCustomFilter.
попробуйте для теста в core\components\msearch2\model\msearch2\filters.class.php после 74 строки дописать
https://disk.yandex.ru/i/eU3jzbcssEOc8w
А тебе зачем дату?
Или что-то другое надо?