Приложение Д. Исходные коды файла 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;
}
?>
|