Collections: фильтрация ресурсов в админке по tv

Используется компонент Collections для вывода списка ресурсов в админке (разбиение на категории).
Необходимо внутри коллекции добавить фильтрацию по ТВ параметрам ресурсов, т.е. там где в коллекции Поиск по ресурсам, фильтр «Опубликован/нет...», вот там нужен ещё фильтр по определённым, заранее подготовленным ТВ.
Как это можно сделать, есть какой-нибудь мануал? В инете не смог найти ничего.
Скаут
21 июля 2017, 15:55
modx.pro
970
0

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

Денис
07 февраля 2020, 15:48
0
Подниму тему, реально ли в этом компоненте сделать фильтрацию по tv? Куда копать хоть подскажите… Знающие люди…
    Денис
    13 февраля 2020, 11:07
    0
    Для себя сделал так:

    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"
    … сделать себе ширину поля поиска пошире, чтобы можно было удобно и много писать.

    А также если пишите запрос без подстроки "=", то фильтрация происходит среди «всего» — как и раньше.
    Десерты
    Вуаля… Может кому пригодится…
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2