Тема: Отображение комплектаций в списке товаров

День добрый!
Подскажите, можно ли производить выбор комплектаций в списке товаров?
В нашем случае это уменьшило бы список товаров в 4 раза.

Повысить оценку Понизить оценку

2 Отредактировано Александр (28.04.2015 16:50:27)

Re: Отображение комплектаций в списке товаров

Здравствуйте. Поясните подробнее Вашу задачу. Вам надо при отображении списка товаров, получать к товару комплектации, чтобы потом вывести по ним сведения? Я имею ввиду шаблон list_products.tpl.

Re: Отображение комплектаций в списке товаров

В списке товаров (list_products.tpl) дать возможность покупателю выбрать какую комплектацию положить в корзину.
Через radio button, например, отображать размер и цену.

Повысить оценку Понизить оценку

4

Re: Отображение комплектаций в списке товаров

В настоящее время, если товар с комплектацией, то всплывает окно, в котором нужно её выбрать.

Если вы хотите сразу отображать, то это можно сделать доработкой шаблона.
Корзина воспринимает URL видов: /cart/?add=ID_ТОВАРА&offer=ID_КОМПЛЕКТАЦИИ

В начале шаблона где-нибудь добавить массовую загрузку комплектаций к товарам.

{$list=$this_controller->api->addProductsOffers($list)}

Вам нужно вывести в виде радиокнопок комплектации для каждого товара в шаблоне, примерно таким образом

{foreach from=$product.offers.items key=key item=offer name=offers}
     <input value="{$key}" type="radio" name="offer" {if $smarty.foreach.offers.first}checked{/if} id="offer_{$key}_{$product.id}" />
     <label for="offer_{$key}_{$product.id}">{$offer.title}</label><br>
{/foreach}

и написать JavaScript, который будет править href у иконки "В корзину" для этого товара, добавляя параметр offer=ID_ОТМЕЧЕННОЙ_КОМПЛЕКТАЦИИ.

Повысить оценку Понизить оценку

5 Отредактировано Александр (29.04.2015 12:48:28)

Re: Отображение комплектаций в списке товаров

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

Например вот так:

{foreach from=$product.offers.items key=key item=offer name=offers}
<a href="{$router->getUrl('shop-front-cartpage', ["add" => $product.id,"offer"=>$key])}" class="addToCart">В корзину</a>
{/foreach}

Но если всё же нужны радиокнопки, то можно сделать так:
Контейнер в который вы оборачиваете выводящийся товар с комплектациями добавить атрибут "data-id", где значением будет id текущего перебираемого товара. А внутри уже выводить комплектации радио кнопками с атрибтом name="offer".
Дело в том, что скрипт который отрабатывает нажатие на добавить в корзину ищет ближайшего родителя в html, у которого есть атрибут data-id со значением текущего товара. Как только он его находит он пытается найти внутри этого оборачивающего контейнера input с атрибутом name="offer". Т.е. ищет какую какую комплектацию хотят поместить и автоматически добавляет её в запрос. Поэтому в Вашем случае надо сделать так:

<div data-id="{$product.id}">
{foreach from=$product.offers.items key=key item=offer name=offers}
     <input value="{$key}" type="radio" name="offer" {if $smarty.foreach.offers.first}checked{/if} id="offer_{$key}_{$product.id}" />
     <label for="offer_{$key}_{$product.id}">{$offer.title}</label><br>
     <a href="{$router->getUrl('shop-front-cartpage', ["add" => $product.id])}" class="addToCart">В корзину</a>
{/foreach}
</div>

Обратите внимание, что ссылке присвоен класс addToCart именно этот класс отвечает за нажатие на добавить в корзину. Если хотите разобраться более подробно, то загляните в common.js в папке с Вашей темой оформления.
Пробуйте.

Re: Отображение комплектаций в списке товаров

Помогло?

Re: Отображение комплектаций в списке товаров

Александр пишет:

Помогло?

Столкнулся с такой же проблемой - решение работает. А как вывести цены + зачеркнутые цены для каждой комплектации рядом с название комплектации? Заранее спасибо за ответ

Повысить оценку Понизить оценку

8 Отредактировано Александр (05.05.2015 19:44:10)

Re: Отображение комплектаций в списке товаров

Всё просто.
Цену можно получить в шаблоне следующей конструкцией:

{$product->getCost('Имя цены или ничего')}

Если имя цены не указано, то возвращается значение цены по умолчанию.
Для вашего случая цену можно вывести так:

{*Цена по умолчанию*}
{$product->getCost()}

{*Цена зачеркнутая*}
{$product->getCost('Зачеркнутая цена')}

Т.к. {$product} является объектом \Catalog\Model\Orm\Product, то Вам будут доступны все фунукции класса Product в файле /modules/catalog/model/orm/product.inc.php
Пробуйте и отпишитесь smile

9 Отредактировано Александр (06.05.2015 10:53:41)

Re: Отображение комплектаций в списке товаров

Александр пишет:

Всё просто.
Цену можно получить в шаблоне следующей конструкцией:

{$product->getCost('Имя цены или ничего')}

Спасибо огромное, помогло.

Применил конструкцию

{foreach from=$product.offers.items key=key item=offer name=offers}
<b><label for="offer_{$key}_{$product.id}">{$offer.title} - </label></b>
{$product->getCost(null, $key)}
{$product->getCost('Зачеркнутая цена', $key)}
{/foreach}

