bitrix api

Отработка событий *::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 идея, голосуем

Замена 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");

CIBlockElement::SetPropertyValues()

Следует отметить вот такой порядок параметров

CIBlockElement::SetPropertyValues(
    $i_ElementID, 
    $i_IblockID, 
    array('PROPERTY_CODE' => 'PROPERTY_VALUE')
);

В этом случае очень важный момент, при обновлении нужно задать все свойства элемента, иначе те которые не заданы будут сброшены.

Это напоминает логику работы CIBlockElement::Update(), если не все свойства указать в PROPERTY_VALUES.

Отложенные функции [bitrix api]

Первое что хочу сказать, они используются для вывода чего либо в хидере, но не просто вывода, а зависящего от определенных параметров которые передаются на самой странице.

На примере, допустим нам нужно в левую колонку (header.php) выводить список товаров, но по определенному условию, если на странице находится товар с ценой больше 1000 р. или еще по какому-либо критерию. Важно то, что мы не знаем значение по которому можно определить это и оно было-бы нам доступно в header.php, только если это $_GET параметр, но я думаю все цены товара «поднимать» в $_GET это бред.

Вот для передачи значения в header и служат отложенные функции. Заголовок странице устанавливается тоже так, передача значения идет с самой страницы.

С помощью метода $APPLICATION->SetPageProperty(‘KEY’, ‘VALUE’) на самой странице добавляем в ее свойства наше значение, в примере с ценой это будет примерно так:

$APPLICATION->SetPageProperty('MAX_PRICE', $i_ProductPrice);

Далее пишем функцию и ложем ее в init.php например,

Continue reading

Статичная ли страница? [bitrix api]

Недавно на форуме был задан вопрос, как можно определить статическую страницу в битриксе. Видимо у людей мало опыта и они просто не знают что изначально все публичные файла сайта битрикса статичные, а уже потом на них можно добавить вывод динамического содержимого.

Continue reading

Конвертер валют для Bitrix [php, js]

Конвертер валют Битрикс

Конвертер валют Битрикс

Я редко что-то выкладываю готовое, но вот просто захотелось. Я не жадный, просто нет времени. Итак задача была сделать конвертер на js, для этого нам нужно иметь данные для подсчета, принципиально не захотел делать пересчет на аяксе так как это был бы не совсем js конвертер. Вариантов получения данных несколько, вот как сделал я.

В битриксе есть модуль «Валюты» он нам нужен для back-end нашего конвертера. Для автоматического обновления есть скрипт который обновляет курс, его можно запускать кроном или агентом, я выбрал крон. Там же в модуле валюты есть список курсов, с названиями и значениями курса по умолчанию, по большому счету нам нужны только названия валют оттуда. Его пришлось собирать ручками, по этому в архиве положу csv файл, загрузите его сами. Теперь когда back-end готов можно перейти к компоненту.

Компонент обрабатывает данные из модуля, он должен быть постоянно кэшированным так как при вычислении коэффициента для каждой валюты, создается большой кол-во запросов, благо они мелкие и легкие. Кэш компонента очищается при отработки скрипта на кроне, в коде это можно найти. Логика компонента возвращает 2 json объекта с которыми мы в дальнейшем работаем в шаблоне. В общем смотрим что получилось, улучшать там есть что, буду раз замечаниям.

Скачать архив

В папке cron скрипт для пересчета валюты, в flag флаги, их нужно положить в upload или поправить пути. Не забудьте подключить jQuery.

 

Сколько лет пользователю сайта?

Немного лениво выглядит профиль пользователя на сайте, когда вместо надписи о количестве лет выводится дата его рождения. Снипед, для Битрикса, жаль что нету API функции.

if(strlen($ar_UserCabinet['PERSONAL_BIRTHDAY']) > 0)
{
	$ar_UserDateTo  = explode('.', $ar_UserCabinet['PERSONAL_BIRTHDAY']);
	$s_MetaDateTo   = mktime(0, 0, 0, $ar_UserDateTo[1], $ar_UserDateTo[0], $ar_UserDateTo[2]);
	$s_MetaDateFrom = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
	$i_Meta = ($s_MetaDateFrom - $s_MetaDateTo) / 31276800;

	# проверим был ли у пользователя день рождения, если еще небыло то -1
	$s_DateRog = mktime(0, 0, 0, $ar_UserDateTo[1], $ar_UserDateTo[0], date('Y'));
	if($s_DateRog > $s_MetaDateFrom)
		$i_Meta -= 1;

	$arResult['USER_BIRTHDAY'] = intval($i_Meta);
}