Пример создания нового способа доставки — различия между версиями
Velross (обсуждение | вклад)  (Новая страница: «'''Задача:''' рассчитывать доставку почтой России по следующей формуле: тариф + процент.<br/> '''…»)  | 
				Vitaliks (обсуждение | вклад)   (Отмена правки 9180, сделанной Aposio (обсуждение)) (Метка: отмена)  | 
				||
| (не показано 8 промежуточных версий 4 участников) | |||
| Строка 1: | Строка 1: | ||
| − | '''  | + | '''Актуально для версии 20'''  | 
| − | + | ||
| + | == Задача ==   | ||
| + | |||
| + | Создать новый тип доставки который расчитывает стоимость доставки с учетом цены заказа.  | ||
| + | |||
| + | == Решение ==   | ||
Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:<br/>  | Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:<br/>  | ||
| − | 1. Открыть модуль '''Шаблоны данных''' и найти там "'''  | + | 1. Открыть модуль '''Шаблоны данных''' и найти там тип данных "'''Способ доставки'''". Добавить в него дочерний шаблон, назвав его например, так "''Доставка стоимость + процент от заказа''".  | 
| − | + | ||
| − | 2. В созданном шаблоне   | + | [[Файл:Russian01.png]]  | 
| − | '''  | + | |
| − | '''  | + | 2. В созданном шаблоне добавим новую группу полей Свойства доставки [delivery_props] и добавим в нее два поля:  | 
| − | Запоминаем id шаблона из адресной строки браузера:  | + | |
| − | '''/admin/data/type_edit/  | + | '''Процент [procent]''' - тип число с точкой, видимое.  | 
| − | 3. В этом же модуле, на вкладке Справочники, находим справочник "'''Типы доставки'''" и нажимаем   | + | |
| − | Добавляем новое наименование.  | + | '''Стоимость заказа, после которой доставка бесплатна [order_min_price]''' - тип число с точкой, видимое.  | 
| − | В поле "'''Название'''" напишем тоже самое "''  | + | |
| − | + | [[Файл:Russian02.png]]  | |
| − | + | ||
| − | + | Запоминаем id шаблона из адресной строки браузера:  | |
| − | + | ||
| − | + | '''/admin/data/type_edit/659/''' - то есть у меня id=659  | |
| − | + | ||
| − | + | [[Файл:Russian03.png]]  | |
| − | '''  | + | |
| − | + | 3. В этом же модуле, на вкладке Справочники, находим справочник "'''Типы доставки'''" и нажимаем кнопку '''Посмотреть''', чтобы открыть содержимое справочника.  | |
| − | + | ||
| − | название класса courierDelivery на '''  | + | Добавляем новое наименование.  | 
| − | + | ||
| + | В поле "'''Название'''" напишем тоже самое "''Доставка стоимость + процент от заказа''", в поле "'''Тип данных (id)'''" наш запомненный ранее id "''135''", в поле "'''Идентификатор типа доставки'''" напишем название будущего класса, которое должно отражать предназначение класса. Указывается латинскими буквами. У меня в примере данный класс называется ''exampledelivery''.  | ||
| + | |||
| + | [[Файл:Russian04.png]]  | ||
| + | |||
| + | 4. Заходим на сайт по FTP, открываем директорию:  | ||
| + | |||
| + | '''/classes/components/emarket/classes/delivery/systems/'''  | ||
| + | |||
| + | там копируем файл courier.php и переименовываем его в ''exampledelivery.php'' - у Вас может быть другое название, которое Вы указали в 3 шаге.  | ||
| + | |||
| + | 5. Открываем файл на редактирование и изменяем:  | ||
| + | |||
| + | название класса courierDelivery на '''exampledeliveryDelivery''' (у вас может быть другое название, указанное на 3 шаге).  | ||
| + | |||
| + | Файл должен получиться примерно такой:  | ||
| + | |||
| + | <source lang="php">  | ||
<?php  | <?php  | ||
| − | 	class   | + | |
| + | 	/**  | ||
| + | 	 * Способ доставки типа "Доставка стоимость + процент от заказа".  | ||
| + | 	 * Подходит ко всем заказам.  | ||
| + | 	 * Стоимость доставки берет из объекта-источника + процент от стоимости заказа.  | ||
| + | 	 * Доставка может быть бесплатной, если стоимость заказа превысила значение соответствующей настройки объекта-источника.  | ||
| + | 	 */  | ||
| + | 	class exampledeliveryDelivery extends delivery {  | ||
| + | |||
| + | 		/** @inheritdoc */  | ||
		public function validate(order $order) {  | 		public function validate(order $order) {  | ||
			return true;  | 			return true;  | ||
		}  | 		}  | ||
| + | 		/** @inheritdoc */  | ||
		public function getDeliveryPrice(order $order) {  | 		public function getDeliveryPrice(order $order) {  | ||
| − | + | 			$deliveryPrice = $this->getValue('price');  | |
| − | + | 			$deliveryProcent = $this->getValue('procent');  | |
| + | 			$minOrderPrice = $this->getValue('order_min_price');  | ||
| + | |||
| + | 			$orderPrice = $order->getActualPrice() - $order->getDeliveryPrice();  | ||
| + | |||
| + | 			if ($minOrderPrice === null) {  | ||
| + | 				return $deliveryPrice + ($orderPrice / 100) * $deliveryProcent;  | ||
| + | 			}  | ||
| + | |||
| + | 			$returnPrice = $orderPrice < $minOrderPrice ? $deliveryPrice : 0;			  | ||
| + | 			return $returnPrice + ($orderPrice / 100) * $deliveryProcent;  | ||
| + | 		}  | ||
| + | 	}  | ||
| + | </source>  | ||
| − | + | Проверьте, что файл в кодировке utf-8 (без BOM).  | |
| − | + | ||
| − | + | 6. В административном интерфейсе сайта, в модуле Интернет-магазин, создайте новый способ доставки "''Доставка стоимость + процент от заказа''", заполните поля Стоимость доставки, Процент и Стоимость заказа, после которой доставка бесплатна:  | |
| − | + | ||
| − | + | [[Файл:Russian05.png]]  | |
| − | + | ||
| − | + | 7. Проверим работу нового способа доставки.  | |
| − | + | ||
| − | + | Наш заказ:  | |
| − | + | ||
| − | + | [[Файл:Russian06.png]]  | |
| − | + | ||
| − | Наш заказ:  | + | [[Файл:Russian07.png]]   | 
| + | |||
| + | Так как общая сумма заказа больше 500 рублей то стоимость доставки включает только процент от стоимости заказа.  | ||
| + | |||
| + | Итого: 0 + (32893 * 1%) = 328.93 руб.  | ||
| − | + | [[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]  | |
Текущая версия на 07:34, 17 мая 2019
Актуально для версии 20
Задача
Создать новый тип доставки который расчитывает стоимость доставки с учетом цены заказа.
Решение
Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:
1. Открыть модуль Шаблоны данных и найти там тип данных "Способ доставки". Добавить в него дочерний шаблон, назвав его например, так "Доставка стоимость + процент от заказа".
2. В созданном шаблоне добавим новую группу полей Свойства доставки [delivery_props] и добавим в нее два поля:
Процент [procent] - тип число с точкой, видимое.
Стоимость заказа, после которой доставка бесплатна [order_min_price] - тип число с точкой, видимое.
Запоминаем id шаблона из адресной строки браузера:
/admin/data/type_edit/659/ - то есть у меня id=659
3. В этом же модуле, на вкладке Справочники, находим справочник "Типы доставки" и нажимаем кнопку Посмотреть, чтобы открыть содержимое справочника.
Добавляем новое наименование.
В поле "Название" напишем тоже самое "Доставка стоимость + процент от заказа", в поле "Тип данных (id)" наш запомненный ранее id "135", в поле "Идентификатор типа доставки" напишем название будущего класса, которое должно отражать предназначение класса. Указывается латинскими буквами. У меня в примере данный класс называется exampledelivery.
4. Заходим на сайт по FTP, открываем директорию:
/classes/components/emarket/classes/delivery/systems/
там копируем файл courier.php и переименовываем его в exampledelivery.php - у Вас может быть другое название, которое Вы указали в 3 шаге.
5. Открываем файл на редактирование и изменяем:
название класса courierDelivery на exampledeliveryDelivery (у вас может быть другое название, указанное на 3 шаге).
Файл должен получиться примерно такой:
<?php
	/**
	 * Способ доставки типа "Доставка стоимость + процент от заказа".
	 * Подходит ко всем заказам.
	 * Стоимость доставки берет из объекта-источника + процент от стоимости заказа.
	 * Доставка может быть бесплатной, если стоимость заказа превысила значение соответствующей настройки объекта-источника.
	 */
	class exampledeliveryDelivery extends delivery {
		/** @inheritdoc */
		public function validate(order $order) {
			return true;
		}
		/** @inheritdoc */
		public function getDeliveryPrice(order $order) {
			$deliveryPrice = $this->getValue('price');
			$deliveryProcent = $this->getValue('procent');
			$minOrderPrice = $this->getValue('order_min_price');
			
			$orderPrice = $order->getActualPrice() - $order->getDeliveryPrice();
			
			if ($minOrderPrice === null) {
				return $deliveryPrice + ($orderPrice / 100) * $deliveryProcent;
			}
				
			$returnPrice = $orderPrice < $minOrderPrice ? $deliveryPrice : 0;			
			return $returnPrice + ($orderPrice / 100) * $deliveryProcent;
		}
	}
Проверьте, что файл в кодировке utf-8 (без BOM).
6. В административном интерфейсе сайта, в модуле Интернет-магазин, создайте новый способ доставки "Доставка стоимость + процент от заказа", заполните поля Стоимость доставки, Процент и Стоимость заказа, после которой доставка бесплатна:
7. Проверим работу нового способа доставки.
Наш заказ:
Так как общая сумма заказа больше 500 рублей то стоимость доставки включает только процент от стоимости заказа.
Итого: 0 + (32893 * 1%) = 328.93 руб.





