Вывод списка продуктов из БД на страницу магазина

Здравствуйте. Вот задача: нужно сделать выборку продуктов из БД(здесь все понятно) и средствами вебасиста вывести все это дело на страницу магазина. Средствами вебасиста - это значит что вебасист будет работать с этим набором продуктов как с результатом поиска или просомтра категории... Вот собственно вопрос - как ему подсунуть этот набор? Нашел класс - shopProductsCollection. Что он делает? Я так понял, что в конструктор передается запрос для выборки, так? Если да - то в каком виде должен быть представлен запрос? Выборка будет осуществляться по категориям и характеристикам(как минимум, то есть нужны сложные SQL запросы). Заранее спасибо

8 ответов

  • 6
    Михаил Ушенин Webasyst 18 февраля 2014 02:25 #
    В конструктор нужно передать хеш выборки товаров. Примеры хешей:

    array(12,23,34) — массив id товаров
    'id/12,23,34' — альтернативная запись того же самого
    'related/cross_selling/12' — рекомендуемые (cross-selling) товары для товара с id=12
    'related/upselling/23' — рекомендуемые (upselling) товары для товара с id=23
    'category/208' — товары из категории с id = 208
    'search/query=style' — результат поиска товаров по слову 'style'
    'search/tag=style' — результат поиска товаров по тегу 'style'
    'search/type_id=1' — результат поиска по любому полю таблицы shop_product, например, type_id
    'search/name=SuperProduct' — аналогичный поиск по полю name (точное совпадение)
    'search/color.value_id=6' — поиск по значению с id=6 характеристики типа "чекбокс" с кодом color
    'tag/style' — аналог 'search/tag=style'
    'type/2' — выбор товаров, которым присвоен тип с id=2

    Вся эта информация взята из исходного кода методов класса коллекции, имена которых заканчиваются на Prepare: categoryPrepare, idPrepare, relatedPrepare, searchPrepare, tagPrepare, typePrepare.
    • 0
      Paz Dim Paz Dim 18 февраля 2014 04:05 #
      О! Часть задачи решена - могу загружать в коллекцию набор товаров. А как эту коллекцию вывести на страницу магазина? Идея такая: есть форма, на ней - ряд полей ввода, по которым осуществляется фильтрация, и кнопка, при нажатии на которую вызывается на страницу выводится набор товаров(как при обычном поиске). Выборку буду делать сам, идентификаторы загружу в коллекцию... А что с коллекцией делать - пока не знаю
      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 18 февраля 2014 04:47 #
        Попробуйте воспользоваться методом {$wa->shop->products(search_conditions[,offset[, limit[, options]]])} из шпаргалки редактора дизайна.
        • +1
          vvedik vvedik 28 июня 2018 00:34 #

          Добрый день!

          А можете расшифровать что означает

          offset, limit, options ?

    • +1
      marked marked 4 апреля 2017 16:29 #

      То же самое, но через API, не работает или ограниченно работает. Добавил такое предложение по доработке.

  • 2
    Impulse Trofimov 8 декабря 2015 02:42 #

    Всем привет, проблема следующая: есть необходимость с генерировать XML файл для выгрузки (сторонние плагины не подходят!). Как с генерировать URL товара и URL его изображения из БД. то есть примерно так:

    <offer id="" productId="">

    <url>АДРЕС ТОВАРА</url>
    <price></price>
    <purchasePrice></purchasePrice>
    <categoryId></categoryId>
    <picture>ЧТО БЫ ЗДЕСЬ БЫЛ URL А НЕ ID КАРТИНКИ<picture/>
    <name></name>
    <productName></productName>

    </offer>

    За ранее спасибо.


    • +1
      Никита Лещёв Никита Лещёв 12 апреля 2016 03:21 #

      Есть как минимум 2 варианта, один затрагивает shopProductsCollection, другой - нет.

      Вариант с использованием shopProductsCollection

      //создаёте коллекцию
      $productCollection = new shopProductsCollection('search/status=1', array('absolute' => true));
      //первым аргументом указываете поля, которые необходимо выбрать, обязательно укажите поле images
      $products = $productCollection->getProducts('images, ext, frontend_url, name');

      Вариант без использования коллекции

      Воспользуйтесь функцией shopImage::getUrl, например так:

      shopImage::getUrl(
          array(
              'id' => $image_id,
              'product_id' => $product_id,
      'ext' => $extension //расширение изображения (jpg, например) ), '96x96', //размер изображения true //абсолютный или относительный должен быть путь )

      В обоих случаях есть вероятность, что в начале пути будет не нужное вам имя исполняемого файла. Так при выполнении скрипта из консоли в начале пути постоянно дописывается cli.php. Если у Вас возникнет такая же ошибка, рекомендую сделать так:

      str_replace('cli.php', '', shopImage::getUrl(...));
  • 1
    Paz Dim 18 февраля 2014 05:17 #
    Разобрался. Если кому-нибудь понадобится, то вот как сделал:
    Создал экшен класса shopFrontendAction, в нем - примерно следующее:
    $model = new shopProductModel();
    $products = $model->query('SELECT id FROM shop_product');
    $hash = 'id/';
    foreach($products as $product)
    {
    $hash .= $product['id'] . ', ';
    }
    $this->setCollection(new shopProductsCollection($hash));
    if($_POST['searchName'] != null)
    $this->view->assign('title', $_POST['searchName']);
    else
    $this->view->assign('title', '');
    $this->view->assign('frontend_search', shopMysearchPlugin::viewSearch());
    $this->setThemeTemplate('search.html');

    Как и хотел - отображает выбранные товары(в данном случае все) средствами вебасиста.
  • 1
    alexsergin 13 августа 2014 09:43 #
    Да
  • 1
    Impulse Trofimov 18 ноября 2015 05:24 #

    Всем привет, шарюсь в phpMyAdmin так вот у меня почему то нету таблицы товаров в SQL, то есть нету таблицы shop_product, может она как то по другому называется но я все проверил, и ни где нет записей о продуктах

    • +1
      Алексей Алексей Webasyst 18 ноября 2015 05:28 #

      В 5 и 6 версии именно эта таблица используется.

      Вы можете сделать дамп базы и в текстовом файле поиском найти где у вас товары. Возможно еще используется более старая версия.

  • 0
    Константин Брызгалин 22 апреля 2014 04:58 #
    все товары со скидкой:
    {$discounted = $wa->shop->products("search/compare_price>0")}
  • 0
    alexsergin 1 августа 2014 08:53 #
    А сортировку как делать?
    • 0
      Михаил Ушенин Михаил Ушенин Webasyst 4 августа 2014 02:48 #
      Используйте метод orderBy($field, $order = 'ASC') класса shopProductsCollection.

      Пример:
      $collection = new shopProductsCollection($hash);
      $collection->orderBy('sku_count', 'DESC'); //сортировка по убыванию кол-ва артикулов у товара
      • 0
        alexsergin alexsergin 13 августа 2014 09:45 #
        А если мне нужно в API получить товары с нужной сортировкой? В product.search тоже hash используется.
  • 0
    alexsergin 1 августа 2014 08:55 #
    А несколько параметров в кэш добавить как?

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите