Поддержать видеоуроки



руб.





Xxxxxxxxx

ПОДРОБНЕЕ
ФАЙЛЫ ДЛЯ СКАЧИВАНИЯ
  • 19 Окт 2017
  • Автор: Роман Онищенко
  • Битрикс экзамен №2
  • 174
  • 0

На мой взгляд это самое простое задание из всего преречня, которое для решения требует минимальное количество времени относительно всех остальных заданий

Методика решения задания

Данное задание решается при помощи событий и запроса к БД для получения количества просмотров товара (поле SHOW_COUNTER):

  • OnAfterIBlockElementUpdate - Событие вызывается в методе CIBlockElement::Update до изменения элемента информационного блока, и может быть использовано для отмены изменения или для переопределения некоторых полей.

Для отмены изменения и прекращении выполнения метода CIBlockElement::Update необходимо в функции-обработчике создать исключение методом $APPLICATION->ThrowException() и вернуть false.

В папке local создаем папку php_interface и в ней создаем файл init.php в котором подключаем два файла если они существуют const.php и deactivation.php

if(file_exists($_SERVER['DOCUMENT_ROOT'].'/local/php_interface/const.php')){
   require_once($_SERVER['DOCUMENT_ROOT'].'/local/php_interface/const.php');
}
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/local/php_interface/deactivation.php')){
   require_once($_SERVER['DOCUMENT_ROOT'].'/local/php_interface/deactivation.php');
}
    

Создаём вышеуказанные файлы.
В файле const.php определяем константу, которая будет содержать ID инфоблока "продукция"

define('PRODUCT_IBLOCK',2);
   

В файле deactivation.php подключаем модуль языковых фраз,регистрируем обработчик события OnBeforeIBlockElementUpdate, получаем поле SHOW_COUNTER и если оно больше 2 отменяем деактивацию товара с выводом текста ошибки.

use \Bitrix\Main\Localization\Loc;
Loc::LoadMessages(__FILE__);
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));

class MyClass{
   function OnBeforeIBlockElementUpdateHandler(&$arFields){
      if($arFields['IBLOCK_ID'] = PRODUCT_IBLOCK && $arFields['ACTIVE'] !== 'Y'){
         $r = CIBlockElement::GetByID($arFields['ID']);
         if($res = $r -> Fetch()){
            $show_counter = $res['SHOW_COUNTER'];
         }
         if($show_counter > 2){
            global $APPLICATION;
            $APPLICATION->throwException(Loc::getMessage('SHOW_COUNTER_ERROR_1').$show_counter.Loc::getMessage('SHOW_COUNTER_ERROR_2'));
            return false;
         }
      }
   }
}
   

Вот и всё! Спасибо за внимание!
P.S. В описании мог что нибудь забыть,поэтому смотрите видео

Авторизация

×

Отправляя форму, я соглашаюсь на обработку персональных данных

Отправить