Joomla разработчикам и в частности разработчикам, работающим с JoomShopping часто не хватает актуальной документации для работы. Эта справочная статья призвана восполнить этот пробел и дать представление о всём потоке данных в процессе оформления заказа в компоненте интернет-магазина JoomShopping. Описывается порядок исполнения кода, все триггеры плагинов в хронологическом порядке, а так же какие данные они получают на вход и типы этих данных, описывается как прокидывать свои данные из плагина в шаблон JoomShopping в позиции вида _tmp_var....
Оглавление
Как читать этот документ
Этот документ построен строго по времени выполнения кода. Для каждого этапа показано:
- Где мы находимся (Controller -> Model -> View preparation -> View template).
- Какие события плагинов срабатывают и в каком порядке.
- Какие аргументы получает каждое событие (с типами аргументов).
- Что именно в этот момент можно прокинуть в шаблон: существующие
_tmp_*позиции и собственные поля.
Собрано по файлам JoomShopping 5.9.0.
Принятый порядок слоев
В процессе оформления заказа (checkout) у JoomShopping фактический порядок чаще всего такой:
- Controller стартует этап.
- Controller вызывает model-методы, где формируются данные/фрагменты и срабатывают события плагинов в Model / Table.
- Controller собирает
Viewи вызываетonBeforeDisplay...View. - Только после этого выполняется template (
display()илиloadTemplate()).
Важно: в site/View/Checkout/HtmlView.php нет собственных triggerEvent(...).
Этап 0. Корзина (кнопка «Оформить заказ»)
Где мы
- Controller:
CartController::view()—site/Controller/CartController.php. - Model:
CartModel—site/Model/CartModel.php,CartpreviewModel—site/Model/CartpreviewModel.php,CheckoutModel(навигация) —site/Model/CheckoutModel.php. - View:
site/templates/default/cart/cart.php.
Поток данных этапа
- Загружается cart и пересчитываются суммы/налоги.
- Генерируется
href_checkoutчерезCartpreviewModel::getUrlCheckout(). - В template выводится кнопка
JSHOP_CHECKOUTс ссылкой наcheckout&task=step2(иногдаcheck_login=1).
Хронология trigger-ов
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть в шаблон |
|---|---|---|---|---|
| 1 | CartController::init() |
onConstructJshoppingControllerCart |
(&$obj) (CartController) |
Можно изменить поведение контроллера до view() |
| 2 | CartModel::__construct() |
onConstructJshopCart |
(&$obj) (CartModel) |
Глобальная инициализация cart model |
| 3 | CartModel::load() |
onBeforeCartLoad |
(&$obj) (CartModel) |
Подготовка cart данных до загрузки |
| 4 | CartModel::load() |
onAfterCartLoad |
(&$obj) |
Можно дописать поля продуктов cart |
| 5 | CartModel::load() |
onAfterLoadPriceAndCountProducts |
(&$obj) |
После расчета цен/количества |
| 6 | CartpreviewModel::prepareView() |
onBeforeDisplayCart |
(&$cart, &$obj) (CartModel, CartpreviewModel) |
Удобная точка для подготовки cart-вставок до view |
| 7 | CheckoutModel::showCheckoutNavigation() |
onBeforeDisplayCheckoutNavigator |
(&$output, &$array_navigation_steps, &$step) (array, array, string|int) |
Можно менять HTML шагов в навигаторе |
| 8 | CheckoutModel::showCheckoutNavigation() |
onAfterDisplayCheckoutNavigator |
(&$view) (checkout view) |
Можно добавить поля в view меню |
| 9 | CartController::view() |
onBeforeDisplayCartView |
(&$view) (cart view) |
Прямое назначение _tmp_* полей cart template |
Template-позиции cart, доступные на этом этапе
В CartController::view() инициализируются: _tmp_ext_html_cart_start, _tmp_html_after_subtotal, _tmp_html_after_total, _tmp_ext_subtotal, _tmp_html_before_buttons, _tmp_html_after_buttons, _tmp_ext_html_before_discount, _tmp_ext_html_after_discount, _tmp_ext_total, _tmp_ext_discount_text, _tmp_ext_discount, массив _tmp_ext_tax.
Пример (этап корзины)
public function onBeforeDisplayCartView(&$view): void
{
$view->_tmp_ext_html_cart_start = '<div class="alert alert-info">Проверка корзины перед checkout</div>';
$view->_tmp_ext_total = '<span class="text-muted"> (с учетом ваших условий)</span>';
}
Этап 1. Заполнение данных пользователя (checkout step2)
Где мы
- Controller:
CheckoutController::step2()иstep2save()—site/Controller/CheckoutController.php. - Model:
CheckoutModel(showCheckoutNavigation,loadSmallCart,setEmptyCheckoutPrices,setMaxStep) —site/Model/CheckoutModel.php;CartModel—site/Model/CartModel.php;CartpreviewModel—site/Model/CartpreviewModel.php. - View:
site/templates/default/checkout/adress.php+site/templates/default/cart/checkout.php(малая корзина).
Поток данных этапа
- Открытие шага
step2: загрузка профиля пользователя, полей формы, навигатора и малой корзины. - Сохранение
step2save: валидация/сохранение пользователя, сброс shipping/payment в корзине. - Переход на следующий шаг через
CheckoutStepModel::getNextStep(2).
Хронология trigger-ов (step2)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::init() |
onConstructJshoppingControllerCheckout |
(&$obj) (CheckoutController) |
Глобальная инициализация checkout controller |
| 2 | CheckoutController::step2() |
onLoadCheckoutStep2 |
() |
Старт шага, до подготовки view |
| 3 | CheckoutModel::showCheckoutNavigation() |
onBeforeDisplayCheckoutNavigator |
(&$output, &$array_navigation_steps, &$step) |
Модификация навигатора |
| 4 | CheckoutModel::showCheckoutNavigation() |
onAfterDisplayCheckoutNavigator |
(&$view) |
Доп. данные menu template |
| 5 | CartModel::__construct() (в showSmallCart) |
onConstructJshopCart |
(&$obj) |
Инициализация cart model для small cart |
| 6 | CartModel::load() |
onBeforeCartLoad |
(&$obj) |
Перед загрузкой cart |
| 7 | CartModel::load() |
onAfterCartLoad |
(&$obj) |
После загрузки cart |
| 8 | CartModel::load() |
onAfterLoadPriceAndCountProducts |
(&$obj) |
После пересчетов |
| 9 | CartpreviewModel::prepareView() (step=2) |
onBeforeDisplaySmallCart |
(&$cart, &$obj) |
Подготовка данных малой корзины |
| 10 | CartModel::getTaxExt() |
onAfterCartGetTaxExt |
(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment) |
Можно корректировать tax-list |
| 11 | CartModel::getSum() |
onAfterCartGetSum |
(&$obj, &$incShiping, &$incRabatt, &$incPayment) |
Можно влиять на итог fullsum |
| 12 | CheckoutModel::showSmallCart() |
onBeforeDisplayCheckoutCartView |
(&$view) |
Прямые _tmp_* вставки в cart/checkout.php |
| 13 | CheckoutController::step2() |
onBeforeDisplayCheckoutStep2View |
(&$view) (checkout view) |
Прямые вставки в checkout/adress.php |
Хронология trigger-ов (step2save)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step2save() |
onLoadCheckoutStep2save |
(&$post) (array<string,mixed>) |
Нормализация входных данных формы |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Правки cart перед сохранением. |
| 3 | CheckoutController::step2save() |
onBeforeSaveCheckoutStep2 |
(&$adv_user, &$user, &$cart, &$model) |
Записать свои поля в user/cart до save |
| 4 | CheckoutController::step2save() |
onAfterSaveCheckoutStep2 |
(&$adv_user, &$user, &$cart) |
Пост-обработка после save |
| 5 | CheckoutModel::setMaxStep() |
onAfterSetMaxStepJshopCheckout |
(&$step) |
Контроль перехода на следующий шаг |
Template-позиции этапа
В step2 доступны: _tmp_ext_html_address_start, _tmp_ext_html_address_end, _tmpl_address_html_2..._tmpl_address_html_9.
Пример (этап step2)
public function onBeforeDisplayCheckoutStep2View(&$view): void
{
$view->_tmp_ext_html_address_start = '<div class="checkout-tip">Заполните обязательные поля</div>';
$view->_tmpl_address_html_7 .= '<div class="custom-block">Доп. блок перед submit</div>';
$view->myAddressMeta = ['source' => 'plugin', 'ts' => time()];
}
Этап 2. Выбор оплаты (checkout step3)
Где мы
- Controller:
CheckoutController::step3()иstep3save()—site/Controller/CheckoutController.php. - Model:
CheckoutPaymentModel—site/Model/CheckoutpaymentModel.php,CheckoutModel(навигация/малая корзина) —site/Model/CheckoutModel.php,CartModel—site/Model/CartModel.php,CartpreviewModel—site/Model/CartpreviewModel.php. - View:
site/templates/default/checkout/payments.php.
Поток данных этапа
- Загружается список способов оплаты.
- Для каждого метода может быть построена HTML-форма платежного плагина.
- На
step3saveпроверяется и сохраняется выбранный метод оплаты и её params.
Хронология trigger-ов (step3)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step3() |
onLoadCheckoutStep3 |
() |
Старт шага оплаты |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Коррекция cart перед рендером оплаты |
| 3 | CheckoutModel::showCheckoutNavigation() |
onBeforeDisplayCheckoutNavigator |
(&$output, &$array_navigation_steps, &$step) |
Меню checkout |
| 4 | CheckoutModel::showCheckoutNavigation() |
onAfterDisplayCheckoutNavigator |
(&$view) |
Данные в menu view |
| 5 | CartpreviewModel::prepareView() (step=3) |
onBeforeDisplaySmallCart |
(&$cart, &$obj) |
Данные small cart для шага оплаты |
| 6 | CartModel::getTaxExt() |
onAfterCartGetTaxExt |
(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment) |
Влияние на налоги |
| 7 | CartModel::getSum() |
onAfterCartGetSum |
(&$obj, &$incShiping, &$incRabatt, &$incPayment) |
Влияние на итог |
| 8 | CheckoutModel::showSmallCart() |
onBeforeDisplayCheckoutCartView |
(&$view) |
_tmp_* для малой корзины |
| 9 | CheckoutController::step3() |
onBeforeDisplayCheckoutStep3View |
(&$view) |
_tmp_ext_html_payment_start/end, свои поля view |
Хронология trigger-ов (step3save)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step3save() |
onBeforeSaveCheckoutStep3save |
(&$post) |
Валидировать/переписать post-параметры |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Подготовка cart к savePaymentData |
| 3 | CheckoutController::step3save() |
onAfterSaveCheckoutStep3save |
(&$adv_user, &$paym_method, &$cart) |
До перехода на следующий step |
| 4 | CheckoutModel::setMaxStep() |
onAfterSetMaxStepJshopCheckout |
(&$step) |
Контроль маршрута |
Template-позиции этапа
В step3 доступны _tmp_ext_html_payment_start и _tmp_ext_html_payment_end.
Пример (этап step3)
public function onBeforeDisplayCheckoutStep3View(&$view): void
{
$view->_tmp_ext_html_payment_start = '<div class="pay-note">Оплата защищена</div>';
$view->myPaymentFlags = ['supportsInstallments' => true];
}
Этап 3. Выбор доставки (checkout step4)
Где мы
- Controller:
CheckoutController::step4()иstep4save()—site/Controller/CheckoutController.php. - Model:
CheckoutShippingModel—site/Model/CheckoutshippingModel.php,CheckoutModel—site/Model/CheckoutModel.php,CartModel—site/Model/CartModel.php,CartpreviewModel—site/Model/CartpreviewModel.php. - View:
site/templates/default/checkout/shippings.php.
Поток данных этапа
- Вычисляются доступные способы доставки по стране/оплате.
- Для каждого метода может отрисовываться форма способа доставки (shipping form).
- На
step4saveсохраняются параметры, пересчитываются суммы, при необходимости обновляется стоимость заказа (payment price).
Хронология trigger-ов (step4)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step4() |
onLoadCheckoutStep4 |
() |
Старт шага доставки |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Коррекция cart |
| 3 | CheckoutModel::showCheckoutNavigation() |
onBeforeDisplayCheckoutNavigator |
(&$output, &$array_navigation_steps, &$step) |
Навигатор |
| 4 | CheckoutModel::showCheckoutNavigation() |
onAfterDisplayCheckoutNavigator |
(&$view) |
Навигатор view |
| 5 | CartpreviewModel::prepareView() (step=4) |
onBeforeDisplaySmallCart |
(&$cart, &$obj) |
Small cart |
| 6 | CartModel::getTaxExt() |
onAfterCartGetTaxExt |
(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment) |
Налоги |
| 7 | CartModel::getSum() |
onAfterCartGetSum |
(&$obj, &$incShiping, &$incRabatt, &$incPayment) |
Итог |
| 8 | CheckoutModel::showSmallCart() |
onBeforeDisplayCheckoutCartView |
(&$view) |
_tmp_* малого cart |
| 9 | CheckoutController::step4() |
onBeforeDisplayCheckoutStep4View |
(&$view) |
_tmp_ext_html_shipping_start/end, custom поля |
Хронология trigger-ов (step4save)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step4save() |
onBeforeSaveCheckoutStep4save |
() |
Превалидация перед saveShippingData |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Коррекция cart |
| 3 | CheckoutController::step4save() |
onAfterSaveCheckoutStep4 |
(&$adv_user, &$sh_method, &$shipping_method_price, &$cart) |
Фиксация выбора доставки |
| 4 | CheckoutModel::setMaxStep() |
onAfterSetMaxStepJshopCheckout |
(&$step) |
Переход |
Template-позиции этапа
В step4 доступны _tmp_ext_html_shipping_start и _tmp_ext_html_shipping_end.
Этап 4. Подтверждение заказа (checkout step5)
Где мы
- Controller:
CheckoutController::step5()иstep5save()—site/Controller/CheckoutController.php. - Model:
CheckoutModel—site/Model/CheckoutModel.php,CheckoutOrderModel—site/Model/CheckoutorderModel.php,CartModel—site/Model/CartModel.php,OrderTable—site/Table/OrderTable.php,CartpreviewModel—site/Model/CartpreviewModel.php. - View:
site/templates/default/checkout/previewfinish.php+ малая корзинаsite/templates/default/cart/checkout.php.
Поток данных этапа
- Отображается финальный предпросмотр заказа: адрес, доставка, оплата, суммы.
- При отправке формы (
step5save) выполняются проверки AGB (согласия на обработку перс.данных и право возврата) / stock (списание, наличие) / coupon (работа с купонами). - Создается order и order items.
- Если оплата не нужна или сумма ноль — сразу
finish, иначеstep6/step6iframe.
Хронология trigger-ов (step5)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step5() |
onLoadCheckoutStep5 |
() |
Старт preview |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Подготовка cart |
| 3 | CheckoutModel::showCheckoutNavigation() |
onBeforeDisplayCheckoutNavigator |
(&$output, &$array_navigation_steps, &$step) |
Навигатор |
| 4 | CheckoutModel::showCheckoutNavigation() |
onAfterDisplayCheckoutNavigator |
(&$view) |
Навигатор view |
| 5 | CartpreviewModel::prepareView() (step=5) |
onBeforeDisplaySmallCart |
(&$cart, &$obj) |
Small cart |
| 6 | CartModel::getTaxExt() |
onAfterCartGetTaxExt |
(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment) |
Налоги |
| 7 | CartModel::getSum() |
onAfterCartGetSum |
(&$obj, &$incShiping, &$incRabatt, &$incPayment) |
Итог |
| 8 | CheckoutModel::showSmallCart() |
onBeforeDisplayCheckoutCartView |
(&$view) |
_tmp_* малого cart |
| 9 | CheckoutController::step5() |
onBeforeDisplayCheckoutStep5 |
(&$sh_method, &$pm_method, &$delivery_info, &$cart, &$view) |
Можно дописать данные в delivery_info и view |
| 10 | CheckoutController::step5() |
onBeforeDisplayCheckoutStep5View |
(&$view) |
_tmp_ext_html_previewfinish_*, custom поля |
Хронология trigger-ов (step5save)
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step5save() |
onLoadStep5save |
(&$checkagb) (string|null) |
Переопределить AGB check |
| 2 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Подготовка cart |
| 3 | CartModel::checkListProductsQtyInStore() |
onBeforeCheckListProductsQtyInStore |
(&$obj) |
Влиять на pre-check stock |
| 4 | CartModel::checkListProductsQtyInStore() |
onCheckListProductsQtyInStoreForeach |
(&$obj, &$key, &$product, &$attr, &$qtyInStock, &$checkqty, &$check) |
Проверка каждого товара |
| 5 | CartModel::checkListProductsQtyInStore() |
onAfterCheckListProductsQtyInStore |
(&$obj) |
Финал stock-check |
| 6 | CartModel::checkCoupon() |
onBeforeCheckCouponStep5save |
(&$obj, &$coupon) |
Проверка купона перед orderDataSave |
| 7 | OrderTable::getListFieldCopyUserToOrder() |
onBeforeGetListFieldCopyUserToOrder |
(&$list) |
Добавить/убрать поля копирования user->order |
| 8 | OrderTable::formatOrderNumber() |
onAfterFormatOrderNumber |
(&$number, &$num) |
Формат номера заказа |
| 9 | OrderTable::copyDeliveryData() (если надо) |
onAfterCopyDeliveryData |
(&$obj) |
Правка delivery полей в order |
| 10 | CheckoutOrderModel::createOrder() |
onBeforeCreateOrder |
(&$order, &$cart, &$obj) |
Ключевая точка перед order->store() |
| 11 | OrderTable::store() |
onBeforeStoreTableOrder |
(&$obj) |
Последний guard перед сохранением заказа |
| 12 | CheckoutOrderModel::orderDataSave() |
onAfterCreateOrder |
(&$order, &$cart) |
После создания order |
| 13 | CheckoutOrderModel::couponFinished() |
onBeforeCouponFinished |
(&$coupon, &$cart, &$user_id, &$order) |
Коррекция coupon finalize |
| 14 | OrderTable::saveOrderItem() |
onBeforeSaveOrderItem |
(&$order_item, &$value) |
Изменение order item перед store |
| 15 | CheckoutOrderModel::orderDataSave() |
onAfterCreateOrderFull |
(&$order, &$cart) |
После полного набора order данных |
| 16 | OrderTable::saveOrderHistory() |
onBeforeJshopOrderSaveOrderHistory |
(&$history, &$notify, &$comments, &$obj) |
Комментарий/флаги history |
| 17 | OrderTable::changeProductQTYinStock() |
onBeforechangeProductQTYinStock |
(&$items, &$obj, &$change) |
До списания/возврата склада |
| 18 | OrderTable::changeProductQTYinStock() |
onAfterchangeProductQTYinStock |
(&$item, &$change, &$obj) |
После каждой позиции |
| 19 | OrderTable::changeProductQTYinStock() |
onAfterchangeProductQTYinStockPSR |
(&$items, &$obj, &$change, &$product_stock_removed) |
После всего batch |
| 20 | CheckoutController::step5save() |
onEndCheckoutStep5 |
(&$order, &$cart) |
Финал шага и выбор следующего этапа |
| 21 | CheckoutModel::setMaxStep() |
onAfterSetMaxStepJshopCheckout |
(&$step) |
Переход к step6/finish |
Template-позиции этапа
В preview (step5) доступны:
- _tmp_ext_html_previewfinish_start
- _tmp_ext_html_previewfinish_agb
- _tmp_ext_html_previewfinish_before_button
- _tmp_ext_html_previewfinish_end
В малой корзине (showSmallCart) доступны:
- _tmp_ext_subtotal, _tmp_ext_discount_text, _tmp_ext_discount, _tmp_ext_shipping, _tmp_ext_shipping_package, _tmp_ext_payment, _tmp_ext_tax[], _tmp_ext_total
- _tmp_html_after_subtotal, _tmp_html_after_total, _tmp_html_after_checkout_cart
- checkoutcartdescr
Пример (этап step5)
public function onBeforeDisplayCheckoutStep5View(&$view): void
{
$view->_tmp_ext_html_previewfinish_before_button = '<div class="legal">Нажимая кнопку, вы принимаете условия.</div>';
}
public function onBeforeDisplayCheckoutCartView(&$view): void
{
$view->checkoutcartdescr = '<p>Итоговые суммы могут зависеть от статуса оплаты.</p>';
}
Этап 5. Переход к платежной системе (step6 / step6iframe)
Где мы
- Controller:
CheckoutController::step6iframe()/step6()—site/Controller/CheckoutController.php. - Model:
CheckoutOrderModel—site/Model/CheckoutorderModel.php,CheckoutModel—site/Model/CheckoutModel.php,OrderChangeStatusModel(если отмена) —site/Model/OrderchangestatusModel.php. - View:
site/templates/default/checkout/step6iframe.php(iframe-режим).
Поток данных этапа
step6iframeстроит URL в платежный этап и может менять размеры/URL через trigger.step6вызываетshowEndFormPaymentSystem($order_id).- Если пользователь вернулся назад в ПС (
getSendEndForm()==1), вызываетсяcancelPayOrder()с полноценным статусным lifecycle.
Хронология trigger-ов
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step6iframe() |
onBeforeStep6Iframe |
(&$width, &$height, &$url) |
Можно изменить URL iframe, размеры |
| 2 | CheckoutOrderModel::showEndFormPaymentSystem() |
onBeforeShowEndFormStep6 |
(&$order, &$cart, $pm_method) |
Дополнить order/cart перед showEndForm() |
| 3 | CheckoutModel::cancelPayOrder() (ветка отмены) |
onAfterCancelPayOrderJshopCheckout |
(&$order_id, $status, $sendmessage) |
Пост-обработка cancel |
Если на step6 произошла отмена: status-lifecycle triggers
При вызове cancelPayOrder()->changeStatusOrder()->OrderChangeStatusModel::store():
onBeforeChangeOrderStatus(...)илиonBeforeChangeOrderStatusAdmin(...)onBeforeJshopOrderSaveOrderHistory(...)onBeforeCreateMailOrderStatusView(&$view)onBeforeSendClientMailOrderStatus(...)/...Admin.../...Vendor...onBeforeSendMailChangeOrderStatusClient(...)/...Admin.../...Vendor...onAfterChangeOrderStatus(...)или...Admin...
Этап 6. Обработка уведомлений о статусе заказа Callback/Return/Notify (step7)
Где мы
- Controller:
CheckoutController::step7()—site/Controller/CheckoutController.php. - Model:
CheckoutBuyModel—site/Model/CheckoutbuyModel.php,CheckoutOrderModel—site/Model/CheckoutorderModel.php,OrderTable—site/Table/OrderTable.php,OrderChangeStatusModel—site/Model/OrderchangestatusModel.php. - View: отсутствует (в этом шаге нет обычного
displaycheckout view).
Поток данных этапа
- Загружаются URL params платежного метода (
loadUrlParams). buy()проверяет транзакцию, вычисляет статус, сохраняет trx-данные.- Если нужно, впервые «создает» order в смысле
order_created=1и меняет статус. - Для
notifyзавершает черезnofityFinishиdie(). - Для return/прочих завершает
finish(...)и редиректит наcheckout finish.
Хронология trigger-ов
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::step7() |
onLoadStep7 |
() |
Старт callback этапа |
| 2 | OrderTable::orderCreateAndSetStatus() |
onOrderCreateAndSetStatus |
(&$order_id, &$status, &$prev_order_status_data) |
Реакция на атомарную смену order_status/order_created |
| 3 | CheckoutBuyModel::buy() (если order создан впервые на step7) |
onStep7OrderCreated |
(&$order, &$res, &$obj, &$pmconfigs) |
Пост-логика после «досоздания» заказа |
| 4 | OrderChangeStatusModel::store() (если смена статуса) |
onBeforeChangeOrderStatus... -> mail triggers -> onAfterChangeOrderStatus... |
См. этап 5 | Управление бизнес-логикой смены статуса |
| 5 | CheckoutBuyModel::buy() |
onStep7BefereNotify |
(&$order, &$obj, &$pmconfigs) |
Последняя точка перед notify/finish ПС |
| 6 | CheckoutModel::setMaxStep() (успешный путь) |
onAfterSetMaxStepJshopCheckout |
(&$step) |
Переход на finish |
Где хранить свои данные на этом этапе
Здесь нет checkout-view. Данные обычно прокидывают через:
- поля заказа (
$order->order_add_info, пользовательские поля заказа вида$order->my_custom_data), - transaction data,
- комментарий истории заказа,
- сессию/логическую метку в вашем сервисе.
Этап 7. Финальный экран (checkout finish)
Где мы
- Controller:
CheckoutController::finish()—site/Controller/CheckoutController.php. - Model:
CheckoutFinishModel—site/Model/CheckoutfinishModel.php,CartModel—site/Model/CartModel.php,CheckoutModel—site/Model/CheckoutModel.php. - View:
site/templates/default/checkout/finish.php.
Поток данных этапа
- Загружается текст
order_finish_descr. - Триггер плагина перед отображением может изменить
text,text_end,order_id. - После рендера вызывается
paymentComplete(). - Очищаются cart и checkout session.
Хронология trigger-ов
| # | Где | Trigger | Аргументы (тип) | Что можно прокинуть |
|---|---|---|---|---|
| 1 | CheckoutController::finish() |
onBeforeDisplayCheckoutFinish |
(&$text, &$order_id, &$text_end) |
Основная точка финального контента на finish template |
| 2 | CheckoutFinishModel::paymentComplete() |
onAfterDisplayCheckoutFinish |
(&$text, &$order, &$pm_method) |
Пост-обработка после payment_system->complete() |
| 3 | CheckoutFinishModel::clearAllDataCheckout() |
динамические Helper::Js_add_trigger(..., "before") |
(&$callerObject, &$varsArray) |
Хуки до очистки cart/session |
| 4 | CartModel::load() |
onBeforeCartLoad / onAfterCartLoad / onAfterLoadPriceAndCountProducts |
(&$obj) |
Подготовка cart перед clear |
| 5 | CartModel::getSum() |
onAfterCartGetSum |
(&$obj, &$incShiping, &$incRabatt, &$incPayment) |
Если нужно вмешательство в пересчет перед clear |
| 6 | CartModel::clear() |
onBeforeClearCart |
(&$obj) |
До полной очистки cart |
| 7 | CartModel::saveToSession() |
onAfterSaveToSessionCart |
(&$obj) |
После фиксации пустой cart в session |
| 8 | CheckoutModel::deleteSession() |
onAfterDeleteDataOrder |
(&$obj) |
После очистки checkout session |
| 9 | CheckoutFinishModel::clearAllDataCheckout() |
динамические Helper::Js_add_trigger(..., "after") |
(&$callerObject, &$varsArray) |
Хуки после очистки |
Что можно прокинуть на finish
На этапе onBeforeDisplayCheckoutFinish задавайте:
$text(основной HTML/текст),$text_end(дополнительный блок в конце),- свои данные через
$text/$text_endили через собственные поля view (если доработан шаблон).
_tmp_var..., _tmp_ext..., _tmpl_...: практическая карта
Где реально доступны позиции в checkout потоке
step2(checkout/adress.php):_tmp_ext_html_address_start/end,_tmpl_address_html_2...9.step3(checkout/payments.php):_tmp_ext_html_payment_start/end.step4(checkout/shippings.php):_tmp_ext_html_shipping_start/end.step5(checkout/previewfinish.php):_tmp_ext_html_previewfinish_start,_tmp_ext_html_previewfinish_agb,_tmp_ext_html_previewfinish_before_button,_tmp_ext_html_previewfinish_end.- Малая корзина checkout (
cart/checkout.php):_tmp_ext_subtotal,_tmp_ext_discount_text,_tmp_ext_discount,_tmp_ext_shipping,_tmp_ext_shipping_package,_tmp_ext_payment,_tmp_ext_tax[],_tmp_ext_total,_tmp_html_after_subtotal,_tmp_html_after_total,_tmp_html_after_checkout_cart,checkoutcartdescr. - Product/List (вне checkout, но часто используют вместе):
_tmp_var_start,_tmp_var_buttons,_tmp_var_endи др.
Универсальный паттерн для каждого trigger
Если trigger дает &$view:
- Назначайте существующие
_tmp_*позиции напрямую. - Добавляйте свои поля (
$view->myCustomData) и читайте их в override template.
Если trigger дает &$order, &$cart, &$product:
- Пишите данные в поля объекта (
order_add_info, custom props). - Либо в следующем
...BeforeDisplay...Viewпереносите эти данные вviewи_tmp_*позиции.
Пример: «существующая позиция + свои данные»
public function onBeforeDisplayCheckoutStep4View(&$view): void
{
// 1) В существующую позицию
$view->_tmp_ext_html_shipping_start = '<div class="shipping-banner">Курьер приедет в выбранный слот</div>';
// 2) Свой payload
$view->myShippingMeta = [
'feature' => 'slot-selector',
'enabled' => true,
];
}
Шаблон (checkout/shippings.php override):
<?php if (!empty($this->myShippingMeta['enabled'])): ?>
<div class="slot-info">Feature: <?php echo htmlspecialchars($this->myShippingMeta['feature'], ENT_QUOTES, 'UTF-8'); ?></div>
<?php endif; ?>
Быстрый checklist для проверки своего плагина
- В каждом этапе цепляйтесь за самый поздний
...BeforeDisplay...View, если ваша цель — шаблон. - Если цель — бизнес-логика заказа, используйте
onBeforeCreateOrder,onAfterCreateOrderFull,onStep7OrderCreated. - Если цель — статусная интеграция (CRM/ERP), используйте
onAfterChangeOrderStatus...и mail-события. - Для изменения внешнего вида страницы "спасибо за заказ" —
onBeforeDisplayCheckoutFinishиonAfterDisplayCheckoutFinish. - Не ожидайте триггеров внутри
Checkout HtmlView: их нет, они происходят доdisplay().
Приложение A. Полные сигнатуры trigger-ов по этапам (с путями к файлам)
События плагинов даны в хронологическом порядке срабатывания. Формат строк: Trigger(аргументы) — path/to/file.php::method().
Обратите внимание на то, что JoomShopping до сих пор (JoomShopping 5.9.0) использует старые способы вызова событий и для получения аргументов события в своём плагине лучше, чтобы он наследовал SubscriberInterface и соответственно получал аргументы через [$param1, $param2, $paramXXX] = $event->getArguments(). Возможно когда-нибудь в будущем JoomShopping перейдёт на собственные классы событий.
A1. Cart (CartController::view)
onConstructJshoppingControllerCart(&$obj)—site/Controller/CartController.php::init().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplayCart(&$cart, &$obj)—site/Model/CartpreviewModel.php::prepareView().onBeforeDisplayCheckoutNavigator(&$output, &$array_navigation_steps, &$step)—site/Model/CheckoutModel.php::showCheckoutNavigation().onAfterDisplayCheckoutNavigator(&$view)—site/Model/CheckoutModel.php::showCheckoutNavigation().onBeforeDisplayCartView(&$view)—site/Controller/CartController.php::view().
A2. Step2 (CheckoutController::step2, step2save)
onConstructJshoppingControllerCheckout(&$obj)—site/Controller/CheckoutController.php::init().onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onLoadCheckoutStep2()—site/Controller/CheckoutController.php::step2().onBeforeDisplayCheckoutNavigator(&$output, &$array_navigation_steps, &$step)—site/Model/CheckoutModel.php::showCheckoutNavigation().onAfterDisplayCheckoutNavigator(&$view)—site/Model/CheckoutModel.php::showCheckoutNavigation().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplaySmallCart(&$cart, &$obj)—site/Model/CartpreviewModel.php::prepareView().onAfterCartGetTaxExt(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment)—site/Model/CartModel.php::getTaxExt().onAfterCartGetSum(&$obj, &$incShiping, &$incRabatt, &$incPayment)—site/Model/CartModel.php::getSum().onBeforeDisplayCheckoutCartView(&$view)—site/Model/CheckoutModel.php::showSmallCart().onBeforeDisplayCheckoutStep2View(&$view)—site/Controller/CheckoutController.php::step2().onLoadCheckoutStep2save(&$post)—site/Controller/CheckoutController.php::step2save().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeSaveCheckoutStep2(&$adv_user, &$user, &$cart, &$model)—site/Controller/CheckoutController.php::step2save().onAfterSaveCheckoutStep2(&$adv_user, &$user, &$cart)—site/Controller/CheckoutController.php::step2save().onAfterSetMaxStepJshopCheckout(&$step)—site/Model/CheckoutModel.php::setMaxStep().
A3. Step3 (CheckoutController::step3, step3save)
onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onLoadCheckoutStep3()—site/Controller/CheckoutController.php::step3().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplayCheckoutNavigator(&$output, &$array_navigation_steps, &$step)—site/Model/CheckoutModel.php::showCheckoutNavigation().onAfterDisplayCheckoutNavigator(&$view)—site/Model/CheckoutModel.php::showCheckoutNavigation().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplaySmallCart(&$cart, &$obj)—site/Model/CartpreviewModel.php::prepareView().onAfterCartGetTaxExt(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment)—site/Model/CartModel.php::getTaxExt().onAfterCartGetSum(&$obj, &$incShiping, &$incRabatt, &$incPayment)—site/Model/CartModel.php::getSum().onBeforeDisplayCheckoutCartView(&$view)—site/Model/CheckoutModel.php::showSmallCart().onBeforeDisplayCheckoutStep3View(&$view)—site/Controller/CheckoutController.php::step3().onBeforeSaveCheckoutStep3save(&$post)—site/Controller/CheckoutController.php::step3save().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onAfterSaveCheckoutStep3save(&$adv_user, &$paym_method, &$cart)—site/Controller/CheckoutController.php::step3save().onAfterSetMaxStepJshopCheckout(&$step)—site/Model/CheckoutModel.php::setMaxStep().
A4. Step4 (CheckoutController::step4, step4save)
onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onLoadCheckoutStep4()—site/Controller/CheckoutController.php::step4().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplayCheckoutNavigator(&$output, &$array_navigation_steps, &$step)—site/Model/CheckoutModel.php::showCheckoutNavigation().onAfterDisplayCheckoutNavigator(&$view)—site/Model/CheckoutModel.php::showCheckoutNavigation().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplaySmallCart(&$cart, &$obj)—site/Model/CartpreviewModel.php::prepareView().onAfterCartGetTaxExt(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment)—site/Model/CartModel.php::getTaxExt().onAfterCartGetSum(&$obj, &$incShiping, &$incRabatt, &$incPayment)—site/Model/CartModel.php::getSum().onBeforeDisplayCheckoutCartView(&$view)—site/Model/CheckoutModel.php::showSmallCart().onBeforeDisplayCheckoutStep4View(&$view)—site/Controller/CheckoutController.php::step4().onBeforeSaveCheckoutStep4save()—site/Controller/CheckoutController.php::step4save().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onAfterSaveCheckoutStep4(&$adv_user, &$sh_method, &$shipping_method_price, &$cart)—site/Controller/CheckoutController.php::step4save().onAfterSetMaxStepJshopCheckout(&$step)—site/Model/CheckoutModel.php::setMaxStep().
A5. Step5 (CheckoutController::step5, step5save)
onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onLoadCheckoutStep5()—site/Controller/CheckoutController.php::step5().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplayCheckoutNavigator(&$output, &$array_navigation_steps, &$step)—site/Model/CheckoutModel.php::showCheckoutNavigation().onAfterDisplayCheckoutNavigator(&$view)—site/Model/CheckoutModel.php::showCheckoutNavigation().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeDisplaySmallCart(&$cart, &$obj)—site/Model/CartpreviewModel.php::prepareView().onAfterCartGetTaxExt(&$obj, &$tax_summ, &$incShiping, &$incRabatt, $incPayment)—site/Model/CartModel.php::getTaxExt().onAfterCartGetSum(&$obj, &$incShiping, &$incRabatt, &$incPayment)—site/Model/CartModel.php::getSum().onBeforeDisplayCheckoutCartView(&$view)—site/Model/CheckoutModel.php::showSmallCart().onBeforeDisplayCheckoutStep5(&$sh_method, &$pm_method, &$delivery_info, &$cart, &$view)—site/Controller/CheckoutController.php::step5().onBeforeDisplayCheckoutStep5View(&$view)—site/Controller/CheckoutController.php::step5().onLoadStep5save(&$checkagb)—site/Controller/CheckoutController.php::step5save().onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onBeforeCheckListProductsQtyInStore(&$obj)—site/Model/CartModel.php::checkListProductsQtyInStore().onCheckListProductsQtyInStoreForeach(&$obj, &$key, &$product, &$attr, &$qtyInStock, &$checkqty, &$check)—site/Model/CartModel.php::checkListProductsQtyInStore().onAfterCheckListProductsQtyInStore(&$obj)—site/Model/CartModel.php::checkListProductsQtyInStore().onBeforeCheckCouponStep5save(&$obj, &$coupon)—site/Model/CartModel.php::checkCoupon().onBeforeGetListFieldCopyUserToOrder(&$list)—site/Table/OrderTable.php::getListFieldCopyUserToOrder().onAfterFormatOrderNumber(&$number, &$num)—site/Table/OrderTable.php::formatOrderNumber().onAfterCopyDeliveryData(&$obj)—site/Table/OrderTable.php::copyDeliveryData().onBeforeCreateOrder(&$order, &$cart, &$obj)—site/Model/CheckoutorderModel.php::createOrder().onBeforeStoreTableOrder(&$obj)—site/Table/OrderTable.php::store().onAfterCreateOrder(&$order, &$cart)—site/Model/CheckoutorderModel.php::orderDataSave().onBeforeCouponFinished(&$coupon, &$cart, &$user_id, &$order)—site/Model/CheckoutorderModel.php::couponFinished().onBeforeSaveOrderItem(&$order_item, &$value)—site/Table/OrderTable.php::saveOrderItem().onAfterCreateOrderFull(&$order, &$cart)—site/Model/CheckoutorderModel.php::orderDataSave().onBeforeJshopOrderSaveOrderHistory(&$history, &$notify, &$comments, &$obj)—site/Table/OrderTable.php::saveOrderHistory().onBeforechangeProductQTYinStock(&$items, &$obj, &$change)—site/Table/OrderTable.php::changeProductQTYinStock().onAfterchangeProductQTYinStock(&$item, &$change, &$obj)—site/Table/OrderTable.php::changeProductQTYinStock().onAfterchangeProductQTYinStockPSR(&$items, &$obj, &$change, &$product_stock_removed)—site/Table/OrderTable.php::changeProductQTYinStock().onEndCheckoutStep5(&$order, &$cart)—site/Controller/CheckoutController.php::step5save().onAfterSetMaxStepJshopCheckout(&$step)—site/Model/CheckoutModel.php::setMaxStep().
A6. Step6 / Step6iframe
onBeforeStep6Iframe(&$width, &$height, &$url)—site/Controller/CheckoutController.php::step6iframe().onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onBeforeShowEndFormStep6(&$order, &$cart, $pm_method)—site/Model/CheckoutorderModel.php::showEndFormPaymentSystem().- При cancel-ветке дополнительно запускается lifecycle
site/Model/OrderchangestatusModel.php::store()(см. A7). onAfterCancelPayOrderJshopCheckout(&$order_id, $status, $sendmessage)—site/Model/CheckoutModel.php::cancelPayOrder().
A7. Step7 (CheckoutController::step7, CheckoutBuyModel::buy)
onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onLoadStep7()—site/Controller/CheckoutController.php::step7().onOrderCreateAndSetStatus(&$order_id, &$status, &$prev_order_status_data)—site/Table/OrderTable.php::orderCreateAndSetStatus().onStep7OrderCreated(&$order, &$res, &$obj, &$pmconfigs)—site/Model/CheckoutbuyModel.php::buy().- Если меняется статус, вызывается lifecycle
site/Model/OrderchangestatusModel.php::store(): onBeforeChangeOrderStatus(&$order_id, &$status, &$sendmessage, &$comments, &$prev_status, &$return)—site/Model/OrderchangestatusModel.php::store().onBeforeChangeOrderStatusAdmin(&$order_id, &$status, &$status_id, &$notify, &$comments, &$include_comment, &$view_order, &$prev_status, &$return)—site/Model/OrderchangestatusModel.php::store().onBeforeJshopOrderSaveOrderHistory(&$history, &$notify, &$comments, &$obj)—site/Table/OrderTable.php::saveOrderHistory().onBeforeCreateMailOrderStatusView(&$view)—site/Model/OrderchangestatusModel.php::getMessage().onBeforeSendClientMailOrderStatus(&$message, &$order, &$comments, &$tbl_order_status, &$vendorinfo, &$order_details_url, &$ishtml, &$mailfrom, &$fromname, &$subject, &$datavendor)—site/Model/OrderchangestatusModel.php::sendMail().onBeforeSendAdminMailOrderStatus(&$message, &$order, &$comments, &$tbl_order_status, &$vendorinfo, &$order_details_url, &$ishtml, &$mailfrom, &$fromname, &$subject, &$datavendor)—site/Model/OrderchangestatusModel.php::sendMail().onBeforeSendVendorMailOrderStatus(&$message, &$order, &$comments, &$tbl_order_status, &$vendorinfo, &$order_details_url, &$ishtml, &$mailfrom, &$fromname, &$subject, &$datavendor)—site/Model/OrderchangestatusModel.php::sendMail().onBeforeSendMailChangeOrderStatusClient(&$mailer, &$order_id, &$status, &$sendmessage, &$order)—site/Model/OrderchangestatusModel.php::sendMail().onBeforeSendMailChangeOrderStatusAdmin(&$mailer, &$order_id, &$status, &$sendmessage, &$order)—site/Model/OrderchangestatusModel.php::sendMail().onBeforeSendMailChangeOrderStatusVendor(&$mailer, &$order_id, &$status, &$sendmessage, &$order)—site/Model/OrderchangestatusModel.php::sendMail().onAfterChangeOrderStatus(&$order_id, &$status, &$sendmessage, &$prev_status)—site/Model/OrderchangestatusModel.php::store().onAfterChangeOrderStatusAdmin(&$order_id, &$status, &$status_id, &$notify, &$comments, &$include_comment, &$view_order, &$prev_status)—site/Model/OrderchangestatusModel.php::store().onStep7BefereNotify(&$order, &$obj, &$pmconfigs)—site/Model/CheckoutbuyModel.php::buy().onAfterSetMaxStepJshopCheckout(&$step)—site/Model/CheckoutModel.php::setMaxStep().
A8. Finish (CheckoutController::finish, CheckoutFinishModel)
onConstructJshopCheckout(&$obj)—site/Model/CheckoutModel.php::__construct().onBeforeDisplayCheckoutFinish(&$text, &$order_id, &$text_end)—site/Controller/CheckoutController.php::finish().onAfterDisplayCheckoutFinish(&$text, &$order, &$pm_method)—site/Model/CheckoutfinishModel.php::paymentComplete().- Динамический trigger (
Js_add_trigger before) с параметрами(&$callerObject, &$varsArray)—site/Model/CheckoutfinishModel.php::clearAllDataCheckout(). onConstructJshopCart(&$obj)—site/Model/CartModel.php::__construct().onBeforeCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterCartLoad(&$obj)—site/Model/CartModel.php::load().onAfterLoadPriceAndCountProducts(&$obj)—site/Model/CartModel.php::load().onAfterCartGetSum(&$obj, &$incShiping, &$incRabatt, &$incPayment)—site/Model/CartModel.php::getSum().onBeforeClearCart(&$obj)—site/Model/CartModel.php::clear().onAfterSaveToSessionCart(&$obj)—site/Model/CartModel.php::saveToSession().onAfterDeleteDataOrder(&$obj)—site/Model/CheckoutModel.php::deleteSession().- Динамический trigger (
Js_add_trigger after) с параметрами(&$callerObject, &$varsArray)—site/Model/CheckoutfinishModel.php::clearAllDataCheckout().