|  Приложение Д. Исходные коды файла init.php
 
 CPageOption::SetOptionString("main", "nav_page_in_session", "N");
 
 /**
 
 * bool write_access_log(string filepath) - функция фиксирует запрошенный адрес в специальном файле
 
 * @param string filepath - файл, в который нужно записать данные
 
 * @return true в случае успешного завершения работы функции, false в противном случае
 
 */
 
 function write_access_log($filepath)
 
 {
 
 if(SITE_SERVER_NAME == ""){
 
 return false;
 
 }
 
 global $APPLICATION;
 
 //получаем URL текущей запрошенной страницы, дополняя ее в начале именем сервера
 
 $current_uri = "http://".SITE_SERVER_NAME.ToLower(
 
 $APPLICATION->GetCurPageParam("", array(), true));
 
 //$filepath = $_SERVER["DOCUMENT_ROOT"]."/".$filepath;
 
 //флаг, указывающий, нужно ли записать URL в файл
 
 $can_write = true;
 
 //если файл существует
 
 if(@file_exists($filepath)){
 
 $fp_read = @fopen($filepath, "r");
 
 if(!$fp_read){
 
 fclose($fp_read);
 
 return false;
 
 }
 
 //читаем его содержимое по строкам
 
 while(!feof($fp_read)){
 
 $exist_link = trim(fgets($fp_read));
 
 //если URL уже есть в файле, отменяем запись
 
 if(strcasecmp($exist_link, $current_uri) == 0){
 
 $can_write = false;
 
 break;
 
 }
 
 }
 
 fclose($fp_read);
 
 }
 
 //пишем URL в файл
 
 if($can_write){
 
 if(@file_exists($filepath)){
 
 //добавляем
 
 $fp_append = @fopen($filepath, "a");
 
 if(filesize($filepath) > 0){
 
 $str = PHP_EOL.$current_uri;
 
 }
 
 else{
 
 $str = $current_uri;
 
 }
 
 }
 
 else{
 
 //или создаем новый файл
 
 $fp_append = @fopen($filepath, "w");
 
 $str = $current_uri;
 
 }
 
 fwrite($fp_append, $str);
 
 fclose($fp_append);
 
 }
 
 return true;
 
 }
 
 write_access_log($_SERVER["DOCUMENT_ROOT"]."/access_log.log");
 
 /**
 
 * Далее определяются константы типов и идентификаторов информационных блоков, используемых в проекте
 
 */
 /**
 
 * тип информационных блоков "Игры"
 
 */
 
 define("IB_TYPE_GAMES", "ib_games");
 
 /**
 
 * тип информационных блоков "Обзоры"
 
 */
 
 define("IB_TYPE_REVIEWS", "ib_reviews");
 
 /**
 
 * Информационный блок "Игры" => "Игры"
 
 */
 
 define("IB_GAMES_PC", 1);
 
 /**
 
 * Информационный блок "Обзоры" => "Обзоры"
 
 */
 
 define("IB_REVIEWS_PC", 2);
 /**
 
 * Далее определяются символьные коды свойств, используемых в обработчике добавление ИБ "Обзоры" и ИБ "Игры"
 
 */
 
 /**
 
 * Свойство "Оценка" ИБ "Обзоры"
 
 */
 
 define("REVIEWS_PC_PROP_GAME", "GAME_ID");
 
 /**
 
 * Свойство "Метаоценка" ИБ "Игры"
 
 */
 
 define("GAMES_PC_PROP_METAMARK", "MAIN_METAMARK");
 
 /**
 
 * Свойство "Оценка" ИБ "Обзоры"
 
 */
 
 define("REVIEWS_PC_PROP_MARK", "MARK");
 /**
 
 * Указываем имя файла, в которое будет писать логи функция AddMessage2Log
 
 */
 
 define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/init.log");
 
 /**
 
 * Текст при возникновении ошибки в работе базы данных
 
 */
 
 define("DB_ERROR_TEXT", "Ошибка работы с данными");
 
 /**
 
 */
 
 define("CACHE_TIME", 3600);
 
 /**
 
 * Указываем пороговые минимальные значения для секторов метаоценок
 
 */
 
 define("MIN_METAMARK_GREEN", 75);
 
 define("MIN_METAMARK_YELLOW", 50);
 
 /**
 
 * Имя переменной, включающих ряд компонентов в режиме аякс-запроса
 
 */
 
 define("AJAX_REQUEST_MODE_PARAM", "ajax_request_mode");
 
 //список месяцев на русском языке
 
 $arMonthNames = array(
 
 1 => array("month" => "Январь", "month_a" => "января"),
 
 2 => array("month" => "Февраль", "month_a" => "февраля"),
 
 3 => array("month" => "Март", "month_a" => "марта"),
 
 4 => array("month" => "Апрель", "month_a" => "апреля"),
 
 5 => array("month" => "Май", "month_a" => "мая"),
 
 6 => array("month" => "Июнь", "month_a" => "июня"),
 
 7 => array("month" => "Июль", "month_a" => "июля"),
 
 8 => array("month" => "Август", "month_a" => "августа"),
 
 9 => array("month" => "Сентябрь", "month_a" => "сентября"),
 
 10 => array("month" => "Октябрь", "month_a" => "октября"),
 
 11 => array("month" => "Ноябрь", "month_a" => "ноября"),
 
 12 => array("month" => "Декабрь", "month_a" => "декабря")
 
 );
 //подключение модуля "Информационные блоки"
 
 CModule::IncludeModule("iblock");
 //обработчики
 
 AddEventHandler("iblock", "OnAfterIblockElementAdd", "add_review_handler");
 
 AddEventHandler("iblock", "OnAfterIblockElementUpdate", "add_review_handler");
 
 AddEventHandler("iblock", "OnBeforeIblockElementDelete", "delete_review_handler");
 
 AddEventHandler("iblock", "onBeforeIblockElementAdd", "check_element_code");
 
 AddEventHandler("iblock", "onBeforeIblockElementUpdate", "check_element_code");
 
 /**
 
 * bool delete_review_handler(int ID) - Обработчик события удаления элемента информационного блока "Обзоры" => "PC"
 
 * @author dda
 
 * @param int ID Идентификатор удаляемого элемента информационного блока
 
 * @return true в случае успеха, false в противном случае
 
 */
 
 function delete_review_handler($ID)
 
 {
 
 AddMessage2Log("Вызван обработчик delete_review_handler события OnAfterIblockElementDelete\n");
 
 $db_current_element = CIBlockElement::GetByID($ID);
 
 $ob_current_element = $db_current_element->GetNextElement();
 
 //получаем поля элемента
 
 $arFields = $ob_current_element->GetFields();
 
 //и свойства
 
 $arProperties = $ob_current_element->GetProperties();
 
 //проверяем принадлежность добавляемого элемента к инфоблоку "Обзоры"
 
 //и выходим, если это не так
 
 if($arFields["IBLOCK_ID"] != IB_REVIEWS_PC){
 
 AddMessage2Log("Обработчик завершил работу. Причина - элемент не того ИБ\n");
 
 //return $arFields;
 
 return true;
 
 }
 
 //запрос на получение свойств
 
 if(!array_key_exists(REVIEWS_PC_PROP_GAME, $arProperties)){
 
 return false;
 
 }
 
 $game_id = intval($arProperties[REVIEWS_PC_PROP_GAME]["VALUE"]);
 
 //проверяем, есть ли элемент с таким ID=$game_id и, если нет, выходим
 
 $db_game_check = CIBlockElement::GetByID($game_id);
 
 if($db_game_check->SelectedRowsCount() <= 0){
 
 AddMessage2Log("Обработчик завершил работу. Нет элемента с ID=".$game_id);
 
 return false;
 
 }
 
 //получаем значения для других уже существующих обзоров с таким ID=$game_id
 
 $review_filter = array(
 
 "PROPERTY_".REVIEWS_PC_PROP_GAME => $game_id
 
 );
 
 $review_select = array(
 
 "PROPERTY_".REVIEWS_PC_PROP_MARK,
 
 );
 
 $db_reviews_exists = CIBlockElement::GetList(array(), $review_filter, false, false, $review_select);
 
 //считаем сумму оценок и среднее арифметическое
 
 $summ_mark_for_game = 0 - $arProperties[REVIEWS_PC_PROP_MARK]["VALUE"];
 
 while($ar_reviews_exists =$db_reviews_exists->GetNext()){
 
 $summ_mark_for_game += $ar_reviews_exists["PROPERTY_".REVIEWS_PC_PROP_MARK."_VALUE"];
 
 }
 
 //записываем это значение в свойство с кодом GAMES_PC_PROP_METAMARK для элемента с ID=$game_id
 
 $average = round($summ_mark_for_game/($db_reviews_exists->SelectedRowsCount() - 1));
 
 CIBlockElement::SetPropertyValueCode($game_id, GAMES_PC_PROP_METAMARK, $average); #------- ЗАПРОС 4,5
 
 AddMessage2Log("Обработчик завершил работу. Элементу с ID=".$game_id." в свойство ".GAMES_PC_PROP_METAMARK." записано значение ".$average."\n");
 
 return true;
 
 }
 
 /** bool check_element_code(array &arFields)
 
 * функция - обработчик добавления или изменения документа. Проверяет на валидность символьный код элемента
 
 * @param array arFields - массив с полями элемента. Передается по ссылке
 
 * @return Возвращает true, если символьный код валиден и false, если нет
 
 */
 
 function check_element_code(&$arFields)
 
 {
 
 global $APPLICATION;
 
 if(!eregi("^[a-zA-Z0-9_]+$", $arFields["CODE"])){
 
 $APPLICATION->throwException("Символьный код может содержать только латинские буквы, цифры и знак \"_\"");
 
 return false;
 
 }
 
 return true;
 
 }
 
 /**
 
 * void add_review_handler(array &arFields) - Обработчик события добавления или изменения элемента информационного блока "Обзоры" => "PC"
 
 * @author dda
 
 * @param array arFields Массив данных добавленного(измененного элемента). Данный массив передается в функцию по ссылке и может быть изменен внутри неё
 
 * @return Возвращаемых значений нет
 
 */
 
 function add_review_handler(&$arFields)
 
 {
 
 AddMessage2Log("Вызван обработчик add_review_handler события OnAfterIblockElementAdd(Update)\n");
 
 //проверяем принадлежность добавляемого элемента к инфоблоку "Обзоры"
 
 //и выходим, если это не так
 
 if($arFields["IBLOCK_ID"] != IB_REVIEWS_PC){
 
 return;
 
 }
 
 //проверяем, что элемент добавлен и не возникло ошибок
 
 if($arFields["ID"] > 0 && empty($arFields["RESULT_MESSAGE"])){
 
 //запрос на получение свойств
 
 $db_prop = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields["ID"], array(), array("CODE" => REVIEWS_PC_PROP_GAME));
 
 if($db_prop->SelectedRowsCount() <= 0){
 
 AddMessage2Log("Обработчик завершил работу. нет свойства с кодом ".REVIEWS_PC_PROP_GAME."\n");
 
 return;
 
 }
 
 $fetch = $db_prop->GetNext();
 
 $game_id = intval($fetch["VALUE"]);
 
 //проверяем, есть ли элемент с таким ID=$game_id и, если нет, выходим
 
 $db_game_check = CIBlockElement::GetByID($game_id);
 
 if($db_game_check->SelectedRowsCount() <= 0){
 
 AddMessage2Log("Обработчик завершил работу. Нет элемента с ID=".$game_id);
 
 return;
 
 }
 
 //получаем значения для других уже существующих обзоров с таким ID=$game_id
 
 $review_filter = array(
 
 "PROPERTY_".REVIEWS_PC_PROP_GAME => $game_id
 
 );
 
 $review_select = array(
 
 "PROPERTY_".REVIEWS_PC_PROP_MARK,
 
 );
 
 $db_reviews_exists = CIBlockElement::GetList(array(), $review_filter, false, false, $review_select);
 
 //считаем сумму оценок и среднее арифметическое
 
 $summ_mark_for_game = 0;
 
 while($ar_reviews_exists =$db_reviews_exists->GetNext()){
 
 $summ_mark_for_game += $ar_reviews_exists["PROPERTY_".REVIEWS_PC_PROP_MARK."_VALUE"];
 
 }
 
 //записываем это значение в свойство с кодом GAMES_PC_PROP_METAMARK для элемента с ID=$game_id
 
 $average = round($summ_mark_for_game/$db_reviews_exists->SelectedRowsCount());
 
 CIBlockElement::SetPropertyValueCode($game_id, GAMES_PC_PROP_METAMARK, $average);
 
 AddMessage2Log("Обработчик завершил работу. Элементу с ID=".$game_id." в свойство ".GAMES_PC_PROP_METAMARK." записано значение ".$average."\n");
 
 }
 
 }
 
 /**
 
 * array get_iblock_type_list(array ar_sort) - функция получения списка информационных блоков
 
 * @author dda
 
 * @param array ar_sort - массив вида ("поле_сортировки" => "направление_сортировки"), указывающий, как сортировать список типов информационных блоков
 
 * @return array ar_iblock_type - возвращает список типов информационных блоков
 
 */
 
 function get_iblock_type_list($ar_sort)
 
 {
 
 $db_iblock_type = CIBlockType::GetList(array("NAME" => "ASC"));
 
 $ar_iblock_type = array();
 
 while($fetch = $db_iblock_type->GetNext()){
 
 if($fetch_lang = CIBlockType::GetByIDLang($fetch["ID"], LANG)){
 
 $ar_iblock_type[$fetch_lang["ID"]] = "[".$fetch_lang["ID"]."] ".$fetch_lang["NAME"];
 
 }
 
 }
 
 return $ar_iblock_type;
 
 }
 
 /**
 
 * array get_iblock_list(string type_id, array ar_sort, bool bActive = true) - функция получения информационных блоков по типу type_id
 
 * @author dda
 
 * @param string type_id - тип информационного блока (идентификатор)
 
 * @param array ar_sort - массив вида ("поле_сортировки" => "направление_сортировки"), указывающий, как сортировать список информационных блоков
 
 * @param bool bActive - флаг, указывющий, выбирать ли только активные инфоблоки. Необязательный, по умолчанию true, т.е. выбирать только активные
 
 * @return array ar_iblock - возвращает список информационных блоков
 
 */
 
 function get_iblock_list($type_id, $ar_sort, $bActive = true, $field = "ID")
 
 {
 
 $arFilter = array(
 
 "TYPE" => $type_id,
 
 );
 
 if($bActive){
 
 $arFilter["ACTIVE"] = "Y";
 
 }
 
 $db_iblock = CIBlock::GetList($ar_sort, $arFilter);
 
 $ar_iblock = array();
 
 while($fetch = $db_iblock->GetNext()){
 
 $ar_iblock[$fetch[$field]] = "[".$fetch[$field]."] ".$fetch["NAME"];
 
 }
 
 return $ar_iblock;
 
 }
 
 /**
 
 * void prepare_params(&arParams)
 
 * фунцкия обрабатывает массив $arParams, приходящий в файл component.php компонента (удаление лишних пробелов, экранирование и т.д.)
 
 * @author dda
 
 * @param arParams - массив параметров, передается по ссылке
 
 * @return функция ничего не возвращает
 
 */
 
 function prepare_params(&$arParams)
 
 {
 
 foreach($arParams as $key => $param){
 
 if(!is_array($param)){
 
 $arParams[$key] = trim($param);
 
 }
 
 else{
 
 foreach($param as $p_key => $p_param){
 
 $param[$p_key] = trim($p_param);
 
 }
 
 $arParams[$key] = $param;
 
 }
 
 }
 
 }
 
 /**
 
 * bool is_ajax_request()
 
 * в функции проверяется, запущена ли страница в режиме ajax-запроса
 
 * @return true в случае, если страница запущена в режиме ajax-запроса и false в противном случае
 
 */
 
 function is_ajax_request()
 
 {
 
 return (isset($_REQUEST[AJAX_REQUEST_MODE_PARAM]) && $_REQUEST[AJAX_REQUEST_MODE_PARAM] == "Y");
 
 }
 
 /**
 
 * string get_ajax_param()
 
 * функция возвращает имя переменной, отвечающей за запуск страницы в режиме ajax-запроса
 
 */
 
 function get_ajax_param()
 
 {
 
 return defined(AJAX_REQUEST_MODE_PARAM) ? AJAX_REQUEST_MODE_PARAM : "ajax_request_mode";
 
 }
 
 /** array get_parts_reg(string value[,string pattern]) - функция обрабатывает строку <название> [значение] и возвращает части в
 
 * виде массива регулярного выражения или false в случае ошибки
 
 * @param string value - строка, подлежащая разбору
 
 * @param string pattern - регуляное выражение. Необязательное, по умолчанию - "/\[\b(\d+)(.)\]/i"
 
 */
 
 function get_parts_reg($value, $pattern = "/\[\b(\d+)(.)\]/i")
 
 {
 
 //ищем последнее вхождение открывающей значение скобки
 
 $skob_pos = mb_strpos($value, "[", 0, LANG_CHARSET);
 
 //если скобка не найдена, выходим
 
 if($skob_pos === false){
 
 return false;
 
 }
 
 //вырезаем 2 части - текст и значение
 
 $text = trim(mb_substr($value, 0, $skob_pos, LANG_CHARSET));
 
 $val = trim(mb_substr($value, $skob_pos, (mb_strlen($value, LANG_CHARSET) - mb_strlen($text, LANG_CHARSET)), LANG_CHARSET));
 
 //обрабатываем значение - проверяем наличие правильного шаблона
 
 if(!preg_match($pattern, $val, $matches)){
 
 return false;
 
 }
 
 return array("matches" => $matches, "text" => $text);
 
 }
 
 /** int get_max_day(int month, int year) - функция возвращает максимальный день в зависимости от года и месяца
 
 * @param int current_month - месяц
 
 * @param int current_year - год
 
 * @return возвращает число месяца
 
 */
 
 function get_max_day($current_month, $current_year)
 
 {
 
 if($current_month == 2){
 
 if($_REQUEST["year"] % 4 == 0){
 
 $top_day = 29;
 
 }
 
 else{
 
 $top_day = 28;
 
 }
 
 }
 
 elseif($current_month < 8){
 
 if($current_month % 2 == 0){
 
 $top_day = 30;
 
 }
 
 else{
 
 $top_day = 31;
 
 }
 
 }
 
 elseif($current_month >= 8){
 
 if($current_month % 2 != 0){
 
 $top_day = 30;
 
 }
 
 else{
 
 $top_day = 31;
 
 }
 
 }
 
 return $top_day;
 
 }
 
 ?>
 
 
 
 |