Вывод прайс-листа на главной странице

Здравствуйте.
На главной странице нужно вывести прайс в таком виде:
Категория 1
  • Товар 1 — цена
  • Товар 2 — цена
Категория 2
  • Товар 3 — цена
  • Товар 4 — цена
и т.д…
Проще всего использовать сниппет msProducts и для каждой категории товаров выводить результаты сниппетом msProducts, но когда категорий много, то использование множества выводов сниппета тормозят загрузку страницы.
{'!msProducts' | snippet : [
        'parents' => 'id категории',
        'tpl' => '@FILE chunks/tpl_price.tpl',
        'limit' => 0
        ]}
Может кто делал подобное и подскажет как вывести прайс через placeholder ({'result' | placeholder}) с проверкой на ID категории, чтобы вывести название категории и ее товары? То есть сниппет msProducts вызвается один раз, а затем результаты выводятся placeholder.
Дмитрий
23 февраля 2024, 13:26
modx.pro
553
0

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

Артур Шевченко
23 февраля 2024, 18:31
0
Вот код сниппета, который выбирает нужные данные из БД и форматирует их в нужный вид
$tablePrefix = $modx->getOption('table_prefix');
$sql = "SELECT Product.pagetitle AS name, Data.price AS price, Parent.pagetitle AS parent FROM {$tablePrefix}site_content Product
LEFT JOIN {$tablePrefix}ms2_products Data ON Product.id = Data.id 
LEFT JOIN {$tablePrefix}site_content Parent ON Product.parent = Parent.id
WHERE Product.class_key = 'msProduct'";
$statement = $modx->query($sql);
$products = $statement->fetchAll(PDO::FETCH_ASSOC);
$output = [];
foreach ($products as $product) {
    $output[$product['parent']][] = $product;
}
return $output;
    Дмитрий
    26 февраля 2024, 12:44
    0
    Спасибо за сниппет. Не могли бы вы пояснить как вывести то, что мне нужно? У меня не получается вывести.
      Артур Шевченко
      26 февраля 2024, 15:22
      0
      {set $menu = 'mySnippet' | snippet}
      {foreach $menu as $parent => $products}
          <p>{$parent}</p>
          <ul>
          {foreach $products as $data}
              <li>{$data.name} - {$data.price}</li>
          {/foreach}
          </ul>
      {/foreach}
        Дмитрий
        27 февраля 2024, 10:51
        0
        Спасибо. Но ничего не выводится, ошибок в логе нет.
        Я создал сниппет «GetPrice»:
        <?php
        $tablePrefix = $modx->getOption('table_prefix');
        $sql = "SELECT Product.pagetitle AS name, Data.price AS price, Parent.pagetitle AS parent FROM {$tablePrefix}site_content Product
        LEFT JOIN {$tablePrefix}ms2_products Data ON Product.id = Data.id 
        LEFT JOIN {$tablePrefix}site_content Parent ON Product.parent = Parent.id
        WHERE Product.class_key = 'msProduct'";
        $statement = $modx->query($sql);
        $products = $statement->fetchAll(PDO::FETCH_ASSOC);
        $output = [];
        foreach ($products as $product) {
            $output[$product['parent']][] = $product;
        }
        Затем вывожу в чанке:
        {set $menu = 'GetPrice' | snippet}
        {foreach $menu as $parent => $products}
            <p>{$parent}</p>
            <ul>
            {foreach $products as $data}
                <li>{$data.name} - {$data.price}</li>
            {/foreach}
            </ul>
        {/foreach}
        И ничего. Помогите пожалуйста разобраться.
          Артур Шевченко
          27 февраля 2024, 14:59
          0
          У меня работает.
            Дмитрий
            27 февраля 2024, 19:20
            0
            Спасибо друг! Все работает, не заметил ошибку. Извини!
              Дмитрий
              27 февраля 2024, 19:38
              0
              А как сделать чтобы название товара было ссылкой ведущей на товар и у цены убрать два ноля после точки (1500.00 р). Подскажи пожалуйста.
                Артур Шевченко
                27 февраля 2024, 21:39
                0
                Добавь в сниппете в запрос получение uri, а в выводе оберни имя товара в тег ссылки с атрибутом href равным data.uri. А нули можно убрать модификатором replace.
                  Дмитрий
                  29 февраля 2024, 15:06
                  0
                  Спасибо большое, добрый человек! Дай Бог тебе здоровья!
        Дмитрий
        25 мая 2024, 13:51
        0
        Добрый день. Если товар снять с публикации, он все равно выводиться в прайсе, чтобы не выводился нужно товар полностью удалять. Подскажите пожалуйста, как прописать условие в сниппете чтобы не выводил снятые с публикации товары.
          Артур Шевченко
          25 мая 2024, 14:04
          0
          Нужно присоединить таблицу site_content по id и в условиях выборки добавить ПсевдонимТаблицы.published = 1
            Дмитрий
            25 мая 2024, 14:09
            0
            Прошу прощения, для меня это «темный лес». Не могли бы вы написать код? Буду очень благодарен.
              Артур Шевченко
              25 мая 2024, 14:24
              0
              $tablePrefix = $modx->getOption('table_prefix');
              $sql = "SELECT Product.pagetitle AS name, Data.price AS price, Parent.pagetitle AS parent FROM {$tablePrefix}site_content Product
              LEFT JOIN {$tablePrefix}ms2_products Data ON Product.id = Data.id 
              LEFT JOIN {$tablePrefix}site_content Parent ON Product.parent = Parent.id
              LEFT JOIN {$tablePrefix}site_content Resource ON Product.id= Resource.id
              WHERE Product.class_key = 'msProduct' AND Resource.published = 1";
              $statement = $modx->query($sql);
              $products = $statement->fetchAll(PDO::FETCH_ASSOC);
              $output = [];
              foreach ($products as $product) {
                  $output[$product['parent']][] = $product;
              }
              return $output;
                Дмитрий
                25 мая 2024, 14:33
                0
                Спасибо огромное!
                  Дмитрий
                  03 июля 2024, 16:11
                  0
                  Добрый день.
                  Прошу прощения, а можно как то исключить из выборки некоторые категории товаров с их товарами из прайса?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        17