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