Java, UX, HTML, CSS, WEB-design

Как создать собственные способы доставки в Magento

[ad_1]

  • Мэтью Хаворт

  • 0 Комментарии

Как создать собственные способы доставки в Magento

  • 9 минут чтения

  • Кодирование, PHP, Методы, Magento

Краткое резюме ↬

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

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

Мы рассмотрим следующее:

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

Прежде чем мы начнем

В этом руководстве предполагается, что вы знакомы с тем, как создать модуль Magento. Если нет, сначала обратитесь к более раннему руководству из этой серии «Основы создания модуля Magento». Для начала вам понадобится установка Magento для сообщества или предприятия, локально или на сервере, к которому у вас есть доступ.

Еще после прыжка! Продолжить чтение ниже ↓

Дальнейшее чтение на SmashingMag:

  • Знакомство с макетом Magento
  • Основы создания модуля Magento
  • Как создать модуль отслеживания партнерских программ в Magento
  • 35 бесплатных высококачественных шаблонов электронной коммерции

Логика, которую мы будем реализовывать в этом руководстве, может быть специфичной для клиента, поэтому мы реализуем наш модуль как «локальный модуль» и, следовательно, создадим его в 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
  • Carrier Любой класс, расширяющий абстрактный класс. 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="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>

Эти поля отображаются в панели администратора при переходе к System → 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;
}

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

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

Ранее мы добавили более дорогой способ экспресс-доставки. Но более тяжелые товары, требующие сложной организации доставки, могут быть недоступны для доставки на следующий день. Мы можем проверить это, используя атрибут веса объекта запроса, обернув код, который добавляет способ доставки к результату доставки:


// ...
$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 в app/code/local/SmashingMagazine/MyCarrier/etc/system.xml файл в fields узел:


<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.

Код из этого руководства можно скачать здесь.

Я приветствую любые вопросы и хотел бы услышать ваши отзывы в области комментариев ниже.

Сокрушительная редакция
(ал, эа)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — Как создать собственные способы доставки в Magento

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован.

Краткое описание по статье Как создать собственные способы доставки в Magento

Название: Как создать собственные способы доставки в Magento . Краткое описание: [ad_1] ⭐ Мэтью Х . Дата публикации: 11.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»