Collections: фильтрация ресурсов в админке по tv
Используется компонент Collections для вывода списка ресурсов в админке (разбиение на категории).
Необходимо внутри коллекции добавить фильтрацию по ТВ параметрам ресурсов, т.е. там где в коллекции Поиск по ресурсам, фильтр «Опубликован/нет...», вот там нужен ещё фильтр по определённым, заранее подготовленным ТВ.
Как это можно сделать, есть какой-нибудь мануал? В инете не смог найти ничего.
Необходимо внутри коллекции добавить фильтрацию по ТВ параметрам ресурсов, т.е. там где в коллекции Поиск по ресурсам, фильтр «Опубликован/нет...», вот там нужен ещё фильтр по определённым, заранее подготовленным ТВ.
Как это можно сделать, есть какой-нибудь мануал? В инете не смог найти ничего.
Комментарии: 2
Подниму тему, реально ли в этом компоненте сделать фильтрацию по tv? Куда копать хоть подскажите… Знающие люди…
Для себя сделал так:
core/components/collections/processors/mgr/resource/getlist.class.php:
Также можете в
assets/components/collections/css/mgr.css по селектору ".ext-strict #collections-child-search"
… сделать себе ширину поля поиска пошире, чтобы можно было удобно и много писать.
А также если пишите запрос без подстроки "=", то фильтрация происходит среди «всего» — как и раньше.
core/components/collections/processors/mgr/resource/getlist.class.php:
public function prepareQueryBeforeCount(xPDOQuery $c)
{
$parent = $this->getProperty('parent', null);
$c->where(array(
'parent' => $parent,
));
$query = $this->getProperty('query', null);
if (!empty($query)) {
$c->leftJoin('modUserProfile', 'CreatedByProfile', array('CreatedByProfile.internalKey = modResource.createdby'));
$c->leftJoin('modUser', 'CreatedBy');
if (strpos($query, '=') !== false) {
$queryWhere = array(
'pagetitle:LIKE' => '%######%',
);
parse_str($query, $outputTvs);
foreach($outputTvs as $tvName => $tvValue) {
if (is_array($tvValue)) {
foreach($tvValue as $tvNameIsArray => $tvValueIsArray) {
array_push($queryWhere, array(
'OR:TemplateVarResources_' . $tvName . '.value:LIKE' => '%' . $tvValueIsArray . '%',
));
}
}
else {
array_push($queryWhere, array(
'OR:TemplateVarResources_' . $tvName . '.value:LIKE' => '%' . $tvValue . '%',
));
}
}
} else {
if ($this->searchQueryTitleOnly) {
$queryWhere = array(
'pagetitle:LIKE' => '%' . $query . '%',
);
} else {
$queryWhere = array(
'pagetitle:LIKE' => '%' . $query . '%',
'OR:description:LIKE' => '%' . $query . '%',
'OR:alias:LIKE' => '%' . $query . '%',
'OR:introtext:LIKE' => '%' . $query . '%',
'OR:CreatedByProfile.fullname:LIKE' => '%' . $query . '%',
'OR:CreatedBy.username:LIKE' => '%' . $query . '%',
);
}
if ($this->searchQueryExcludeTvs == false) {
// tv columns search rules
foreach ($this->tvColumns as $column) {
array_push($queryWhere, array(
'OR:TemplateVarResources_' . $column['column'] . '.value:LIKE' => '%' . $query . '%',
));
}
}
if ($this->searchQueryExcludeTagger == false) {
if ($this->useTagger) {
$c->leftJoin('TaggerTagResource', 'TagResource', array('TagResource.resource = modResource.id'));
$c->leftJoin('TaggerTag', 'Tag', array('Tag.id = TagResource.tag'));
array_push($queryWhere, array(
'OR:Tag.tag:LIKE' => '%' . $query . '%',
));
}
}
}
$c->where($queryWhere);
}
$filter = $this->getProperty('filter', '');
switch ($filter) {
case 'published':
$c->where(array(
'published' => 1,
'deleted' => 0,
));
break;
case 'unpublished':
$c->where(array(
'published' => 0,
'deleted' => 0,
));
break;
case 'deleted':
$c->where(array(
'deleted' => 1,
));
break;
default:
$c->where(array(
'deleted' => 0,
));
break;
}
$c->where(array(
'class_key:!=' => 'CollectionContainer',
// "NOT EXISTS (SELECT 1 FROM {$this->modx->getTableName('modResource')} r WHERE r.parent = modResource.id)"
));
foreach ($this->tvColumns as $column) {
$c->leftJoin('modTemplateVarResource', '`TemplateVarResources_' . $column['column'] . '`', '`TemplateVarResources_' . $column['column'] . '`.`contentid` = modResource.id AND `TemplateVarResources_' . $column['column'] . '`.`tmplvarid` = ' . $column['id']);
}
return $c;
}
Соответственно в после поиск теперь пишем (пример):tv_prm_category_food[]=Шашлыки&tv_prm_category_food[]=Десерты
… Происходит фильтрация по нескольким значениям, можно фильтровать как разные tv так и единые.Также можете в
assets/components/collections/css/mgr.css по селектору ".ext-strict #collections-child-search"
… сделать себе ширину поля поиска пошире, чтобы можно было удобно и много писать.
А также если пишите запрос без подстроки "=", то фильтрация происходит среди «всего» — как и раньше.
Десерты
Вуаля… Может кому пригодится…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.