Shop: Магазин

Добавляет функционал корзины с сохранением заказов в базе данных. Позволяет размещать механизм добавления в корзину в любом месте страницы с помощью вставок (insertions).

Документация

Читать

Важная часть любого интернет-магазина, без которой его нельзя представить - корзина заказов. С ней покупатель сталкивается после того, как товар уже выбран и теперь необходимо сделать следующий шаг, оформить покупку. Компонент 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;',
			...
		),
	),
);

Все версии

Обращаем ваше внимание, что установка и обновление компонентов штатным способом осуществляется из системы управления вашим сайтом ("Библиотека компонентов"). Данный раздел несет прежде всего информационную функцию. Однако, вы можете скачивать инсталляционные пакеты компонентов в целях ознакомления или в случае если функционирование библиотеки компонентов по какой-то причине затруднено.


Версия Дата
0.1.1
Изменения
* Fix: убран console.log (js-api) * Fix: восстановлена потерянная переменная (js-api) * Fix: лёгкий рефакторинг (js-api)
19.07.2018
0.1.0
Изменения
* Добавлен js-класс позволяющий реализовать js-api к корзине
18.07.2018
0.0.53
Изменения
* Fix Исправлена баг с потерей дробной части цены при добавлении в корзину
22.06.2018
0.0.52
Изменения
* Добавлена поддержка сайтов с HTTPS (требует TAO не ниже 2.1.157)
29.01.2018
0.0.51 23.11.2015
0.0.50
Изменения
Добавлены события обновления корзины и товара в корзине
20.07.2015
0.0.49
Изменения
Исправлена ошибка в методе отображения таблицы заказа
18.05.2015
0.0.48
Изменения
- из базового шаблона удалены неиспользуемые скрипты - режим редактирования теперь доступен только в админе. Ранее при включении режима редактирования в письма пользователям также включалась форма редактирования.
13.05.2015
0.0.47
Изменения
Исправлена ошибка в контейнере, по вине которой не работали штатные методы переопределения шаблонов
24.04.2015
0.0.46
Изменения
Добавлена обработка действия копирования заказов в администраторе
02.03.2015
0.0.45
Изменения
Режим редактирования заказов в администраторе по умолчанию выключен
26.02.2015
0.0.44
Изменения
Исправлена ошибка при редактировании заказов в админе
26.02.2015
0.0.43 16.02.2015
0.0.42 13.02.2015
0.0.41 12.01.2015
0.0.40 12.01.2015
0.0.39 25.12.2014
0.0.38 25.12.2014
0.0.37 02.12.2014
0.0.36 27.11.2014
0.0.35 27.11.2014
0.0.34 21.11.2014
0.0.33 21.11.2014
0.0.32 14.11.2014
0.0.31 14.11.2014
0.0.30 14.11.2014
0.0.29 29.10.2014
0.0.28 29.10.2014
0.0.27 29.10.2014
0.0.26 28.10.2014
0.0.25 28.10.2014
0.0.24
Изменения
вывод информации о заказе с учетом заданных полей
28.10.2014
0.0.23 28.10.2014
0.0.22 23.10.2014
0.0.21 23.10.2014
0.0.20 23.10.2014
0.0.19 23.10.2014
0.0.18 23.10.2014
0.0.17 23.10.2014
0.0.16 22.10.2014
0.0.15
Изменения
Добавлен список заказов пользователя, возможность выводить список заказов и один заказ с помощью insertion и с помощью методов хелпера Прочие доработки
22.10.2014
0.0.14 15.08.2014
0.0.13 14.08.2014
0.0.12
Изменения
Добавлена интеграция с Робокассой
10.07.2014
0.0.11
Изменения
Исправлены url в заказе (относительные преобразуются в абсолютные). Исправлены шаблоны для писем
06.06.2014
0.0.10 04.06.2014
0.0.9
Изменения
Добавлены уведомления о заказе пользователю и администратору
04.06.2014
0.0.8 29.05.2014
0.0.7 22.05.2014
0.0.6 22.05.2014
0.0.5
Изменения
добавлена возможность размещать кнопки добавления в корзину в списке товаров добавлен блок "кол-во товаров в корзине" добавлена возможность вставлять блоки посредством вызова методов хелпера, а не только через Insertions
21.05.2014
0.0.3 16.05.2014
0.0.2 15.05.2014
0.0.1 15.05.2014