Добавление профиля покупателя

13
Алексей,

В компоненте bitrix:sale.personal.profile.detail есть только редактирование, что бы научить его добавлять новые профили, нужно немного кастомного кода.

Идея в том, что форма добавления будет такой же как и изменения профиля, за одним исключением, поле USER_PROPS_ID будет пустое. USER_PROPS_ID это ID профиля покупателя.

Если отправить такую форму в стандартный компонент, он вернет ошибку "Профиль не найден". Поэтому надо до подключения компонента создать новый профиль и передать в параметры компонента.

$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();

if ($_REQUEST["USER_PROPS_ID"] > 0) {
	$profileId = IntVal($_REQUEST["USER_PROPS_ID"]);
} elseif ($request->isPost() && ($request->get("save") || $request->get("apply"))
		&& check_bitrix_sessid() && $request->get("NAME")) { // Добавляем новый профиль
	$ob = new CSaleOrderUserProps();
	$id = $ob->Add(array(
		'PERSON_TYPE_ID' => 1,
		'USER_ID' => $USER->GetID(),
		'NAME' => $request->get("NAME")
	));
	if ($id > 0) {
		$profileId = $id;
	}
}

$APPLICATION->IncludeComponent(
	"bitrix:sale.personal.profile.detail",
	"json",
	Array(
		"COMPATIBLE_LOCATION_MODE" => "N",
		"ID" => $profileId,
		"PATH_TO_DETAIL" => "",
		"PATH_TO_LIST" => "",
		"SET_TITLE" => "N",
		"USE_AJAX_LOCATIONS" => "N"
	)
);

Учтите, что новый профиль будет создаваться каждый раз при отправке формы, даже если компонент вернул ошибку. Тут несколько вариантов:

  • встроить код в класс компонента, что бы была возможность проверить валидность полей до создания профиля
  • проверять поля формы на фронте, что бы у компонента не возникло вопросов
  • можно возвращать id нового профиля сразу в форму, что бы после исправления ошибок не создавать еще один профиль
  • написать свой компонент добавления профиля и не заниматься ерундой :)

Опубликовано 20 ноября 2020
разработчику, магазин, костыли
Комментарии