—»     —»   Создаем пользовательские методы доставки в Magento
  Раздел: Руководства   Нет комментариев  

Создаем пользовательские методы доставки в Magento

В нашем сегодняшнем руководстве мы поговорим с вами об удобной функции разделения кода в платформе Magento, которая позволит нам создавать собственные методы доставки. Мы разработаем 3 метода доставки с фиксированной ставкой, возможностью проводить акции с бесплатной доставкой, определять логику на основе веса товаров и, наконец, настраивать все это через админ-панель в системе.

Создаем пользовательские методы доставки в Magento

Сегодня мы охватим следующие вопросы:

* Расширение класса shipping и внедрение новых востребованных методов.
* Возможность настраивать методы доставки через админ-панель Magento.
* Наладка системы акций, которые позволяют получить бесплатную доставку.
* Возможность отслеживать доставку товара по специальному коду.

Перед тем как начать

Данное руководство больше ориентировано на тех пользователей, кто знаком с процессом создания модулей для Magento. Если вы не знакомы с ним, то мы настоятельно рекомендуем вам ознакомиться с руководством, посвященным созданию модулей в Magento. Для начала вам нужно будет установить Magento версии Community или Enterprise, либо на сервере, либо на локальной машине.

Логика, которую мы сегодня реализуем, может быть клиенто-ориентированной, так что наш модуль мы будем реализовывать в качестве “локального модуля”, а следовательно, располагаться он будет в app/code/local. Давайте начнем с разработки структуры файла:

app
- code
- local
- SmashingMagazine
- MyCarrier
- Model
- Carrier.php
- etc
- config.xml
- system.xml
- etc
- modules
- SmashingMagazine_MyCarrier.xml

Теперь мы можем создать SmashingMagazine_MyCarrier.xml:

<?xml version="1.0"?>
<config>
<modules>
<SmashingMagazine_MyCarrier>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Shipping />
</depends>
</SmashingMagazine_MyCarrier>
</modules>
</config>

Обратите внимание на зависимости от модуля доставки (shipping). Это гарантирует нам то, что наш модуль SmashingMagazine MyCarrier будет подгружен после модуля Mage Shipping, а значит, в случае отключенного модуля Mage Shipping мы получим ошибку.

Транспортировка, методы, запросы и результаты

Перед тем как продолжить, нам нужно научиться понимать терминологию, которая используется в Magento в процессе разделения shipping. Carrier отвечает за транспортную компанию (к примеру, DPD, FedEx и так далее). У каждой компании может быть один и больше методов доставки, которые будут содержать код перевозчика, заголовок, код метода, заголовок метода, а также стоимость, которую должен будет уплатить покупатель и стоимость, которую должен будет уплатить предприниматель (опционально).

В процессе проведения оплаты, Magento создает объект “request” на ставку оплаты, который содержит всю нужную информацию о доставке. Этот запрос может быть использован для определения применяемых издержек. К примеру, “express”-доставка не может быть применена к заказам дешевле 10$. Затем все применяемые ставки “прикрепляются” к объекту “result”, который генерирует список методов, из которых покупатель может выбирать.

В следующем списке представлены названия определенных выше концептов, а также представляет классы Magento:

* Request
Mage_Shipping_Model_Rate_Request

* Result
Mage_Shipping_Model_Rate_Result

* Method
Mage_Shipping_Model_Rate_Result_Method

* Carrier
Любой класс, который дополняет абстрактный класс Mage_Shipping_Model_Carrier_Abstract и реализует интерфейс Mage_Shipping_Model_Carrier_Interface

Дополняем абстрактный класс Shipping

Чтобы создать наш центр доставки, нам нужно дополнить Mage_Shipping_Model_Carrier_Abstract, реализовать Mage_Shipping_Model_Carrier_Interface, и добавить все необходимые абстрактные методы.

Самый важный метод здесь – collectRates. Это метод, который получает запрос на доставку, прикрепляет доступные методы доставки и возвращает полученный результат.

Скопируйте следующий код в app/code/local/SmashingMagazine/MyCarrier/Model/Carrier.php:

