MODX REVO не работает where в getImageList, как настроить фильтр?

Друзья, подскажите пожалуйста, почему не работает фильтрация в getImageList?
Есть снипет для фильтра ajax, работает хорошо со снипетом pdoResources и его параметрами, а вот с MIGX tv и getImageList не хочет :(

На странице есть MIGX tv field-news, в нем параметр date. Этот параметр формой передаю в снипет, тут порядок, все прилетает. Но вот в $where никак не возвращает почему то, что не так?

$_GET['date'] = '2018'; //задал жестко для примера один параметр
$filter = array();

if($_GET['date']) {
    $filter[] = 'date='.$_GET['date'];
}
if($filter) {
	$where = $modx->toJSON(array($filter));
} else {$where = '';}
$params = array(
	'docid' => 1,
	'tvname' => 'field-news',
	'where' => $where
	);
return $modx->runSnippet('getImageList',$params);

Если делаю параметры для pdoResources
$params = array(
	'parents' => 13,
	'includeTVs' => 'date',
	'where' => $where
	);
return $modx->runSnippet('pdoResources', $params);
То все работает, $where возвращает массив страницы родитель которой c id 13 где tv date равен 2018,
Но это проделать для getImageList то не возвращает массив с tv field-news с записью где параметр date равен 2018. Почему так происходит?
Роман
31 декабря 2019, 00:40
modx.pro
1 278
0

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

Yurij Finiv
31 декабря 2019, 01:04
0
Не проще найти человека, который сделает, а не создавать кучу одного и того ж вопроса. Доведите до конца одну тему, а то не удобно бегать и собирать части кода по всех

function validateDate($date, $format = 'd m Y H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

if(validateDate($_GET['date'], 'Y')) {
    $where = json_encode(['date:='.$_GET['date']]);
}else{
    $where = '';
}

$params = array(
	'docid' => 1,
	'tvname' => 'field-news',
	'where' => $where
	);
return $modx->runSnippet('getImageList',$params);
Могут быть ошибки так как код написал не используя IDE
    Роман
    31 декабря 2019, 01:11
    0
    Спасибо! Но дело не в самой дате! Это параметр может быть любой. И уже много сам сделал что бы передавать на решение кому либо, хочется самому разобраться. Ваше решение к сожалению тоже не возвращает массив :(
      Yurij Finiv
      31 декабря 2019, 01:33
      0
      Я не работал с getImageList всегда пишу свой, так как не нравится решение. По идее должно работать если передать параметр ?date=2018, в вашем примере много ошибок, нужно знать сначала какие параметры будут, потом собирать с ними массив, и тогда переводить в json, date в каком формате сохранен «2018»?
      ресурс 1?

      Сделайте на pdoResources и не замораживайтесь решение с ним отличное.
        Роман
        31 декабря 2019, 02:00
        0
        Мне кажется, проблема или в формате JSON самого MIGX, так как условие еще раз преобразует в JSON, $where = $modx->toJSON(array($filter)); Или потому что MIGX TV field_news это и есть массив, по нему нужно пробежаться циклом еще раз, и получить поле date (это не формат даты, просто tv с типом текст).
        Или проблема в обоих случая и в JSON и в выборке неправильной :)

        Если в вышеописанном коде моем, выборку с условием делаю через pdoResources то возвращает массив с нужной записью (есть родитель с id 13, в нем три ресурса у которых в tv date разные значения 2018, 2017, 2019, в примере достаю ресурс с цифрами 2018).
        $params = array(
        	'parents' => 13,
        	'includeTVs' => 'date',
        	'where' => $where
        	);
        return $modx->runSnippet('pdoResources', $params);
        Array
        (
            [id] => 15
            [type] => document
            [contentType] => text/html
            [pagetitle] => тест 3
            [longtitle] => 
            [description] => 
            [alias] => тест-3
            [alias_visible] => 1
            [link_attributes] => 
            [published] => 1
            [pub_date] => 0
            [unpub_date] => 0
            [parent] => 13
            [isfolder] => 0
            [introtext] => 
            [richtext] => 1
            [template] => 2
            [menuindex] => 0
            [searchable] => 1
            [cacheable] => 1
            [createdby] => 1
            [createdon] => 1577626874
            [editedby] => 1
            [editedon] => 1577630217
            [deleted] => 0
            [deletedon] => 0
            [deletedby] => 0
            [publishedon] => 1577626680
            [publishedby] => 1
            [menutitle] => 
            [donthit] => 0
            [privateweb] => 0
            [privatemgr] => 0
            [content_dispo] => 0
            [hidemenu] => 0
            [class_key] => modDocument
            [context_key] => web
            [content_type] => 1
            [uri] => тест-3
            [uri_override] => 0
            [hide_children_in_tree] => 0
            [show_in_tree] => 1
            [properties] => 
            [tv.date] => 2018
            [idx] => 1
            [link] => 
        )
        Но если я тоже самое проделаю для getImageList
        $params = array(
        	'docid' => 1,
        	'tvname' => 'field-news',
        	'where' => $where
        	);	
        return $modx->runSnippet('getImageList', $params);
        То ничего не возвращает :(
          Роман
          31 декабря 2019, 02:01
          0
          Да мне нужно для MIGX это, а не для папаки с ресурсами, в том то и проблема.
            Yurij Finiv
            31 декабря 2019, 02:02
            0
            я так подозреваю что 'docid' => 13,
              Роман
              31 декабря 2019, 02:05
              0
              Нет, это для примера что работает все для ресурсов и с pdoResiurces. Но MIGX TV field_news с параметром date находится в ресурсе с id 1
          Yurij Finiv
          31 декабря 2019, 01:53
          0
          Я подозреваю что с id ресурса 1 нет данных
            Роман
            31 декабря 2019, 02:03
            0
            Есть, если я закомvентирую условие where в параметрах, то вернет все записи

            $params = array(
            	'docid' => 1,
            	'tvname' => 'field-news',
            	//'where' => $where
            	);	
            return $modx->runSnippet('getImageList', $params);
            
            
            Array
            (
                [MIGX_id] => 13
                [desc] =>                                           
                [date] => 2019
                [image] => images/slide_news.jpg
                [btn] => PARTICIPATE
                [socialnews] => [{"MIGX_id":"1","link":"https:\/\/twitter.com\/home?lang=ru","simage":"icon\/twitter-social-logotype.svg","title":"Twitter"},{"MIGX_id":"2","link":"#","simage":"icon\/share.svg","title":"Link"}]
                [_alt] => 0
                [_first] => 1
                [_last] => 
                [idx] => 1
                [property.docid] => 1
                [property.tvname] => field-news
            )
            И так все 4 записи в TV
              Yurij Finiv
              31 декабря 2019, 02:08
              0
              Допустил ошибку
                Yurij Finiv
                31 декабря 2019, 02:17
                0
                function validateDate($date, $format = 'd m Y H:i:s')
                {
                    $d = DateTime::createFromFormat($format, $date);
                    return $d && $d->format($format) == $date;
                }
                $where = '';
                if(validateDate($_GET['date'], 'Y')) {
                    $where = ['date:=' => $_GET['date']];
                }
                
                if ($where){
                    $where = json_encode($where);
                }
                
                $params = array(
                	'docid' => 1,
                	'tvname' => 'field-news',
                	'where' => $where
                	);
                return $modx->runSnippet('getImageList',$params);
                Допустил ошибку в коде? Переписал код чтобы можно было добавлять свои фильтры
                  Роман
                  31 декабря 2019, 02:46
                  0
                  Эх нет, не возвращает массив, ответил вам на почту. Там даты нет, там просто tv с текстовым полем, просто имя такое у tv date, в них что у обычного TV date что у MIGX TV field_news у параметра date простые текстовые поля, в них года 2017, 2018, 2019 их не нужно преобразовывать никак через DateTime и тд.
                    Yurij Finiv
                    31 декабря 2019, 04:25
                    0
                    Код работает у вас 'field-news' подключен на 198 ресурс просто заменить 'docid' => 1, на 'docid' => 198, или 'docid' => $modx->resource->get('id'),
                    Зависит как использовать

                    И не забывайте что решения сохранять Новости в MIGX плохое, так как со временем через ограничения MySQL получите ошибку что поле превысило количество символов.

                    Решение создать отдельный ресурс Новости. В нем каталоги если нужно. И тогда каждый ресурс новости вывести всё через pdoPage.

                    P.S И делать сайт з большим количеством TV плохое решение, так как большая нагрузка.
                      Роман
                      31 декабря 2019, 11:41
                      0
                      Да нет, не работает код, id везде стоят на 198.

                      $_GET['date'] = '2018';
                      $filter = array();
                      if($_GET['date']) {
                      	$filter[] = 'date='.$_GET['date'];
                      	//$filter[] = 'date:='.$_GET['date'];
                      }
                      if($filter) {
                        $where = $modx->toJSON(array($filter));
                      } else {
                      	$where = '';
                      }
                      
                      // для getimagelist
                      $params2 = array(
                      	'docid' => 198,
                      	'tvname' => 'field-news',
                          'where' => $where
                      	);	
                      return $modx->runSnippet('getImageList', $params2);
                      И новости это пример, там слайдер сделан на MIGX. И мне нужен фильтр исключительно полей MIGX, но для getImagelist не работает.
                      Yurij Finiv
                      31 декабря 2019, 04:40
                      0
                      Посмотрите modstore.pro/ и modx.com/extras/ много решений сделано на компонентах, если нужно отправлю контакты. Объясню как правильно делать.
                        Роман
                        31 декабря 2019, 11:43
                        0
                        Кроме платного фильтра Search2 для minishop нет ничего.
            Роман
            31 декабря 2019, 13:46
            0
            Нашел где косяк, но решить пока проблему не могу, дело в синтаксисе параметра where для getImageList, он другой чем у pdoResources, поэтому не работает фильтрация.Если напрямую в where прописать $where = '{«date:=»:«2018»}'; то все работает, если делать через $where = $modx->toJSON(array($filter)); то не работает.
            Еще проблема есть мне кажется в создании массива для фильтрации, а точнее в синтаксисе опять же для where
            if($_GET['date']) {
            	//$filter[] = 'date='.$_GET['date'];
            	//$filter[] = "{'date:=':'2018'}";
            }
            Вот если миновать массив и в where напрямую прописать то порядок, но нужно через JSON пропустить для AJAX запроса :( пока не знаю как заставить работать этот код.
            $filter = array();
            if($_GET['date']) {
            	//$filter[] = 'date='.$_GET['date'];
            	//$filter[] = "{'date:=':'2018'}";
            }
            if($filter) {
             //$where = $modx->toJSON(array($filter));
             $where = '{"date:=":"2018"}';
            }
            $params = array(
            	'docid' => 198,
            	'tvname' => 'field-news',
                'where' => $where
                //'where' => '{"date:=":"2018"}',
            	);	
            return $modx->runSnippet('getImageList', $params);
              Yurij Finiv
              31 декабря 2019, 15:44
              0
              Загляните в консоль вчера оставил пример
                Роман
                31 декабря 2019, 15:47
                0
                Спасибо, но дело в том что в консоли не сохраняется ничего, у меня там только мой код :( Я уже посмотрел сразу утром.
                  Yurij Finiv
                  31 декабря 2019, 15:55
                  0
                  Возьмите скопируйте мой последний пример в консоль, добавьте get и замените Id.

                  И почитайте документацию PHP. Бо в if у вас в коде проблема
                    Роман
                    31 декабря 2019, 16:06
                    0
                    Я пробовал я ваш код, спасибо большое, но не работает он, возвращает абсолютно все записи, не фильтрует, и у вас там почему то работа с датой, А У МЕНЯ ДАТ НЕТ ТАМ, 2018 это просто цифры, в простом TV с типом текст. А у вас там
                    validateDate($date, $format = 'd m Y H:i:s' и так далее.

                    тот код пробовал ваш, id ресурса поменял на нужный. Потому что на сайте к которому давал вам доступ, ресурс с TV имеет id 198 а не 1
                    function validateDate($date, $format = 'd m Y H:i:s')
                    {
                        $d = DateTime::createFromFormat($format, $date);
                        return $d && $d->format($format) == $date;
                    }
                    $where = '';
                    if(validateDate($_GET['date'], 'Y')) {
                        $where = ['date:=' => $_GET['date']];
                    }
                    
                    if ($where){
                        $where = json_encode($where);
                    }
                    
                    $params = array(
                    	'docid' => 1,
                    	'tvname' => 'field-news',
                    	'where' => $where
                    	);
                    return $modx->runSnippet('getImageList',$params);
                    Возвращает все три записи, а нужно одну, с [date] => 2018
                    Array
                    (
                        [MIGX_id] => 1
                        [desc] => первая нвость
                        [date] => 2018
                        [_alt] => 0
                        [_first] => 1
                        [_last] => 
                        [idx] => 1
                        [property.docid] => 198
                        [property.tvname] => field-news
                        [property.where] => 
                    )
                    Array
                    (
                        [MIGX_id] => 2
                        [desc] => вторая новсть
                        [date] => 2017
                        [_alt] => 1
                        [_first] => 
                        [_last] => 
                        [idx] => 2
                        [property.docid] => 198
                        [property.tvname] => field-news
                        [property.where] => 
                    )
                    Array
                    (
                        [MIGX_id] => 3
                        [desc] => третья новость
                        [date] => 2017
                        [_alt] => 0
                        [_first] => 
                        [_last] => 1
                        [idx] => 3
                        [property.docid] => 198
                        [property.tvname] => field-news
                        [property.where] => 
                    )
                      Yurij Finiv
                      31 декабря 2019, 16:09
                      0
                      Правильно бо нет $_GET['date'] = 2018; почитайте документацию как работает GET
                        Роман
                        31 декабря 2019, 16:13
                        0
                        да хоть напрямую пропишите, 2018 без $_GET['date'], не работает. Дело не в этом.
                          Yurij Finiv
                          31 декабря 2019, 16:17
                          0
                          Почитайте документацию php разберётесь, по другому никак, пример я тестировал у вас на сайте у меня всё работало
                            Роман
                            31 декабря 2019, 16:21
                            0
                            Проверьте сами, не работает. Если бы я мог разобраться, я бы сюда не обращался. Ладно, спасибо, если не можете помочь вы не обязаны, спасибо что откликнулись!
                              Yurij Finiv
                              31 декабря 2019, 16:57
                              0
                              http://***.ru/test/?date=2017

                              Запустите сами страницу у вас на сайте и посмотрите
                                Роман
                                31 декабря 2019, 17:14
                                0
                                БЛАГОДАРЮ! Консоль видно как то кеширует, да работает, но все равно нельзя убирать МАССИВ FILTR, и зачем то вы с date format там сделали, я сейчас поменял поле с date на event=новое и все, не работает, эти параметры будут передаваться AjAX формой в сниппет, поэтому нужен массив для фильтрации.

                                $filter = array();
                                if($_GET['date']) {
                                	$filter[] = 'date='.$_GET['date'];
                                }
                                Понимаете? И проходить фильтр будет по этому массиву, по нескольким параметрам будет выборка осуществляться,
                                if($filter) {
                                  $where = $modx->toJSON(array($filter));
                                } else {
                                	$where = '';
                                }
                                Вы же изменили все как я понял и завязали жестко на date. Но вы большой молодец! Низкий вам поклон! СПАСИБО, на базе вашего кода попробую все же свой изменить, что бы работал универсально.
                                Yurij Finiv
                                31 декабря 2019, 17:19
                                +1
                                В целях безопасности, там на каждый параметр нужно сделать свою проверку чтобы не было XSS. И делать array_merge
                                Роман
                                31 декабря 2019, 17:21
                                0
                                Спасибо, завтра продолжу голову ломать в новом году :)) С Новым годом!
                                Yurij Finiv
                                31 декабря 2019, 17:22
                                0
                                С новым годом
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            30