Author: Рамиль Юналиев

Отключение обработчиков событий [1С-Битрикс]

class HandlerTest
{
    static $b_HandlerRun = true;

    function OnAfterIBlockElementAddHandler(&$arFields)
    {
	AddMessage2Log(var_export( self::$b_HandlerRun , true), "my_module_id");
    }
}

/****** В init.php *****/
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("HandlerTest", "OnAfterIBlockElementAddHandler"));


/************************************/
HandlerTest::$b_HandlerRun = false;

$oElement = new CIBlockElement();
$oElement->Add(array("IBLOCK_ID" => 43, "NAME" => "Название элемента"));

В логе получим false, тем самым мы можем отключать или включать там где нужно события.

Отработка событий *::Add, *::Update, *::Delete

Иногда нужно чтобы события не срабатывали у разных методов системы. Пока этого нет, то пишем свои методы в обход. Редактирование полей пользователя прямым запросом.

function updateUserField($i_UserID, $ar_Fields)
{
	$ID = intval($i_UserID);
	
	if(intval($ID) <= 0 || count($ar_Fields) == 0) return false; global $DB; $res = $DB->Query("UPDATE b_user SET ".$DB->PrepareUpdate("b_user", $ar_Fields)." WHERE ID=".$ID, true);
	return (!$res) ? false : true;
}

BX идея, голосуем

OnAfterUserUpdate не все данные

На заметку, OnAfterUserUpdate в массиве $arFields вы будите долго искать XML_ID, ну а зачем он, и без него можно… :(

function OnAfterUserUpdateHandler(&$arFields)
{
    # Зато б..дь есть все UF_* 
    $_ar = CUser::GetByID($arFields['ID'])->Fetch();
    $arFields['XML_ID'] = $_ar['XML_ID']; 
    self::_handler($arFields, 'update');
}

XML to Array and Array to XML

Сейчас много приходится работать с XML (интеграция 1C-Битрикс и 1С), сложная логика проекта не позволяет использовать типового импорта, и задача стоит как можно больше перенести на сторону 1с, ну суть не в этом, задача постоянно парсить XML или собирать и отдавать в 1с, хочу сохранить пару очень удобных классов которые как раз подходят для этих задач. Array2XML и XML2Array

Ссылка 1
Ссылка 2

Замена CUser::GetParam()

/**
 * Возвращает все данные текущего пользователя, можно выбрать 1 параметр по ключу, можно указать ID другого пользователя
 * @param string $s_ParamKey - Ключ поля CUser
 * @param intval $i_UserID - ID пользователя данные которогонужно выбрать
 * @return mixed
 */
public static function getUserParams($s_ParamKey = false, $i_UserID = false)
{
	global $USER;
	if( ! $i_UserID && ! $USER->IsAuthorized() )
		return; 	
	
	$ar_User = CUser::GetByID( ( intval($i_UserID) > 0 ) ? intval($i_UserID) : $USER->GetID() )->Fetch();
	return (!$s_ParamKey) ? $ar_User : $ar_User[$s_ParamKey]; 
}

Вместо ущербного CUser::GetParam()

1С-Битрикс, добавить логотип к службе доставки CSaleDelivery::Add()

Чтобы добавить логотип при добавлении настраиваемой службы доставки, нужно добавить ключ: LOGOTIP

$ar_Fields = array(
    'NAME'  => 'New drlivery',
    ...
    'LOGOTIP' => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$s_ImagesPatch)
);
if($i_NewID = CSaleDelivery::Add($ar_Fields))
{
}

Лайфхак для CUser::Register() [bitrix api]

CUser::Register() регистрирует нового пользователя и отправляет ему типовое письмо о успешной регистрации, смене пароля и тд. Иногда нужно чтобы это не происходило.

1) Можно удалить шаблоны (не рекомендуется)
2) Есть вариант при котором письма не отправятся, 7 параметр [string site_id = false], ID сайта почтовых шаблонов, если указать не существующий ID сайта, то и не будет шаблонов и как следствие писем.

global $USER; 
$USER->Register("admin", "", "", "123456", "123456", "a@m.ru", "no_send");