<?php
class SmashingMagazine_MyCarrier_Model_Carrier
extends Mage_Shipping_Model_Carrier_Abstract
implements Mage_Shipping_Model_Carrier_Interface
{
protected $_code = 'smashingmagazine_mycarrier';

public function collectRates(
Mage_Shipping_Model_Rate_Request $request
)
{
return Mage::getModel('shipping/rate_result');
}

public function getAllowedMethods()
{
return array();
}
}

Это структура для класса shipping method, но сейчас она бесполезна, так как у нас пока нет методов доставки.

Давайте начнем с разработки метода. Этот метод будет называться «standart» и стоимость его будет составлять 4.99$. На данный момент он не предполагает каких-то издержек для предпринимателя.

<?php
class SmashingMagazine_MyCarrier_Model_Carrier
extends Mage_Shipping_Model_Carrier_Abstract
implements Mage_Shipping_Model_Carrier_Interface
{
protected $_code = 'smashingmagazine_mycarrier';

public function collectRates(
Mage_Shipping_Model_Rate_Request $request
)
{
$result = Mage::getModel('shipping/rate_result');
/* @var $result Mage_Shipping_Model_Rate_Result */

$result->append($this->_getStandardShippingRate());

return $result;
}

protected function _getStandardShippingRate()
{
$rate = Mage::getModel('shipping/rate_result_method');
/* @var $rate Mage_Shipping_Model_Rate_Result_Method */

$rate->setCarrier($this->_code);
/**
* getConfigData(config_key) returns the configuration value for the
* carriers/[carrier_code]/[config_key]
*/
$rate->setCarrierTitle($this->getConfigData('title'));

$rate->setMethod('standand');
$rate->setMethodTitle('Standard');

$rate->setPrice(4.99);
$rate->setCost(0);

return $rate;
}

public function getAllowedMethods()
{
return array(
'standard' => 'Standard',
);
}
}

Сейчас мы находимся в шаге от работающего метода доставки – файла конфигурации модуля.

Конфигурация модуля

Конфигурация модуля имеет стандартную структуру (как описано в статье, посвященной основам разработки модулей для Magento). Скопируйте следующий код в app/code/local/SmashingMagazine/MyCarrier/etc/config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<SmashingMagazine_MyCarrier>
<module>0.0.1</module>
</SmashingMagazine_MyCarrier>
</modules>
<global>
<models>
<smashingmagazine_mycarrier>
<class>SmashingMagazine_MyCarrier_Model</class>
</smashingmagazine_mycarrier>
</models>
</global>
<!-- Default configuration -->
<default>
<carriers>
<smashingmagazine_mycarrier>
<active>1</active>
<!--
This configuration should not be made visible
to the administrator, because it specifies
the model to be used for this carrier.
-->
<model>smashingmagazine_mycarrier/carrier</model>
<!--
The title as referenced in the carrier class
-->
<title>Smashing Magazine Carrier</title>
<!--
The sort order specifies the position that
this carrier appears relative to the other
carriers available in checkout.
-->
<sort_order>10</sort_order>
<!--
Out of the box, Magento offers shipping
carriers the ability to restrict themselves
to specific countries. For this configuration
option, 0 means allow all countries available,
and 1 means allow all countries specified
in the country list that we will add later
in system.xml
-->
<sallowspecific>0</sallowspecific>
</smashingmagazine_mycarrier>
</carriers>
</default>
</config>

Стандартная конфигурация «регистрирует» модель, которую мы только что создали, в качестве транспортной компании для доставки. Как вы уже наверное знаете, Magento объединяет все XML-конфигурации вместе и кэширует результат (если включена функция кэширования). Когда покупатель загружает список доступных методов доставки, Magento прочесывает всех транспортировщиков и подгружает методы доставки из моделей, определенных в “active”.

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

Делаем методы настраиваемыми

Для данного модуля мы уже установили стандартную конфигурацию. Поэтому давайте реализуем возможность настраивать наш модуль через админ-панель, скопировав следующий код в app/code/local/SmashingMagazine/etc/system.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
<sections>
<carriers translate="label" module="shipping">
<groups>
<smashingmagazine_mycarrier translate="label">
<label>Smashing Magazine Carrier</label>
<frontend_type>text</frontend_type>
<sort_order>2</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<!--
The following fields are available
to modify in the admin panel.
The values are saved in the
database.

