php

Если нужно сделать User Update и сразу Authorize(id)

Задача:

Если обновлять пользователя (в моем случае ajax) и пытаться сразу авторизовать по ID, это не получится сделать или будет выкидывать после 1 хита.

Решение:

$user = new \CUser();
$resultUpdate = $user->Update($userId, $filedsUpdate);
if ($resultUpdate) {
    $user->Authorize($userId);
    $user->CheckAuthActions(); // вся соль тут
}

Битрикс ЧПУ, правила urlrewrite.php

Самые часто используемые правила ЧПУ в битриксе это страницы детального описания элемента, например /section/125/ 125 это ID элемента, в основном это дополнительные разделы сайта, для магазинов используется комплексный компонент каталога и там 1 правило для всего компонента, но речь не о ней.

Continue reading

Отключение обработчиков событий [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, тем самым мы можем отключать или включать там где нужно события.

XML to Array and Array to XML

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

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

Особенность Add2BasketByProductID() [bitrix api]

Итак есть одна особенность у это функции, которая так облегчает нам жизнь. И так суть в том, что когда вы добавляете товар в корзину в кол-ве 10 штук, туда попадает 1 или 4 и т.д. В общем кол-во не всегда правильное и это сбивает с толку.

Continue reading

Предыдущий следующий элемент массива по кругу [php]

Для формирования ссылок на детальных страниц нужно искать предыдущий и следующий элемент, для построения url.

Это первое способ, собрать все ID в массив и найти prev и next. Второй способ если у вас много элементов, использовать pagination (постраничну навигацию) с настройкой списка в 1 элемент.

Snippet для 1 случая:

// массив с ID
$ar_ElementID = array();

// текущий ID (должен присутствовать в $ar_ElementID)
$i_CurrentID = 777

// находим текущий ключ
$i_KeyCurrent =	array_search($i_CurrentID, $ar_ElementID);

// кол-во элементов в массиве
$i_CountElement = count($ar_ElementID);


/* коротко */

	// слудеющий ID	
	$i_NextID = ( $i_KeyCurrent !== ($i_CountElement -1) ) 
		? $ar_ElementID[$i_KeyCurrent + 1] : 0;

	// предыдущий ID
	$i_PrevID = ( $i_KeyCurrent == 0 ) 
		? $ar_ElementID[$i_CountElement - 1] : $ar_ElementID[$i_KeyCurrent - 1];


/* длинно */

	// слудеющий ID	
	if($i_KeyCurrent !== ($i_CountElement -1) )
	{
		$i_NextID = $ar_ElementID[ $i_KeyCurrent + 1 ];
	}	
	else 
	{
		$i_NextID = 0;
	}	
		
	// предыдущий ID
	if($i_KeyCurrent == 0 )
	{
		$i_PrevID = $ar_ElementID[$i_CountElement - 1];
	}	
	else
	{
		$i_PrevID = $ar_ElementID[$i_KeyCurrent - 1];
	}

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