Тема: Отображение комплектаций в списке товаров
День добрый!
Подскажите, можно ли производить выбор комплектаций в списке товаров?
В нашем случае это уменьшило бы список товаров в 4 раза.
Форум ReadyScript Вопросы по работе с системой Отображение комплектаций в списке товаров
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
День добрый!
Подскажите, можно ли производить выбор комплектаций в списке товаров?
В нашем случае это уменьшило бы список товаров в 4 раза.
Здравствуйте. Поясните подробнее Вашу задачу. Вам надо при отображении списка товаров, получать к товару комплектации, чтобы потом вывести по ним сведения? Я имею ввиду шаблон list_products.tpl.
В списке товаров (list_products.tpl) дать возможность покупателю выбрать какую комплектацию положить в корзину.
Через radio button, например, отображать размер и цену.
В настоящее время, если товар с комплектацией, то всплывает окно, в котором нужно её выбрать.
Если вы хотите сразу отображать, то это можно сделать доработкой шаблона.
Корзина воспринимает 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_ОТМЕЧЕННОЙ_КОМПЛЕКТАЦИИ.
Можно рассмотреть более простой вариант. Вывести комплектации товара и в строках с комплектациями на против каждой вывести кнопку в корзину с уже готовых 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 в папке с Вашей темой оформления.
Пробуйте.
Помогло?
Столкнулся с такой же проблемой - решение работает. А как вывести цены + зачеркнутые цены для каждой комплектации рядом с название комплектации? Заранее спасибо за ответ
Всё просто.
Цену можно получить в шаблоне следующей конструкцией:
{$product->getCost('Имя цены или ничего')}
Если имя цены не указано, то возвращается значение цены по умолчанию.
Для вашего случая цену можно вывести так:
{*Цена по умолчанию*}
{$product->getCost()}
{*Цена зачеркнутая*}
{$product->getCost('Зачеркнутая цена')}
Т.к. {$product} является объектом \Catalog\Model\Orm\Product, то Вам будут доступны все фунукции класса Product в файле /modules/catalog/model/orm/product.inc.php
Пробуйте и отпишитесь
Всё просто.
Цену можно получить в шаблоне следующей конструкцией:{$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 и больше, то все выводиться нормально.
Единственное, не появляется значение $offer.title в случаях если у меня 1 вариант комплектации. Если их 2 и больше, то все выводиться нормально.
Если у товара 1 комплектация, то она не выводится, т.к. это и есть сам товар.
Вам надо поставить проверку на наличие комплектаций(Если больше двух). Сделать это просто:
{if $product->isOffersUse()}
//Если есть комплектации и их больше 1
{else}
//Иначе просто сам товар.
{/if}
Насчёт цены для комплектаций, то вы верно подсмотрели решение. В вашем случае нужна конструкция:
{$product->getCost('Имя цены или null','номер комплектации начиная от 0')}
{*Например*}
{$product->getCost(null,2)} {*Получение цены основной для третьей комплектации*}
Подскажите, пожалуйста, а как быть с многомерными комплектациями?
Пробовал по аналогии с кодом из файла product.tpl, вывод по var_dump показал, что у $product нет multioffers.
Многомерные комплектации используются, в корзине выбор есть, в карточке товара аналогично.
p.s. Подсмотрел в контроллере: $product->fillMultiOffers()
Подскажите, пожалуйста, а как быть с многомерными комплектациями?
Пробовал по аналогии с кодом из файла 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. Данный метод позволит подгрузить многомерки сразу многим товарам.
Пробуйте.
Не за что. Надеюсь, Вам это пригодится.
Уже пригодилось) Оптовый интернет-магазин, поэтому выбор комплектации и количества сразу из списка товаров категории.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум ReadyScript Вопросы по работе с системой Отображение комплектаций в списке товаров