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