Створюємо методи доставки в Magento

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

створюємо

Сьогодні ми охопимо такі питання:

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

Перед тим, як почати

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

Тепер ми можемо створити SmashingMagazine_MyCarrier.xml:

Зверніть увагу на залежність від модуля доставки (shipping). Це гарантує нам те, що наш модуль SmashingMagazine MyCarrier буде завантажений після модуля Mage Shipping, а значить, у разі відключеного модуля Mage Shipping ми отримаємо помилку.

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

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

У процесі проведення оплати, Magento створює об'єкт “request” на ставку оплати, який містить усю потрібну інформацію про доставку. Цей запит може бути використаний визначення застосовуваних витрат. Наприклад, “express”-доставка може бути застосована до замовлень дешевше 10$. Потім усі застосовувані ставки "прикріплюються" до об'єкта "result", який генерує список методів, з яких покупець може обирати.

У наступному списку представлені назви певних вище концептів, а також представляє класи Magento:

* 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:

Це структура для класу shipping method, але зараз вона марна, так як у нас поки що немає методів доставки.

Почнемо з розробки методу. Цей метод називатиметься «standart» і вартість його становитиме 4.99$. На даний момент він не передбачає якихось витрат для підприємця.

Зараз ми перебуваємо за крок від працюючого способу доставки – файлу конфігурації модуля.

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

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

Зараз у нас має бути можливість побачити наш метод доставки на сторінці трансакції.

Робимо методи, що налаштовуються

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

Ці поля будуть видимі в адмін-панелі, якщо пройти в меню > Configuration > Shipping Method > Smashing Magazine Carrier.

Використовуємо кілька методів доставки

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

Щоб цей метод доставки з'явився поряд із стандартним, який ми створили раніше, нам потрібно відредагувати код у методі collectRates, та приставити до неї нову вартість. Додайте наступний рядок коду перед виразом return:

Нарешті, додайте метод доставки в масив доступних методів у getAllowedMethods:

Багато веб-сайтів пропонують безкоштовну доставку,якщо загальна вартість покупок перевищує певний поріг. У нас теж має бути подібна нагода. У Magento ви можете налаштовувати спеціальні правила кошика товарів. За допомогою цієї опції ви можете вказати певні норми та застосувати певні дії, якщо ці норми будуть виконані. Серед таких дій можна відзначити активацію безкоштовної доставки.

Якщо конкретному користувачу доступна безкоштовна доставка, то об'єт 'request' буде змінено, - is_free_shipping буде переключено на 1. Нам потрібно перевірити умови та надати таку можливість у нашому методі доставки. Додайте наступний рядок коду перед виразом return у методі collectRates:

Додайте наступний рядок коду до app/code/local/SmashingMagazine/MyCarrier/Model/Carrier.php:

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

Коди відстеження доставки можуть бути додані за допомогою адмін-панелі, або за допомогою API. Але щоб наші методи доставки були видні в адмін-панелі, нам потрібно переписати метод isTrackingAvailable в абстрактному класі, і виставити значення 'true'.

Додайте наступний метод до кінця SmashingMagazine_MyCarrier_Model_Carrier.

Тепер ви повинні бачити, що при спробі додати новий метод доставки, у меню, що випадає, транспортних компаній повинні з'явитися перевізники та методи.

Використовуємо значення ваги

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

Зверніть увагу, що ми додали посилання на конфігурацію. Щобвідобразити це в адмін-панелі, нам потрібно додати наступний XML-код до параметра 'fields' у файлі app/code/local/SmashingMagazine/MyCarrier/etc/system.xml:

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

Код, представлений у цьому посібнику, можна завантажити тут.