MODX REVO не работает where в getImageList, как настроить фильтр?
Друзья, подскажите пожалуйста, почему не работает фильтрация в getImageList?
Есть снипет для фильтра ajax, работает хорошо со снипетом pdoResources и его параметрами, а вот с MIGX tv и getImageList не хочет :(
На странице есть MIGX tv field-news, в нем параметр date. Этот параметр формой передаю в снипет, тут порядок, все прилетает. Но вот в $where никак не возвращает почему то, что не так?
Если делаю параметры для pdoResources
Но это проделать для getImageList то не возвращает массив с tv field-news с записью где параметр date равен 2018. Почему так происходит?
Есть снипет для фильтра 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. Почему так происходит?
Комментарии: 30
Не проще найти человека, который сделает, а не создавать кучу одного и того ж вопроса. Доведите до конца одну тему, а то не удобно бегать и собирать части кода по всех
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
Спасибо! Но дело не в самой дате! Это параметр может быть любой. И уже много сам сделал что бы передавать на решение кому либо, хочется самому разобраться. Ваше решение к сожалению тоже не возвращает массив :(
Я не работал с getImageList всегда пишу свой, так как не нравится решение. По идее должно работать если передать параметр ?date=2018, в вашем примере много ошибок, нужно знать сначала какие параметры будут, потом собирать с ними массив, и тогда переводить в json, date в каком формате сохранен «2018»?
ресурс 1?
Сделайте на pdoResources и не замораживайтесь решение с ним отличное.
ресурс 1?
Сделайте на pdoResources и не замораживайтесь решение с ним отличное.
Мне кажется, проблема или в формате JSON самого MIGX, так как условие еще раз преобразует в JSON, $where = $modx->toJSON(array($filter)); Или потому что MIGX TV field_news это и есть массив, по нему нужно пробежаться циклом еще раз, и получить поле date (это не формат даты, просто tv с типом текст).
Или проблема в обоих случая и в JSON и в выборке неправильной :)
Если в вышеописанном коде моем, выборку с условием делаю через pdoResources то возвращает массив с нужной записью (есть родитель с id 13, в нем три ресурса у которых в tv date разные значения 2018, 2017, 2019, в примере достаю ресурс с цифрами 2018).
Или проблема в обоих случая и в 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);
То ничего не возвращает :(
Да мне нужно для MIGX это, а не для папаки с ресурсами, в том то и проблема.
я так подозреваю что 'docid' => 13,
Нет, это для примера что работает все для ресурсов и с pdoResiurces. Но MIGX TV field_news с параметром date находится в ресурсе с id 1
Я подозреваю что с id ресурса 1 нет данных
Есть, если я заком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
Допустил ошибку
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);
Допустил ошибку в коде? Переписал код чтобы можно было добавлять свои фильтры
Эх нет, не возвращает массив, ответил вам на почту. Там даты нет, там просто tv с текстовым полем, просто имя такое у tv date, в них что у обычного TV date что у MIGX TV field_news у параметра date простые текстовые поля, в них года 2017, 2018, 2019 их не нужно преобразовывать никак через DateTime и тд.
Код работает у вас 'field-news' подключен на 198 ресурс просто заменить 'docid' => 1, на 'docid' => 198, или 'docid' => $modx->resource->get('id'),
Зависит как использовать
И не забывайте что решения сохранять Новости в MIGX плохое, так как со временем через ограничения MySQL получите ошибку что поле превысило количество символов.
Решение создать отдельный ресурс Новости. В нем каталоги если нужно. И тогда каждый ресурс новости вывести всё через pdoPage.
P.S И делать сайт з большим количеством TV плохое решение, так как большая нагрузка.
Зависит как использовать
И не забывайте что решения сохранять Новости в MIGX плохое, так как со временем через ограничения MySQL получите ошибку что поле превысило количество символов.
Решение создать отдельный ресурс Новости. В нем каталоги если нужно. И тогда каждый ресурс новости вывести всё через pdoPage.
P.S И делать сайт з большим количеством TV плохое решение, так как большая нагрузка.
Да нет, не работает код, 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 не работает.
Посмотрите modstore.pro/ и modx.com/extras/ много решений сделано на компонентах, если нужно отправлю контакты. Объясню как правильно делать.
Кроме платного фильтра Search2 для minishop нет ничего.
Нашел где косяк, но решить пока проблему не могу, дело в синтаксисе параметра where для getImageList, он другой чем у pdoResources, поэтому не работает фильтрация.Если напрямую в where прописать $where = '{«date:=»:«2018»}'; то все работает, если делать через $where = $modx->toJSON(array($filter)); то не работает.
Еще проблема есть мне кажется в создании массива для фильтрации, а точнее в синтаксисе опять же для where
Еще проблема есть мне кажется в создании массива для фильтрации, а точнее в синтаксисе опять же для 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);
Загляните в консоль вчера оставил пример
Спасибо, но дело в том что в консоли не сохраняется ничего, у меня там только мой код :( Я уже посмотрел сразу утром.
Возьмите скопируйте мой последний пример в консоль, добавьте get и замените Id.
И почитайте документацию PHP. Бо в if у вас в коде проблема
И почитайте документацию PHP. Бо в if у вас в коде проблема
Я пробовал я ваш код, спасибо большое, но не работает он, возвращает абсолютно все записи, не фильтрует, и у вас там почему то работа с датой, А У МЕНЯ ДАТ НЕТ ТАМ, 2018 это просто цифры, в простом TV с типом текст. А у вас там
validateDate($date, $format = 'd m Y H:i:s' и так далее.
тот код пробовал ваш, id ресурса поменял на нужный. Потому что на сайте к которому давал вам доступ, ресурс с TV имеет id 198 а не 1
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] => 2018Array
(
[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] =>
)
Правильно бо нет $_GET['date'] = 2018; почитайте документацию как работает GET
да хоть напрямую пропишите, 2018 без $_GET['date'], не работает. Дело не в этом.
Почитайте документацию php разберётесь, по другому никак, пример я тестировал у вас на сайте у меня всё работало
Проверьте сами, не работает. Если бы я мог разобраться, я бы сюда не обращался. Ладно, спасибо, если не можете помочь вы не обязаны, спасибо что откликнулись!
http://***.ru/test/?date=2017
Запустите сами страницу у вас на сайте и посмотрите
Запустите сами страницу у вас на сайте и посмотрите
БЛАГОДАРЮ! Консоль видно как то кеширует, да работает, но все равно нельзя убирать МАССИВ 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. Но вы большой молодец! Низкий вам поклон! СПАСИБО, на базе вашего кода попробую все же свой изменить, что бы работал универсально.
В целях безопасности, там на каждый параметр нужно сделать свою проверку чтобы не было XSS. И делать array_merge
Спасибо, завтра продолжу голову ломать в новом году :)) С Новым годом!
С новым годом
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.