Пример создания нового способа доставки — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Отмена правки 9180, сделанной Aposio (обсуждение))
(Метка: отмена)
 
Строка 1: Строка 1:
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
<br/>
 
  
'''Задача:''' рассчитывать доставку почтой России по следующей формуле: тариф + процент.<br/>
+
== Задача ==
'''Решение:''' для решения поставленной задачи, создадим новый способ доставки.<br/>
+
 
 +
Создать новый тип доставки который расчитывает стоимость доставки с учетом цены заказа.
 +
 
 +
== Решение ==
  
 
Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:<br/>
 
Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:<br/>
1. Открыть модуль '''Шаблоны данных''' и найти там "'''Способы доставки'''". Добавить в него дочерний шаблон, назвав его например, так "''Почта России Тариф+Процент''".<br/>
+
1. Открыть модуль '''Шаблоны данных''' и найти там тип данных "'''Способ доставки'''". Добавить в него дочерний шаблон, назвав его например, так "''Доставка стоимость + процент от заказа''".
[[Файл:Russian01.png]]<br/>
+
 
2. В созданном шаблоне создаем два поля:<br/>
+
[[Файл:Russian01.png]]
'''Тариф [tarif]''' - тип число, видимое.<br/>
+
 
'''Процент [procent]''' - тип число с точкой, видимое.<br/>
+
2. В созданном шаблоне добавим новую группу полей Свойства доставки [delivery_props] и добавим в нее два поля:
[[Файл:Russian02.png]]<br>
+
 
Запоминаем id шаблона из адресной строки браузера:<br/>
+
'''Процент [procent]''' - тип число с точкой, видимое.
'''/admin/data/type_edit/659/''' - то есть у меня id=659<br/>
+
 
[[Файл:Russian03.png]]<br>
+
'''Стоимость заказа, после которой доставка бесплатна [order_min_price]''' - тип число с точкой, видимое.
3. В этом же модуле, на вкладке Справочники, находим справочник "'''Типы доставки'''" и нажимаем на иконку глаза, чтобы открыть содержимое справочника.<br/>
+
 
Добавляем новое наименование.<br/>
+
[[Файл:Russian02.png]]
В поле "'''Название'''" напишем тоже самое "''Почта России Тариф+Процент''", в поле "'''Тип данных (id)'''" наш запомненный ранее id "''659''", в поле "'''Тип данных'''" напишем "''emarket-delivery-659''", где 659 - это наш id. А вот в поле "'''Идентификатор типа доставки'''" напишем название будущего класса, которое должно отражать предназначение класса. Указывается латинскими буквами. У меня в примере данный класс называется ''russiapostinterestrate''.<br/>
+
 
[[Файл:Russian04.png]]<br>
+
Запоминаем id шаблона из адресной строки браузера:
4. Открываем базу данных через phpMyAdmin и выполняем запрос:<br/>
+
 
<source lang="sql">
+
'''/admin/data/type_edit/659/''' - то есть у меня id=659
UPDATE `blank`.`cms3_object_types` SET `guid` = 'emarket-delivery-659' WHERE `cms3_object_types`.`id` = 659;
+
 
</source>
+
[[Файл:Russian03.png]]
В данном запросе следует изменить:<br/>
+
 
''''blank'''' - на название вашей базы данных,<br/>
+
3. В этом же модуле, на вкладке Справочники, находим справочник "'''Типы доставки'''" и нажимаем кнопку '''Посмотреть''', чтобы открыть содержимое справочника.
''''emarket-delivery-659'''' - на emarket-delivery с вашим id<br/>
+
 
'''659''' - на ваш id<br/>
+
Добавляем новое наименование.
5. Заходим на сайт по FTP, открываем директорию:<br/>
+
 
