Общие данные и элементы
Элементы дизайна и верстки
Такие стандартные возможности, как добавление товаров в корзину, пересчет корзины с использованием JS и Ajax (без перезагрузки страницы), выбор вариантов товара, всплывающие окошки форм и т.п. уже реализованы в платформе Дигистр. Все это находится в файле скриптов digistr.js, который нужно подключить к своим макетам.
Чтобы все созданные функции работали в вашей теме, нужно добавить соответствующие классы, идентификаторы и атрибуты для HTML элементов страницы.
Отображение цен в валюте сайта
Необходимо создать элемент, с id равным «shop-cart-currency» и параметрами для форматирования цен: format, name, decimals, dsep, tsep. Так скрипты получат информацию, как форматировать цены. Это используется при динамических пересчетах цен (при обновлении количества товара в корзине, например). Чаще всего, это код добавляется возле корзины или в подвале сайта.
<span id="shop-cart-currency" format="{$document.Currency.format}" name="{$document.Currency.sign|default:$document.Currency.name}" decimals="{$document.Currency.decimals}" dsep="{$document.Currency.dsep}" tsep="{$document.Currency.tsep}"></span>
Блок корзины
Следующие классы используются для работы блока корзины.
.cart-count | Количество товаров в корзине |
.cart-count-label | Подпись к количеству (товаров, товар, товара) |
.cart-price | Отформатированная сумма корзины в валюте сайта |
.cart-ajax | Перезагружаемый блок, который обновляется при добавлении товара в корзину. Используется для «маленькой корзины» со списком товаров. |
<a href="{url action='shop.cart.index'}" class="dropdown-toggle" data-toggle="dropdown">
<span class="icon"><i class="fa fa-shopping-cart"></i></span>
<span class="cart-value">
<span class="count cart-count">{$document.Cart.count|default:0}</span>
—
<span class="count cart-price">{$document.Cart.price_site_format|default:0}</span>
</span>
</a>
<div class="dropdown-menu cart-ajax">
{* Текущее состояние корзины *}
{include file='blocks/cart.tpl'}
</div>
Содержание корзины
.cart-isempty | Блок, который показывается, когда корзина пуста (нет товаров) | ||||||||||
.cart-isnotempty | Блок для непустой корзины | ||||||||||
.cart-delete |
Удаление товара из корзины при клике по данному элементу Дополнительные атрибуты элемента
|
||||||||||
.cart-count-changer |
Поле с вводом количества товаров Дополнительные атрибуты элемента
|
||||||||||
#order_delivery_id |
ID. Выпадающий список выбора способа доставки Элементы списка (option) имеют следующие атрибуты
|
||||||||||
.cart-delivery-price | Отформатированная сумма доставки в валюте сайта |
{* Класс pr{$item.id} для удаления строки при удалении товара *}
{ foreach from=$document.Cart.products item=item name=i }
<tr class="pr{$item.id} {cycle name=ci values='even,odd'} {if $smarty.foreach.i.first}first{elseif $smarty.foreach.i.last}last{/if}">
<!-- фото -->
<td>
{ if !empty($item.Product.photo) }
<a href="{ $item.Product.url }" class="product-image">{photo _crop=1 _width=100 _height=100 _id=$item.Product.id src=$item.Product.photo title=$item.Product.name alt=$item.Product.name folder=product}</a>
{ /if }
</td>
<!-- название -->
<td>
<a href="{ $item.Product.url }">{ $item.Product.name }</a>
{if !empty($item.ProductVariant.name)}<br>{$item.ProductVariant.name}{/if}
</td>
<!-- цена -->
<td>{ $item.price_site_format }</td>
<!-- количество -->
<td>
{* Класс cart-count-changer с атрибутами для автоматического обновления количества товаров *}
{if !$_params.shop_checkstock || $item.stock}
<input name="data[order][product][{ $item.id }]" class="form-control cart-count-changer" type="text" value="{ $item.qty }" price="{ $item.price_site }" productid="{ $item.id }" {if $_params.shop_checkstock}productlimit="{$item.stock}"{/if} update=".pv{$item.id}">
{else}
Нет<br><small>на складе</small>
{/if}
</td>
<!-- итого -->
{* Класс pv{$item.id}, куда запишется итого, как указано в .cart-count-changer атрибуте update *}
<td><span class="pv{$item.id}">{ $item.total_site_format }</span></td>
<!-- удалить -->
{* Класс cart-delete с атрибутами удаления товара и его строки *}
<td><a class="cart-delete" href="{url action='shop.cart.delete'}/{ $item.id }" productid="{ $item.id }" delete=".pr{$item.id}"><i class="fa fa-trash"></i></a></td>
</tr>
{ /foreach }
<tr>
<td colspan="4" class="ta-r">
{* ID order_delivery_id для динамического обновления способа доставки и полей формы. *}
{if !empty($delivery[1].Delivery) || ($delivery && $_params.shop_show_one_delivery)}
<select class="select" id="order_delivery_id" name="data[order][delivery_id]">
{foreach from=$delivery item=item}
<option value="{$item.Delivery.id}" price="{$item.Delivery.price_site}" priceispcnt="{$item.Delivery.price_is_pcnt}" pcnt="{$item.Delivery.price}" {if $item.Delivery.free_from_active && $item.Delivery.free_from}freefrom="{$item.Delivery.free_from_site}"{/if} showfields="{$item.Delivery.show_fields}">
{$item.Delivery.name}{if $item.Delivery.free_from_active && $item.Delivery.free_from} (бесплатно от {$item.Delivery.free_from_site_format}){/if}
</option>
{/foreach}
</select>
{/if}
</td>
<td class="ta-c">
{* Класс cart-delivery-price для динамической стоимости доставки *}
<span class="cart-delivery-price">{if !$delivery[0].Delivery.price_site || ($delivery[0].Delivery.free_from_active && ($document.Cart.price_site >= $delivery[0].Delivery.free_from_site))}бесплатно{else}{if $delivery[0].Delivery.price_is_pcnt}{$delivery[0].Delivery.price}%{else}{$delivery[0].Delivery.price_site}{/if}{/if}</span>
</td>
<td></td>
</tr>
<tr>
<td colspan="4" class="ta-r">
<b>Итого:</b>
</td>
<td class="ta-c">
<b><span class="cart-price">{ $document.Cart.price_site_format }</span></b>
</td>
<td></td>
</tr>
Добавление в корзину
Кнопки добавления в корзину, избранное и сравнение могут иметь два состояния: товар уже добавлен в соответствующий список или еще не добавлен. Поэтому создается два элемента: первый добавляет товар в список, второй – удаляет. Во время добавления или удаления товаров меняется их видимость на странице (скрываются или показываются соответствующие элементы).
Для корзины часто достаточно только добавления в корзину.
.addtocart |
Добавление в корзину по клику Обязательные атрибуты
Дополнительные атрибуты
|
Полная версия
{* Если указывается ссылка без JS, то нужен nofollow *}
{* Где-то рядом с кнопкой есть <input class="pc{$item.Product.id}"> для количества *}
{if $item.CatalogStatus.is_orderable || empty($item.CatalogStatus.alias)}
<a href="{url action='shop.cart.add'}/{$item.Product.id}/1" rel="nofollow"
class="addtocart tc{$item.Product.id} {if !empty($document.Cart.ids) && in_array($item.Product.id, $document.Cart.ids)}d-none{/if}"
show=".ic{$item.Product.id}"
hide=".tc{$item.Product.id}"
productid="{$item.Product.id}"
productprice="{$item.Product.price_site}"
count=".pc{$item.Product.id}"
{if $_params.shop_checkstock}productlimit="{$item.Product.stock}"{/if}>
В корзину
</a>
{* Второе состояние - переход в корзину по ссылке *}
<a href="{url action='shop.cart.index'}" rel="nofollow"
class="incart ic{$item.Product.id} {if empty($document.Cart.ids) || !in_array($item.Product.id, $document.Cart.ids)}d-none{/if}">
<span>В корзине →</span>
</a>
{/if}
Обычный способ
{if $item.CatalogStatus.is_orderable || empty($item.CatalogStatus.alias)}
<a href="{url action='shop.cart.add'}/{$item.Product.id}/1" rel="nofollow"
class="addtocart tc{$item.Product.id} {if !empty($document.Cart.ids) && in_array($item.Product.id, $document.Cart.ids)}d-none{/if}"
productid="{$item.Product.id}"
productprice="{$item.Product.price_site}">
В корзину
</a>
{/if}
Дополнительно на странице товара используются атрибуты count и productlimit.
Добавление в избранное и сравнение
Аналогично добавлению в корзину используется два состояния кнопок, которые обязательны, в отличие от корзины, где можно разместить только кнопку добавления товара в список.
.wishlist-add |
Добавление в избранное по клику Атрибуты
|
||||||
.wishlist-delete |
Удаление из избранного Атрибуты
|
||||||
.wishlist-hide | Вспомогательный класс, который добавляет display:none в стили элемента и таким образом скрывает неактивное состояние элемента |
С помощью атрибутов show и hide обеспечивается показ соответствующего состояния товара в списке (добавлен или нет).
Аналогично для сравнения используются классы compare-add, compare-delete, compare-hide с атрибутами productid, show и hide.
{if m('wishlist')}
<a title="В избранное" class=" {if in_array($item.Product.id, $document.WishList.ids)}wishlist-hide{/if} wishlist-add twls{$item.Product.id}" productid="{$item.Product.id}" show=".twlh{$item.Product.id}" hide=".twls{$item.Product.id}"><i class="fa fa-heart"></i></a>
<a title="Удалить из избранного" class="{if !in_array($item.Product.id, $document.WishList.ids)}wishlist-hide{/if} wishlist-delete twlh{$item.Product.id}" productid="{$item.Product.id}" show=".twls{$item.Product.id}" hide=".twlh{$item.Product.id}"><i class="fa fa-heart"></i></a>
{/if}
{if m('compare')}
<a title="Сравнить" class="{if in_array($item.Product.id, $document.CompareList.ids)}compare-hide{/if} compare-add tcmps{$item.Product.id}" productid="{$item.Product.id}" show=".tcmph{$item.Product.id}" hide=".tcmps{$item.Product.id}"><i class="fa fa-compress"></i></a>
<a title="Удалить из сравнения" class="{if !in_array($item.Product.id, $document.CompareList.ids)}compare-hide{/if} compare-delete tcmph{$item.Product.id}" productid="{$item.Product.id}" show=".tcmps{$item.Product.id}" hide=".tcmph{$item.Product.id}"><i class="fa fa-compress"></i></a>
{/if}
Часто в верстке кнопки добавления в избранное и сравнения созданы элементом <span> или <a>. При смене видимости этих элементов на странице с помощью show()/hide() в jQuery их свойство display меняется на inline. Но в верстке изначальное состояние равно inline-block. Так кнопки добавленного в корзину товара искажаются. Чтобы этого избежать, нужно менять стиль на корректный. Для этого в файлы скриптов нужно добавить следующие строки.
jQuery(document).ready(function($)
{
/* Корректное отображение для span при добавлении в избранное и сравнение */
$('.wishlist-add, .wishlist-delete, .compare-delete, .compare-add').click(function(){
$( $(this).attr('show') ).css({'display' : 'inline-block'});
});
});
Быстрый просмотр
Для быстрого просмотра нужно указать ссылку на страницу товара с URL параметром «?quickview=1». Чтобы ссылка открывалась во всплывающем окошке, вместо отдельной страницы, нужно добавить ей класс «quick-view-button». Сам шаблон для быстрого просмотра должен быть «catalog/quickview.tpl».
{if m('quickview')}
<a class="quick-view-button" href="{ $item.Product.url }?quickview=1">Быстрый просмотр</a>
{/if}
Всплывающие формы заказа звонка, быстрой покупки и т.п.
Чтобы показать всплывающее окно с формой, необходимо добавить элементу класс «user-request». В атрибуте type указывается, какую форму нужно показать. Доступны следующие значения.
preorder | Предзаказ * |
quickbuy | Быстрая покупка (создает новый заказ) * |
product | Быстрый заказ (только заявка с названием товара) * |
bargain | Торг по цене * |
decrease | Уведомление о снижении цены * |
callback | Заказ звонка |
sendidea | Предложение идеи |
quickfeedback | Обратная связь |
messagetotop | Сообщение руководству |
pricerequest | Запрос прайса |
consultant | Заявка на консультацию |
Для типов, отмеченных звездочкой *, требуется атрибут productid – ID товара для которого отправляется заявка.
Дополнительные атрибуты boxwidth и boxheight позволяют указать произвольные размеры для формы. Это может понадобиться, если размеры полей формы и кнопка отправки сильно отличаются от стандартных и форма не вмещается в окно.
{if m('callback')}<a class="dashed user-request" type="callback" boxwidth="320" boxheight="500">Заказать звонок</a>{/if}
{if m('quickbuy')}<a class="dashed user-request" type="quickbuy" productid="{$document.Product.id}">Купить в 1 клик</a>{/if}
Класс dashed подчеркивает пунктиром ссылку.
Поиск
Дополнительные классы и элементы используются для поиска с автодополнением. Для обычного поиска такие классы не требуются.
Для простого автодополнения используется класс «search-autocomplete-input» для поля ввода запроса.
<form action="{url action='catalog.catalog.search'}" method="get">
<input name="filter[q]" class="{if m('autocomplete')}search-autocomplete-input{/if}" type="search" placeholder="Поиск по каталогу...">
<button class="search-submit"><i class="fa fa-search"></i></button>
</form>
Для расширенного автодополнения используется класс «ajaxsearch-input» для поля ввода. Также необходимо добавить элемент с id равным «ajaxsearch-result» для отображения результатов поиска. Этот элемент, вместе с полем ввода нужно обернуть в класс «ajaxsearch-area» чтобы спозиционировать показ результатов поиска возле поля ввода.
<form action="{url action='catalog.catalog.search'}" method="get" class="ajaxsearch-area">
<input name="filter[q]" class="{if m('autocomplete.pro')}ajaxsearch-input{/if}" type="search" placeholder="Поиск по каталогу...">
<button class="search-submit"><i class="fa fa-search"></i></button>
{if m('autocomplete.pro')}<div id="ajaxsearch-result"></div>{/if}
</form>