Привет всем, Что такое MVC- мы все знаем. Однако MVC Битрикса отличается от этой модели в привычном ее понимании. Controller и View как-то смешаны в одну сущность, и в некоторых компонентах одно не отличить от другого.
Больше всего я не понимаю как взаимодействуют события и вьюшки. Согласно документации порядок выполнения приложения следующий:
Служебная часть пролога;
Визуальная часть пролога;
Тело страницы;
Визуальная часть эпилога;
Служебная часть эпилога.
т.е всякая логика отображения задается в шаблонах битрикса, а шаблоны подключаются в визуальной части пролога. Но в некоторых случаях порядок выполнения страницы становится необъяснимым. Например, в дефолтном компоненте sale.order.ajax после успешного сохранения корзины и создания заказа происходит переадресация на страницу благодарности. Данная переадресация задается где-то в шаблоне, т.е в визуальной части пролога. В своем обработчике по факту создания заказа пытаюсь вывести в консоль сообщение, однако из-за переадресации данное сообщение не выводится. Почему один компонент выполняющийся по времени позже другого влияет на его работу? А что, если я внутри обработчика хочу делать инъекцию JS кода в тело страницы? Использовать библиотеку BX? Как?
Вообще, не понимаю как происходит отработка JS и его связь с шаблоном. Есть какой-то BX.setJSList(...); - кто его вызывает?
Omar Khazamov написал: Привет всем,Что такое MVC- мы все знаем. Однако MVC Битрикса отличается от этой модели в привычном ее понимании. Controller и View как-то смешаны в одну сущность, и в некоторых компонентах одно не отличить от другого.
Не смотря на то, что Битрикс в некоторых моментах говорит о MVC, это всего лишь паттерн, а не обязательная стратегия поведения. Если сравнивать с общедоступными паттернами, то скорее всего это больше похоже на HMVC. Но что есть, то есть и class.php + ajax жизненный цикл должны отчасти решить эту проблему.
Цитата
Omar Khazamov написал: т.е всякая логика отображения задается в шаблонах битрикса, а шаблоны подключаются в визуальной части пролога.
Все верно, но не совсем так. Есть AJAX запросы на подгрузку html части, которые обрабатываются так же, но обнуляют буферизацию вывода в самом компоненте. Есть некоторые части системы, которые взаимодействуют с /*/tools/ или services и там уже подключается только служебная части.
НО! Ни одна логика не зашита в самом шаблоне!
Цитата
Omar Khazamov написал:Но в некоторых случаях порядок выполнения страницы становится необъяснимым. Например, в дефолтном компоненте sale.order.ajax после успешного сохранения корзины и создания заказа происходит переадресация на страницу благодарности. Данная переадресация задается где-то в шаблоне, т.е в визуальной части пролога.
Нет, данная страница находится в шаблоне компонента: confirm.php
Цитата
Omar Khazamov написал: В своем обработчике по факту создания заказа пытаюсь вывести в консоль сообщение, однако из-за переадресации данное сообщение не выводится. Почему один компонент выполняющийся по времени позже другого влияет на его работу?
Тонкости работы компонента в режиме ajax. Первый хит на оформление заказа, затем редирект на ок-страницу для утверждения/оплаты.
Цитата
Omar Khazamov написал: А что, если я внутри обработчика хочу делать инъекцию JS кода в тело страницы? Использовать библиотеку BX? Как?
На событиях entity такого не делают. Это можно сделать, если есть события которые что-то рендерят или на js-событиях в публичной части. Все остальное делается только через подключение своих скриптов и перехват, ну или кастомизации шаблона компонента.
Памятуя о Вашем примере оформления заказа - echo не должно быть на событии сохранения заказа.
Цитата
Omar Khazamov написал: Вообще, не понимаю как происходит отработка JS и его связь с шаблоном.
1) Есть служебные скрипты которые подключаются при вызове шаблона компонента 2) Есть Asset'ы которые подключаются из любого места 3) В конце концов есть добавление в самом шаблоне/компоненте.
Где-то на странице есть код который вызывает или наборот при ready-событии на dom срабатывают биндеры
На событиях entity такого не делают. Это можно сделать, если есть события которые что-то рендерят или на js-событиях в публичной части.
Код
Все остальное делается только через подключение своих скриптов и перехват
Другими словами, я делаю в своем модуле публичную часть, которая будет ловить событие собственного модуля ? Какая структура библиотеки JS BX отвечает за это? Андрей, не сочтите за наглость , можно простейший пример модуля, который рендерит что-нибудь на стандартное события стандартного модуля?
Omar Khazamov написал: Другими словами, я делаю в своем модуле публичную часть, которая будет ловить событие собственного модуля ?
Что? Зачем Вам в своем же модуле ловить события своего же модуля?
Цитата
Omar Khazamov написал: Какая структура библиотеки JS BX отвечает за это?
За что именно?
Цитата
Omar Khazamov написал: Андрей, не сочтите за наглость , можно простейший пример модуля, который рендерит что-нибудь на стандартное события стандартного модуля?
Вы же Сами указали эту ссылку. Читайте внимательнее примечание: 1) Вы подписываетесь на событие компонента! OnSaleComponentOrderOneStepFinal, это не событие entity! 2) sprintf он использует в определенном месте и в определенный момент. LocalRedirect, который переводит пользователя, не ждет загрузки исполнения скриптов, а значит код на echo в случае с подпиской на entity не сработает