Приложение В. Исходные коды программных компонентов В.1. Компонент games.calendar Файл component.php
//компонент
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
try
{
//массив с именами месяцев
global $arMonthNames;
//обрабатываем массив $arParams
prepare_params($arParams);
//проверяем параметры
if(strlen($arParams["IBLOCK_TYPE"]) <= 0){
$arParams["IBLOCK_TYPE"] = IB_TYPE_GAMES;
}
$arParams["COUNT"] = intval($arParams["COUNT"]);
if($arParams["COUNT"] <= 0){
$arParams["COUNT"] = 10;
}
if(strlen($arParams["SORT_BY1"]) <= 0){
$arParams["SORT_BY1"] = "PROPERTY_MAIN_METAMARK";
}
if($arParams["SORT_ORDER1"] != "DESC"){
$arParams["SORT_ORDER1"] = "ASC";
}
if(strlen($arParams["SORT_BY2"]) <= 0){
$arParams["SORT_BY2"] = "NAME";
}
if($arParams["SORT_ORDER2"] != "DESC"){
$arParams["SORT_ORDER2"] = "ASC";
}
$arParams["MIN_METAMARK_YELLOW"] = intval($arParams["MIN_METAMARK_YELLOW"]);
$arParams["MIN_METAMARK_GREEN"] = intval($arParams["MIN_METAMARK_GREEN"]);
if($arParams["MIN_METAMARK_YELLOW"] <= 0){
$arParams["MIN_METAMARK_YELLOW"] = 50;
}
if($arParams["MIN_METAMARK_GREEN"] <= 0){
$arParams["MIN_METAMARK_GREEN"] = 75;
}
//параметры сортировки
$arSortOrder = array(
$arParams["SORT_BY1"] => $arParams["SORT_ORDER1"],
$arParams["SORT_BY2"] => $arParams["SORT_ORDER2"],
"ID" => "DESC"
);
//параметры фильтрации
$arFilter = array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"ACTIVE" => "Y",
"SECTION_ACTIVE" => "Y"
);
//если в настройках указана фильтрация по секции (платформе), задаем параметры фильтра
if(!empty($arParams["IBLOCK_SECTION_CODE"])){
$arFilter["SECTION_CODE"] = $arParams["IBLOCK_SECTION_CODE"];
}
$current_year = intval(date("Y"));
$current_month = intval(date("m"));
$current_day = intval(date("d"));
$top_day = get_max_day($current_month, $current_year);
//если указан фильтр, включаем его в запрос
if(isset($arParams["FILTER"]) && is_array($arParams["FILTER"]) && count($arParams["FILTER"]) > 0){
$arFilter = array_merge($arFilter, $arParams["FILTER"]);
if(isset($arFilter[">=PROPERTY_DATES_DATE_REL_RUS"])){
$selected_month = intval(date("m", strtotime($arFilter[">=PROPERTY_DATES_DATE_REL_RUS"])));
$selected_year = intval(date("Y", strtotime($arFilter[">=PROPERTY_DATES_DATE_REL_RUS"])));
if($arParams["DATE_BORDER"] == "bottom"){
if($selected_year < $current_year){
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
elseif($selected_year == $current_year){
if($selected_month <= $current_month){
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
}
}
}
else{
$selected_month = date("m");
if($arParams["DATE_BORDER"] == "bottom" && $selected_month == $current_month){
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
}
if(isset($arFilter["<=PROPERTY_DATES_DATE_REL_RUS"])){
$selected_month = intval(date("m", strtotime($arFilter["<=PROPERTY_DATES_DATE_REL_RUS"])));
$selected_year = intval(date("Y", strtotime($arFilter["<=PROPERTY_DATES_DATE_REL_RUS"])));
if($arParams["DATE_BORDER"] == "top"){
if($selected_year > $current_year){
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
elseif($selected_year == $current_year){
if($selected_month >= $current_month){
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
}
}
}
else{
$selected_month = date("m");
if($arParams["DATE_BORDER"] == "top" && $selected_month == $current_month){
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
}
}
else{
//не выводим с датой меньше или больше текущей
if($arParams["DATE_BORDER"] == "top"){
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
elseif($arParams["DATE_BORDER"] == "bottom"){
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
//иначе указываем фильтрацию по текущему месяцу
if($arParams["CURRENT_MONTH_DEFAULT"] == "Y"){
if($arParams["DATE_BORDER"] != "bottom"){
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d", strtotime("01.".$current_month.".".$current_year));
}
else{
$arFilter[">=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
if($arParams["DATE_BORDER"] != "top"){
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d", strtotime($top_day.".".$current_month.".".$current_year));
}
else{
$arFilter["<=PROPERTY_DATES_DATE_REL_RUS"] = date("Y-m-d");
}
}
}
//кеширование зависит от настроек фильтра, отобразим это в ID кеша
//вносим в кеш данные постраничной навигации
$cache_id_arr = array(CDBResult::NavStringForCache($arParams["COUNT"]));
//и параметры фильтра
foreach($arFilter as $filt){
$cache_id_arr[] = trim(str_replace(array(";", ":", " ","-"), "", $filt));
}
$cache_id = implode("", $cache_id_arr);
//с данного момента включаем кеширование
if($this->StartResultCache(false, $cache_id)){
//формируем костяк массива, принимаемого в шаблоне
$arResult = array(
"ITEMS" => array(), //массив самих игр
"NO_ITEMS" => false, //флаг наличия элементов в результирующем сете
"PAGENAV" => "", //строка постраничной навигации
"IS_ERROR" => false //флаг наличия какой-либо ошибки
);
//проверяем, подключен ли модуль
if(!CModule::IncludeModule("iblock")){
$arResult["IS_ERROR"] = true;
throw new Exception(GetMessage("C_MODULE_ERROR"));
}
$arSelect = array(
"NAME", "ID", "DETAIL_PAGE_URL", "PREVIEW_PICTURE",
"PROPERTY_DATES_DATE_REL_RUS", "PROPERTY_MAIN_METAMARK",
"PROPERTY_GENRE_GENRE", "IBLOCK_SECTION_ID", "PROPERTY_DATES_DATE_REL"
);
$db_element = CIBlockElement::GetList($arSortOrder, $arFilter, false, array("nPageSize" => $arParams["COUNT"]), $arSelect);
//ошибка запроса к базе данных
if(!$db_element){
$arResult["IS_ERROR"] = true;
throw new Exception(DB_ERROR_TEXT);
}
//если элементов в запросе не найдено
if($db_element->SelectedRowsCount() <= 0){
$arResult["IS_ERROR"] = true;
$arResult["NO_ITEMS"] = true;
throw new Exception(GetMessage("C_NO_ITEMS"));
}
//разбиваем сет запроса на страницы
$db_element->NavStart($arParams["COUNT"]);
//получаем постраничную навигацию
$arResult["PAGENAV"] = $db_element->GetNavPrint("", false, "", "/bitrix/templates/.default/pagenav_template.php");
//если в настройках компонента задан шаблон пути к элементу на детальн. страницу, обрабатываем шаблон пути
if(!empty($arParams["DETAIL_URL"])){
$db_element->SetUrlTemplates($arParams["DETAIL_URL"]);
}
//массив ID секций (платформ)
$section_ids = array();
//связь между секцией и элементами (для быстрого вывода в шаблоне)
$section_id_elem = array();
//получаем элементы по одному
while($fetch_element = $db_element->GetNext()){
//получаем поля элемента (основные)
$fields["NAME"] = htmlspecialchars($fetch_element["NAME"]);
$fields["DETAIL_PAGE_URL"] = $fetch_element["DETAIL_PAGE_URL"];
$fields["PREVIEW_PICTURE"] = intval($fetch_element["PREVIEW_PICTURE"]);
$fields["IBLOCK_SECTION_ID"] = intval($fetch_element["IBLOCK_SECTION_ID"]);
$fields["ID"] = intval($fetch_element["ID"]);
//если задана превью-обложка, получаем массив ее изображения
if($fields["PREVIEW_PICTURE"] > 0){
$fields["PREVIEW_PICTURE"] = CFile::GetFileArray($fields["PREVIEW_PICTURE"]);
}
else{
$fields["PREVIEW_PICTURE"] = false;
}
//получаем свойства элемента
$props["DATES_DATE_REL_RUS"]["VALUE"] = trim(htmlspecialchars($fetch_element["PROPERTY_DATES_DATE_REL_RUS_VALUE"]));
$props["DATES_DATE_REL"]["VALUE"] = trim(htmlspecialchars($fetch_element["PROPERTY_DATES_DATE_REL_VALUE"]));
//если не указана дата выхода в России, используем дату выхода в общем
$props["MAIN_METAMARK"]["VALUE"] = floatval($fetch_element["PROPERTY_MAIN_METAMARK_VALUE"]);
$props["GENRE_GENRE"]["VALUE"] = $fetch_element["PROPERTY_GENRE_GENRE_VALUE"];
if(empty($props["DATES_DATE_REL_RUS"]["VALUE"])){
$props["DATES_DATE_REL_RUS"]["VALUE"] = $props["DATES_DATE_REL"]["VALUE"];
}
//формируем вывод даты в соотвествии с требованиями
if(!empty($props["DATES_DATE_REL_RUS"]["VALUE"])){
$day = intval(date("d", strtotime($props["DATES_DATE_REL_RUS"]["VALUE"])));
$month_name = mb_substr($arMonthNames[intval(date("m", strtotime($props["DATES_DATE_REL_RUS"]["VALUE"])))]["month_a"], 0, 3, LANG_CHARSET);
$month_name_full = $arMonthNames[intval(date("m", strtotime($props["DATES_DATE_REL_RUS"]["VALUE"])))]["month_a"];
$year = date("Y", strtotime($props["DATES_DATE_REL_RUS"]["VALUE"]));
$props["DATES_DATE_REL_RUS"]["VALUE"] = $day." ".$month_name." ".$year;
$props["DATES_DATE_REL_RUS"]["VALUE_FULL"] = $day." ".$month_name_full." ".$year;
}
/*** В зависимости от значения метаоценки определяем стиль, который будет применен к метаоценке при выводе ***/
if($props["MAIN_METAMARK"]["VALUE"] >= $arParams["MIN_METAMARK_GREEN"]){
$props["STYLE_RAITING"] = "green";
}
elseif($props["MAIN_METAMARK"]["VALUE"] >= $arParams["MIN_METAMARK_YELLOW"] && $props["MAIN_METAMARK"]["VALUE"] < $arParams["MIN_METAMARK_GREEN"]){
$props["STYLE_RAITING"] = "yellow";
}
elseif($props["MAIN_METAMARK"]["VALUE"] > 0){
$props["STYLE_RAITING"] = "red";
}
else{
$props["STYLE_RAITING"] = "no_mark";
}
/*** Конец определения стиля для метаоценки ***/
//забисываем в выходящий массив данные игры
$arResult["ITEMS"][$fields["ID"]] = array(
"FIELDS" => $fields,
"PROPS" => $props
);
//записываем ID всех секций элементов, находящихся в сете
if(!in_array($fields["IBLOCK_SECTION_ID"], $section_ids)){
$section_ids[] = $fields["IBLOCK_SECTION_ID"];
}
//и формируем связь между секцией и элементом
$section_id_elem[$fields["IBLOCK_SECTION_ID"]][] = $fields["ID"];
}
//готовим запрос к секциям инфоблока для получения нужных секций
$arSectionFilter = array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"ID" => $section_ids,
"ACTIVE" => "Y"
);
//проводим запрос к списку секций (платформ)
$db_section = CIBlockSection::GetList(array(), $arSectionFilter, false, array("NAME", "CODE", "PICTURE", "UF_*"));
//и получаем необходимые данные секции, занося их в данные по элементу (для вывода)
while($ar_section = $db_section->GetNext()){
foreach($section_id_elem[$ar_section["ID"]] as $elem_to_id){
//имя секции (платформы)
$arResult["ITEMS"][$elem_to_id]["FIELDS"]["SECTION_NAME"] = $ar_section["NAME"];
//код секции (платформы)
$arResult["ITEMS"][$elem_to_id]["FIELDS"]["SECTION_CODE"] = $ar_section["CODE"];
//цвет текста для вывода платформы
$arResult["ITEMS"][$elem_to_id]["FIELDS"]["SECTION_TEXT_COLOR"] = $ar_section["UF_TEXT_COLOR"];
//если задана картинка для секции (маленькая), получаем массив ее изображения
if(intval($ar_section["PICTURE"]) > 0){
$arResult["ITEMS"][$elem_to_id]["FIELDS"]["SECTION_PICTURE"] = CFile::GetFileArray(intval($ar_section["PICTURE"]));
}
}
}
//подключаем шаблон
$this->IncludeComponentTemplate();
}
}
catch(Exception $e)
{
//произошла ошибка, сбрасываем кеш
//чистим кеш
if(!$arResult["NO_ITEMS"]){
$this->ClearResultCache($cache_id);
}
$this->AbortResultCache();
//пишем ошибку в компонент arResult
$arResult["ERROR"] = $e->getMessage();
//подключаем шаблон
$this->IncludeComponentTemplate();
}?>
|