Денис

Денис

С нами с 03 января 2020; Место в рейтинге пользователей: #1113
Денис
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"
… сделать себе ширину поля поиска пошире, чтобы можно было удобно и много писать.

А также если пишите запрос без подстроки "=", то фильтрация происходит среди «всего» — как и раньше.
Десерты
Вуаля… Может кому пригодится…
Денис
07 февраля 2020, 15:48
0
Подниму тему, реально ли в этом компоненте сделать фильтрацию по tv? Куда копать хоть подскажите… Знающие люди…
Денис
11 января 2020, 13:03
+1
Да, ты прав. Решил не заниматься херней. Всем добра.
Денис
03 января 2020, 10:32
0
Точнее сайт уже написан на Laravel + Voyager, но если MODX вдруг оживает, то почему бы и нет, очень отличная CMS. Вопрос выше актуален.
Денис
03 января 2020, 10:20
0
У меня вопрос. Мне нужно прямо сейчас начинать писать сайт на MODX. Какую версию лучше выбрать? 2.7 или 3.0 альфа? Сайт не маленький, буду долго поддерживать. И соответственно когда выйдет релиз 3.0 буду апдейтить сайт. Вопрос важный.