This shipping carrier abstract checks
this value to determine whether
the carrier should be shown.
-->
<active translate="label">
<label>Enabled</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</active>
<!--
This value can be used to specify a
custom title for our method.
-->
<title translate="label">
<label>Title</label>
<frontend_type>text</frontend_type>
<sort_order>2</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</title>
<!--
The sort order is used in Magento
to determine what order the carrier
will appear in relative to the
other carriers available.
-->
<sort_order translate="label">
<label>Sort Order</label>
<frontend_type>text</frontend_type>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</sort_order>
<!--
This value is used to specify whether
the carrier is available only for
specific countries or all countries
available in the current Magento
installation.
-->
<sallowspecific translate="label">
<label>Ship to Applicable Countries</label>
<frontend_type>select</frontend_type>
<sort_order>90</sort_order>
<frontend_class>shipping-applicable-country</frontend_class>
<source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</sallowspecific>
<!--
If 'specific countries' is chosen
in the previous option, then this field
allows the administrator to specify
which specific countries this carrier
should be available for.
-->
<specificcountry translate="label">
<label>Ship to Specific Countries</label>
<frontend_type>multiselect</frontend_type>
<sort_order>91</sort_order>
<source_model>adminhtml/system_config_source_country</source_model>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
<can_be_empty>1</can_be_empty>
</specificcountry>
</fields>
</smashingmagazine_mycarrier>
</groups>
</carriers>
</sections>
</config>

Эти поля будут видимыми в админ-панели, если пройти в меню > Configuration > Shipping Method > Smashing Magazine Carrier.

Используем несколько методов доставки

Экспресс-доставка

Итак, мы уже включили стандартный метод доставки по цене в 9.99$. Однако покупатель может пожелать заплатить больше, чтобы получить покупку быстрее. Следующий код создает отдельный пункт доставки с более высокой платой и иным кодом доставки:

protected function _getExpressShippingRate()
{
$rate = Mage::getModel('shipping/rate_result_method');
/* @var $rate Mage_Shipping_Model_Rate_Result_Method */
$rate->setCarrier($this->_code);
$rate->setCarrierTitle($this->getConfigData('title'));
$rate->setMethod('express');
$rate->setMethodTitle('Express (Next day)');
$rate->setPrice(12.99);
$rate->setCost(0);
return $rate;
}

Чтобы этот метод доставки появился рядом со стандартным, который мы создали ранее, нам нужно отредактировать код в методе collectRates, и приставить к ней новую стоимость. Добавьте следующую строку кода перед выражением return:

$result->append($this->_getExpressShippingRate());

Наконец, добавьте метод доставки в массив доступных методов в getAllowedMethods:

public function getAllowedMethods()
{
return array(
'standard' => 'Standard',
'express' => 'Express',
);
}

Бесплатная доставка

Многие веб-сайты предлагают бесплатную доставку, если общая стоимость покупок превышает определенный порог. У нас тоже должна быть подобная возможность. В Magento вы можете настраивать особые правила корзины товаров. С помощью этой опции вы можете указать определенные нормы, и применить определенные действия, если эти нормы будут выполнены. Среди таких действий можно отметить и активацию бесплатной доставки.

Если конкретному пользователю доступна бесплатная доставка, то объет ‘request’ будет изменен, - is_free_shipping будет переключен на 1. Нам нужно проверить условия и представить такую возможность в нашем методе доставки. Добавьте следующую строку кода перед выражением return в методе collectRates:

if ($request->getFreeShipping()) {
/**
* If the request has the free shipping flag,
* append a free shipping rate to the result.
*/
$freeShippingRate = $this->_getFreeShippingRate();
$result->append($freeShippingRate);
}

Добавьте следующую строку кода в app/code/local/SmashingMagazine/MyCarrier/Model/Carrier.php:

protected function _getFreeShippingRate()
{
$rate = Mage::getModel('shipping/rate_result_method');
/* @var $rate Mage_Shipping_Model_Rate_Result_Method */
$rate->setCarrier($this->_code);
$rate->setCarrierTitle($this->getConfigData('title'));
$rate->setMethod('free_shipping');
$rate->setMethodTitle('Free Shipping (3 - 5 days)');
$rate->setPrice(0);
$rate->setCost(0);
return $rate;
}

