PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/components/bitrix/advertising.banner/class.php

https://gitlab.com/alexprowars/bitrix
PHP | 371 lines | 319 code | 51 blank | 1 comment | 46 complexity | c8161e0055eb801205c231f52e7b7c84 MD5 | raw file
  1. <?php
  2. use Bitrix\Main;
  3. use Bitrix\Main\Localization\Loc;
  4. if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
  5. Loc::loadMessages(__FILE__);
  6. class AdvertisingBanner extends \CBitrixComponent
  7. {
  8. /** @var CPHPCache $obCache */
  9. protected $obCache;
  10. protected $cache_id;
  11. protected $cache_path;
  12. protected $templateCachedData;
  13. protected $arBanners;
  14. protected $arVars;
  15. protected $templateProps;
  16. protected $templateFiles;
  17. protected $bannerIndex = 0;
  18. public function onPrepareComponentParams($params)
  19. {
  20. $params['TYPE'] = (isset($params['TYPE']) ? trim($params['TYPE']) : '');
  21. if($params['NOINDEX'] <> 'Y')
  22. {
  23. $params['NOINDEX'] = 'N';
  24. }
  25. if ($params['CACHE_TYPE'] == 'Y' || ($params['CACHE_TYPE'] == 'A' && Bitrix\Main\Config\Option::get('main', 'component_cache_on', 'Y') == 'Y'))
  26. {
  27. $params['CACHE_TIME'] = intval($params['CACHE_TIME']);
  28. }
  29. else
  30. {
  31. $params['CACHE_TIME'] = 0;
  32. }
  33. if (isset($params['QUANTITY']) && intval($params['QUANTITY']) > 0)
  34. {
  35. $params['QUANTITY'] = intval($params['QUANTITY']);
  36. }
  37. else
  38. {
  39. $params['QUANTITY'] = 1;
  40. }
  41. $params['BANNER_ID'] = intval($params['BANNER_ID']);
  42. return $params;
  43. }
  44. protected function loadBanners()
  45. {
  46. global $APPLICATION;
  47. $this->arBanners = CAdvBanner::GetRandomArray($this->arParams['TYPE'], $this->arParams['QUANTITY']);
  48. $this->arResult['BANNERS'] = array();
  49. if (!empty($this->arBanners) && is_array($this->arBanners))
  50. {
  51. foreach ($this->arBanners as $key => $banner)
  52. {
  53. if ($banner['AD_TYPE'] === 'template')
  54. {
  55. $templateProps = unserialize($banner['TEMPLATE'], ['allowed_classes' => false]);
  56. $templateFiles = unserialize($banner['TEMPLATE_FILES'], ['allowed_classes' => false]);
  57. if (empty($this->arResult['SIZE']))
  58. {
  59. $this->templateFiles = $templateFiles;
  60. $this->arResult['SIZE'] = $this->getBannerSize();
  61. }
  62. if (count($templateProps['PROPS']) > 1)
  63. {
  64. if (count($this->arResult['BANNERS']) == 0)
  65. {
  66. foreach ($templateProps['PROPS'] as $k => $v)
  67. {
  68. ob_start();
  69. $APPLICATION->IncludeComponent(
  70. 'bitrix:advertising.banner.view',
  71. $templateProps['NAME'],
  72. array(
  73. 'PROPS' => $v,
  74. 'FILES' => $templateFiles[$k],
  75. 'EXT_MODE' => $templateProps['MODE'],
  76. 'INDEX' => $this->bannerIndex,
  77. 'HEIGHT' => $this->arParams['HEIGHT'],
  78. 'CASUAL_PROPERTIES' => array(
  79. 'TYPE' => $banner['AD_TYPE']
  80. )
  81. ),
  82. $this,
  83. array('HIDE_ICONS' => 'Y')
  84. );
  85. $strReturn = CAdvBanner::PrepareHTML(ob_get_contents(), $banner);
  86. $strReturn = CAdvBanner::ReplaceURL($strReturn, $banner);
  87. ob_end_clean();
  88. $this->arResult['BANNERS'][] = $strReturn;
  89. $this->bannerIndex++;
  90. }
  91. $this->arResult['BANNERS_PROPERTIES'][$key] = $banner;
  92. break;
  93. }
  94. else
  95. {
  96. continue;
  97. }
  98. }
  99. else
  100. {
  101. ob_start();
  102. $APPLICATION->IncludeComponent(
  103. 'bitrix:advertising.banner.view',
  104. $templateProps['NAME'],
  105. array(
  106. 'PROPS' => $templateProps['PROPS'][0],
  107. 'FILES' => $templateFiles[0],
  108. 'EXT_MODE' => $templateProps['MODE'],
  109. 'INDEX' => $this->bannerIndex,
  110. 'HEIGHT' => $this->arParams['HEIGHT'],
  111. 'CASUAL_PROPERTIES' => array(
  112. 'TYPE' => $banner['AD_TYPE']
  113. )
  114. ),
  115. $this,
  116. array('HIDE_ICONS' => 'Y')
  117. );
  118. $strReturn = CAdvBanner::PrepareHTML(ob_get_contents(), $banner);
  119. $strReturn = CAdvBanner::ReplaceURL($strReturn, $banner);
  120. ob_end_clean();
  121. $this->arResult['BANNERS'][$key] = $strReturn;
  122. $this->arResult['BANNERS_PROPERTIES'][$key] = $banner;
  123. $this->bannerIndex++;
  124. }
  125. }
  126. else
  127. {
  128. $templateExists = false;
  129. if ($this->arParams['DEFAULT_TEMPLATE'] <> '')
  130. {
  131. $arTemplates = CComponentUtil::GetTemplatesList('bitrix:advertising.banner.view');
  132. if (is_array($arTemplates) && !empty($arTemplates))
  133. {
  134. foreach ($arTemplates as $template)
  135. {
  136. if ($this->arParams['DEFAULT_TEMPLATE'] == $template['NAME'])
  137. {
  138. $templateExists = true;
  139. break;
  140. }
  141. }
  142. }
  143. }
  144. if ($banner['AD_TYPE'] === 'image' && $templateExists)
  145. {
  146. ob_start();
  147. $APPLICATION->IncludeComponent(
  148. 'bitrix:advertising.banner.view',
  149. $this->arParams['DEFAULT_TEMPLATE'],
  150. array(
  151. 'PROPS' => array(),
  152. 'FILES' => array(),
  153. 'EXT_MODE' => 'N',
  154. 'HEIGHT' => $this->arParams['HEIGHT'],
  155. 'CASUAL_PROPERTIES' => array(
  156. 'TYPE' => $banner['AD_TYPE'],
  157. 'IMG' => $banner['IMAGE_ID'],
  158. 'ALT' => $banner['IMAGE_ALT'],
  159. 'URL' => $banner['URL'],
  160. 'URL_TARGET' => $banner['URL_TARGET']
  161. )
  162. ),
  163. $this,
  164. array('HIDE_ICONS' => 'Y')
  165. );
  166. $strReturn = ob_get_contents();
  167. ob_end_clean();
  168. }
  169. else
  170. {
  171. $strReturn = CAdvBanner::GetHTML($banner, ($this->arParams['NOINDEX'] == 'Y'));
  172. }
  173. $this->arResult['BANNERS'][$key] = $strReturn;
  174. $this->arResult['BANNERS_PROPERTIES'][$key] = $banner;
  175. $this->bannerIndex++;
  176. }
  177. }
  178. }
  179. }
  180. protected function registerBannerTags()
  181. {
  182. if (defined('BX_COMP_MANAGED_CACHE'))
  183. {
  184. $taggedCache = Main\Application::getInstance()->getTaggedCache();
  185. $taggedCache->registerTag('advertising_banner_type_'.$this->arParams['TYPE']);
  186. }
  187. }
  188. protected function loadPreview()
  189. {
  190. global $APPLICATION;
  191. if ($banner = CAdvBanner::GetByID($this->arParams['BANNER_ID'])->Fetch())
  192. {
  193. if ($banner['AD_TYPE'] === 'template')
  194. {
  195. $this->templateProps = unserialize($banner['TEMPLATE'], ['allowed_classes' => false]);
  196. $this->templateFiles = unserialize($banner['TEMPLATE_FILES'], ['allowed_classes' => false]);
  197. foreach ($this->templateProps['PROPS'] as $k => $v)
  198. {
  199. ob_start();
  200. $APPLICATION->IncludeComponent(
  201. 'bitrix:advertising.banner.view',
  202. $this->templateProps['NAME'],
  203. array(
  204. 'PROPS' => $v,
  205. 'FILES' => $this->templateFiles[$k],
  206. 'EXT_MODE' => $this->templateProps['MODE'],
  207. 'INDEX' => $this->bannerIndex,
  208. 'PREVIEW' => $this->arParams['PREVIEW'],
  209. 'CASUAL_PROPERTIES' => array(
  210. 'TYPE' => $banner['AD_TYPE']
  211. )
  212. ),
  213. $this,
  214. array('HIDE_ICONS' => 'Y')
  215. );
  216. $strReturn = CAdvBanner::PrepareHTML(ob_get_contents(), $banner);
  217. ob_end_clean();
  218. $this->arResult['BANNERS'][] = $strReturn;
  219. $this->bannerIndex++;
  220. }
  221. $this->arResult['BANNERS_PROPERTIES'][] = $banner;
  222. }
  223. $this->arResult['SIZE'] = $this->getBannerSize();
  224. }
  225. else
  226. {
  227. $this->arResult = array();
  228. }
  229. }
  230. protected function getBannerSize()
  231. {
  232. if (is_array($this->templateFiles))
  233. {
  234. foreach ($this->templateFiles as $tfk => $tfv)
  235. {
  236. foreach ($tfv as $name => $id)
  237. {
  238. if ($id !== 'null')
  239. {
  240. $file = CFile::GetFileArray($id);
  241. return array(
  242. 'WIDTH' => $file['WIDTH'],
  243. 'HEIGHT' => $file['HEIGHT']
  244. );
  245. }
  246. }
  247. }
  248. }
  249. return array();
  250. }
  251. protected function setCache()
  252. {
  253. global $USER;
  254. return $this->startResultCache(false, $USER->GetGroups());
  255. }
  256. protected function checkModules()
  257. {
  258. if (!\Bitrix\Main\Loader::includeModule('advertising'))
  259. {
  260. ShowError(Loc::getMessage('MODULE_IS_NOT_INSTALLED'));
  261. return false;
  262. }
  263. return true;
  264. }
  265. public function executeComponent()
  266. {
  267. if (!$this->checkModules())
  268. {
  269. return;
  270. }
  271. $this->arResult = array(
  272. 'ID' => $this->randString(5),
  273. 'BANNER' => '',
  274. 'BANNER_PROPERTIES' => array(),
  275. );
  276. if ($this->setCache())
  277. {
  278. if ($this->arParams['PREVIEW'] === 'Y')
  279. {
  280. $this->loadPreview();
  281. }
  282. else
  283. {
  284. $this->loadBanners();
  285. $this->registerBannerTags();
  286. }
  287. if (!empty($this->arResult['BANNERS']) && is_array($this->arResult['BANNERS']))
  288. {
  289. $this->arResult['BANNER'] = implode('<br />', $this->arResult['BANNERS']);
  290. }
  291. if (!empty($this->arResult['BANNERS_PROPERTIES']) && is_array($this->arResult['BANNERS_PROPERTIES']))
  292. {
  293. $this->arResult['BANNER_PROPERTIES'] = reset($this->arResult['BANNERS_PROPERTIES']);
  294. }
  295. $this->includeComponentTemplate();
  296. }
  297. if ($this->arParams['PREVIEW'] != 'Y')
  298. {
  299. $this->doFinalActions();
  300. }
  301. }
  302. public function doFinalActions()
  303. {
  304. global $USER, $APPLICATION;
  305. if (!empty($this->arResult['BANNERS_PROPERTIES']) && is_array($this->arResult['BANNERS_PROPERTIES']))
  306. {
  307. foreach ($this->arResult['BANNERS_PROPERTIES'] as $banner)
  308. {
  309. CAdvBanner::FixShow($banner);
  310. if ($USER->IsAuthorized() && $APPLICATION->GetShowIncludeAreas())
  311. {
  312. if (($arIcons = CAdvBanner::GetEditIcons($banner, $this->arParams['TYPE'], $this->getIncludeAreaIcons())) !== false)
  313. {
  314. $this->addIncludeAreaIcons($arIcons);
  315. }
  316. }
  317. }
  318. }
  319. }
  320. }