Задать вопрос
Sadist07
@Sadist07
Верстальщик, Недо дизайнер

Как выбрать ресурсы по TV MIGX?

Добрый вечер, у меня есть ресурсы с TV (MIGX) в котором используются checkbox и radio. Задача состоит в том что мне нужно выводить ресурсы в зависимости от значений этих checkbox и radio.
feec3fb62b574574bd6b979aa5e4a63c.png07b9364d6f884dfa9398693e86533664.png
Например мне нужно вывести все игры у которых в Жанре выбран "Экшен", а еще лучше если будет возможность сделать выборку по 2 критериям (Например, что бы были ресурсы у которых есть жанр Экшен и Гонки, либо Жанр => Экшен и Способ активации => Steam), но даже если я смогу фильтровать по 1 критерию тоже буду очень рад.
А теперь перейду к тому с чего началась загвоздка.
Я изначально думал что всё легко и просто возьму сниппет pdoResources подключу к нему TV через &includeTVs и воспользуюсь &tvFilters. Но т.к TV сделано через MIGX то оно хранится в базе как JSON и хотя сниппет его преобразует в массив мне не воспользоваться параметром &tvFilters и с помощью &where тоже не как т.к в базе хранится JSON.
Например то что лежит в базе
[{"MIGX_id":"1","image":"http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/271590\/header.jpg?t=1459273772","alt_image":"GTAV","title_image":"GTAV","video":"1","janre":["\u042d\u043a\u0448\u0435\u043d ","\u0421\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b ","\u0424\u0430\u0439\u0442\u0438\u043d\u0433\u0438 ","\u0414\u0438\u0437\u0430\u0439\u043d "],"activation":"Origin","platform":"Windows ","region":"\u0412\u0435\u0441\u044c \u043c\u0438\u0440 ","rejim":"\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440 ","news":"1"}]

В виде массива:
[tovar_info] => Array
                (
                    [0] => Array
                        (
                            [MIGX_id] => 1
                            [image] => http://cdn.akamai.steamstatic.com/steam/apps/271590/header.jpg?t=1459273772
                            [alt_image] => GTAV
                            [title_image] => GTAV
                            [video] => 1
                            [janre] => Array
                                (
                                    [0] => Экшен 
                                    [1] => Симуляторы 
                                    [2] => Файтинги 
                                    [3] => Дизайн 
                                )

                            [activation] => Origin
                            [platform] => Windows 
                            [region] => Весь мир 
                            [rejim] => Мультиплеер 
                            [news] => 1
                        )

                )

А теперь самое сложно для меня
Т.к я не могу воспользоваться уже готовыми сниппетами и наверно все же не умею создавать правильные запросы в &where и &tvFilters решил что пора написать свой сниппет (Чем сложнее тем лучше, учесть что PHP я только поверхностно знаю, а начинку MODX я вообще не знаю).

