Common event handlers¶
This section contains common Bitrix event handlers
Minimal and maximal price props¶
<?php
AddEventHandler('iblock', 'OnAfterIBlockElementAdd', 'DoIBlockAfterSave');
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', 'DoIBlockAfterSave');
AddEventHandler('catalog', 'OnPriceAdd', 'DoIBlockAfterSave');
AddEventHandler('catalog', 'OnPriceUpdate', 'DoIBlockAfterSave');
/**
* Runs on events:
* - OnAfterIBlockElementAdd
* - OnAfterIBlockElementUpdate
* - OnPriceAdd
* - OnPriceUpdate
*
* Calculates min and max prices and saves them into propd
* @param $arg1
* @param bool $arg2
*/
function DoIBlockAfterSave($arg1, $arg2 = false)
{
$ELEMENT_ID = false;
$IBLOCK_ID = false;
$OFFERS_IBLOCK_ID = false;
$OFFERS_PROPERTY_ID = false;
//Check for catalog event
if (is_array($arg2) && $arg2["PRODUCT_ID"] > 0) {
//Get iblock element
$rsPriceElement = CIBlockElement::GetList(
array(),
array(
"ID" => $arg2["PRODUCT_ID"],
),
false,
false,
array("ID", "IBLOCK_ID")
);
if ($arPriceElement = $rsPriceElement->Fetch()) {
$arCatalog = CCatalog::GetByID($arPriceElement["IBLOCK_ID"]);
if (is_array($arCatalog)) {
//Check if it is offers iblock
if ($arCatalog["OFFERS"] == "Y") {
//Find product element
$rsElement = CIBlockElement::GetProperty(
$arPriceElement["IBLOCK_ID"],
$arPriceElement["ID"],
"sort",
"asc",
array("ID" => $arCatalog["SKU_PROPERTY_ID"])
);
$arElement = $rsElement->Fetch();
if ($arElement && $arElement["VALUE"] > 0) {
$ELEMENT_ID = $arElement["VALUE"];
$IBLOCK_ID = $arCatalog["PRODUCT_IBLOCK_ID"];
$OFFERS_IBLOCK_ID = $arCatalog["IBLOCK_ID"];
$OFFERS_PROPERTY_ID = $arCatalog["SKU_PROPERTY_ID"];
}
} //or iblock wich has offers
elseif ($arCatalog["OFFERS_IBLOCK_ID"] > 0) {
$ELEMENT_ID = $arPriceElement["ID"];
$IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
$OFFERS_IBLOCK_ID = $arCatalog["OFFERS_IBLOCK_ID"];
$OFFERS_PROPERTY_ID = $arCatalog["OFFERS_PROPERTY_ID"];
} //or it's regular catalog
else {
$ELEMENT_ID = $arPriceElement["ID"];
$IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
$OFFERS_IBLOCK_ID = false;
$OFFERS_PROPERTY_ID = false;
}
}
}
} //Check for iblock event
elseif (is_array($arg1) && $arg1["ID"] > 0 && $arg1["IBLOCK_ID"] > 0) {
//Check if iblock has offers
$arOffers = CIBlockPriceTools::GetOffersIBlock($arg1["IBLOCK_ID"]);
if (is_array($arOffers)) {
$ELEMENT_ID = $arg1["ID"];
$IBLOCK_ID = $arg1["IBLOCK_ID"];
$OFFERS_IBLOCK_ID = $arOffers["OFFERS_IBLOCK_ID"];
$OFFERS_PROPERTY_ID = $arOffers["OFFERS_PROPERTY_ID"];
}
}
if ($ELEMENT_ID) {
static $arPropCache = array();
if (!array_key_exists($IBLOCK_ID, $arPropCache)) {
//Check for MINIMAL_PRICE property
$rsProperty = CIBlockProperty::GetByID("MINIMUM_PRICE", $IBLOCK_ID);
$arProperty = $rsProperty->Fetch();
if ($arProperty)
$arPropCache[$IBLOCK_ID] = $arProperty["ID"];
else
$arPropCache[$IBLOCK_ID] = false;
}
if ($arPropCache[$IBLOCK_ID]) {
//Compose elements filter
$arProductID = array($ELEMENT_ID);
if ($OFFERS_IBLOCK_ID) {
$rsOffers = CIBlockElement::GetList(
array(),
array(
"IBLOCK_ID" => $OFFERS_IBLOCK_ID,
"PROPERTY_" . $OFFERS_PROPERTY_ID => $ELEMENT_ID,
"ACTIVE_DATE" => "Y",
"ACTIVE" => "Y",
"<CATALOG_QUANTITY" => AVALIABLE_VAL,
">CATALOG_QUANTITY" => 0
),
false,
false,
array("ID")
);
while ($arOffer = $rsOffers->Fetch())
$arProductID[] = $arOffer["ID"];
}
$minPrice = false;
$maxPrice = false;
//Get prices
$rsPrices = CPrice::GetList(
array(),
array(
"BASE" => "Y",
"PRODUCT_ID" => $arProductID,
)
);
while ($arPrice = $rsPrices->Fetch()) {
$PRICE = $arPrice["PRICE"];
if ($minPrice === false || $minPrice > $PRICE)
$minPrice = $PRICE;
if ($maxPrice === false || $maxPrice < $PRICE)
$maxPrice = $PRICE;
}
//Save found minimal price into property
if ($minPrice !== false) {
CIBlockElement::SetPropertyValuesEx(
$ELEMENT_ID,
$IBLOCK_ID,
array(
"MINIMUM_PRICE" => $minPrice,
"MAXIMUM_PRICE" => $maxPrice,
)
);
}
}
}
}
Before mail sent¶
<?php
AddEventHandler('sale', 'OnOrderNewSendEmail', 'processOrderMailTemplate');
function processOrderMailTemplate($ID, &$eventName, &$arFields)
{
if ($eventName == 'SALE_NEW_ORDER') {
}
}
Restrict 1C from updating element fields¶
AddEventHandler(
'sale',
'OnBeforeIBlockElementUpdate',
array('OnBeforeIBlockElementUpdate', 'restrictFieldsUpdateFrom1C')
);
class OnBeforeIBlockElementUpdate
{
public static $group1cId = 23;
public static function restrictFieldsUpdateFrom1C(&$arFields)
{
global $USER;
if(in_array(self::$group1cId, $USER->GetUserGroupArray()))
{
unset($arFields["PREVIEW_TEXT"]);
unset($arFields["DETAIL_TEXT"]);
unset($arFields["CODE"]);
}
}
}