В этом уроке мы будем использовать возможности Magento для создания различных способов пользовательской доставки. Мы создадим три способа доставки, которые обеспечивают фиксированную цену доставки, позволяют проводить бесплатные промо-акции, определять логику в зависимости от массы элемента и, наконец, позволяют выполнять все необходимые настройки через панель администрирования.
Мы рассмотрим следующее:
- Как расширить абстрактный класс доставки и реализовать требуемые способы.
- Как выполнять настройки требуемого способа доставки через панель администрирования в Magento.
- Работа с промо-акциями для обеспечения бесплатной доставки.
- Разрешение установки кодов отслеживания в определенном порядке.
Перед тем, как мы начнем.
Это обучающее руководство предполагает, что вы уже знакомы с тем, как создавать Magento модуль. Если вы не обладаете требуемыми знаниями, пожалуйста, сначала изучите предыдущее обучающее руководство из этой серии «Основы создания Magento модуля». Для начала, вам понадобится Community (групповая) или Enterprise (корпоративная) установка Magento. Вы можете выполнить установку либо локально, либо на сервере, к которому у вас есть доступ.
Логика, которую мы постараемся создать в этом уроке, будет иметь свою клиентскую специфику. По этой причине мы будем реализовывать наш модуль как «локальный модуль» и, следовательно, создадим его в 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>
Обратите внимание на зависимость модуля отправки. Этот фрагмент кода гарантирует, что наш SmashingMagazine MyCarrier модуль загрузится после Mage Shipping модуля. Если Mage Shipping модуль отключен, тогда появится сообщение о соответствующей ошибке.
Каналы доставки, способы, запросы и результаты.
Прежде чем продолжить, мы должны разобраться с основной терминологией, которую Magento использует на протяжении всей отправной абстракции (широко используемый принцип выделения только главных свойств и характеристик проблемы и игнорирования аспектов, не оказывающих существенного влияния на её решение). «Канал доставки» организует отправку по аналогии с привычной для вас почтовой службой (DPD, FedEx (“Федерал экспресс” крупнейшая частная почтовая служба срочной доставки небольших посылок и бандеролей.), и т.д.). Каждый канал имеет один или несколько способов доставки, которые содержат соответствующий код, название перевозчика, код способа, название способа, цену, которую должен заплатить потребитель и стоимость доставки в магазине (по желанию).
В процессе оформления заказа, Magento создает специальный объект «запрос», который содержит всю касающуюся доставки информацию. Запрос может быть использован для определения используемого показателя. Например, способ «экспресс» доставки не может применяться к заказам общей стоимостью менее чем 10 $. Все действующие показатели затем «прикрепляются» к объекту «результат», который генерирует список способов, доступных для выбора клиентом.
Следующий перечень имен обобщает определенные выше понятия, наряду с их представлением в виде Magento классов:
- Запрос
Mage_Shipping_Model_Rate_Request
- Результат
Mage_Shipping_Model_Rate_Result
- Способ
Mage_Shipping_Model_Rate_Result_Method
- Канал доставки любого класса, который расширяет абстрактный класс
Mage_Shipping_Model_Carrier_Abstract
и реализует интерфейсMage_Shipping_Model_Carrier_Interface
Расширение отправной абстракции.
Для создания канала доставки нам нужно расширить 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();
}
}
Это скелет для класса способа доставки. Но пока что он будет полностью бесполезным, поскольку у нас отсутствуют какие-либо способы доставки.
Давайте начнем с создания жестко закодированного способа. Этот способ будет называться «стандартный» и будет иметь цену $ 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 перебирает в узле конфигурации все возможные варианты и загружает из моделей способы доставки, определенные как «активные».
Теперь, при подсчете сделанных покупок, мы сможем увидеть доступные способы доставки.
Как управлять конфигурацией модуля.
Мы уже указали конфигурацию по умолчанию для выбранного модуля. Теперь давайте организуем возможность настройки модуля через панель администрирования. Для этого необходимо скопировать приведенный ниже фрагмент кода в файл app/code/local/SmashingMagazine/etc/system.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<sections>
<carriers translate="label" module="s ...
Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров