Последние темы


Сниппет для получения 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
    Заметил что если в ТВ товара указано не одно значение, а не сколько, то он не выбирается данным сниппетом

  • В общем имею след код

    <?php
    $pagetitle = 'F10/F11 2009>'; //значение ТВшки, которое ищем
    $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.parent'));
       $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['parent']; 
                       
                   }
       }
      return implode(',',$ids_array);
    

    но так как $TV_ID=6 имеет множественное значение, в выборку попадают только товары у которого этот ТВ имеет одно значение (если там указано несколько значений, то игнорируется)

    Вопрос в следующем, как сделать чтобы и с множественным значением попадали документы

 

Последние комментарии

  • M

    @Andchir , спасибо. Проблема и правда была в одном из плагинов, который на другом сайте нормально работает

    Читать далее
  • Что нового в Shopkeeper 4.0.3:

    Исправлено некорректное определение языка по умолчанию В настройках в админке скрываются пароли. Добавлена возможность загружать картинки для категорий. shopkeeper.js - добавлена функция updateProductsPrice() для поддержки текстовых полей для цены. Twig-функции contentList() и includeContent() вынесены в отдельный класс. Добавлено событие "order.before_create". Сортировка всех полей типа контента перетаскиванием. Автоматическое сохранение сортировки полей при сохранении типа контента (не нужно нажимать на отдельную кнопку). В интерфейсе админа добавлено поле поиска для списка Composer-пакетов.

    Скачать можно на главной странице https://modx-shopkeeper.ru/

    Читать далее
  • Вот этот плагин:
    0_1550334109280_screenshot_022.png

    Вроде по умолчанию он выключен. Надо включить. Но плагин работает только на редактирование товаров, при удалении он делалать ничего не будет. Только что проверил кнопку, всё работает корректно, фильтры удаляются и добавляются, когда нужно. Но нужно очищать корзину после удаления товаров (возможно баг).

    Читать далее
  • J

    @Andchir Если нажимаю кнопочку "Обновить значения", то в фильтрах появляются как раз те самые удаленные значения фильтра.. Потом приходится Ручками выбирать эти удаленные значения.
    вот так выглядит Управление фильтрами когда удаляешь ручками: https://yadi.sk/i/_zw64CGkZ_sAYg
    А вот так выглядит когда просто нажимаешь "Обновить значения": https://yadi.sk/i/7WFbXC6xV5sQAw (красным выделено, то что приходится постоянно удалять

    Читать далее