Единственное, не появляется значение $offer.title в случаях если у меня 1 вариант комплектации. Если их 2 и больше, то все выводиться нормально.

Повысить оценку Понизить оценку

10 Отредактировано Александр (06.05.2015 18:06:29)

Re: Отображение комплектаций в списке товаров

Единственное, не появляется значение $offer.title в случаях если у меня 1 вариант комплектации. Если их 2 и больше, то все выводиться нормально.

Если у товара 1 комплектация, то она не выводится, т.к. это и есть сам товар.
Вам надо поставить проверку на наличие комплектаций(Если больше двух). Сделать это просто:

{if $product->isOffersUse()}
    //Если есть комплектации и их больше 1
{else}
    //Иначе просто сам товар.
{/if}

Насчёт цены для комплектаций, то вы верно подсмотрели решение. В вашем случае нужна конструкция:

{$product->getCost('Имя цены или null','номер комплектации начиная от 0')}

{*Например*}
{$product->getCost(null,2)} {*Получение цены основной для третьей комплектации*}

11 Отредактировано Ярослав (18.05.2015 18:40:15)

Re: Отображение комплектаций в списке товаров

Подскажите, пожалуйста, а как быть с многомерными комплектациями?
Пробовал по аналогии с кодом из файла product.tpl, вывод по var_dump показал, что у $product нет multioffers.
Многомерные комплектации используются, в корзине выбор есть, в карточке товара аналогично.

p.s. Подсмотрел в контроллере: $product->fillMultiOffers()

12 Отредактировано Александр (19.05.2015 01:04:31)

Re: Отображение комплектаций в списке товаров

Подскажите, пожалуйста, а как быть с многомерными комплектациями?
Пробовал по аналогии с кодом из файла product.tpl, вывод по var_dump показал, что у $product нет multioffers.
Многомерные комплектации используются, в корзине выбор есть, в карточке товара аналогично.

p.s. Подсмотрел в контроллере: $product->fillMultiOffers()

Вы всё верно подсмотрели. Дело в том, что мы не подгружаем к товару многомерки сразу, т.к. они не требуются в списке, а нужны лишь на странице товара.
Для того, чтобы подгрузить к одному товару многомерки используется конструкция

{$product->fillMultiOffers()}

После этого к товару будут дописаны многомерки если они есть и проверить это можно так:

{if $product->isMultiOffersUse()}
   //Многомерки используются
{else}
   //Иначе
{/if}

После того как добавятся многомерки, то они будут ключе массива объекта \Catalog\Model\Orm\Product. А именно в

   <pre>
   {var_dump($product.multioffers)}
   </pre>

Т.е. перебрать многомерки можно как в карточке товара

{foreach $product.multioffers.levels as $level}
    
{/foreach}

Следующим шагом, нужно добавить информацию о комплектациях, которые соответствуют одной из выбранных многомерных комплектаций.

{if $product->isOffersUse()}
                {foreach from=$product.offers.items key=key item=offer name=offers}
                    <input value="{$key}" type="hidden" name="hidden_offers" class="hidden_offers" {if $smarty.foreach.offers.first}checked{/if} id="offer_{$key}" data-info='{$offer->getPropertiesJson()}' {if $check_quantity}data-num="{$offer.num}"{/if} {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getCost('Зачеркнутая цена', $key)}"}' data-images='{$offer->getPhotosJson()}' data-sticks='{$offer->getStickJson()}'/>
                {/foreach}
                
      <input type="hidden" name="offer" value="0"/>
{/if}

Соответственно нужно обеспечить выбор нужной комплектации которая соответствует выбраной многомерной комплектации. Если посмотреть на input'ы, то там видно, что подгружаются сведения о многомерках в data-info.
Т.е. нужно javascript.
Посмотреть как взять нужную комплектацию можно в /templates/ВАША ТЕМА/resourse/js/jquery.changeoffer.js, в методе changeMultiOffer.

Для javascript просмотра используйте firebug и console.log(переменная);

В этом методе смотрится, что выбрана многомерка, смотрится соотвествие комплектациям, и если такая есть, то в input с name="offer" ставится нужная комплектация.

При нажатии на кнопку купить. Скрипт смотрит что у нас находится в этом input в рамках контейнера который обёрнут с data-id="id товара", как приведено выше.

По идее, Вам надо просто добавить скрипт jquery.changeoffer.js на эту страницу и он сам поймёт всю структуру. И при смене многомерки будет выбиратся нужная комплектация. Главное чтобы была обёртка с data-id (как было описано в предыдущем посте).

Есть ещё другой момент. Вы работаете со списком товаров, а каждый раз подгружать многомерки накладно. Поэтому вместо:

{$product->fillMultiOffers()}

Вам нужно использовать конструкцию

{$list=$this_controller->api->addProductsMultiOffers($list)}

Подробнее данный метод можно посмотреть в файле /modules/catalog/model/api.inc.php. Данный метод позволит подгрузить многомерки сразу многим товарам.

Пробуйте.

13

Re: Отображение комплектаций в списке товаров

Спасибо за детальный ответ!

Re: Отображение комплектаций в списке товаров

Не за что. smile Надеюсь, Вам это пригодится.

15

Re: Отображение комплектаций в списке товаров

Уже пригодилось) Оптовый интернет-магазин, поэтому выбор комплектации и количества сразу из списка товаров категории.