Не забудьте добавить метод в массив доступных методов доставки:

public function getAllowedMethods()
{
return array(
'standard' => 'Standard',
'express' => 'Express',
'free_shipping' => 'Free Shipping',
);
}

Дополняем функционал

Отслеживание доставки

Коды отслеживания доставки могут быть добавлены либо при помощи админ-панели, либо посредством API. Но чтобы наши методы доставки были видны в админ-панели, нам нужно переписать метод isTrackingAvailable в абстрактном классе, и выставить значение ‘true’.

Добавьте следующий метод в конец SmashingMagazine_MyCarrier_Model_Carrier.

public function isTrackingAvailable()
{
return true;
}

Теперь вы должны видеть, что при попытке добавить новый метод доставки, в выпадающем меню транспортных компаний должны появиться перевозчики и методы.

Используем значение веса

Ранее мы уже добавили более дорогой способ доставки. Однако тяжелые товары требуют иных издержек на транспортировку, и такие товары может быть физически невозможно доставить раньше. Мы можем проверить вес товаров при помощи атрибута weight запрошенного объекта, обернув прикрепленный код метода доставки кодом результата доставки:

// ...
$expressWeightThreshold =
$this->getConfigData('express_weight_threshold');

$eligibleForExpressDelivery = true;
foreach ($request->getAllItems() as $_item) {
if ($_item->getWeight() > $expressWeightThreshold) {
$eligibleForExpressDelivery = false;
}
}

if ($eligibleForExpressDelivery) {
$result->append($this->_getExpressShippingRate());
}
// ...

Обратите внимание, что мы добавили ссылку в конфигурацию. Чтобы отобразить это в админ-панели, нам нужно добавить следующий XML-код в параметр ‘fields’ в файле app/code/local/SmashingMagazine/MyCarrier/etc/system.xml:

<express_weight_threshold translate="label">
<label>Express Weight Threshold</label>
<frontend_type>text</frontend_type>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</express_weight_threshold>

В завершение

При помощи сравнительного небольшого кода, мы смогли реализовать целую логику системы доставки, которая интегрируется со страницей трансакции, админ-панелью и даже системой скидок и акций. Вы можете узнать гораздо больше по поводу создания модулей доставки в Magento, ознакомившись с примерами в структурных файлах под названиями Mage_Usa и Mage_Shipping.

Код, представленный в данном руководстве, можно скачать здесь.
Обнаружили ошибку или мёртвую ссылку?
Выделите проблемный фрагмент мышкой и нажмите CTRL+ENTER.
В появившемся окне опишите проблему и отправьте уведомление Администрации ресурса.
Нужна органическая вечная ссылка из данной статьи? Постовой?
Подробности здесь
Вам понравился материал? Поблагодарить легко!
Будем весьма признательны, если поделитесь этой статьей в социальных сетях:

Ключевые тэги: Magento
Опубликовал Design FactoRy   Прочитано (раз): 11172   |   Нет комментариев
Автор перевода — CoolWebmasters.Com ©   |   Источник материала / оригинал статьи   Распечатать
Другие статьи и новости по теме:
Добавление комментария
Уважаемые пользователи!
При добавлении комментариев на сайт Вам следует учитывать следующее - все комментарии проверяются Администрацией на предмет отсутствия спама. При обнаружении признаков спама, в оставленном Вами комментарии, сам комментарий будет незамедлительно удалён, а Ваш IP-адрес будет забанен без предупреждения! Учётные записи пользователей, рассылающих спам, блокируются/удаляются без права последующего восстановления.

С уважением, Администрация сайта.
* = поля обязательны к заполнению
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Вопрос : Назовите месяц December по-русски
Подтверждение кода безопасности :

Включите эту картинку для отображения кода безопасности
обновить, если не виден код


Спонсоры проекта
Баннер в сайдбаре 1 (сквозной)
Баннер в сайдбаре 2 (сквозной)
Спонсоры проекта
Баннер в сайдбаре 3 (сквозной)
Баннер в сайдбаре 4 (сквозной)
Популярные публикации







Свежие шаблоны сайтов каждый день
С миру по нитке
«    Март 2024    »
ПнВтСрЧтПтСбВс
 123
45678910
11121314151617
18192021222324
25262728293031