Так вот в моей голове с начало крутилась мысль, что нужно использовать функционал pdoResources и добавить в него свой фильтр (Для меня это функция которая принимает значения (массив в данном случае) и еще одна переменная это ключ который мы будет искать в этом массиве. Ну это наверно не совсем правильно, на вход все же нужно 3 значения например:
function migxFilter($array, $key, $val){
	
}

Где $array массив полученный из MIGX преобразованный уже MODX как нибудь так:
$val = $resource->getTVValue(2);
$val = $modx->fromJSON($val);

$key - должен быть КЛЮЧОМ что бы не получить лишнее и искать именно в определенном месте( в данном случае в категория например Жанр что в массиве [janre]).
Ну и конечно $val само значение по которому мы будем фильтровать (Например "Экшен").
Ладно пробежались по массиву нашли совпадение.... Получается на выход нам достаточно получить boolean (true || false). То есть у нас есть полученный ресурс, а вернее наверно лучше ресурсы с этим TV.
Например :
$pdo = $modx->getService('pdoFetch');
$parameters = array(
	'showUnpublished' => 1,
	'parents' => 2,
	'templates' => 4,
	'includeTVs' => 'Нужные TV',
);
$res = $pdo->getCollection('modResource', null, $parameters);

В переменной $res будет храниться Многомерный массив:
Array
(
    [0] => Array
        (
            [id] => 3
            [type] => document
            [contentType] => text/html
            [pagetitle] => Grand Theft Auto V
            [longtitle] => Купить игру GTA 5 / ГТА 5 / Grand Theft Auto V для STEAM
            [description] => 
            [alias] => grand-theft-auto-v
            [link_attributes] => 
            [published] => 1
            [pub_date] => 0
            [unpub_date] => 0
            [parent] => 4
            [isfolder] => 0
            [introtext] => 
            [content] => 
            [richtext] => 1
            [template] => 4
            [menuindex] => 0
            [searchable] => 1
            [cacheable] => 1
            [createdby] => 1
            [createdon] => 1468714413
            [editedby] => 1
            [editedon] => 1470168281
            [deleted] => 0
            [deletedon] => 0
            [deletedby] => 0
            [publishedon] => 1468714380
            [publishedby] => 1
            [menutitle] => 
            [donthit] => 0
            [privateweb] => 0
            [privatemgr] => 0
            [content_dispo] => 0
            [hidemenu] => 1
            [class_key] => modDocument
            [context_key] => web
            [content_type] => 1
            [uri] => grand-theft-auto-v.html
            [uri_override] => 0
            [hide_children_in_tree] => 0
            [show_in_tree] => 1
            [properties] => Array
                (
                    [autoredirector] => Array
                        (
                            [old_uri] => grand-theft-auto-v.html
                        )

                )

            [tovar_info] => Array
                (
                    [0] => Array
                        (
                            [MIGX_id] => 1
                            [image] => http://cdn.akamai.steamstatic.com/steam/apps/271590/header.jpg?t=1459273772
                            [alt_image] => GTAV
                            [title_image] => GTAV
                            [video] => 1
                            [janre] => Array
                                (
                                    [0] => Экшен 
                                    [1] => Симуляторы 
                                    [2] => Файтинги 
                                    [3] => Дизайн 
                                )

                            [activation] => Origin
                            [platform] => Windows 
                            [region] => Весь мир 
                            [rejim] => Мультиплеер 
                            [news] => 1
                        )

                )
        )
 и т.д
)

В этих ресурсах мы должны получить наш массив из TV (tovar_info) применить к нему наш фильтр (который увы я сам не смог написать, вернее смог сделать функцию которая пробегается по массиву и ищет нужное значение, а на выход даёт либо true либо false)
function janr($array, $string){
      if(!is_array($array)){
        return false;  
      }
      static $da = false;
      foreach($array as $k=>$v){
          if(is_array($v)){
            janr($v, $string);  
          }else{
            if(trim($v) === $string){
              $da = true;
            }  
          }
          
      }
      return $da;
  }

И здесь мои знания полностью иссякли т.к я не знаю как мне отфильтровать или этот фильтр добавить в pdoResources. Если подумать можно пробежаться foreach по самим ресурсам дать ресурсу ключ TV что бы получить значения этого TV и если совпадение есть то вывести уже на экран этот ресурс используя Чанк.
foreach($res as $tovar){
    $array = $tovar[tovar_info];
    if(janr($array,"Ролевые")){
     $pdo->getChunk(Чанк, $res)  //Вывoдим Чанк этого ресурса
    }  
}

Но теперь у меня возникла проблема как мне в чанке вывести плейсхолдеры. Неужели придется писать там [[+tovar_info.0.rejim.0]]
Вообщем время уже поездное 4:39, выразить свои мысли не могу, да и наверно не умею. Поэтому попрошу Вас добрых людей,помогите пожалуйста с такими вопросами ?
  1. Как грамотно написать сниппет ? Что бы был похоже на pdoResources но с возможностью добавить свой фильтр в виде функции
  2. Как доработать фильтр который принимал бы 3 переменные ? (Если конечно это не сложно и Вас не затрудни написать)
  3. Как сделать потом нормальные плейсхолдеры ? Напрмер [[+tovar_info.janre]] или просто [[+janre]]
  4. И что нужно изучить, что бы можно было самому писать Плагины снипеты и дорабатывать сам движок MODX под свои нужды? И есть ли люди которые могу поучить ? либо указать верное направления для достижения целей как в программирование так и в самом MODX. Сам парень я не ленивый, но самообучение даётся не легко, знаю что если кто то помогает то в разы быстрее научиться можно
  • Вопрос задан
  • 1062 просмотра
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы