Контрольні нотатки для сертифікаційного екзамену Мадженто-розробника – ч.8
Оформлення замовлення – частка в екзамені: 16%.
Квоти
Magento використовує модель квот для зберігання інформації про замовлення, перш ніж клієнт завершить його. Сюди входить:
- Інформація про споживача
- Позиції для замовлення
- Платіжна адреса
- Адреса доставки
- Метод доставки
- Метод оплати
- Загальна ціна
Платіжна адреса та адреса для доставки використовують одну модель Mage_Sales_Model_Quote_Address
. Тип адреси встановлено як поле в моделі.
Адреса доставки (або платіжна адреса, якщо продукт є віртуальним або завантажуваним) використовується для розрахунку загальної суми для замовлення та доступних способів доставки.
Наприкінці процесу оформлення замовлення виконується повне квотування і перетворюється в замовлення.
Додавання до квот
Модель Кошика використовується для маніпулювання (додавання, видалення та оновлення) елементів у квотах. Вона виконує додаткову перевірку, наприклад встановлення мінімальної кількості замовлень для позиції, коли вона додається до кошика.
Коли товар додається до кошика, викликається метод _prepareProduct()
, щоб підготувати дані товару для зберігання у квоті. Для простих товарів завантажуються всі дані товару в модель (включаючи варіанти товару, що зберігаються в таблиці sales_flat_quote_item_option
). Згрупований товар, наприклад, завантажує дані всіх пов’язаних товарів.
Для отримання інформації про товар, наприклад, спеціальних та налаштовуваних параметрів, він перетворюється в об’єкт Mage_Sales_Quote_Item_Option
та зберігається в базі даних у таблиці sales_flat_quote_item_option
.
Квоти в базі даних
Квоти зберігаються в базі даних. Більшість зберігається в таблиці sales_flat_quote
, але більш складна інформація зберігається в додаткових таблицях, які посилаються на початкову квоту.
Оформлення замовлення
Параметри потоку оформлення замовлення
За замовчуванням передбачено два варіанти оформлення замовлення: односторінкове та з мульти-доставкою. У мульти-доставці товарні позиції додаються до кожної адреси доставки (хоча віртуальні елементи додаються до адреси оплати), а не в кінці оформлення замовлення для кожної адреси. Це відображається в базі даних, де ці позиції зберігаються в таблиці sales_flat_quote_address_item
, тоді як квоти односторінкового замовлення в таблиці sales_flat_quote_item
.
Мульти-доставка використовує окремий контролер Mage_Checkout_MultishippingController
та індивідуальний тип оформлення замовлення Mage_Checkout_Model_Type_Mulitishipping
. Крім того, вона повторно використовує багато тих же моделей, що і звичайне замовлення. Щоб налаштувати або розширити мульти-доставку, ці два класи повинні бути розширені та змінені.
У мульти-доставці віртуальні елементи додаються до платіжної адреси (замість однієї з адрес доставки), оскільки віртуальна квота буде такою, що містить позиції лише для платіжної адреси. Квоти з віртуальними позиціями створюють додаткове замовлення з платіжної адреси, яка містить ці елементи.
Згруповані товари додаються до кошика як кілька окремих товарів, тому їх можна вибирати для доставки на різні адреси, використовуючи регулярний процес мульти-доставки. Проте пов’язані товари (bundled) не можна розділити між кількома адресами.
Підсумки (totals)
Квоти позицій, цінові правила кошика та витрати на доставку складають загальну вартість квоти.
Платіжні адреси та адреси доставки також впливають на загальну суму, оскільки вони використовуються для визначення податкових ставок, способів доставки та способів оплати.
У моделях підсумку відстежується вартість замовлення чи квоти. Кожен з підсумків має код, який пов’язаний з ним, та який може бути використаний для його отримання та обробки. Моделі підсумку обробляють адресу, щоб додати в колекцію підсумки для неї. За допомогою адреси моделі отримують доступ до квоти та квот позицій.
Ці моделі можна перезаписати або можна додати нові моделі підсумку, розширивши модель Mage_Sales_Quote_Address_Total_Abstract
і зареєструвавши її в config.xml.
<config> <global> <sales> <quote> <totals> <{code}> <class>{grouped_class_name}</class> <before>{csv_other_totals}</before> <after>{csv_other_totals}</after> </{code}> </totals> </quote> </sales> </global> </config>
Пріоритет виконання моделі підсумку можна налаштувати за допомогою елементів <before>
та <after>
у визначенні підсумку (totals). Проте порядок виконання замовлення за замовчуванням такий:
- По позиціям
- Сумарно
- Доставка
- Податок
- Загальний підсумок
Цей процес керується моделлю Mage_Sales_Model_Quote_Address_Total_Collector
, яка викликається з адреси, використовуючи метод collectTotals()
. Цей метод викликається кожного разу, коли квота оновлюється, наприклад, на кожному етапі оформлення замовлення. Цей метод також надсилає події _collect_totals_before
та _collect_totals_after
.
Авторизація та зарахування платежів
Авторизація картки та зарахування відбуваються при розміщенні замовлення ($order->place()
), що виникає при збереженні замовлення. Залежно від способу оплати, авторизація може бути зарезервована на цей час, а потім відбувається зарахування після створення рахунку-фактури.
Зниження кількості позицій на складі
Для односторінкового замовлення (onepage checkout) кількість на складі зменшується за допомогою спостерігача Mage_CatalogInventory
для події sales_model_service_quote_submit_before
. Ця подія відправляється безпосередньо перед замовленням і подією checkout_submit_all_after
, яка спрацьовує в кінці односторінкового замовлення (спостерігач має певні перевірки, щоб запобігти двократному зменшенню), а також після того, як всі замовлення були створені в мульти-доставці.
Цінові правила кошика
Цінові правила для кошика застосовують знижки, і вони можуть приймати набір умов, при яких вони спрацьовують. Ця функціональність забезпечується модулем Mage_SalesRule
.
На відміну від цінових правил каталогу, цінові правила кошика застосовують зміни ціни (знижки) на основі інформації в квоті, наприклад, групи клієнтів, промо-коду, а не на основі товару чи категорії.
Обмеження цінових правил кошика включають:
- Хоча для одного кошика може застосовуватися декілька правил, одночасно може застосовуватися лише один промо-код.
- Правила працюють незалежно один від одного, тому правило не може бути вказано як активне на основі інших правил.
- У панелі адміністратора при перегляді замовлень цінові правила кошика можуть бути відключені для певних елементів, але вони завжди застосовуються до всіх елементів у фронтенді.
Способи доставки
У Magento способи доставки розширюють модель Mage_Shipping_Model_Carrier_Abstract
і зареєстровані в конфігурації магазину із значеннями за замовчуванням (і статичною конфігурацією типу назв моделей), що встановлені у файлі config.xml.
<config> <default> <carriers> <{code}> <active>{0|1}</active> <sallowspecific>{0|1}</sallowspecific> <model>{grouped_class_name}</model> <name>{name}</name> <title>{title}</title> ... </{code}> </carriers> </default> </config>
Методи доставки називаються перевізниками (carriers), оскільки вони визначають спосіб доставки, наприклад, як Royal Mail або FedEx, і можуть запропонувати декілька ставок в рамках цього методу, наприклад, Стандартна або Доставка наступного дня.
Існуючі способи доставки, що надані Magento, можуть бути налаштовані шляхом перезапису їхньої моделі.
Розрахунок вартості доставки
Розрахунок вартості доставки здійснюється в квоті Адреси (requestShippingRates()
), яка створює запит, що містить всі відповідні дані, такі як пункт призначення та вага упаковки, і викликає метод Mage_Shipping_Model_Shipping::collectRates($request)
. Він обробляє через цикл всі доступні перевізники, перевіряє запит і викликає метод collectRates($request)
для кожного з них, щоб отримати наявні ставки.
Таблиця ставок (TableRates)
Метод доставки TableRate дозволяє створювати набір правил, вказаних у форматі csv, для встановлення ціни доставки, яка залежить від місця призначення та вартості замовлення, ваги чи кількості позицій. Використовуваний коефіцієнт встановлюється на рівні магазину і повинен задіюватись для магазину, наприклад, правила ціни та ваги не можна змішувати на рівні магазину.
Способи доставки в США
Деякі перевізники звертаються із запитом до сторонньої служби, щоб отримати пропоновані тарифи. FedEX, IPS і USPS розширюють модель Mage_Usa_Model_Shipping_Carrier_Abstract
і отримують свої тарифи за допомогою HTTP або SOAP-запитів.
Методи оплати
Методи оплати в Magento розширюють модель Mage_Payment_Model_Method_Abstract
, і, як і способи доставки, реєструються за допомогою конфігурації магазину із значеннями за замовчуванням (та додатковою конфігурацією), що встановлені в config.xml.
<config> <default> <payment> <{name}> <active>{0|1}</active> <model>{grouped_class_name}</model> <order_status>{order_state}</order_status> <title>{title}</title> <allowspecific>{0|1}</allowspecific> <sort_order>{sort_order}</sort_order> <group>{group}</group> <payment_action>{action}</payment_action> ... </{name}> </payment> </default> </config>
Більшість параметрів способу оплати, як правило, можна налаштувати у Конфігурації системи або маніпулюючи значеннями за замовчуванням у config.xml. Наприклад, дія платежу за замовчуванням, як правило, визначається у полі <payment_action>
. Якщо потрібне більш глибоке налаштування, можуть бути перезаписані моделі методу оплати.
Інформація про платіж додається до методів з використанням методу Mage_Sales_Model_Quote_Payment::importData($data)
і викликається методом savePayment()
у односторінковому замовлені. Він надсилає подію sales_quote_payment_import_data_before
перед викликом методу assignData($data)
у моделі методу оплати. Спостерігаючи цю подію, дані можуть бути змінені, перш ніж вони будуть збережені у методі.
Методи оплати реалізують логіку конкретного способу оплати, наприклад, з допомогою кредитних карток. Тим часом, платіжні моделі керують методами оплати через квоту чи замовлення та обробляють операції, пов’язані з оплатою, такі як зарахування або відшкодування.
Модулі методів оплати зазвичай містять кілька блоків для відображення платіжних форм на сторінці оформлення замовлення, наприклад, форми для кредитних карток, а також контролери для обробки переадресації на будь-які платіжні шлюзи.
Платіжні угоди вбудовані в двигуні Magento. Методи оплати встановлюють ідентифікатор платіжної угоди для об’єкту оплати за допомогою:
$order->getPayment()->setBillingAgreementData($data);
Переклад українською: SebWeo