'''\classes\modules\emarket\classes\delivery\systems\'''<br/>
+
В поле "'''Название'''" напишем тоже самое "''Доставка стоимость + процент от заказа''", в поле "'''Тип данных (id)'''" наш запомненный ранее id "''135''", в поле "'''Идентификатор типа доставки'''" напишем название будущего класса, которое должно отражать предназначение класса. Указывается латинскими буквами. У меня в примере данный класс называется ''exampledelivery''.
где копируем файл courier.php и переименовываем его в ''russiapostinterestrate.php'' - у Вас может быть другое название, которое Вы указали в 3 шаге.<br/>
+
 
6. Открываем файл на редактирование и изменяем:<br/>
+
[[Файл:Russian04.png]]
название класса courierDelivery на '''russiapostinterestrate''' (у вас может быть другое название, указанное на 3 шаге).<br/>
+
 
7. Замените содержимое класса на:<br/>
+
4. Заходим на сайт по FTP, открываем директорию:
 +
 
 +
'''/classes/components/emarket/classes/delivery/systems/'''
 +
 
 +
там копируем файл courier.php и переименовываем его в ''exampledelivery.php'' - у Вас может быть другое название, которое Вы указали в 3 шаге.
 +
 
 +
5. Открываем файл на редактирование и изменяем:
 +
 
 +
название класса courierDelivery на '''exampledeliveryDelivery''' (у вас может быть другое название, указанное на 3 шаге).
 +
 
 +
Файл должен получиться примерно такой:
 +
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
class russiapostinterestrateDelivery extends delivery { // У Вас может быть другое название
+
 
 +
/**
 +
* Способ доставки типа "Доставка стоимость + процент от заказа".
 +
* Подходит ко всем заказам.
 +
* Стоимость доставки берет из объекта-источника + процент от стоимости заказа.
 +
* Доставка может быть бесплатной, если стоимость заказа превысила значение соответствующей настройки объекта-источника.
 +
*/
 +
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) {
                        $deliveryTarif = $this->object->tarif;
+
$deliveryPrice = $this->getValue('price');
                        $deliveryProcent = $this->object->procent;
+
$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. Проверим работу нового способа доставки.
 +
 
 +
Наш заказ:
  
                        if((is_null($deliveryTarif) || is_null($deliveryProcent))){
 
                            return 'Извините, данная опция недоступна';
 
                        }
 
         
 
                        $returnPrice = ($order->getOriginalPrice() + $deliveryTarif)+(($order->getOriginalPrice()/100)*$deliveryProcent);
 
                        return $returnPrice;
 
}
 
};
 
?>
 
</source><br/>
 
8. Проверьте, что файл в кодировке utf-8 (без BOM).<br/>
 
9. В административном интерфейсе сайта, в модуле Интернет-магазин, создайте новый способ доставки "''Почта России Тариф+Процент''", заполните поля Тариф и Процент.<br>[[Файл:Russian05.png]]<br/>
 
10. Проверим.<br/>
 
Наш заказ:<br/>
 
 
[[Файл:Russian06.png]]
 
[[Файл:Russian06.png]]
[[Файл:Russian07.png]] Итого: 210 + 220 + (210*4%) = 438,40 руб.
 
  
Версия: 2.8.6.1
+
[[Файл:Russian07.png]]
 +
 
 +
Так как общая сумма заказа больше 500 рублей то стоимость доставки включает только процент от стоимости заказа.
 +
 
 +
Итого: 0 + (32893 * 1%) = 328.93 руб.
 +
 
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]

Текущая версия на 07:34, 17 мая 2019

Актуально для версии 20

Задача

Создать новый тип доставки который расчитывает стоимость доставки с учетом цены заказа.

Решение

Чтобы добавить новый тип доставки, Вам следует выполнить следующие шаги:
1. Открыть модуль Шаблоны данных и найти там тип данных "Способ доставки". Добавить в него дочерний шаблон, назвав его например, так "Доставка стоимость + процент от заказа".

Russian01.png

2. В созданном шаблоне добавим новую группу полей Свойства доставки [delivery_props] и добавим в нее два поля:

Процент [procent] - тип число с точкой, видимое.

Стоимость заказа, после которой доставка бесплатна [order_min_price] - тип число с точкой, видимое.

Russian02.png

Запоминаем id шаблона из адресной строки браузера:

/admin/data/type_edit/659/ - то есть у меня id=659

Russian03.png

3. В этом же модуле, на вкладке Справочники, находим справочник "Типы доставки" и нажимаем кнопку Посмотреть, чтобы открыть содержимое справочника.

Добавляем новое наименование.

В поле "Название" напишем тоже самое "Доставка стоимость + процент от заказа", в поле "Тип данных (id)" наш запомненный ранее id "135", в поле "Идентификатор типа доставки" напишем название будущего класса, которое должно отражать предназначение класса. Указывается латинскими буквами. У меня в примере данный класс называется exampledelivery.

Russian04.png

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. В административном интерфейсе сайта, в модуле Интернет-магазин, создайте новый способ доставки "Доставка стоимость + процент от заказа", заполните поля Стоимость доставки, Процент и Стоимость заказа, после которой доставка бесплатна:

Russian05.png

7. Проверим работу нового способа доставки.

Наш заказ:

Russian06.png

Russian07.png

Так как общая сумма заказа больше 500 рублей то стоимость доставки включает только процент от стоимости заказа.

Итого: 0 + (32893 * 1%) = 328.93 руб.