Контрольные заметки для сертификационного экзамена Мадженто-разработчика – ч.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