Сниппет для получения id родителей



  • Здравствуйте,
    В php и modx api не силен, а возникла необходимость в своем сниппете для вывода id родителе по нескольким условиям.
    Ситуация следующая
    Меню состоит из двух уровней
    -1. Основной родитель (категория деталей)
    --1.2. Родитель (тип деталей). В тип деталей вложены сами товары, у них свой шаблон

    У товаров есть тв поле применяемости, в ней указаны модели авто. (имеет множественный выбор с разделителем ||)
    Меню выводится на странице модели авто.
    В меню список деталей строиться из того какие товары есть для этого авто, т.е. если для какой то модели авто нет товаров в каком то конкретном типе деталей, то и этот тип не выводится в меню.

    Вот мне как раз нужно получить id этих типов деталей, чтобы вставить во входные параметры getProducts.

    Если я все правильно понял то сниппет получает на вход id основного родителя, перебирает товары внутри него, где у товаров в тв полей есть совпадение по заголовку текущей страницы и возвращает id родителей этих товаров (id типов деталей)

    Кто безвозмездно готов помочь в написании данного сниппета?



  • Пока вчитывался в xPDO смог пока получить только id типов деталей

    Тестировал в Console

    <?php
    $where = array(
        'parent' => 45
        );
    $resources = $modx->getCollection('modResource',$where);
    
    $output = '<p>Всего ресурсов: '.count($resources).'</p>';
    foreach ($resources as $k => $res) {
      $output .= $k.', ';
    }
    print $output;
    

    Дальше застрял (((



  • Неужели никто не может помочь?



  • Вообще не понятно, что вы пытаетесь сделать

    Посмотрите: Раз и Два



  • @slaad Ну грубо говоря мне нужно получить id родителей ресурсов, у которых шаблон 5 и значение ТВ поля совпадает с pagetitle текущей страницы (тв имеет множественный выбор, т.е. там через разделитель || указаны несколько pagetitle)



  • @tsergey

    Что-то такое можно попробовать:

    
    $pagetitle = 'Машинка'; //значение ТВшки, которое ищем
    $TV_ID=6;//id твшки, которую провереяем на соответствие $pagetitle
    
       $q = $modx->newQuery('modResource');
       $q->innerJoin('modTemplateVarResource', 'tv', array('modResource.id = tv.contentid', 'tv.tmplvarid = ' . $TV_ID));
       $q->select(array('modResource.id'));
       $q->where(array('tv.value'=>
               $pagetitle
               ));
       
       if ($q->prepare() && $q->stmt->execute()){
           $results = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
                    $ids_array=array();
               foreach($results as $result){
                       $ids_array[]=$result['resource_id']; 
                       
                   }
       }
      print_r ($ids_array); //для консоли
      //return $ids_array; //для работы
    


  • @slaad Спасибо что откликнулись.
    В консоле при проверке на выходе получаю Array ()



  • @tsergey Вы точно корректно заполнили
    $pagetitle и $TV_ID?

    Все должно работать, там только на $result['id']; надо поправить и все

    $pagetitle = 'Состав:'; //значение ТВшки, которое ищем
    $TV_ID=4;//id твшки, которую провереяем на соответствие $pagetitle
    
       $q = $modx->newQuery('modResource');
       $q->innerJoin('modTemplateVarResource', 'tv', array('modResource.id = tv.contentid', 'tv.tmplvarid = ' . $TV_ID));
       $q->select(array('modResource.id'));
       $q->where(array('tv.value'=>
               $pagetitle
               ));
       
       if ($q->prepare() && $q->stmt->execute()){
           $results = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
                    $ids_array=array();
               foreach($results as $result){
                       $ids_array[]=$result['id']; 
                       
                   }
       }
      print_r ($ids_array); //для консоли
    


  • @slaad Да так заработало.
    Буду теперь думать как получить id родителей этих товаров, и на выводе ограничить, что эти родители являются детьми введенного id.
    Если конечно не сложно не откажусь от помощи, или в какую сторону копать?



  • @tsergey
    Я же вам даже две базы склеил теперь должны были разобраться, ну покрутите запрос.

    Вам нужно копать в сторону $q->select - это поля которые вы из базы тащите и $q->where - это какие фильтры наклаываете.
    в $q->select добавьте modResource.parent
    в $q->where modResource.parent = > ...; ( указать id)

    И да, на выходе у вас будет многомерный массив, поэтому сначала выведите print_r ($results), прежде чем обрабатывать его, чтобы вы поняли , что вам делать.



  • @slaad Спасибо, покрутим, подумаем. Для предыдущего запроса я вот так сделал

    return implode(',',$ids_array); 
    

    Чтобы получить чисто id через запятую



  • Участник @slaad
    Заметил что если в ТВ товара указано не одно значение, а не сколько, то он не выбирается данным сниппетом



Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.