1c-bitrix

CIBlockElement::SetPropertyValues()

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

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

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

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

Проверка вхождения пользователя в определенныу группу [bitrix api]

Думаю метод проверки пользователя в определенной группе обязан быть в API, но его почему-то там не оказалось, есть пару(CUser::GetUserGroupArray(),
CUser::GetUserGroup(), CUser::GetUserGroupString()) методов для выборки всех групп пользователя. Чтобы сделать проверку с помощью этих методов нужны дополнительные манипуляции.

Предложу решение:

/**
* Функция проверки нахождения пользователя в определенной группе
* @param {intva} $i_GroupID - ID группы
* @param {intval} $i_UserID - ID пользователя, если не указан, то текущий 
* @return {bool}
*/ 
function isUserGroupID($i_GroupID, $i_UserID = false)
{
    if(!$i_UserID && $GLOBALS['USER']->IsAuthorized())
        $i_UserID = intval($GLOBALS['USER']->GetID());        

    if($i_UserID)            
        return  in_array($i_GroupID, CUser::GetUserGroup(intval($i_UserID)));
}

var_dunp( isUserGroupID(1, 1) ); // true

Проверка активности элемента по дате [bitrix api]

В методе CIBlockElement::GetList() есть параметр фильтра для выборки активных элементов по дате. Т.е. проверка происходит еще в запросе и не надо в списке нечего проверять дополнительно.

Если вам нужно обратная сторона действия с фильтрацией по дате активности, то у вас это не получится сделать. Мной ожидалось поведение, что если
заменить Y на N то выборка отдаст только не активные по дате элементы, но к сожалению это не так, читаем еще раз док и убеждаемся в этом.

ACTIVE_DATE — непустое значение задействует фильтр по датам активности.
Будут выбраны активные по датам элементы.Если значение не установлено («»), фильтрация по датам активности не производится;

Приходится делать полную выборку и проверят уже в результате что конечно не очень хорошо.

function __isElelementDateActive($s_DateFrom, $s_DateTo)
{
    $stmp_DateFrom = MakeTimeStamp($s_DateFrom, "DD.MM.YYYY HH:MI:SS");
    $stmp_DateTo   = MakeTimeStamp($s_DateTo, "DD.MM.YYYY HH:MI:SS");
    $stmp_Date     = MakeTimeStamp(date('d.m.Y H:i:s'), "DD.MM.YYYY HH:MI:SS");

    return ($stmp_Date > $stmp_DateFrom && $stmp_Date < $stmp_DateTo);
}
+ бонус, проверка если дата истекает за 1 день
function __isOneDayShowElement($s_DateTo)
{
    $stmp_DateTo   = MakeTimeStamp($s_DateTo, "DD.MM.YYYY");
    $stmp_Date     = MakeTimeStamp(date('d.m.Y'), "DD.MM.YYYY");

    return (($stmp_DateTo - $stmp_Date) == 86400);
}
+ дата и время

function isDateTimeActive($date_from, $date_to)
{
    $ar_From    	= explode(' ', $date_from);
    $ar_DateFrom    = explode('.', $ar_From[0]);
    $ar_TimeFrom    = explode(':', $ar_From[1]);

    $ar_To      	= explode(' ', $date_to);
    $ar_DateTo    	= explode('.', $ar_To[0]);
    $ar_TimeTo    	= explode(':', $ar_To[1]);

    $ar_Date        = explode('.', date('d.m.Y'));
    $ar_Time        = explode(':', date('H:i:s'));

    $s_MetaDateFrom = mktime($ar_TimeFrom[0], $ar_TimeFrom[1], $ar_TimeFrom[2], $ar_DateFrom[1], $ar_DateFrom[0], $ar_DateFrom[2]);
    $s_MetaDateTo   = mktime($ar_TimeTo[0],   $ar_TimeTo[1],   $ar_TimeTo[2],   $ar_DateTo[1],   $ar_DateTo[0],   $ar_DateTo[2]);
    $s_MetaDate     = mktime($ar_Time[0],     $ar_Time[1],     $ar_Time[2],     $ar_Date[1],     $ar_Date[0],     $ar_Date[2]);

    return ($s_MetaDate >= $s_MetaDateFrom && $s_MetaDate <= $s_MetaDateTo);
}

Проверка элемента на активность по дате [bitrix]

function _isDateActive($date_from, $date_to) 
{
    $ar_DateFrom    = explode('.', $date_from);
    $ar_DateTo      = explode('.', $date_to);
    $ar_Date        = explode('.', date('d.m.Y'));
    $s_MetaDateFrom = mktime(0, 0, 0, $ar_DateFrom[1], $ar_DateFrom[0], $ar_DateFrom[2]);
    $s_MetaDateTo   = mktime(0, 0, 0, $ar_DateTo[1], $ar_DateTo[0], $ar_DateTo[2]);
    $s_MetaDate     = mktime(0, 0, 0, $ar_Date[1], $ar_Date[0], $ar_Date[2]);

    return ($s_MetaDate >= $s_MetaDateFrom && $s_MetaDate <= $s_MetaDateTo);
}

Отложенные функции [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);
}

Вывод в заголовок диапазона элементов [c 10 по 20]

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

Вот наброски кода который решает эту задачу $rs_Element объект типа arResult

if(is_array($ar_Navigatonparams))
{
    $ar_NavParams = array(
        'NavPageNomer'    => $rs_Element->NavPageNomer,
        'NavPageSize'     => $rs_Element->NavPageSize,
        'NavRecordCount'  => $rs_Element->NavRecordCount,
        'nEndPage'        => $rs_Element->nEndPage
    );

    function navigationIntervalList($ar_NavParams)
    {
        if(isset($_REQUEST['PAGEN_1']) && intval($_REQUEST['PAGEN_1']) > 0)
        {
            if(intval($ar_NavParams['NavPageNomer'])  > 1)
            {
                $_s = ($ar_NavParams['NavPageNomer'] * $ar_NavParams['NavPageSize']) - $ar_NavParams['NavPageSize'] + 1;
                $_p = $ar_NavParams['NavPageNomer'] * $ar_NavParams['NavPageSize'];

                if($ar_NavParams['nEndPage'] == $ar_NavParams['NavPageNomer'])
                    $_p = $ar_NavParams['NavRecordCount'];

                return 'список с '.$_s.' по '.$_p;
            }
        }
    }

    $s_nav = navigationIntervalList($ar_NavParams);
    $s_Nav = (!empty($s_nav)) ? ' / '.$s_nav : '';
    $s_Tit = (!empty($s_nav)) ? ', '.$s_nav : '';

    $APPLICATION->AddChainItem($s_TitleNavchain.$s_Nav);
    $APPLICATION->SetTitle($s_TitleNavchain.$s_Tit);
}