<?php
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", ["MyClass", "OnBeforeIBlockElementUpdateHandler"]);
class MyClass {
public static function OnBeforeIBlockElementUpdateHandler(&$arFields)
{
if ($arFields['IBLOCK_ID'] == 1) { // Проверяем на нужный ИБ
$userId = $arFields["MODIFIED_BY"];
$propValues = $arFields["PROPERTY_VALUES"];
$propMap = [ // Массив полей, за которым следим в виде ID св-ва => тайтл
8 => "Some prop",
];
$changesPropId = 9; // ID свойства changes
$resOldElem = CIBlockElement::GetList(
[],
["IBLOCK_ID" => $arFields["IBLOCK_ID"], "ID" => $arFields["ID"]],
false,
false,
array_map(function($propId) {
return "PROPERTY_{$propId}";
}, array_keys($propMap))
)->Fetch();
$newChanges = [];
foreach ($propMap as $propId => $propTitle) {
$propValueKey = "PROPERTY_{$propId}_VALUE";
$oldPropValue = $resOldElem[$propValueKey];
$newPropValue = $propValues[$propId][array_key_first($propValues[$propId])]["VALUE"]; // Для множественных свойств нужна своя логика обработки
if ($oldPropValue != $newPropValue) { // Если значение из справочника, то его надо разыменовать, достать значение из ИБ/Хайлоад ИБ
$newChanges[] = "Юзер {$userId} изменил {$propTitle}: {$oldPropValue} -> {$newPropValue}";
}
}
if (!empty($newChanges)) {
$arFields['PROPERTY_VALUES'][$changesPropId] = array_merge($arFields['PROPERTY_VALUES'][$changesPropId], $newChanges);
}
}
}
}
<?php
// Include Sale module
Bitrix\Main\Loader::includeModule("sale");
// Query: Get all cart items for current user
$res = CSaleBasket::GetList(
array(),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => NULL,
"CAN_BUY" => "Y"
),
false,
false,
array(
"QUANTITY",
"BASE_PRICE",
"PRICE",
"DISCOUNT_PRICE"
)
);
$totalPrice = 0;
// Temp array with cart items
$arItems = array();
// Fetching query
while($arFields = $res->Fetch()){
// Check for base price
if(!isset($arFields['BASE_PRICE']) || (float)$arFields['BASE_PRICE'] <= 0){
$arFields['BASE_PRICE'] = $arFields['PRICE'] + $arFields['DISCOUNT_PRICE'];
}
// Calculate total price without discount
$totalPrice += $arFields["PRICE"] * $arFields["QUANTITY"];
$arItems[] = $arFields;
}
// Make array for discount calculation
$arOrder = array(
'SITE_ID' => SITE_ID,
'ORDER_PRICE' => $totalPrice,
'BASKET_ITEMS' => $arItems
);
// Checking for authorized user
if(is_object($GLOBALS["USER"])){
$arOrder['USER_ID'] = $GLOBALS["USER"]->GetID();
$arErrors = array();
// Calculate discount
CSaleDiscount::DoProcessOrder($arOrder, array(), $arErrors);
}
// All done!
echo $arOrder['ORDER_PRICE'];
$res = CIBlockElement::GetList(
array(),
array(
'IBLOCK_ID' = 1, // Идентификатор ИБ статей
),
false,
false,
array(
'PROPERTY_FILES.PROPERTY_DOC', // Коды свойств с файлами
'PROPERTY_FILES.PROPERTY_PDF'
)
);
while($arFields = $res->GetNext()){
// Смотрите, что тут находится в $arFields, и доставайте файлы по идентификатору, с помощью метода CFile::GetByID либо CFile::GetPath
}
if(!empty($arResult['PROPERTIES']['FILES']['VALUE'])){
$res = CIBlockElement::GetList(
array(),
array(
'IBLOCK_ID' => $arResult['PROPERTIES']['FILES']['IBLOCK_ID'],
'ID' => $arResult['PROPERTIES']['FILES']['VALUE'],
'ACTIVE' => 'Y'
),
false,
false,
array(
'PROPERTY_DOC', // Коды свойств с файлами
'PROPERTY_PDF'
)
);
$files = array();
while($arFields = $res->GetNext()){
foreach(array('PDF', 'DOC') as $code){
$fullCode = "PROPERTY_$code_VALUE";
if($filePath = CFile::GetPath($arFields[$fullCode])){
$files[] = $filePath;
}
}
}
$arResult['PROPERTIES']['FILES']['LINKS'] = $files;
}
array(
'PROPERTY_BRAND' // Где BRAND это код свойсва "БРЕНД"
)
ID - идентификатор урока;
...
COURSE_ID - идентификатор курса;
<?$APPLICATION->ShowHead();?>
<title><?$APPLICATION->ShowTitle();?></title>
<?
$APPLICATION->ShowMeta("keywords");
$APPLICATION->ShowMeta("description");
$APPLICATION->ShowCSS();
$APPLICATION->ShowHeadStrings();
$APPLICATION->ShowHeadScripts();
?>