Не преувеличу, если скажу, что sale.order.ajax является сердцем публичной части магазина, и выносить его в свое пространство имен - это лишаться его будущих обновлений. А если учесть еще и набирающего популярность Маркетплейс, то вы лишаетесь так же возможных плюшек от решений партнеров. Попробую на простом примере показать, что в любом случае можно пойти сторонним путем и не трогать компонент. [spoiler] Если честно, то я даже не смогу навскидку придумать ситуации, при которой компонент нужно именно менять внутри, и выносить в свое пространство. А даже если вы упретесь в такой тупик, то коллеги из 1С-Битрикс, думаю, смогут помочь обходным событием в компоненте
Замечу, что в последних обновлениях магазина прилетело еще несколько событий, которые еще больше укрепляют мой предыдущий абзац. Вот они:
OnSaleComponentOrderOneStepPersonType
OnSaleComponentOrderOneStepOrderProps
OnSaleComponentOrderOneStepDelivery
OnSaleComponentOrderOneStepPaySystem
OnSaleComponentOrderOneStepProcess
OnSaleComponentOrderOneStepComplete
OnSaleComponentOrderOneStepFinal
Эти и многие другие события можно найти по ссылке.
Ну а теперь рассмотрим простое внедрение в работу этого компонента, которое, казалось бы, без выноса в свое пространство его не сделать. Мой пост навеян этим постом, поэтому, давайте и пример возьмем оттуда.
Собственно, задача. Если пользователь был автоматически создан в момент заказа, то сохранить у него авторизацию. Можно поступить как сделал Михаил, но давайте сделаем хитрее.
Но тут есть одна проблема - переавторизовывает каждого. А нам надо только для новых этот код запустить. Как можно узнать, что пользователь только что был создан? Перехватить текущую регистрацию и сохранить в переменной флаг регистрации. Вот тут можно воспользоваться только перехватом CUser::Add, так как CUser::Register там не применяется. Не беда.
class CMainhandlers
{
public static $bNowReg = false;
...
function OnAfterUserAddHandler(&$arFields)
{
self::$bNowReg = true;
}
Теперь просто переписываем наш код:
function OnSaleComponentOrderOneStepCompleteHandler($ID, $arFields)
{
if (CMainhandlers::$bNowReg)
{
$UID = $GLOBALS['USER']->GetID();
$GLOBALS['USER']->Logout();
CUser::Authorize($UID, true);
}
}
Еще раз извиняюсь перед Михаилом, я не выставляю его подход плохим. Мой пост скорее призыв, лучше поизвращаться, но оставить нетронутым этот компонент На последнем проекте мне пришлось реально для этого попотеть.
события отрабатываются только один раз в компоненте, и при перегрузке формы (например при изменении города) повторно не отрабатывается. конкретно проблема появилась при интеграции модуля агрегатора доставки, который использует событие OnSaleComponentOrderOneStepDelivery для пересчета стоимости доставки. как быть?
Антон, события обрабатываются всегда. Поставьте в код обработчика запись в лог, к примеру, чтобы убедиться, что они обрабатываются (быть может их действия не очевидны). Если они действительно срабатывают, то проблемы искать далее надо уже - в компоненте (может он кастомизирован или старый, с какой-нибудь ошибкой), или в модулях стороних. В любом случае, детально вам поможет только ТП Битрикс
если правильно понимаю, вызов события происходит в компоненте sale.order.ajax, в файле component.php код отрабатывается только 1 раз, далее аяксом перегружается форма не зартагивая component.php
Интересно, если править пост, получается что он в самый вверх вылазит, это так задумано? мой тоже зачем-то вылез, хотя я только ссылку в него добавил внутри текста
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».