cms

Content Management System

Очистка корзины Bitrix24 коробка [сниппет]

use \Bitrix\Recyclebin\Internals\Models\RecyclebinTable;
use \Bitrix\Recyclebin\Recyclebin;
use \Bitrix\Main\Loader;

Loader::includeModule('recyclebin');

$list = RecyclebinTable::getList([
        'limit'  => 5000,
        'filter' => ['MODULE_ID' => 'CRM'],
        'select' => ['ID']
    ]
)->fetchAll();
foreach ($list as $item) {
    Recyclebin::remove(intval($item['ID']));
}

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

Отработка событий *::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