Не преувеличу, если скажу, что 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);
}
}
Еще раз извиняюсь перед Михаилом, я не выставляю его подход плохим. Мой пост скорее призыв, лучше поизвращаться, но оставить нетронутым этот компонент На последнем проекте мне пришлось реально для этого попотеть.
Антон, события обрабатываются всегда. Поставьте в код обработчика запись в лог, к примеру, чтобы убедиться, что они обрабатываются (быть может их действия не очевидны). Если они действительно срабатывают, то проблемы искать далее надо уже - в компоненте (может он кастомизирован или старый, с какой-нибудь ошибкой), или в модулях стороних. В любом случае, детально вам поможет только ТП Битрикс
если правильно понимаю, вызов события происходит в компоненте sale.order.ajax, в файле component.php код отрабатывается только 1 раз, далее аяксом перегружается форма не зартагивая component.php
Интересно, если править пост, получается что он в самый вверх вылазит, это так задумано? мой тоже зачем-то вылез, хотя я только ссылку в него добавил внутри текста
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».