Важная часть любого интернет-магазина, без которой его нельзя представить - корзина заказов. С ней покупатель сталкивается после того, как товар уже выбран и теперь необходимо сделать следующий шаг, оформить покупку. Компонент Shop реализует минимальный необходимый функционал корзины с сохранением заказов в базе данных. Механизм добавления в корзину товара реализован с помощью вставок (insertions) и может быть размещен в любом месте страницы или формы.
Так как списки архивных заказов персонализированы, то для возможности их отображения требуется установка компонента Users.
Вывод на сайте (insertions)
1. Блок входа в корзину доступен по адресу /shop/cart/. Список товаров перемещается в архив после того, как посетитель оформит заказ.
Часто требуется кроме вывода ссылки на корзину возможность отслеживать количество добавленных товаров и общую сумму покупки. Для этого можно использовать соответствующий механизм вставки.
//app/views/layouts/work.php ... <div align=right><a href="/shop/cart/"><b>Ваша корзина</b></a> <br /> %cart_total{}</div> ...
где %cart_total{} - выводит количество и общую сумму выбранных товаров в корзине.
2. Вывод механизма добавления заказа для удобства был реализован с помощью вставок (/app/components/Shop/views/insertions).
- %add_to_cart{code, title, price [, $url = ' ']}
- code - id заказа, который формируется при занесении заказа в базу, отображается в администраторе сайта.
- title - название товара (заголовок в каталоге)
- price - цена
- [, $url = ' '] - необязательный параметр (string) url. Может использоваться, например, когда вывод механизма добавления в корзину применяется на странице со списком товаров, из которых предлагается каким-либо образом выбрать нужный.
Рассмотрим простой вариант, когда механизм добавления товара выведен в шаблоне страницы с описанием единицы товара.
// app/components/NodusCatalog/app/Item/full.phtml
...
<tr><td>%add_to_cart{code, title, price}</td></tr>
...
Можно воспользоваться непосредственно методом вывода механизма:
// app/components/NodusCatalog/app/Item/full.phtml ... // вывод для элементов NodusCatalog <tr><td><?=$this->shop->add_to_cart($item->id, $item->title, $item->price)?></td></tr> ...
Этот метод можно применять и для объектов, которые не являются сущностями нодус-каталога.
// app/components/NodusCatalog/app/Item/full.phtml ... // каким-либо образом полученные id, title и price <tr><td><?=$this->shop->add_to_cart($id, $title, $price)?></td></tr> ...
3. Архив заказов доступен по адресу /shop/orders/. Для его вывода также сделаны соответствующие вставки.
- %orders{[$url_mask]} - вывод полного списка заказов. $url_mask - необязательный параметр, маска для url заказа (../orders/%), где символ «%» будет изменен на id заказа.
- %order{$id, $orders_url} - вывод полного описания заказа.
Например вывод списка заказов в кабинете абонента.
// app/components/Users/app/views/home/index.phtml
...
<h2>История заказов</h2>
<div>%orders{}</div>
...
Или можно вывести без применения вставки.
// app/components/Users/app/views/home/index.phtml ... <?=$this->shop->orders(Component_Shop_Router::make_url('orders/%'))?> ...
Конфигурирование настроек компонента
Файл конфигурационных настроек хранится в папке под именем app/components/Shop/config/settings.php.
return array( 'for_auth_users' => false, 'add_template' => 'add-to-cart-simple', 'js_api' => false, 'currency' => 'руб.', 'statuses' => array( 0 => 'в обработке', 1 => 'исполнен', ), 'delivery' => array(), /* пример заполнения массива 'delivery' => array( 'Самовывоз' => 'бесплатно', 'По Москве' => 250, 'За пределы МКАД' => 500, 'По России' => 'рассчитывается менеджером', ),*/ 'send_notification' => false, 'notification_emails' => array(), 'send_reply' => true, 'email_from' => 'info@mysite.ru', 'subject' => 'Заказ с сайта', 'use_robokassa' => false, 'robokassa' => array( 'test_mode' => true, 'login' => '', 'pass1' => '', 'pass2' => '', 'description' => 'Оплата заказа', 'include_delivery' => true, // Включать стоимость доставки в сумму оплаты ), );
где
- for_auth_users - принимает значения true/false. По умолчанию стоит в false, т.е. все посетители могут добавлять товары в корзину. Если установлено в true, то для не авторизованных посетителей не будет отображаться механизм добавления в корзину.
- add_template - установка одного из предуставновленных шаблонов или пользовательского шаблона. Предустановленные шаблоны:
- add_to_cart_simple.phtml - упрощенный вывод в виде ссылки.
- add_to_cart.phtml - вывод шаблона с указанием количества выбранных товаров и их общая сумма.
- js_api - принимает значения true/false. По умолчанию стоит в false, что значит не использовать новую js-реализацию корзины с объектом API.
- currency - добавляет к цене наименование валюты.
- statuses - массив произвольных значений, обозначающих статус обработки заказа. Предустановлены 2 значения:
- 0 => в обработке
- 1 => 'исполнен
- delivery - выводится в виде дополнительной строки с выпадающим списком в таблице заказа в корзине.
- send_notification - подключает рассылку уведомлений администраторам портала при появлении новых заказов на сайте.
- notification_emails - массив адресов, кому будут рассылаться уведомления.
- send_reply - принимает значения true/false. Подключает отправку писем-уведомлений пользователям после оформления заказа.
- email_from - адрес отправителя для формирования письма.
- subject - заголовок письма
- use_robokassa - выводится в виде чекбокса. Подключает сервис оплаты через РОБОКАССУ.
- robokassa - массив значений для настройки сервиса РОБОКАССА.
- 'test_mode' => true - включить тестовый режим настройки Робокассы
- 'login' => '' - логин, берется из настроек Робокассы.
- 'pass1' => ,' ' '' - пароль 1, берется из настроек Робокассы.
- 'pass2' => ' ' '' - пароль 2, берется из настроек Робокассы.
- 'description' => 'Оплата заказа' - описание операции.
- 'include_delivery' => true - включать стоимость доставки в сумму оплаты.
js-API
С версии 0.1.0 в базовую поставку входят js-файлы, содержащие js-объекты, реализующие минимальный api по работе с корзиной.
В стандартном режиме (без js_api) для механизма добавления в корзину используется файл session/add-to-cart-simple.js (или session/add-to-cart.js для шаблона add-to-cart).
При активации js_api вместо них всегда подключаются 2 файла: baseShop.js и shop.js, реализующие тот же функционал, но написанные по более современным стандартам.
В файле baseShop.js описан базовый класс BaseShop, экземпляр объекта которого хранится в TAO.baseShop. Его не меняем и не переопределяем, но туда можно и нужно заглянуть, чтобы изучить код и js-doc и понимать реализацию.
В файле shop.js описан класс Shop, отнаследованный от TAO.baseShop. Его не меняем, но можем переопределить стандартным образом через папку /app/, после чего - работаем как с обычным отнаследованным классом: можем использовать базовый функционал, добавлять свои методы, переопределять базовые.
При желании можно не использовать стандартные шаблоны добавления в корзину (хелперы и insertion add_to_cart) и вместо этого:
- либо выводить все необходимые данные в своём шаблоне, с сохранением классов и data-атрибутов;
- либо сделать свою реализацию методов updateItem и event2Item.
При этом нужно будет подключить скрипты (последовательность подключения важна, не перепутайте при выставлении весов и типов):
$this->use_scripts(CMS::component_static_path('scripts/baseShop.js', 'Shop')); $this->use_scripts(CMS::component_static_path('scripts/shop.js', 'Shop'));
Настройка РОБОКАССЫ
Если есть необходимость в использовании системы электронных платежей, то в компоненте реализован механизм настройки электронных платежей через систему РОБОКАССА. Сервис предоставляет доступ к тестовому серверу для настройки работы механизма. Для этого в настройках конфигурации компонента Shop значение test_mode установлено в true. Т.е. передача реальных платежей производиться не будет. По окончании отладки работы сервиса необходимо эту настройку отключить.
Подробнее о работе тестового сервера можно почитать в Справочном руководстве РОБОКАССЫ.
Для настройки системы необходимо зарегистрировать магазин на сайте РОБОКАССЫ, а затем внести всю необходимую информацию о магазине в личном кабинете магазина.
В разделе «Мои магазины» с вкладки «Технические настройки» нужно получить логин и пароли для настроек конфигурации.
// return array( ... 'use_robokassa' => false, 'robokassa' => array( 'test_mode' => true, 'login' => '', 'pass1' => '', 'pass2' => '', 'description' => 'Оплата заказа', 'include_delivery' => true, // Включать стоимость доставки в сумму оплаты ), );
Для полей Result Url, Success Url, Fail Url - необходимо прописать url для корректной работы системы.
- Result Url - http://mysite.ru/shop/payment-process/ - служебный адрес, по которому настроен механизм сверки факта оплаты и валидации процесса.
- Success Url - http://mysite.ru/shop/payment-ok/ - страница, которую увидит покупатель после того как оплата прошла или попытка оказалась неудачной.
- Fail Url http://mysite.ru/shop/payment-fail/ - страница, которую увидит покупатель после того как отказался от оплаты.
Редактирование заказов в администраторе
Начиная с версии 0.0.43, в административной части можно полноценно редактировать заказы, добавляя и удаляя товары из них. По умолчанию эта опция отключена. Для подключения необходимо включить режим в настройках.
// app/components/Shop/app/config/settings.php return array( ... 'can_edit_orders' => true, ... );
Затем указать полю search_callback функцию, которая будет возвращать набор записей по запросу пользователя в администраторе. На вход ей будет передаваться строка поиска (данные, которые ввел пользователь) и объект текущего заказа. На выходе должен получиться массив или Traversable-сущность, содержащая объект Entity. На выходе должны быть получены поля id, title, price и метод url(). Если заранее известно, что все эти поля присутствуют в объекте и будут получены, то в настройке полей достаточно указать значение параметра search_callback.
// app/components/Shop/app/config/fields.php return array( 'shop_orders' => array( 'search_callback' => function($query, $item) { $query = trim($query); $id_query = (int) $query; if (strlen($id_query) == strlen($query)) { return Component_Nodus::selector('catitem')->where('nodus_items.id LIKE :query', $id_query . '%')->rows(); } return Component_Nodus::selector('catitem')->where('title LIKE :query', '%' . preg_replace('~\s+~', '%', $query) . '%')->rows(); }, ), );
Также в search_callback можно передать, любой callable-тип, который подходит для Core_Invoke. Кроме этого, можно использовать следующие параметры:
- nodus_catalog - будут выбираться товары из НодусКаталога (предполагается, что компонент установлен).
- nodus/{$datatype} - будут выбираться записи из указанного типа данных нодуса (при условии установленного Нодуса).
- {$orm_name}/{$mapper_method}/{$other_mapper_metod}/... - будут выбираться записи из маппера $orm_name. Перед выборкой на этом маппере будут последовательно вызваны все mapper_method без передачи в них каких-либо аргументов.
// app/components/Shop/app/config/fields.php return array( 'shop_orders' => array( ... 'search_callback' => 'nodus_catalog', ...
Если поля id, title, price, по каким-то причинам, не возможно получить таким образом, то в настройках для поля data можно задать функцию, которая будет превращать данные из Entity в формат, пригодный для передачи и вывода непосредственно для клиента. На вход такая функция должна принимать объект товара, а на выход должна отдать массив, содержащий ключ value - то, что будет непосредственно показано клиенту, и data - массив с полями title, id, price и url, которые будут записаны в базу.
// app/components/Shop/app/config/fields.php return array( 'shop_orders' => array( 'data' => array( 'item_row_callback' => function($row) { return array( 'value' => "[{$row->id}] {$row->title}", 'data' => array( 'title' => $row->title, 'price' => 15215, 'id' => $row->id, 'url' => $row->url() ), ); }, ), );
Для стилизации поля с поиском товара (например, изменения длины) можно воспользоваться настройкой поля ac_style.
// app/components/Shop/app/config/fields.php return array( 'shop_orders' => array( 'data' => array( 'ac_style' => 'width: 450px;', ... ), ), );