PageRenderTime 23ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/components/bitrix/news.calendar/component.php

https://gitlab.com/alexprowars/bitrix
PHP | 391 lines | 333 code | 47 blank | 11 comment | 73 complexity | 03320b29cc5e30c1a41ced18ca084464 MD5 | raw file
  1. <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
  2. /** @var CBitrixComponent $this */
  3. /** @var array $arParams */
  4. /** @var array $arResult */
  5. /** @var string $componentPath */
  6. /** @var string $componentName */
  7. /** @var string $componentTemplate */
  8. /** @global CDatabase $DB */
  9. /** @global CUser $USER */
  10. /** @global CMain $APPLICATION */
  11. if(!isset($arParams["CACHE_TIME"]))
  12. $arParams["CACHE_TIME"] = 36000000;
  13. unset($arParams["IBLOCK_TYPE"]);
  14. $arParams["IBLOCK_ID"] = intval($arParams["IBLOCK_ID"]);
  15. $arParams["TYPE"] = $arParams["TYPE"]=="NEWS";
  16. $arParams["SHOW_YEAR"] = $arParams["SHOW_YEAR"]=="Y";
  17. $arParams["SHOW_TIME"] = $arParams["SHOW_TIME"]=="Y";
  18. $arParams["MONTH_VAR_NAME"] = trim($arParams["MONTH_VAR_NAME"]);
  19. if($arParams["MONTH_VAR_NAME"] == '' || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["MONTH_VAR_NAME"]))
  20. $arParams["MONTH_VAR_NAME"] = "month";
  21. $arParams["YEAR_VAR_NAME"] = trim($arParams["YEAR_VAR_NAME"]);
  22. if($arParams["YEAR_VAR_NAME"] == '' || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["YEAR_VAR_NAME"]))
  23. $arParams["YEAR_VAR_NAME"] = "year";
  24. $arParams["TITLE_LEN"] = intval($arParams["TITLE_LEN"]);
  25. if($arParams["TITLE_LEN"]<0)
  26. $arParams["TITLE_LEN"]=0;
  27. $arParams["NEWS_COUNT"] = intval($arParams["NEWS_COUNT"]);
  28. $arParams["SET_TITLE"] = $arParams["SET_TITLE"]=="Y";
  29. $arParams["SHOW_CURRENT_DATE"] = $arParams["SHOW_CURRENT_DATE"]=="Y";
  30. $arParams["SHOW_MONTH_LIST"] = $arParams["SHOW_MONTH_LIST"]=="Y";
  31. $arParams["WEEK_START"] = intval($arParams["WEEK_START"]);
  32. if($arParams["WEEK_START"] < 0)
  33. $arParams["WEEK_START"] = 0;
  34. elseif($arParams["WEEK_START"] > 6)
  35. $arParams["WEEK_START"] = 6;
  36. if($arParams["TYPE"] || !in_array($arParams["DATE_FIELD"], array("DATE_ACTIVE_FROM", "DATE_ACTIVE_TO", "TIMESTAMP_X", "DATE_CREATE")))
  37. $arParams["DATE_FIELD"] = "DATE_ACTIVE_FROM";
  38. $arParams["DETAIL_URL"]=trim($arParams["DETAIL_URL"]);
  39. $today = time();
  40. $currentMonth = intval($_REQUEST[$arParams["MONTH_VAR_NAME"]]);
  41. if($currentMonth<1 || $currentMonth>12)
  42. $currentMonth = intval(date("n", $today));
  43. $currentYear = intval($_REQUEST[$arParams["YEAR_VAR_NAME"]]);
  44. if($currentYear<1)
  45. $currentYear = intval(date("Y", $today));
  46. $todayYear = intval(date("Y", $today));
  47. $todayMonth = intval(date("n", $today));
  48. $todayDay = intval(date("j", $today));
  49. if($arParams["TYPE"])
  50. { //Do not show future news
  51. if($currentYear > $todayYear)
  52. return;
  53. if(($currentYear == $todayYear) && ($currentMonth > $todayMonth))
  54. return;
  55. }
  56. if($this->StartResultCache(false, array($currentMonth, $currentYear, $todayYear, $todayMonth, $todayDay)))
  57. {
  58. if(!CModule::IncludeModule("iblock"))
  59. {
  60. $this->AbortResultCache();
  61. ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
  62. return;
  63. }
  64. $arParams["MONTH_URL"]=trim($arParams["MONTH_URL"]);
  65. if($arParams["MONTH_URL"] == '')
  66. $arParams["MONTH_URL"] = $APPLICATION->GetCurPageParam($arParams["MONTH_VAR_NAME"]."=#MONTH#&".$arParams["YEAR_VAR_NAME"]."=#YEAR#", array($arParams["MONTH_VAR_NAME"], $arParams["YEAR_VAR_NAME"]));
  67. $arResult["TITLE"] = GetMessage("IBL_NEWS_CAL_M_".date("n", mktime(0, 0, 0, $currentMonth, 1, $currentYear)))." ".$currentYear;
  68. $arResult["currentMonth"] = $currentMonth;
  69. $arResult["currentYear"] = $currentYear;
  70. $arResult["WEEK_DAYS"] = Array(
  71. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_0"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_0")),
  72. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_1"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_1")),
  73. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_2"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_2")),
  74. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_3"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_3")),
  75. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_4"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_4")),
  76. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_5"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_5")),
  77. array("FULL"=>GetMessage("IBL_NEWS_CAL_D_6"),"SHORT"=>GetMessage("IBL_NEWS_CAL_S_6")),
  78. );
  79. $i = $arParams["WEEK_START"];
  80. while($i > 0)
  81. {
  82. $arResult["WEEK_DAYS"][] = array_shift($arResult["WEEK_DAYS"]);
  83. $i--;
  84. }
  85. $arFilter = Array(
  86. "ACTIVE" => "Y",
  87. ">=".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$currentMonth,1,$currentYear)),
  88. "<".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$currentMonth+1,1,$currentYear)),
  89. "IBLOCK_ID" => $arParams["IBLOCK_ID"]
  90. );
  91. $arSelectedFields = Array("ACTIVE", $arParams["DATE_FIELD"], "ID", "IBLOCK_ID", "SITE_ID", "DETAIL_PAGE_URL", "NAME", "LANG_DIR", "SORT", "IBLOCK_TYPE", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE");
  92. $dbItems = CIBlockElement::GetList(array($arParams["DATE_FIELD"]=>"ASC", "ID"=>"ASC"), $arFilter, false, false, $arSelectedFields);
  93. $dbItems->SetUrlTemplates($arParams["DETAIL_URL"]);
  94. while($arItem = $dbItems->GetNext())
  95. {
  96. $arDays[ConvertDateTime($arItem[$arParams["DATE_FIELD"]], CLang::GetDateFormat("SHORT"))][] = $arItem;
  97. }
  98. $bPrevM = false;
  99. $bPrevY = false;
  100. if($arParams["SHOW_YEAR"])
  101. {
  102. $arFilter = Array(
  103. "ACTIVE" => "Y",
  104. "<".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,1,1,$currentYear)),
  105. "IBLOCK_ID" => $arParams["IBLOCK_ID"],
  106. );
  107. $dbItems = CIBlockElement::GetList(array(), $arFilter, false, array("nTopCount"=>1), Array("ID", "IBLOCK_ID"));
  108. if($arItem = $dbItems->GetNext())
  109. {
  110. $bPrevM = true;
  111. $bPrevY = true;
  112. }
  113. }
  114. if(!$bPrevM)
  115. {
  116. $arFilter = Array(
  117. "ACTIVE" => "Y",
  118. "<".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$currentMonth,1,$currentYear)),
  119. "IBLOCK_ID" => $arParams["IBLOCK_ID"],
  120. );
  121. $dbItems = CIBlockElement::GetList(array(), $arFilter, false, array("nTopCount"=>1), Array("ID", "IBLOCK_ID"));
  122. if($arItem = $dbItems->GetNext())
  123. $bPrevM = true;
  124. }
  125. //For news we will not check future month for more news
  126. //for events we will.
  127. $bCheckNext = true;
  128. if($arParams["TYPE"])
  129. {
  130. $bCheckNext = mktime(0, 0, 0 ,$currentMonth+1, 1, $currentYear) < mktime(0, 0, 0 ,$todayMonth+1, 1, $todayYear);
  131. }
  132. $bNextM = false;
  133. $bNextY = false;
  134. if($bCheckNext)
  135. {
  136. if($arParams["SHOW_YEAR"])
  137. {
  138. $arFilter = Array(
  139. "ACTIVE" => "Y",
  140. ">=".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,1,1,$currentYear+1)),
  141. "IBLOCK_ID" => $arParams["IBLOCK_ID"],
  142. );
  143. $dbItems = CIBlockElement::GetList(array(), $arFilter, false, array("nTopCount"=>1), Array("ID", "IBLOCK_ID"));
  144. if($arItem = $dbItems->GetNext())
  145. {
  146. $bNextM = true;
  147. $bNextY = true;
  148. }
  149. }
  150. if(!$bNextM)
  151. {
  152. $arFilter = Array(
  153. "ACTIVE" => "Y",
  154. ">=".$arParams["DATE_FIELD"] => date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$currentMonth+1,1,$currentYear)),
  155. "IBLOCK_ID" => $arParams["IBLOCK_ID"]
  156. );
  157. $dbItems = CIBlockElement::GetList(array(), $arFilter, false, array("nTopCount"=>1), Array("ID", "IBLOCK_ID"));
  158. if($arItem = $dbItems->GetNext())
  159. $bNextM = true;
  160. }
  161. }
  162. if($bPrevM)
  163. {
  164. $navM = date("m", mktime(0,0,0,$currentMonth-1, 1, $currentYear));
  165. $navY = date("Y", mktime(0,0,0,$currentMonth-1, 1, $currentYear));
  166. $arResult["PREV_MONTH"] = date("n", mktime(0,0,0,$currentMonth-1, 1, $currentYear));
  167. $arResult["PREV_MONTH_URL"] = htmlspecialcharsbx(str_replace(
  168. array("#YEAR#","#MONTH#"),
  169. array($navY, $navM),
  170. $arParams["MONTH_URL"]
  171. ));
  172. $arResult["PREV_MONTH_URL_TITLE"] = GetMessage("IBL_NEWS_CAL_M_".$arResult["PREV_MONTH"]);
  173. }
  174. else
  175. {
  176. $arResult["PREV_MONTH_URL"] = false;
  177. }
  178. if($bNextM)
  179. {
  180. $navM = date("m", mktime(0,0,0,$currentMonth+1, 1, $currentYear));
  181. $navY = date("Y", mktime(0,0,0,$currentMonth+1, 1, $currentYear));
  182. $arResult["NEXT_MONTH"] = date("n", mktime(0,0,0,$currentMonth+1, 1, $currentYear));
  183. $arResult["NEXT_MONTH_URL"] = htmlspecialcharsbx(str_replace(
  184. array("#YEAR#","#MONTH#"),
  185. array($navY, $navM),
  186. $arParams["MONTH_URL"]
  187. ));
  188. $arResult["NEXT_MONTH_URL_TITLE"] = GetMessage("IBL_NEWS_CAL_M_".$arResult["NEXT_MONTH"]);
  189. }
  190. else
  191. {
  192. $arResult["NEXT_MONTH_URL"] = false;
  193. }
  194. if($bPrevY)
  195. {
  196. $navM = date("m", mktime(0,0,0,$currentMonth, 1, $currentYear));
  197. $navY = date("Y", mktime(0,0,0,$currentMonth, 1, $currentYear-1));
  198. $arResult["PREV_YEAR"] = $navY;
  199. $arResult["PREV_YEAR_URL"] = htmlspecialcharsbx(str_replace(
  200. array("#YEAR#","#MONTH#"),
  201. array($navY, $navM),
  202. $arParams["MONTH_URL"]
  203. ));
  204. $arResult["PREV_YEAR_URL_TITLE"] = $arResult["PREV_YEAR"];
  205. }
  206. else
  207. {
  208. $arResult["PREV_YEAR_URL"] = false;
  209. }
  210. if($bNextY)
  211. {
  212. $navM = date("m", mktime(0,0,0,$currentMonth, 1, $currentYear));
  213. $navY = date("Y", mktime(0,0,0,$currentMonth, 1, $currentYear+1));
  214. $arResult["NEXT_YEAR"] = $navY;
  215. $arResult["NEXT_YEAR_URL"] = htmlspecialcharsbx(str_replace(
  216. array("#YEAR#","#MONTH#"),
  217. array($navY, $navM),
  218. $arParams["MONTH_URL"]
  219. ));
  220. $arResult["NEXT_YEAR_URL_TITLE"] = $arResult["NEXT_YEAR"];
  221. }
  222. else
  223. {
  224. $arResult["NEXT_YEAR_URL"] = false;
  225. }
  226. $date = mktime(0, 0, 0, $currentMonth, 1, $currentYear);
  227. $MonthStart = date("w", $date) - $arParams["WEEK_START"];
  228. if($MonthStart < 0)
  229. $MonthStart += 7;
  230. $arResult["MONTH"] = array();
  231. $bBreak = false;
  232. for ($i = 0; $i < 6; $i++)
  233. {
  234. $arWeek = array();
  235. $row = $i * 7;
  236. for ($j = 0; $j < 7; $j++)
  237. {
  238. $arDay = array();
  239. $date = mktime(0, 0, 0, $currentMonth, (1 + $row + $j) - $MonthStart, $currentYear);
  240. $y = intval(date("Y", $date));
  241. $m = intval(date("n", $date));
  242. $d = intval(date("j", $date));
  243. $itm = date("w", $date);
  244. if ($i > 0 && $j == 0 && $currentMonth != $m)
  245. {
  246. $bBreak = true;
  247. break;
  248. }
  249. $dayClassName = "NewsCalDay";
  250. if ($d == $todayDay && $m == $todayMonth && $y == $todayYear && !$bBreak)
  251. $defaultClassName = "NewsCalToday";
  252. elseif ($currentMonth != $m)
  253. {
  254. $defaultClassName = "NewsCalOtherMonth";
  255. $dayClassName = "NewsCalDayOther";
  256. }
  257. elseif ($itm == 0 || $itm == 6)
  258. $defaultClassName = "NewsCalWeekend";
  259. else
  260. $defaultClassName = "NewsCalDefault";
  261. $arDay["day"] = $d;
  262. $arDay["td_class"] = $defaultClassName;
  263. $arDay["tday_class"] = $dayClassName;
  264. $arDay["events"] = array();
  265. $tmpDate = date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$m,$d,$y));
  266. if(is_set($arDays[$tmpDate]))
  267. {
  268. $nn = 0;
  269. foreach($arDays[$tmpDate] as $dayNews)
  270. {
  271. $nn++;
  272. $eTime = "";
  273. $arTime = Array();
  274. if($arParams["SHOW_TIME"])
  275. {
  276. $arTime = ParseDateTime($dayNews["DATE_ACTIVE_FROM"], CLang::GetDateFormat("FULL"));
  277. if(intval($arTime["HH"])>0 || $arTime["MI"]>0)
  278. $eTime = $arTime["HH"].":".$arTime["MI"]."&nbsp;";
  279. }
  280. if($dayNews["PREVIEW_TEXT_TYPE"] == "text" && $dayNews["PREVIEW_TEXT"] <> '')
  281. $sTitle = TruncateText($dayNews["PREVIEW_TEXT"], 100);
  282. else
  283. $sTitle = $dayNews["NAME"];
  284. if($arParams["TITLE_LEN"]>0)
  285. $title = TruncateText($dayNews["NAME"], $arParams["TITLE_LEN"]);
  286. else
  287. $title = $dayNews["NAME"];
  288. $arDay["events"][] = array(
  289. "time"=>$eTime,
  290. "url"=>$dayNews["DETAIL_PAGE_URL"],
  291. "title"=>$title,
  292. "preview"=>$sTitle,
  293. $arParams["DATE_FIELD"]=>$dayNews[$arParams["DATE_FIELD"]],
  294. );
  295. if($arParams["NEWS_COUNT"]>0 && $arParams["NEWS_COUNT"]<=$nn)
  296. break;
  297. }
  298. }
  299. $arWeek[]=$arDay;
  300. }
  301. if ($bBreak)
  302. break;
  303. $arResult["MONTH"][]=$arWeek;
  304. }
  305. if($arParams["SHOW_MONTH_LIST"])
  306. {
  307. $arResult["SHOW_MONTH_LIST"] = array();
  308. for($i=1;$i<=12;$i++)
  309. {
  310. $url = str_replace(
  311. array("#YEAR#","#MONTH#"),
  312. array($arResult["currentYear"], $i),
  313. $arParams["MONTH_URL"]
  314. );
  315. if(defined("BX_AJAX_PARAM_ID"))
  316. {
  317. $p = mb_strpos($url, "?");
  318. if($p !== false)
  319. {
  320. $url .= "&".BX_AJAX_PARAM_ID."=".$arParams['AJAX_ID'];
  321. }
  322. else
  323. {
  324. $url .= "?".BX_AJAX_PARAM_ID."=".$arParams['AJAX_ID'];
  325. }
  326. }
  327. $arResult["SHOW_MONTH_LIST"][$i] = array(
  328. "VALUE" => htmlspecialcharsbx($url),
  329. "DISPLAY" => GetMessage("IBL_NEWS_CAL_M_".$i),
  330. );
  331. }
  332. }
  333. else
  334. {
  335. $arResult["SHOW_MONTH_LIST"] = false;
  336. }
  337. $this->SetResultCacheKeys(array(
  338. "TITLE",
  339. ));
  340. $this->IncludeComponentTemplate();
  341. }
  342. if($arParams["SET_TITLE"])
  343. $APPLICATION->SetTitle($arResult["TITLE"], array('COMPONENT_NAME' => $this->GetName()));
  344. ?>