Компонент Shop: Магазин

Компонент: Shop: Магазин

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