Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/advertising/classes/general/ |
Upload File : |
<?php /** * Bitrix Framework * @package bitrix * @subpackage advertising * @copyright 2001-2014 Bitrix */ use \Bitrix\Main\Application; global $arrViewedBanners, // баннеры показанные на данной странице $arrADV_KEYWORDS, // массив ключевых слов для страницы $strAdvCurUri, $nRandom1, $nRandom2, $nRandom3, $nRandom4, $nRandom5, $CACHE_ADVERTISING, $arrADV_VIEWED_BANNERS; $arrADV_KEYWORDS = array(); $strAdvCurUri = false; $arrViewedBanners = array(0); $CACHE_ADVERTISING = array( "BANNERS_ALL" => array(), "BANNERS_CNT" => array(), "CONTRACTS_ALL" => array(), "CONTRACTS_CNT" => array(), ); $arrADV_VIEWED_BANNERS = false; $weightCalculated = false; $nRandom1 = 4689*mt_rand(999, 31999); $nRandom2 = 4689*mt_rand(999, 31999); $nRandom3 = 4689*mt_rand(999, 31999); $nRandom4 = 4689*mt_rand(999, 31999); $nRandom5 = 4689*mt_rand(999, 31999); // Параметр указывающий допустимое процентное отклонение (превышение) от равномерности // прогресса ротации банера define("BANNER_UNIFORMITY_DIVERGENCE_COEF", 0.05); /***************************************************************** Класс "Рекламный контракт" *****************************************************************/ class CAdvContract_all { public static function err_mess() { $module_id = "advertising"; return "<br>Module: ".$module_id."<br>Class: CAdvContract_all<br>File: ".__FILE__; } public static function GetNextSort() { $rsContracts = CAdvContract::GetList("s_sort", "desc", array("ID" => "~1", "ID_EXACT_MATCH" => "Y")); $arContract = $rsContracts->Fetch(); return intval($arContract["SORT"])+10; } /***************************************************************** Группа функций по работе с ролями на модуль Идентификаторы ролей: D - доступ закрыт R - рекламодатель T - менеджер баннеров V - демо-доступ W - администратор рекламы *****************************************************************/ public static function GetDeniedRoleID() { return "D"; } public static function GetAdvertiserRoleID() { return "R"; } public static function GetManagerRoleID() { return "T"; } public static function GetDemoRoleID() { return "V"; } public static function GetAdminRoleID() { return "W"; } // возвращает true если заданный пользователь имеет заданную роль на модуль public static function HaveRole($role, $USER_ID=false) { global $USER, $APPLICATION; if($USER_ID === false && is_object($USER)) $USER_ID = $USER->GetID(); $USER_ID = intval($USER_ID); if ($USER_ID>0) { if(is_object($USER) && $USER_ID == $USER->GetID()) $arrGroups = $USER->GetUserGroupArray(); else $arrGroups = CUser::GetUserGroup($USER_ID); $arRoles = $APPLICATION->GetUserRoles("advertising", $arrGroups); if(in_array($role, $arRoles)) return true; } return false; } // true - если пользователь имеет роль "рекламодатель" // false - в противном случае public static function IsAdvertiser($USER_ID=false) { return CAdvContract::HaveRole(CAdvContract::GetAdvertiserRoleID(), $USER_ID); } // true - если пользователь имеет роль "администратор рекламы" // false - в противном случае public static function IsAdmin($USER_ID=false) { global $USER; if ($USER_ID===false && is_object($USER)) { if ($USER->IsAdmin()) return true; } return CAdvContract::HaveRole(CAdvContract::GetAdminRoleID(), $USER_ID); } // true - если пользователь имеет роль "демо-доступ" // false - в противном случае public static function IsDemo($USER_ID=false) { return CAdvContract::HaveRole(CAdvContract::GetDemoRoleID(), $USER_ID); } // true - если пользователь имеет право на модуль "менеджер баннеров" и выше // false - в противном случае public static function IsManager($USER_ID=false) { return CAdvContract::HaveRole(CAdvContract::GetManagerRoleID(), $USER_ID); } // возвращает массив ID групп для которых задана роль // $role - идентификатор роли public static function GetGroupsByRole($role) { global $APPLICATION, $USER; if (!is_object($USER)) $USER = new CUser; $arGroups = array(); $z = CGroup::GetList("dropdown", "asc", array("ACTIVE" => "Y")); while($zr = $z->Fetch()) { $arRoles = $APPLICATION->GetUserRoles("advertising", array(intval($zr["ID"])), "Y", "N"); if (in_array($role, $arRoles)) $arGroups[] = intval($zr["ID"]); } return array_unique($arGroups); } // возвращает массив пользователей имеющих право на модуль "рекламодатель" public static function GetAdvertisersArray() { $arrRes = array(); $arGroups = CAdvContract::GetGroupsByRole(CAdvContract::GetAdvertiserRoleID()); if (is_array($arGroups) && count($arGroups)>0) { $rsUser = CUser::GetList("id", "desc", array("ACTIVE" => "Y", "GROUPS_ID" => $arGroups)); while ($arUser = $rsUser->Fetch()) $arrRes[] = $arUser; } return $arrRes; } // возвращает массив EMail адресов всех пользователей имеющих заданную роль public static function GetEmailArrayByRole($role) { global $USER; if (!is_object($USER)) $USER = new CUser; $arrEMail = array(); $arGroups = CAdvContract::GetGroupsByRole($role); if (is_array($arGroups) && count($arGroups)>0) { $rsUser = CUser::GetList("id", "desc", array("ACTIVE" => "Y", "GROUPS_ID" => $arGroups)); while ($arUser = $rsUser->Fetch()) { $arrEMail[] = $arUser["EMAIL"]; } } return array_unique($arrEMail); } // возвращает массив EMail'ов всех пользователей имеющих роль "администратор" public static function GetAdminEmails() { return CAdvContract::GetEmailArrayByRole(CAdvContract::GetAdminRoleID()); } // возвращает массив EMail'ов всех пользователей имеющих роль "менеджер баннеров" public static function GetManagerEmails() { return CAdvContract::GetEmailArrayByRole(CAdvContract::GetManagerRoleID()); } /***************************************************************** Группа функций по работе с правами на контракт Идентификаторы прав: VIEW - просмотр настроек контракта, просмотр всех баннеров контракта и их графиков ADD - просмотр настроек контракта, управление баннерами контракта, просмотр графиков баннеров EDIT - управление частью полей контракта, просмотр всех баннеров контракта и их графиков *****************************************************************/ // получение массива максимальных прав доступа на контракт public static function GetMaxPermissionsArray() { return array("VIEW", "ADD", "EDIT"); } // возвращает массивы EMail'ов всех пользователей имеющих доступ к заданному контракту (владельцы контракта) public static function GetOwnerEmails($CONTRACT_ID, &$OWNER_EMAIL, &$ADD_EMAIL, &$VIEW_EMAIL, &$EDIT_EMAIL) { $OWNER_EMAIL = array(); $VIEW_EMAIL = array(); $ADD_EMAIL = array(); $EDIT_EMAIL = array(); $arrPERM = CAdvContract::GetContractPermissions($CONTRACT_ID); foreach ($arrPERM as $perm => $arr) { if (is_array($arr) && count($arr)>0) { foreach($arr as $ar) { $OWNER_EMAIL[] = $ar["USER_EMAIL"]; if ($perm=="VIEW") $VIEW_EMAIL[] = $ar["USER_EMAIL"]; if ($perm=="ADD") $ADD_EMAIL[] = $ar["USER_EMAIL"]; if ($perm=="EDIT") $EDIT_EMAIL[] = $ar["USER_EMAIL"]; } } } $OWNER_EMAIL = array_unique($OWNER_EMAIL); $VIEW_EMAIL = array_unique($VIEW_EMAIL); $ADD_EMAIL = array_unique($ADD_EMAIL); $EDIT_EMAIL = array_unique($EDIT_EMAIL); } // получение массива прав текущего пользователя по всем контрактам public static function GetUserPermissions($CONTRACT_ID=0, $USER_ID=false) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetUserPermissions<br>Line: "; global $DB, $USER; static $CONTRACT_RIGHTS = array(); $USER_ID = ($USER_ID===false) ? intval($USER->GetID()) : intval($USER_ID); if (intval($USER_ID)<=0) return false; $CONTRACT_ID = intval($CONTRACT_ID); $arrRes = array(); if ($CONTRACT_ID>0 && is_set($CONTRACT_RIGHTS[$USER_ID], $CONTRACT_ID)) { $arrRes = $CONTRACT_RIGHTS[$USER_ID]; } else { $isManager = CAdvContract::IsManager($USER_ID); $isAdmin = CAdvContract::IsAdmin($USER_ID); if ($isAdmin) $arrRes[0] = CAdvContract::GetMaxPermissionsArray(); elseif ($isManager) $arrRes[0] = array("VIEW", "ADD"); else $arrRes[0] = array(); $strSqlSearch = ""; if ($CONTRACT_ID>0) $strSqlSearch = " and C.ID= $CONTRACT_ID "; $strSql = " SELECT C.ID, CU.PERMISSION FROM b_adv_contract C LEFT JOIN b_adv_contract_2_user CU ON (CU.CONTRACT_ID=C.ID and CU.USER_ID=$USER_ID) WHERE 1=1 $strSqlSearch "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[$ar["ID"]][] = $ar["PERMISSION"]; if ($isAdmin || $isManager) { foreach ($arrRes as $cid => $arrPerm) { if ($isAdmin) $arrPerm = CAdvContract::GetMaxPermissionsArray(); elseif ($isManager) { $arrPerm[] = "VIEW"; $arrPerm[] = "ADD"; $arrPerm = array_unique($arrPerm); } $arrRes[$cid] = $arrPerm; } } foreach ($arrRes as $cid => $arrPerm) { TrimArr($arrPerm); $CONTRACT_RIGHTS[$USER_ID][$cid] = $arrPerm; $arrRes[$cid] = $arrPerm; } } return $arrRes; } // true - если пользователь имеет доступ к контракту // false - в противном случае public static function IsOwner($CONTRACT_ID, $USER_ID=false) { $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $arrPERM = CAdvContract::GetUserPermissions($CONTRACT_ID, $USER_ID); $arrPERM = $arrPERM[$CONTRACT_ID]; if (is_array($arrPERM) && count($arrPERM)>0) return true; else return false; } // получение массива всех прав доступа по заданному контракту public static function GetContractPermissions($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetContractPermissions<br>Line: "; global $DB; $arrPerm = array(); $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = " SELECT CU.USER_ID, CU.PERMISSION, U.LOGIN, U.NAME, U.LAST_NAME, U.EMAIL FROM b_adv_contract_2_user CU, b_user U WHERE CU.CONTRACT_ID = $CONTRACT_ID and U.ID = CU.USER_ID ORDER BY CU.ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) { $arrPerm[$ar["PERMISSION"]][] = array( "USER_ID" => $ar["USER_ID"], "USER_LOGIN" => $ar["LOGIN"], "USER_NAME" => $ar["NAME"], "USER_LAST_NAME" => $ar["LAST_NAME"], "USER_EMAIL" => $ar["EMAIL"] ); } return $arrPerm; } /***************************************************************** Группа функций по отправке почты *****************************************************************/ public static function SendEMail($arContract, $mess="") { $CONTRACT_ID = $arContract["ID"]; $BCC = array(); $OWNER_EMAIL = array(); $ADD_EMAIL = array(); $EDIT_EMAIL = array(); $MANAGER_EMAIL = CAdvContract::GetManagerEmails(); $ADMIN_EMAIL = CAdvContract::GetAdminEmails(); $ADMIN_EMAIL = array_merge($MANAGER_EMAIL, $ADMIN_EMAIL); $ADMIN_EMAIL = array_unique($ADMIN_EMAIL); CAdvContract::GetOwnerEmails($CONTRACT_ID, $OWNER_EMAIL, $ADD_EMAIL, $VIEW_EMAIL, $EDIT_EMAIL); $EMAIL_TO = $OWNER_EMAIL; if (count($EMAIL_TO)<=0) { $EMAIL_TO = $ADMIN_EMAIL; } else $BCC = $ADMIN_EMAIL; $CREATED_BY = $MODIFIED_BY = ""; if (intval($arContract["CREATED_BY"])>0) { $rsUser = CUser::GetByID($arContract["CREATED_BY"]); if ($arUser = $rsUser->Fetch()) { $CREATED_BY = "[".$arUser["ID"]."] (".$arUser["LOGIN"].") ".$arUser["NAME"]." ".$arUser["LAST_NAME"]; } } if (intval($arContract["MODIFIED_BY"])==intval($arContract["CREATED_BY"]) && intval($arContract["CREATED_BY"])>0) { $MODIFIED_BY = $CREATED_BY; } elseif (intval($arContract["MODIFIED_BY"])>0) { $rsUser = CUser::GetByID($arContract["MODIFIED_BY"]); if ($arUser = $rsUser->Fetch()) { $MODIFIED_BY = "[".$arUser["ID"]."] (".$arUser["LOGIN"].") ".$arUser["NAME"]." ".$arUser["LAST_NAME"]; } } if ($mess <> '') $mess = "\n".$mess."\n"; $description = ""; if ($arContract["DESCRIPTION"] <> '') $description = "\n".$arContract["DESCRIPTION"]."\n"; $arEventFields = array( "ID" => $CONTRACT_ID, "MESSAGE" => $mess, "EMAIL_TO" => implode(",", $EMAIL_TO), "ADMIN_EMAIL" => implode(",", $ADMIN_EMAIL), "ADD_EMAIL" => implode(",", $ADD_EMAIL), "STAT_EMAIL" => implode(",", $VIEW_EMAIL), "EDIT_EMAIL" => implode(",", $EDIT_EMAIL), "OWNER_EMAIL" => implode(",", $OWNER_EMAIL), "BCC" => implode(",", $BCC), "INDICATOR" => GetMessage("AD_".mb_strtoupper($arContract["LAMP"]."_CONTRACT_STATUS")), "ACTIVE" => $arContract["ACTIVE"], "NAME" => $arContract["NAME"], "DESCRIPTION" => $description, "MAX_SHOW_COUNT" => $arContract["MAX_SHOW_COUNT"], "SHOW_COUNT" => $arContract["SHOW_COUNT"], "MAX_CLICK_COUNT" => $arContract["MAX_CLICK_COUNT"], "CLICK_COUNT" => $arContract["CLICK_COUNT"], "BANNERS" => $arContract["BANNER_COUNT"], "DATE_SHOW_FROM" => $arContract["DATE_SHOW_FROM"], "DATE_SHOW_TO" => $arContract["DATE_SHOW_TO"], "DATE_CREATE" => $arContract["DATE_CREATE"], "CREATED_BY" => $CREATED_BY, "DATE_MODIFY" => $arContract["DATE_MODIFY"], "MODIFIED_BY" => $MODIFIED_BY ); $arrSITE = CAdvContract::GetSiteArray($CONTRACT_ID); CEvent::Send("ADV_CONTRACT_INFO", $arrSITE, $arEventFields); } public static function SendInfo() { $err_mess = (CAdvContract_all::err_mess())."<br>Function: SendInfo<br>Line: "; global $DB; $rsContracts = CAdvContract::GetList("", "", array("LAMP" => "red", "EMAIL_COUNT_2" => "0"), null, "N"); while ($arContract = $rsContracts->Fetch()) { CAdvContract::SendEMail($arContract, "< ".GetMessage("AD_CONTRACT_NOT_ACTIVE")." >"); $arFields = array("EMAIL_COUNT" => "EMAIL_COUNT + 1"); $DB->Update("b_adv_contract",$arFields,"WHERE ID='".$arContract["ID"]."'",$err_mess.__LINE__); } return "CAdvContract::SendInfo();"; } /***************************************************************** Группа функций по управлению контрактом *****************************************************************/ public static function CheckFilter($arFilter) { global $strError; $str = ""; $find_date_modify_1 = $arFilter["DATE_MODIFY_1"] ?? ''; $find_date_modify_2 = $arFilter["DATE_MODIFY_2"] ?? ''; if (trim($find_date_modify_1) <> '' || trim($find_date_modify_2) <> '') { $date_1_ok = false; $date1_stm = MkDateTime(ConvertDateTime($find_date_modify_1,"D.M.Y"),"d.m.Y"); $date2_stm = MkDateTime(ConvertDateTime($find_date_modify_2,"D.M.Y")." 23:59","d.m.Y H:i"); if (!$date1_stm && trim($find_date_modify_1) <> '') $str.= GetMessage("AD_ERROR_WRONG_DATE_MODIFY_FROM")."<br>"; else $date_1_ok = true; if (!$date2_stm && trim($find_date_modify_2) <> '') $str.= GetMessage("AD_ERROR_WRONG_DATE_MODIFY_TILL")."<br>"; elseif ($date_1_ok && $date2_stm <= $date1_stm && $date2_stm <> '') $str.= GetMessage("AD_ERROR_FROM_TILL_DATE_MODIFY")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } // получаем массив времени и дней недели связанных с контрактом public static function GetWeekdayArray($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetWeekdayArray<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $arrRes = array(); $strSql = " SELECT DISTINCT C_WEEKDAY, C_HOUR FROM b_adv_contract_2_weekday WHERE CONTRACT_ID = $CONTRACT_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) { $arrRes[$ar["C_WEEKDAY"]][] = $ar["C_HOUR"]; } return $arrRes; } // получаем массив типов связанных с контрактом public static function GetTypeArray($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetTypeArray<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if($CONTRACT_ID<=0) return array(); $strSql = " SELECT T.SID, T.NAME, T.SORT, CT.TYPE_SID, CT.CONTRACT_ID FROM b_adv_contract_2_type CT INNER JOIN b_adv_type T ON (T.SID = CT.TYPE_SID or CT.TYPE_SID='ALL') WHERE CT.CONTRACT_ID=".$CONTRACT_ID." ORDER BY T.SORT "; $arrRes = array(); $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while($ar = $rs->Fetch()) { $arrRes[$ar["SID"]] = $ar["NAME"]; if($ar["TYPE_SID"] == 'ALL') $arrRes["ALL"] = true; } return $arrRes; } // получаем массив языков связанных с контрактом public static function GetSiteArray($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetSiteArray<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $arrRes = array(); $strSql = " SELECT CS.SITE_ID FROM b_adv_contract_2_site CS WHERE CS.CONTRACT_ID = $CONTRACT_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["SITE_ID"]; return $arrRes; } // получаем массив страниц связанных с контрактом public static function GetPageArray($CONTRACT_ID, $SHOW="SHOW") { $err_mess = (CAdvContract_all::err_mess())."<br>Function: GetPageArray<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $arrRes = array(); $SHOW_ON_PAGE = ($SHOW=="NOT_SHOW") ? "'N'" : "'Y'"; $strSql = " SELECT DISTINCT PAGE FROM b_adv_contract_2_page WHERE CONTRACT_ID = $CONTRACT_ID and SHOW_ON_PAGE = $SHOW_ON_PAGE "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["PAGE"]; return $arrRes; } // получаем контракт по ID public static function GetByID($CONTRACT_ID, $CHECK_RIGHTS="Y") { $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $arFilter = array( "ID" => $CONTRACT_ID, "ID_EXACT_MATCH" => "Y" ); $rs = CAdvContract::GetList('', '', $arFilter, null, $CHECK_RIGHTS); return $rs; } // проверка полей при модификации контракта public static function CheckFields($arFields, $CONTRACT_ID, $CHECK_RIGHTS="Y") { global $strError; $str = ""; $arrPERM = false; if ($CHECK_RIGHTS=="Y") { $arrPERM = CAdvContract::GetUserPermissions($CONTRACT_ID); $arrPERM = $arrPERM[$CONTRACT_ID]; } if ($CHECK_RIGHTS!="Y" || (is_array($arrPERM) && in_array("EDIT", $arrPERM))) { if ($arFields["DATE_SHOW_FROM"] <> '') { if (!CheckDateTime($arFields["DATE_SHOW_FROM"])) $str.= GetMessage("AD_ERROR_WRONG_DATE_SHOW_FROM_CONTRACT")."<br>"; } if ($arFields["DATE_SHOW_TO"] <> '') { if (!CheckDateTime($arFields["DATE_SHOW_TO"])) $str .= GetMessage("AD_ERROR_WRONG_DATE_SHOW_TO_CONTRACT")."<br>"; } } else { if ($CONTRACT_ID>0) $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_CONTRACT")."<br>"; else $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_FOR_NEW_CONTRACT")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } // добавляем новый контракт или модифицируем существующий public static function Set($arFields, $CONTRACT_ID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvContract_all::err_mess())."<br>Function: Set<br>Line: "; global $DB, $USER; if (CAdvContract::CheckFields($arFields, $CONTRACT_ID, $CHECK_RIGHTS)) { if ($CHECK_RIGHTS=="Y") { $USER_ID = intval($USER->GetID()); $isAdmin = CAdvContract::IsAdmin(); } else { if (is_object($USER)) $USER_ID = intval($USER->GetID()); else $USER_ID = 0; $isAdmin = true; } $check_activity = "N"; $arFields_i = array(); $arrKeys = array_keys($arFields); if ($isAdmin) { if (in_array("SHOW_COUNT", $arrKeys)) { $check_activity = "Y"; $arFields_i["SHOW_COUNT"] = intval($arFields["SHOW_COUNT"]); } if (in_array("VISITOR_COUNT", $arrKeys)) { $check_activity = "Y"; $arFields_i["VISITOR_COUNT"] = intval($arFields["VISITOR_COUNT"]); } if (in_array("CLICK_COUNT", $arrKeys)) { $check_activity = "Y"; $arFields_i["CLICK_COUNT"] = intval($arFields["CLICK_COUNT"]); } if (in_array("ACTIVE", $arrKeys) && ($arFields["ACTIVE"]=="Y" || $arFields["ACTIVE"]=="N")) { $check_activity = "Y"; $arFields_i["ACTIVE"] = "'".$arFields["ACTIVE"]."'"; } if (in_array("WEIGHT", $arrKeys)) $arFields_i["WEIGHT"] = intval($arFields["WEIGHT"]); if (in_array("ADMIN_COMMENTS", $arrKeys)) $arFields_i["ADMIN_COMMENTS"] = "'".$DB->ForSql($arFields["ADMIN_COMMENTS"],2000)."'"; if (in_array("KEYWORDS", $arrKeys)) $arFields_i["KEYWORDS"] = "'".$DB->ForSql($arFields["KEYWORDS"], 2000)."'";; if (in_array("MAX_SHOW_COUNT", $arrKeys)) { $check_activity = "Y"; if ($arFields["MAX_SHOW_COUNT"] <> '') $arFields_i["MAX_SHOW_COUNT"] = intval($arFields["MAX_SHOW_COUNT"]); else $arFields_i["MAX_SHOW_COUNT"] = "null"; } if (in_array("MAX_VISITOR_COUNT", $arrKeys)) { $check_activity = "Y"; if ($arFields["MAX_VISITOR_COUNT"] <> '') $arFields_i["MAX_VISITOR_COUNT"] = intval($arFields["MAX_VISITOR_COUNT"]); else $arFields_i["MAX_VISITOR_COUNT"] = "null"; } if (in_array("MAX_CLICK_COUNT", $arrKeys)) { $check_activity = "Y"; if ($arFields["MAX_CLICK_COUNT"] <> '') $arFields_i["MAX_CLICK_COUNT"] = intval($arFields["MAX_CLICK_COUNT"]); else $arFields_i["MAX_CLICK_COUNT"] = "null"; } if (in_array("DATE_SHOW_FROM", $arrKeys)) { $check_activity = "Y"; if ($arFields["DATE_SHOW_FROM"] <> '') { $arFields_i["DATE_SHOW_FROM"] = $DB->CharToDateFunction($arFields["DATE_SHOW_FROM"]); } else $arFields_i["DATE_SHOW_FROM"] = "null"; } if (in_array("DATE_SHOW_TO", $arrKeys)) { $check_activity = "Y"; if ($arFields["DATE_SHOW_TO"] <> '') { $time = ""; if(defined("FORMAT_DATE") && mb_strlen($arFields["DATE_SHOW_TO"]) <= mb_strlen(FORMAT_DATE)) { $time = " 23:59:59"; } $arFields_i["DATE_SHOW_TO"] = $DB->CharToDateFunction($arFields["DATE_SHOW_TO"].$time); } else { $arFields_i["DATE_SHOW_TO"] = "null"; } } if (in_array("DEFAULT_STATUS_SID", $arrKeys)) { $arrStatus = CAdvBanner::GetStatusList("N"); $arrV = array_values($arrStatus["reference_id"]); if (in_array($arFields["DEFAULT_STATUS_SID"], $arrV)) { $arFields_i["DEFAULT_STATUS_SID"] = "'".$DB->ForSql($arFields["DEFAULT_STATUS_SID"],255)."'"; } } if (in_array("SORT", $arrKeys)) $arFields_i["SORT"] = intval($arFields["SORT"]); if (in_array("NAME", $arrKeys)) $arFields_i["NAME"] = "'".$DB->ForSql($arFields["NAME"],255)."'"; if (in_array("DESCRIPTION", $arrKeys)) $arFields_i["DESCRIPTION"] = "'".$DB->ForSql($arFields["DESCRIPTION"],2000)."'"; } $arFields_i["EMAIL_COUNT"] = 0; $str_PREV_LAMP = ""; if (intval($CONTRACT_ID)>0) { $rsContract = CAdvContract::GetByID($CONTRACT_ID); $arContract = $rsContract->Fetch(); $str_PREV_LAMP = $arContract["LAMP"]; if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER_ID; $DB->Update("b_adv_contract",$arFields_i,"WHERE ID='".intval($CONTRACT_ID)."'",$err_mess.__LINE__); } elseif ($isAdmin) { $check_activity = "Y"; if (in_array("DATE_CREATE", $arrKeys) && CheckDateTime($arFields["DATE_CREATE"])) $arFields_i["DATE_CREATE"] = $DB->CharToDateFunction($arFields["DATE_CREATE"]); else $arFields_i["DATE_CREATE"] = $DB->GetNowFunction(); if (in_array("CREATED_BY", $arrKeys)) $arFields_i["CREATED_BY"] = intval($arFields["CREATED_BY"]); else $arFields_i["CREATED_BY"] = $USER_ID; if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER_ID; $CONTRACT_ID = $DB->Insert("b_adv_contract",$arFields_i, $err_mess.__LINE__); } $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID>0) { if ($isAdmin) { if (in_array("arrSITE", $arrKeys)) { CAdvContract::DeleteSiteLink($CONTRACT_ID); if (is_array($arFields["arrSITE"])) { $arrSite = array_unique($arFields["arrSITE"]); foreach($arrSite as $sid) { if (trim($sid) <> '') { $strSql = "INSERT INTO b_adv_contract_2_site(CONTRACT_ID, SITE_ID) VALUES ($CONTRACT_ID, '".$DB->ForSql($sid, 2)."')"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } if (in_array("arrSHOW_PAGE", $arrKeys)) { CAdvContract::DeletePageLink($CONTRACT_ID, " and SHOW_ON_PAGE='Y'"); if (is_array($arFields["arrSHOW_PAGE"])) { $arrPage = array_unique($arFields["arrSHOW_PAGE"]); foreach($arrPage as $page) { $page = trim($page); if ($page <> '') { $arFields_i = array( "CONTRACT_ID" => $CONTRACT_ID, "PAGE" => "'".$DB->ForSql($page, 255)."'", "SHOW_ON_PAGE" => "'Y'" ); $DB->Insert("b_adv_contract_2_page",$arFields_i, $err_mess.__LINE__); } } } } if (in_array("arrNOT_SHOW_PAGE", $arrKeys)) { CAdvContract::DeletePageLink($CONTRACT_ID, " and SHOW_ON_PAGE='N'"); if (is_array($arFields["arrNOT_SHOW_PAGE"])) { $arrPage = array_unique($arFields["arrNOT_SHOW_PAGE"]); foreach($arrPage as $page) { $page = trim($page); if ($page <> '') { $arFields_i = array( "CONTRACT_ID" => $CONTRACT_ID, "PAGE" => "'".$DB->ForSql($page, 255)."'", "SHOW_ON_PAGE" => "'N'" ); $DB->Insert("b_adv_contract_2_page",$arFields_i, $err_mess.__LINE__); } } } } if (in_array("arrTYPE", $arrKeys)) { CAdvContract::DeleteTypeLink($CONTRACT_ID); if (is_array($arFields["arrTYPE"])) { $arrType = array_unique($arFields["arrTYPE"]); foreach($arrType as $type) { if (trim($type) <> '') { $strSql = "INSERT INTO b_adv_contract_2_type(CONTRACT_ID, TYPE_SID) VALUES ($CONTRACT_ID, '".$DB->ForSql($type, 255)."')"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } if (in_array("arrWEEKDAY", $arrKeys)) { CAdvContract::DeleteWeekdayLink($CONTRACT_ID); if (is_array($arFields["arrWEEKDAY"])) { $arrWeekday = array_keys($arFields["arrWEEKDAY"]); $arrWeekday = array_unique($arrWeekday); if (is_array($arrWeekday) && count($arrWeekday)>0) { foreach ($arrWeekday as $weekday) { if (is_array($arFields["arrWEEKDAY"][$weekday]) && count($arFields["arrWEEKDAY"][$weekday])>0) { $arrHour = $arFields["arrWEEKDAY"][$weekday]; array_walk( $arrHour, function (&$item) { $item = (int)$item; } ); $arrHour = array_unique($arrHour); foreach($arrHour as $hour) { if ($hour>=0 && $hour<=23) { $strSql = "INSERT INTO b_adv_contract_2_weekday (CONTRACT_ID, C_WEEKDAY, C_HOUR) VALUES (".$CONTRACT_ID.", '".$DB->ForSql($weekday, 10)."', ".$hour.")"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } } } } } if (in_array("arrUSER_VIEW", $arrKeys)) { CAdvContract::DeleteUserLink($CONTRACT_ID, " and PERMISSION = 'VIEW'"); if (is_array($arFields["arrUSER_VIEW"])) { $arrUser = array_unique($arFields["arrUSER_VIEW"]); foreach($arrUser as $user_id) { if (intval($user_id)>0) { $arFields_i = array( "CONTRACT_ID" => $CONTRACT_ID, "USER_ID" => intval($user_id), "PERMISSION" => "'VIEW'" ); $DB->Insert("b_adv_contract_2_user",$arFields_i, $err_mess.__LINE__); } } } } if (in_array("arrUSER_ADD", $arrKeys)) { CAdvContract::DeleteUserLink($CONTRACT_ID, " and PERMISSION = 'ADD'"); if (is_array($arFields["arrUSER_ADD"])) { $arrUser = array_unique($arFields["arrUSER_ADD"]); foreach($arrUser as $user_id) { if (intval($user_id)>0) { $arFields_i = array( "CONTRACT_ID" => $CONTRACT_ID, "USER_ID" => intval($user_id), "PERMISSION" => "'ADD'" ); $DB->Insert("b_adv_contract_2_user",$arFields_i, $err_mess.__LINE__); } } } } if ($isAdmin) { if (in_array("arrUSER_EDIT", $arrKeys)) { CAdvContract::DeleteUserLink($CONTRACT_ID, " and PERMISSION = 'EDIT'"); if (is_array($arFields["arrUSER_EDIT"])) { $arrUser = array_unique($arFields["arrUSER_EDIT"]); foreach($arrUser as $user_id) { if (intval($user_id)>0) { $arFields_i = array( "CONTRACT_ID" => $CONTRACT_ID, "USER_ID" => intval($user_id), "PERMISSION" => "'EDIT'" ); $DB->Insert("b_adv_contract_2_user",$arFields_i, $err_mess.__LINE__); } } } } } if ($check_activity=="Y") { CTimeZone::Disable(); $rsContract = CAdvContract::GetByID($CONTRACT_ID); CTimeZone::Enable(); $arContract = $rsContract->Fetch(); $str_CURRENT_LAMP = $arContract["LAMP"]; if ($str_PREV_LAMP!=$str_CURRENT_LAMP) { $mess = ($str_CURRENT_LAMP=="red") ? "< ".GetMessage("AD_CONTRACT_NOT_ACTIVE")." >" : "< ".GetMessage("AD_CONTRACT_ACTIVE")." >"; CAdvContract::SendEMail($arContract, $mess); } if ($str_CURRENT_LAMP=="red") { $arFields = array("EMAIL_COUNT" => "EMAIL_COUNT + 1"); $DB->Update("b_adv_contract",$arFields,"WHERE ID='".$CONTRACT_ID."'",$err_mess.__LINE__); } } } } return $CONTRACT_ID; } // удаление контракта public static function Delete($CONTRACT_ID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvContract_all::err_mess())."<br>Function: Delete<br>Line: "; global $DB, $strError; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=1) return false; $isAdmin = ($CHECK_RIGHTS=="N"? true : CAdvContract::IsAdmin()); if ($isAdmin) { $strSql = "SELECT ID FROM b_adv_banner WHERE CONTRACT_ID = $CONTRACT_ID"; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) CAdvBanner::Delete($ar["ID"], "N"); CAdvContract::DeletePageLink($CONTRACT_ID); CAdvContract::DeleteSiteLink($CONTRACT_ID); CAdvContract::DeleteTypeLink($CONTRACT_ID); CAdvContract::DeleteUserLink($CONTRACT_ID); CAdvContract::DeleteWeekdayLink($CONTRACT_ID); $strSql = "DELETE FROM b_adv_contract WHERE ID = $CONTRACT_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } else { $strError .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_CONTRACT")."<br>"; return false; } } // удаление связи контракта со страницами public static function DeletePageLink($CONTRACT_ID, $where="") { $err_mess = (CAdvContract_all::err_mess())."<br>Function: DeletePageLink<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = "DELETE FROM b_adv_contract_2_page WHERE CONTRACT_ID = $CONTRACT_ID ".$where; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи контракта с сайтами public static function DeleteSiteLink($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: DeleteSiteLink<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = "DELETE FROM b_adv_contract_2_site WHERE CONTRACT_ID = $CONTRACT_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи контракта с типами баннеров public static function DeleteTypeLink($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: DeleteTypeLink<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = "DELETE FROM b_adv_contract_2_type WHERE CONTRACT_ID = $CONTRACT_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи контракта с пользователями public static function DeleteUserLink($CONTRACT_ID, $where="") { $err_mess = (CAdvContract_all::err_mess())."<br>Function: DeleteUserLink<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = "DELETE FROM b_adv_contract_2_user WHERE CONTRACT_ID = $CONTRACT_ID ".$where; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи контракта со временем и днями недели public static function DeleteWeekdayLink($CONTRACT_ID) { $err_mess = (CAdvContract_all::err_mess())."<br>Function: DeleteWeekdayLink<br>Line: "; global $DB; $CONTRACT_ID = intval($CONTRACT_ID); if ($CONTRACT_ID<=0) return false; $strSql = "DELETE FROM b_adv_contract_2_weekday WHERE CONTRACT_ID = $CONTRACT_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } //Получение статистики по контрактам public static function GetStatList($by, $order, $arFilter) { $err_mess = (CAdvBanner::err_mess())."<br>Function: GetDynamicList<br>Line: "; global $DB; $arSqlSearch = Array(); if (CAdvBanner::CheckDynamicFilter($arFilter)) { if (is_array($arFilter)) { $filter_keys = array_keys($arFilter); for ($i=0, $n = count($filter_keys); $i < $n; $i++) { $key = $filter_keys[$i]; $val = $arFilter[$filter_keys[$i]]; if(is_array($val)) { if(count($val)<=0) continue; } else { if( ((string)$val == '') || ("$val"=="NOT_REF") ) continue; } $key = strtoupper($key); switch($key) { case "DATE_1": $arSqlSearch[] = "D.DATE_STAT>=".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE_2": $arSqlSearch[] = "D.DATE_STAT<=".$DB->CharToDateFunction($val." 23:59:59", "FULL"); break; } } \Bitrix\Main\Type\Collection::normalizeArrayValuesByInt($arFilter['CONTRACT_ID']); if (is_array($arFilter['CONTRACT_ID']) && !empty($arFilter['CONTRACT_ID'])) { $where = new CSQLWhere(); $arSqlSearch[] = $where->_NumberIN("C.ID", $arFilter['CONTRACT_ID']); } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); if ($by == "s_date") { $strSqlOrder = " ORDER BY D.DATE_STAT "; } elseif ($by == "s_visitors") { $strSqlOrder = " ORDER BY VISITOR_COUNT "; } elseif ($by == "s_clicks") { $strSqlOrder = " ORDER BY CLICK_COUNT "; } elseif ($by == "s_ctr") { $strSqlOrder = " ORDER BY CTR"; } elseif ($by == "s_show") { $strSqlOrder = " ORDER BY SHOW_COUNT "; } elseif ($by == "s_id") { $strSqlOrder = " ORDER BY C.ID"; } else { $strSqlOrder = " ORDER BY DATE_STAT"; $by = "s_date"; } if ($order!="asc") { $strSqlOrder .= " desc "; } if ($by != "s_date") { $strSqlOrder .= ', DATE_STAT ASC'; } if ($arFilter['CONTRACT_SUMMA'] == 'Y') { $strSql = " SELECT ".$DB->DateToCharFunction("D.DATE_STAT","SHORT")." DATE_STAT, SUM(D.SHOW_COUNT) SHOW_COUNT, SUM(D.CLICK_COUNT) CLICK_COUNT, SUM(D.VISITOR_COUNT) VISITOR_COUNT, " . CAdvBanner::getCTRSQL() . " FROM b_adv_banner_2_day D INNER JOIN b_adv_banner B ON (D.BANNER_ID = B.ID) INNER JOIN b_adv_contract C ON (B.CONTRACT_ID = C.ID) WHERE $strSqlSearch GROUP by DATE_STAT $strSqlOrder "; } else { $strSql = " SELECT ".$DB->DateToCharFunction("D.DATE_STAT","SHORT")." DATE_STAT, SUM(D.SHOW_COUNT) SHOW_COUNT, SUM(D.CLICK_COUNT) CLICK_COUNT, SUM(D.VISITOR_COUNT) VISITOR_COUNT, C.ID, C.NAME CONTRACT_NAME, " . CAdvBanner::getCTRSQL() . " FROM b_adv_banner_2_day D INNER JOIN b_adv_banner B ON (D.BANNER_ID = B.ID) INNER JOIN b_adv_contract C ON (B.CONTRACT_ID = C.ID) WHERE $strSqlSearch GROUP by DATE_STAT, C.ID, C.NAME $strSqlOrder "; } return $DB->Query($strSql, false, $err_mess.__LINE__); } } /***************************************************************** Класс "Рекламный баннер" *****************************************************************/ class CAdvBanner_all { public static function err_mess() { $module_id = "advertising"; return "<br>Module: ".$module_id."<br>Class: CAdvBanner_all<br>File: ".__FILE__; } public static function GetCurUri() { global $strAdvCurUri, $APPLICATION; if ($strAdvCurUri!==false) return $strAdvCurUri; else return $APPLICATION->GetCurUri("", true); } public static function SetCurUri($uri=false) { global $strAdvCurUri; if ($uri!==false) $strAdvCurUri = $uri; } // получим баннер по ID public static function GetByID($BANNER_ID, $CHECK_RIGHTS="Y") { $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arFilter = array( "ID" => $BANNER_ID, "ID_EXACT_MATCH" => "Y" ); $rs = CAdvBanner::GetList("", "", $arFilter, false, $CHECK_RIGHTS); return $rs; } // копирование баннера public static function Copy($BANNER_ID, $CHECK_RIGHTS="Y") { $ID = 0; $rsBanner = CAdvBanner::GetByID($BANNER_ID, $CHECK_RIGHTS); if ($arBanner = $rsBanner->Fetch()) { $arFields = array( "CONTRACT_ID" => $arBanner["CONTRACT_ID"], "TYPE_SID" => $arBanner["TYPE_SID"], "STATUS_SID" => $arBanner["STATUS_SID"], "STATUS_COMMENTS" => $arBanner["STATUS_COMMENTS"], "NAME" => $arBanner["NAME"], "GROUP_SID" => $arBanner["GROUP_SID"], "ACTIVE" => $arBanner["ACTIVE"], "WEIGHT" => $arBanner["WEIGHT"], "MAX_VISITOR_COUNT" => $arBanner["MAX_VISITOR_COUNT"], "RESET_VISITOR_COUNT" => "Y", "SHOWS_FOR_VISITOR" => $arBanner["SHOWS_FOR_VISITOR"], "MAX_SHOW_COUNT" => $arBanner["MAX_SHOW_COUNT"], "RESET_SHOW_COUNT" => "Y", "MAX_CLICK_COUNT" => $arBanner["MAX_CLICK_COUNT"], "RESET_CLICK_COUNT" => $arBanner["RESET_CLICK_COUNT"], "DATE_SHOW_FROM" => $arBanner["DATE_SHOW_FROM"], "DATE_SHOW_TO" => $arBanner["DATE_SHOW_TO"], "IMAGE_ALT" => $arBanner["IMAGE_ALT"], "URL" => $arBanner["URL"], "URL_TARGET" => $arBanner["URL_TARGET"], "NO_URL_IN_FLASH" => $arBanner["NO_URL_IN_FLASH"], "CODE" => $arBanner["CODE"], "CODE_TYPE" => $arBanner["CODE_TYPE"], "FOR_NEW_GUEST" => $arBanner["FOR_NEW_GUEST"], "COMMENTS" => $arBanner["COMMENTS"], "SHOW_USER_GROUP" => $arBanner["SHOW_USER_GROUP"], "arrSHOW_PAGE" => CAdvBanner::GetPageArray($BANNER_ID, "SHOW"), "arrNOT_SHOW_PAGE" => CAdvBanner::GetPageArray($BANNER_ID, "NOT_SHOW"), "STAT_TYPE" => $arBanner["STAT_TYPE"], "arrCOUNTRY" => CAdvBanner::GetCountryArray($BANNER_ID, array("COUNTRY_ID", "REGION", "CITY_ID")), "arrSTAT_ADV" => CAdvBanner::GetStatAdvArray($BANNER_ID), "arrWEEKDAY" => CAdvBanner::GetWeekdayArray($BANNER_ID), "arrSITE" => CAdvBanner::GetSiteArray($BANNER_ID), "arrUSERGROUP" => CAdvBanner::GetGroupArray($BANNER_ID), "KEYWORDS" => $arBanner["KEYWORDS"], "SEND_EMAIL" => "Y", "AD_TYPE" => $arBanner["AD_TYPE"], "FLASH_TRANSPARENT" => $arBanner["FLASH_TRANSPARENT"], "arrFlashIMAGE_ID" => $arBanner["arrFlashIMAGE_ID"], "FLASH_JS" => $arBanner["FLASH_JS"], "FLASH_VER" => $arBanner["FLASH_VER"], "TEMPLATE" => $arBanner["TEMPLATE"] ); if (intval($arBanner["IMAGE_ID"])>0) { $arrIMAGE = CFile::MakeFileArray($arBanner["IMAGE_ID"]); $arrIMAGE["MODULE_ID"] = "advertising"; $arFields["arrIMAGE_ID"] = $arrIMAGE; } if ($arBanner["TEMPLATE_FILES"] && CheckSerializedData($arBanner["TEMPLATE_FILES"])) $arBanner["TEMPLATE_FILES"] = unserialize( htmlspecialchars_decode($arBanner["TEMPLATE_FILES"]), ['allowed_classes' => false] ); else $arBanner["TEMPLATE_FILES"] = array(); $arrTEMPLATE_FILES = array(); foreach ($arBanner["TEMPLATE_FILES"] as $k1 => $v1) { foreach ($v1 as $k2 => $v2) { $arrTEMPLATE_FILES[$k1][$k2] = CFile::MakeFileArray($v2); } } $arFields["TEMPLATE_FILES"] = $arrTEMPLATE_FILES; $ID = CAdvBanner::Set($arFields, 0); } return $ID; } // удаление баннера public static function Delete($BANNER_ID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: Delete<br>Line: "; global $DB, $strError; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "SELECT CONTRACT_ID, IMAGE_ID, TYPE_SID FROM b_adv_banner WHERE ID = '$BANNER_ID'"; $rsBanner = $DB->Query($strSql, false, $err_mess.__LINE__); if ($arBanner = $rsBanner->Fetch()) { $ok = false; if ($CHECK_RIGHTS=="Y") { $arrPERM = CAdvContract::GetUserPermissions($arBanner["CONTRACT_ID"]); $arrPERM = $arrPERM[$arBanner["CONTRACT_ID"]]; if (in_array("ADD", $arrPERM)) $ok = true; } else { $ok = true; } if ($ok) { if (defined('BX_COMP_MANAGED_CACHE')) { $taggedCache = Application::getInstance()->getTaggedCache(); $taggedCache->clearByTag('advertising_banner_type_'.$arBanner['TYPE_SID']); } CFile::Delete($arBanner["IMAGE_ID"]); CAdvBanner::DeleteCountryLink($BANNER_ID); CAdvBanner::DeleteSiteLink($BANNER_ID); CAdvBanner::DeleteStatAdvLink($BANNER_ID); CAdvBanner::DeletePageLink($BANNER_ID); CAdvBanner::DeleteWeekdayLink($BANNER_ID); CAdvBanner::DeleteGroupLink($BANNER_ID); $strSql = "DELETE FROM b_adv_banner_2_day WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); $strSql = "DELETE FROM b_adv_banner WHERE ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } else { $strError .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_BANNER")."<br>"; } } return false; } // удаление связи баннера со временем и днями недели public static function DeleteWeekdayLink($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeleteWeekdayLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_weekday WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи баннера с языками public static function DeleteSiteLink($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeleteSiteLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_site WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи баннера со страной public static function DeleteCountryLink($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeleteCountryLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_country WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи баннера со рекламными кампаниями статистики public static function DeleteStatAdvLink($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeleteStatAdvLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_stat_adv WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // удаление связи баннера со страницами public static function DeletePageLink($BANNER_ID, $where="") { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeletePageLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_page WHERE BANNER_ID = $BANNER_ID ".$where; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } public static function DeleteGroupLink($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: DeleteGroupLink<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $strSql = "DELETE FROM b_adv_banner_2_group WHERE BANNER_ID = $BANNER_ID"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } public static function GetStatusList() { $ref_id = array( "PUBLISHED", "READY", "REJECTED" ); $ref = array( GetMessage("AD_STATUS_PUBLISHED"), GetMessage("AD_STATUS_READY"), GetMessage("AD_STATUS_REJECTED") ); $arr = array("reference_id" => $ref_id, "reference" => $ref); return $arr; } // получаем массив страниц связанных с баннером public static function GetPageArray($BANNER_ID, $SHOW="SHOW") { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetPageArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); $SHOW_ON_PAGE = ($SHOW=="NOT_SHOW") ? "'N'" : "'Y'"; $strSql = " SELECT DISTINCT PAGE FROM b_adv_banner_2_page WHERE BANNER_ID = $BANNER_ID and SHOW_ON_PAGE = $SHOW_ON_PAGE "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["PAGE"]; return $arrRes; } // получаем массив групп пользователей связанных с баннером public static function GetGroupArray($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetGroupArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); $strSql = " SELECT GROUP_ID FROM b_adv_banner_2_group WHERE BANNER_ID = $BANNER_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["GROUP_ID"]; return $arrRes; } // получаем массив языков связанных с баннером public static function GetSiteArray($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetSiteArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); $strSql = " SELECT SITE_ID FROM b_adv_banner_2_site WHERE BANNER_ID = $BANNER_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["SITE_ID"]; return $arrRes; } // получаем массив стран связанных с баннером public static function GetCountryArray($BANNER_ID, $WHAT = "COUNTRY") { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetCountryArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); if(!is_array($WHAT)) { if($WHAT === "CITY") $arSelect = array("COUNTRY_ID", "REGION", "CITY_ID"); elseif($WHAT === "REGION") $arSelect = array("COUNTRY_ID", "REGION"); else $arSelect = array("COUNTRY_ID"); } else { $arSelect = array(); foreach($WHAT as $FIELD) { if($FIELD === "CITY_ID") $arSelect[$FIELD] = $FIELD; elseif($FIELD === "REGION") $arSelect[$FIELD] = $FIELD; elseif($FIELD === "COUNTRY_ID") $arSelect[$FIELD] = $FIELD; } if(count($arSelect) <= 0) $arSelect = array("COUNTRY_ID"); } $strSql = " SELECT DISTINCT ".implode(", ", $arSelect)." FROM b_adv_banner_2_country WHERE BANNER_ID = $BANNER_ID ORDER BY ".implode(", ", $arSelect)." "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while($ar = $rs->Fetch()) { if($WHAT === "COUNTRY") $arrRes[] = $ar["COUNTRY_ID"]; else $arrRes[] = $ar; } return $arrRes; } // получаем массив времени и дней недели связанных с баннером public static function GetWeekdayArray($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetWeekdayArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); $strSql = " SELECT DISTINCT C_WEEKDAY, C_HOUR FROM b_adv_banner_2_weekday WHERE BANNER_ID = $BANNER_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[$ar["C_WEEKDAY"]][] = $ar["C_HOUR"]; return $arrRes; } // получаем массив рекламных кампаний связанных с баннером public static function GetStatAdvArray($BANNER_ID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetStatAdvArray<br>Line: "; global $DB; $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID<=0) return false; $arrRes = array(); $strSql = " SELECT DISTINCT STAT_ADV_ID FROM b_adv_banner_2_stat_adv WHERE BANNER_ID = $BANNER_ID "; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) $arrRes[] = $ar["STAT_ADV_ID"]; return $arrRes; } // проверяем поля при модификации баннера public static function CheckFields($arFields, $BANNER_ID, $CHECK_RIGHTS="Y") { global $strError; $maxLongString = 65534; $str = ""; if ($CHECK_RIGHTS=="Y") { $isAdmin = CAdvContract::IsAdmin(); $isManager = CAdvContract::IsManager(); } else { $isAdmin = true; $isManager = true; } $arrKeys = array_keys($arFields); if (!in_array("CONTRACT_ID", $arrKeys) && $BANNER_ID>0) { $rsBanner = CAdvBanner::GetByID($BANNER_ID, "N"); $arBanner = $rsBanner->Fetch(); $CONTRACT_ID = intval($arBanner["CONTRACT_ID"]); } else { $CONTRACT_ID = intval($arFields["CONTRACT_ID"]); } if (in_array("TEMPLATE", $arrKeys)) { if (mb_strlen($arFields['TEMPLATE']) > $maxLongString) { $str.= GetMessage("AD_ERROR_LONG_STRING")."<br>"; } } if ($CONTRACT_ID>0) { $access = false; if ($isAdmin || $isManager) { $access = true; } else { $arrPERM = CAdvContract::GetUserPermissions($CONTRACT_ID); $arrPERM = $arrPERM[$CONTRACT_ID]; if (in_array("ADD", $arrPERM)) $access = true; } if ($access) { if ($arFields["DATE_SHOW_FROM"] <> '') { if (!CheckDateTime($arFields["DATE_SHOW_FROM"])) $str.= GetMessage("AD_ERROR_WRONG_DATE_SHOW_FROM_BANNER")."<br>"; } if ($arFields["DATE_SHOW_TO"] <> '') { if (!CheckDateTime($arFields["DATE_SHOW_TO"])) $str .= GetMessage("AD_ERROR_WRONG_DATE_SHOW_TO_BANNER")."<br>"; } if (in_array("arrIMAGE_ID", $arrKeys)) { $arIMAGE = $arFields["arrIMAGE_ID"]; $arIMAGE["MODULE_ID"] = "advertising"; $strRes = CFile::CheckImageFile($arIMAGE, 0, 0, 0, array("FLASH", "IMAGE")); if ($strRes <> '') $str .= $strRes."<br>"; } if (in_array("arrFlashIMAGE_ID", $arrKeys)) { $arIMAGE = $arFields["arrFlashIMAGE_ID"]; $arIMAGE["MODULE_ID"] = "advertising"; $strRes = CFile::CheckImageFile($arIMAGE, 0, 0, 0, array("IMAGE")); if ($strRes <> '') $str .= $strRes."<br>"; } if (in_array("TEMPLATE_FILES", $arrKeys) && is_array($arFields["TEMPLATE_FILES"])) { foreach ($arFields["TEMPLATE_FILES"] as $unit) { if (is_array($unit)) { foreach ($unit as $file) { $file["MODULE_ID"] = "advertising"; $strRes = CAdvBanner_all::CheckFile($file, 0, 0, 0, array("IMAGE", "VIDEO")); if ($strRes <> '') $str .= $strRes."<br>"; } } } } if ($arFields["FLYUNIFORM"] == "Y") { if ($arFields["DATE_SHOW_FROM"] == '' or $arFields["DATE_SHOW_TO"] == '') $str .= GetMessage("AD_ERROR_FROMTO_DATE_HAVETOBE_SET")."<br>"; if ($arFields["FIX_SHOW"] != "Y") $str .= GetMessage("AD_ERROR_FIXSHOW_HAVETOBE_SET")."<br>"; if (intval($arFields["MAX_SHOW_COUNT"])<=0) $str .= GetMessage("AD_ERROR_MAX_SHOW_COUNT_HAVETOBE_SET")."<br>"; } } else { if ($BANNER_ID>0) $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_BANNER")."<br>"; else $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_CONTRACT")."<br>"; } } else { $str .= GetMessage("AD_ERROR_INCORRECT_CONTRACT_ID")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } public static function CheckFile($arFile, $iMaxSize=0, $iMaxWidth=0, $iMaxHeight=0, $access_typies=array(), $bForceMD5=false, $bSkipExt=false) { if ($arFile["name"] == "") { return ""; } if (preg_match("#^php://filter#i", $arFile["tmp_name"])) { return GetMessage("FILE_BAD_FILE_TYPE").".<br>"; } $extension = GetFileExtension(mb_strtolower($arFile["name"])); switch ($extension) { case "jpg": case "jpeg": case "gif": case "bmp": case "png": $file_type = "IMAGE"; break; case "swf": $file_type = "FLASH"; break; case "mp4": case "webm": case "ogg": $file_type = "VIDEO"; break; default: $file_type = "UNKNOWN"; } // IMAGE by default $flashEnabled = false; if(!in_array($file_type, $access_typies)) { $file_type = "IMAGE"; } if ($file_type == "FLASH") { $flashEnabled = true; static $flashMime = array("application/x-shockwave-flash", "application/vnd.adobe.flash.movie"); $res = CFile::CheckFile($arFile, $iMaxSize, $flashMime, CFile::GetFlashExtensions(), $bForceMD5, $bSkipExt); } else if ($file_type == "VIDEO") { $res = CFile::CheckFile($arFile, $iMaxSize, "video/", "mp4,webm,ogg", $bForceMD5, $bSkipExt); } else { $res = CFile::CheckFile($arFile, $iMaxSize, "image/", CFile::GetImageExtensions(), $bForceMD5, $bSkipExt); } if($res <> '') { return $res; } if ($file_type == 'IMAGE' || $file_type == "FLASH") { $imgArray = CFile::GetImageSize($arFile["tmp_name"], true, $flashEnabled); if(is_array($imgArray)) { $intWIDTH = $imgArray[0]; $intHEIGHT = $imgArray[1]; } else { return GetMessage("FILE_BAD_FILE_TYPE").".<br>"; } //check for dimensions if($iMaxWidth > 0 && ($intWIDTH > $iMaxWidth || $intWIDTH == 0) || $iMaxHeight > 0 && ($intHEIGHT > $iMaxHeight || $intHEIGHT == 0)) { return GetMessage("FILE_BAD_MAX_RESOLUTION")." (".$iMaxWidth." * ".$iMaxHeight." ".GetMessage("main_include_dots").").<br>"; } } return null; } public static function makeFileArray($data, $del = false, $description = null, $options = array()) { $emptyFile = array( "name" => null, "type" => null, "tmp_name" => null, "error" => 4, "size" => 0, ); if ($del) { $result = $emptyFile; $result["del"] = "Y"; } elseif (is_null($data)) { $result = $emptyFile; } elseif (is_numeric($data)) { $result = self::makeFileArrayFromId($data, $description, $options); if ($result === false) $result = $emptyFile; } elseif (is_string($data)) { $result = self::makeFileArrayFromPath($data, $description, $options); if ($result === false) $result = $emptyFile; } elseif (is_array($data)) { $result = self::makeFileArrayFromArray($data, $description, $options); if ($result === false) $result = $emptyFile; } else { $result = $emptyFile; } return $result; } private static function makeFileArrayFromId($file_id, $description = null, $options = array()) { $result = false; $result = CFile::MakeFileArray($file_id); if (is_array($result)) { if (!is_null($description)) $result["description"] = $description; } return $result; } private static function makeFileArrayFromPath($file_path, $description = null, $options = array()) { /** @global CMain $APPLICATION */ global $APPLICATION; $result = false; if (preg_match("/^https?:\\/\\//", $file_path)) { $result = CFile::MakeFileArray($file_path); } else { $io = CBXVirtualIo::GetInstance(); $normPath = $io->CombinePath("/", $file_path); $absPath = $io->CombinePath($_SERVER["DOCUMENT_ROOT"], $normPath); if ($io->ValidatePathString($absPath) && $io->FileExists($absPath)) { $perm = $APPLICATION->GetFileAccessPermission($normPath); if ($perm >= "W") $result = CFile::MakeFileArray($io->GetPhysicalName($absPath)); } } if (is_array($result)) { if (!is_null($description)) $result["description"] = $description; } return $result; } private static function makeFileArrayFromArray($file_array, $description = null, $options = array()) { $result = false; if (is_uploaded_file($file_array["tmp_name"])) { $result = $file_array; if (!is_null($description)) $result["description"] = $description; } elseif ( $file_array["tmp_name"] <> '' && mb_strpos($file_array["tmp_name"], CTempFile::GetAbsoluteRoot()) === 0 ) { $io = CBXVirtualIo::GetInstance(); $absPath = $io->CombinePath("/", $file_array["tmp_name"]); $tmpPath = CTempFile::GetAbsoluteRoot()."/"; if (mb_strpos($absPath, $tmpPath) === 0 || (($absPath = ltrim($absPath, "/")) && mb_strpos($absPath, $tmpPath) === 0)) { $result = $file_array; $result["tmp_name"] = $absPath; $result["error"] = intval($result["error"]); if (!is_null($description)) $result["description"] = $description; } } elseif ($file_array["tmp_name"] <> '') { $io = CBXVirtualIo::GetInstance(); $normPath = $io->CombinePath("/", $file_array["tmp_name"]); $absPath = $io->CombinePath(CTempFile::GetAbsoluteRoot(), $normPath); $tmpPath = CTempFile::GetAbsoluteRoot()."/"; if (mb_strpos($absPath, $tmpPath) === 0 && $io->FileExists($absPath) || ($absPath = $io->CombinePath($_SERVER["DOCUMENT_ROOT"], $normPath)) && mb_strpos($absPath, $tmpPath) === 0) { $result = $file_array; $result["tmp_name"] = $absPath; $result["error"] = intval($result["error"]); if (!is_null($description)) $result["description"] = $description; } } else { $emptyFile = array( "name" => null, "type" => null, "tmp_name" => null, "error" => 4, "size" => 0, ); if ($file_array == $emptyFile) { $result = $emptyFile; if (!is_null($description)) $result["description"] = $description; } } return $result; } // добавляем новый баннер или модифицируем существующий public static function Set($arFields, $BANNER_ID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: Set<br>Line: "; global $DB, $USER, $APPLICATION, $strError; $BANNER_ID = intval($BANNER_ID); if (CAdvBanner::CheckFields($arFields, $BANNER_ID, $CHECK_RIGHTS)) { if ($CHECK_RIGHTS=="Y") { $USER_ID = intval($USER->GetID()); $isAdmin = CAdvContract::IsAdmin(); $isManager = CAdvContract::IsManager(); $CHECK_CONTRACT_RIGHTS = "Y"; if ($isManager) $CHECK_CONTRACT_RIGHTS = "N"; } else { $USER_ID = 0; $isAdmin = $isManager = true; $CHECK_CONTRACT_RIGHTS = "N"; } if ($BANNER_ID <= 0) $events = GetModuleEvents("advertising", "OnBeforeBannerAdd", true); else $events = GetModuleEvents("advertising", "OnBeforeBannerUpdate", true); foreach ($events as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) { if ($err = $APPLICATION->GetException()) $strError .= $err->GetString()."<br />"; else $strError .= GetMessage("AD_ERROR_ON_HANDLER", array ("#HANDLER#" => $arEvent['MESSAGE_ID']))."<br />"; return false; } } $arFields_i = array(); $arrKeys = array_keys($arFields); $arBanner = array(); if ($BANNER_ID>0) { $rsBanner = CAdvBanner::GetByID($BANNER_ID, $CHECK_RIGHTS); $arBanner = $rsBanner->Fetch(); if (!in_array("CONTRACT_ID", $arrKeys)) $CONTRACT_ID = intval($arBanner["CONTRACT_ID"]); else $CONTRACT_ID = intval($arFields["CONTRACT_ID"]); } else { $CONTRACT_ID = intval($arFields["CONTRACT_ID"]); } $modify_status = "N"; if ($CONTRACT_ID>0) { if ($BANNER_ID<=0 && (!$isAdmin || !$isManager || in_array("STATUS_SID", $arrKeys))) $modify_status = "Y"; $rsContract = CAdvContract::GetByID($CONTRACT_ID, $CHECK_CONTRACT_RIGHTS); $arContract = $rsContract->Fetch(); if (($isAdmin || $isManager) && in_array("RESET_VISITOR_COUNT", $arrKeys) && $arFields["RESET_VISITOR_COUNT"]) { $arFields_i["VISITOR_COUNT"] = 0; // если баннер уже показывался то if (intval($arBanner["VISITOR_COUNT"])>0) { // уменьшим счетчик у контракта $value = intval($arContract["VISITOR_COUNT"]) - intval($arBanner["VISITOR_COUNT"]); $value = ($value<0) ? 0 : $value; CAdvContract::Set(array("VISITOR_COUNT" => $value), $arContract["ID"], $CHECK_CONTRACT_RIGHTS); } } if (($isAdmin || $isManager) && in_array("RESET_SHOW_COUNT", $arrKeys) && $arFields["RESET_SHOW_COUNT"]) { $arFields_i["SHOW_COUNT"] = 0; // если баннер уже показывался то if (intval($arBanner["SHOW_COUNT"])>0) { // уменьшим счетчик у контракта $value = intval($arContract["SHOW_COUNT"]) - intval($arBanner["SHOW_COUNT"]); $value = ($value<0) ? 0 : $value; CAdvContract::Set(array("SHOW_COUNT" => $value), $arContract["ID"], $CHECK_CONTRACT_RIGHTS); } } if (($isAdmin || $isManager) && in_array("FIX_SHOW", $arrKeys) && ($arFields["FIX_SHOW"]=="Y" || $arFields["FIX_SHOW"]=="N")) $arFields_i["FIX_SHOW"] = "'".$arFields["FIX_SHOW"]."'"; if (($isAdmin || $isManager) && in_array("FLYUNIFORM", $arrKeys) && ($arFields["FLYUNIFORM"]=="Y" || $arFields["FLYUNIFORM"]=="N")) $arFields_i["FLYUNIFORM"] = "'".$arFields["FLYUNIFORM"]."'"; if (($isAdmin || $isManager) && in_array("RESET_CLICK_COUNT", $arrKeys) && $arFields["RESET_CLICK_COUNT"]) { $arFields_i["CLICK_COUNT"] = 0; // если на баннер уже кликали то if (intval($arBanner["CLICK_COUNT"])>0) { // уменьшим счетчик у контракта $value = intval($arContract["CLICK_COUNT"]) - intval($arBanner["CLICK_COUNT"]); $value = ($value<0) ? 0 : $value; CAdvContract::Set(array("CLICK_COUNT" => $value), $arContract["ID"], $CHECK_CONTRACT_RIGHTS); } } if (($isAdmin || $isManager) && in_array("KEYWORDS", $arrKeys)) $arFields_i["KEYWORDS"] = "'".$DB->ForSql($arFields["KEYWORDS"], 2000)."'";; if (in_array("CONTRACT_ID", $arrKeys) && intval($arFields["CONTRACT_ID"])>0) $arFields_i["CONTRACT_ID"] = intval($arFields["CONTRACT_ID"]); if (in_array("TYPE_SID", $arrKeys) && $arFields["TYPE_SID"] <> '') { $arFields_i["TYPE_SID"] = "'".$DB->ForSql($arFields["TYPE_SID"],255)."'"; if ("'".$DB->ForSql($arBanner["TYPE_SID"],255)."'"!=$arFields_i["TYPE_SID"]) $modify_status = "Y"; } if (in_array("NAME", $arrKeys)) $arFields_i["NAME"] = "'".$DB->ForSql($arFields["NAME"],255)."'"; if (in_array("GROUP_SID", $arrKeys)) $arFields_i["GROUP_SID"] = "'".$DB->ForSql($arFields["GROUP_SID"],255)."'"; if (in_array("ACTIVE", $arrKeys) && ($arFields["ACTIVE"]=="Y" || $arFields["ACTIVE"]=="N")) $arFields_i["ACTIVE"] = "'".$arFields["ACTIVE"]."'"; if (in_array("WEIGHT", $arrKeys)) $arFields_i["WEIGHT"] = intval($arFields["WEIGHT"]); if (in_array("MAX_VISITOR_COUNT", $arrKeys)) { if ($arFields["MAX_VISITOR_COUNT"] <> '') $arFields_i["MAX_VISITOR_COUNT"] = intval($arFields["MAX_VISITOR_COUNT"]); else $arFields_i["MAX_VISITOR_COUNT"] = "null"; } if (in_array("SHOWS_FOR_VISITOR", $arrKeys)) { if ($arFields["SHOWS_FOR_VISITOR"] <> '') $arFields_i["SHOWS_FOR_VISITOR"] = intval($arFields["SHOWS_FOR_VISITOR"]); else $arFields_i["SHOWS_FOR_VISITOR"] = "null"; } if (in_array("MAX_SHOW_COUNT", $arrKeys)) { if ($arFields["MAX_SHOW_COUNT"] <> '') $arFields_i["MAX_SHOW_COUNT"] = intval($arFields["MAX_SHOW_COUNT"]); else $arFields_i["MAX_SHOW_COUNT"] = "null"; } if (in_array("MAX_CLICK_COUNT", $arrKeys)) { if ($arFields["MAX_CLICK_COUNT"] <> '') $arFields_i["MAX_CLICK_COUNT"] = intval($arFields["MAX_CLICK_COUNT"]); else $arFields_i["MAX_CLICK_COUNT"] = "null"; } if (in_array("DATE_SHOW_FROM", $arrKeys)) { if ($arFields["DATE_SHOW_FROM"] <> '') $arFields_i["DATE_SHOW_FROM"] = $DB->CharToDateFunction($arFields["DATE_SHOW_FROM"]); else $arFields_i["DATE_SHOW_FROM"] = "null"; } if (in_array("DATE_SHOW_TO", $arrKeys)) { if ($arFields["DATE_SHOW_TO"] <> '') { $time = ""; if(defined("FORMAT_DATE") && mb_strlen($arFields["DATE_SHOW_TO"]) <= mb_strlen(FORMAT_DATE)) { $time = " 23:59:59"; } $arFields_i["DATE_SHOW_TO"] = $DB->CharToDateFunction($arFields["DATE_SHOW_TO"].$time); } else { $arFields_i["DATE_SHOW_TO"] = "null"; } } if (in_array("DATE_SHOW_FIRST", $arrKeys)) $arFields_i["DATE_SHOW_FIRST"] = "null"; if (in_array("arrIMAGE_ID", $arrKeys) && is_array($arFields["arrIMAGE_ID"])) { $arIMAGE = $arFields["arrIMAGE_ID"]; $arIMAGE["MODULE_ID"] = "advertising"; if ($BANNER_ID>0) { $z = $DB->Query("SELECT IMAGE_ID FROM b_adv_banner WHERE ID='$BANNER_ID'", false, $err_mess.__LINE__); $zr = $z->Fetch(); $arIMAGE["old_file"] = $zr["IMAGE_ID"]; } if ($arIMAGE["name"] <> '' || $arIMAGE["del"] <> '') { $subdir = COption::GetOptionString("advertising", "UPLOAD_SUBDIR"); $fid = CFile::SaveFile($arIMAGE, $subdir); if (intval($fid)>0) { $arFields_i["IMAGE_ID"] = intval($fid); } else { $arFields_i["IMAGE_ID"] = "null"; } if (intval($arBanner["IMAGE_ID"])!=intval($arFields_i["IMAGE_ID"])) { $modify_status = "Y"; } } } if (in_array("TEMPLATE_FILES", $arrKeys) && is_array($arFields["TEMPLATE_FILES"])) { if ($BANNER_ID>0) { $z = $DB->Query("SELECT TEMPLATE_FILES FROM b_adv_banner WHERE ID='$BANNER_ID'", false, $err_mess.__LINE__); $zr = $z->Fetch(); if (CheckSerializedData($zr['TEMPLATE_FILES'])) $zr = unserialize($zr['TEMPLATE_FILES'], ['allowed_classes' => false]); else $zr = array(); } $subdir = COption::GetOptionString("advertising", "UPLOAD_SUBDIR"); $arTemplateFiles = array(); $cnt = 0; foreach ($arFields["TEMPLATE_FILES"] as $tfk => $tfv) { if (is_array($tfv)) { foreach($tfv as $k => $arFile) { $arFile["MODULE_ID"] = "advertising"; if(isset($zr[$arFile['lastKey']][$k])) $arFile["old_file"] = $zr[$arFile['lastKey']][$k]; if ($arFile["name"] <> '' || $arFile["description"] <> '' || isset($arFile["del"]) && $arFile["del"] <> '') { $fid = CFile::SaveFile($arFile, $subdir); if ($fid === false && $arFile["description"] <> '' && $arFile["old_file"] <> '') { $arTemplateFiles[$cnt][$k] = intval($arFile["old_file"]); continue; } if (intval($fid)>0) { $arTemplateFiles[$cnt][$k] = intval($fid); } else { $arTemplateFiles[$cnt][$k] = "null"; } if (intval($zr[$arFile['lastKey']][$k]) != intval($arTemplateFiles[$cnt][$k])) { $modify_status = "Y"; } } else { $arTemplateFiles[$cnt][$k] = $zr[$arFile['lastKey']][$k]; } } } $cnt++; } $arFields_i["TEMPLATE_FILES"] = "'".$DB->ForSql(serialize($arTemplateFiles),2000)."'"; } if (in_array("IMAGE_ALT", $arrKeys)) { $arFields_i["IMAGE_ALT"] = "'".$DB->ForSql($arFields["IMAGE_ALT"],255)."'"; if ("'".$DB->ForSql($arBanner["IMAGE_ALT"],255)."'"!=$arFields_i["IMAGE_ALT"]) { $modify_status = "Y"; } } if (in_array("URL", $arrKeys)) { $arFields_i["URL"] = "'".$DB->ForSql($arFields["URL"])."'"; if ("'".$DB->ForSql($arBanner["URL"],2000)."'" != $arFields_i["URL"]) { $modify_status = "Y"; } } if (in_array("URL_TARGET", $arrKeys)) { $arFields_i["URL_TARGET"] = "'".$DB->ForSql($arFields["URL_TARGET"], 255)."'"; if ("'".$DB->ForSql($arBanner["URL_TARGET"], 255)."'" != $arFields_i["URL_TARGET"]) { $modify_status = "Y"; } } if (in_array("NO_URL_IN_FLASH", $arrKeys) && ($arFields["NO_URL_IN_FLASH"]=="Y" || $arFields["NO_URL_IN_FLASH"]=="N")) { $arFields_i["NO_URL_IN_FLASH"] = "'".$arFields["NO_URL_IN_FLASH"]."'"; if ($arBanner["NO_URL_IN_FLASH"]!=$arFields_i["NO_URL_IN_FLASH"]) { $modify_status = "Y"; } } if (in_array("CODE", $arrKeys)) { $arFields_i["CODE"] = $arFields["CODE"]; if ($arBanner["CODE"] != $arFields_i["CODE"]) { $modify_status = "Y"; } } if (in_array("FLASH_JS", $arrKeys) && ($arFields["FLASH_JS"]=="Y" || $arFields["FLASH_JS"]=="N")) { $arFields_i["FLASH_JS"] = "'".$arFields["FLASH_JS"]."'"; if ("'" . $arBanner["FLASH_JS"] . "'" != $arFields_i["FLASH_JS"]) { $modify_status = "Y"; } } if (in_array("FLASH_VER", $arrKeys)) { $arFields_i["FLASH_VER"] = "'".$DB->ForSQL($arFields["FLASH_VER"], 20)."'"; if ("'".$DB->ForSQL($arBanner["FLASH_VER"], 20)."'" != $arFields_i["FLASH_VER"]) { $modify_status = "Y"; } } if (in_array("arrFlashIMAGE_ID", $arrKeys) && is_array($arFields["arrFlashIMAGE_ID"])) { $arrFlashIMAGE = $arFields["arrFlashIMAGE_ID"]; $arrFlashIMAGE["MODULE_ID"] = "advertising"; if ($BANNER_ID>0) { $z = $DB->Query("SELECT FLASH_IMAGE FROM b_adv_banner WHERE ID='$BANNER_ID'", false, $err_mess.__LINE__); if($zr = $z->Fetch()) { $arrFlashIMAGE["old_file"] = $zr["FLASH_IMAGE"]; } } if ($arrFlashIMAGE["name"] <> '' || $arrFlashIMAGE["del"] <> '') { $subdir = COption::GetOptionString("advertising", "UPLOAD_SUBDIR"); $fid = CFile::SaveFile($arrFlashIMAGE, $subdir); if (intval($fid)>0) $arFields_i["FLASH_IMAGE"] = intval($fid); else $arFields_i["FLASH_IMAGE"] = "null"; if (intval($arBanner["FLASH_IMAGE"])!=intval($arFields_i["FLASH_IMAGE"])) { $modify_status = "Y"; } } } if (in_array("AD_TYPE", $arrKeys)) { $arFields_i["AD_TYPE"] = "'".$DB->ForSql($arFields["AD_TYPE"],20)."'"; if ("'".$DB->ForSql($arBanner["AD_TYPE"], 20)."'"!=$arFields_i["AD_TYPE"]) { $modify_status = "Y"; } } if (in_array("TEMPLATE", $arrKeys)) { $arFields_i["TEMPLATE"] = CAdvBanner::addBindField($arFields["TEMPLATE"], $arBanner["TEMPLATE"], $modify_status); } if (in_array("FLASH_TRANSPARENT", $arrKeys)) { $arFields_i["FLASH_TRANSPARENT"] = "'".$DB->ForSql($arFields["FLASH_TRANSPARENT"],11)."'"; if ("'".$DB->ForSql($arBanner["FLASH_TRANSPARENT"],11)."'"!=$arFields_i["FLASH_TRANSPARENT"]) { $modify_status = "Y"; } } if (in_array("CODE_TYPE", $arrKeys)) { $arFields_i["CODE_TYPE"] = ($arFields["CODE_TYPE"]=="text") ? "'text'" : "'html'"; $value = ($arBanner["CODE_TYPE"]=="text") ? "'text'" : "'html'"; if ($value!=$arFields_i["CODE_TYPE"]) { $modify_status = "Y"; } } if (in_array("FOR_NEW_GUEST", $arrKeys)) { if ($arFields["FOR_NEW_GUEST"]=="Y" || $arFields["FOR_NEW_GUEST"]=="N") { $arFields_i["FOR_NEW_GUEST"] = "'".$arFields["FOR_NEW_GUEST"]."'"; } elseif ($arFields["FOR_NEW_GUEST"]=="NOT_REF" || $arFields["FOR_NEW_GUEST"]=="ALL" || $arFields["FOR_NEW_GUEST"] == '') { $arFields_i["FOR_NEW_GUEST"] = "null"; } } if (in_array("COMMENTS", $arrKeys)) $arFields_i["COMMENTS"] = "'".$DB->ForSql($arFields["COMMENTS"],2000)."'"; if (($isAdmin || $isManager) && in_array("STATUS_COMMENTS", $arrKeys)) { $arFields_i["STATUS_COMMENTS"] = "'".$DB->ForSql($arFields["STATUS_COMMENTS"],2000)."'"; } $email_notify = "N"; if ($modify_status=="Y" || (in_array("STATUS_SID", $arrKeys) && ($isAdmin || $isManager))) { $new_status = ($isAdmin || $isManager) ? $arFields["STATUS_SID"] : $arContract["DEFAULT_STATUS_SID"]; $arFields_i["STATUS_SID"] = "'".$DB->ForSql($new_status,255)."'"; // если статус изменился то if ("'".$DB->ForSql($arBanner["STATUS_SID"],255)."'"!=$arFields_i["STATUS_SID"]) { $email_notify = "Y"; } } if (in_array("arrSITE", $arrKeys)) { $arFields_i["FIRST_SITE_ID"] = "''"; if (is_array($arFields["arrSITE"])) { $arrSITE = array_unique($arFields["arrSITE"]); reset($arrSITE); $site_id = current($arrSITE); $arFields_i["FIRST_SITE_ID"] = "'".$DB->ForSql($site_id,2)."'"; } } if (in_array("SHOW_USER_GROUP", $arrKeys)) { if($arFields["SHOW_USER_GROUP"] == "Y" && (in_array("arrUSERGROUP", $arrKeys) && count($arFields["arrUSERGROUP"])>0)) $SHOW_USER_GROUP = "Y"; else $SHOW_USER_GROUP = "N"; $arFields_i["SHOW_USER_GROUP"] = "'".$DB->ForSql($SHOW_USER_GROUP,1)."'"; } if (in_array("STAT_TYPE", $arrKeys)) { if($arFields["STAT_TYPE"] === "CITY") $arFields_i["STAT_TYPE"] = "'CITY'"; elseif($arFields["STAT_TYPE"] === "REGION") $arFields_i["STAT_TYPE"] = "'REGION'"; else $arFields_i["STAT_TYPE"] = "'COUNTRY'"; } if (intval($BANNER_ID)>0) { if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER_ID; CAdvBanner::Update($arFields_i, $BANNER_ID); } else { if (in_array("DATE_CREATE", $arrKeys) && CheckDateTime($arFields["DATE_CREATE"])) $arFields_i["DATE_CREATE"] = $DB->CharToDateFunction($arFields["DATE_CREATE"]); else $arFields_i["DATE_CREATE"] = $DB->GetNowFunction(); if (in_array("CREATED_BY", $arrKeys)) $arFields_i["CREATED_BY"] = intval($arFields["CREATED_BY"]); else $arFields_i["CREATED_BY"] = $USER_ID; if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER_ID; $BANNER_ID = CAdvBanner::Add($arFields_i); } if (defined('BX_COMP_MANAGED_CACHE')) { $taggedCache = Application::getInstance()->getTaggedCache(); $taggedCache->clearByTag('advertising_banner_type_'.$arFields['TYPE_SID']); } $BANNER_ID = intval($BANNER_ID); if ($BANNER_ID>0) { if (in_array("arrSITE", $arrKeys)) { CAdvBanner::DeleteSiteLink($BANNER_ID); if (is_array($arFields["arrSITE"])) { $arrSITE = array_unique($arFields["arrSITE"]); reset($arrSITE); foreach($arrSITE as $sid) { if (trim($sid) <> '') { $strSql = "INSERT INTO b_adv_banner_2_site (BANNER_ID, SITE_ID) VALUES ($BANNER_ID, '".$DB->ForSql($sid, 2)."')"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } if (in_array("arrSHOW_PAGE", $arrKeys)) { CAdvBanner::DeletePageLink($BANNER_ID, " and SHOW_ON_PAGE='Y'"); if (is_array($arFields["arrSHOW_PAGE"])) { $arrPage = array_unique($arFields["arrSHOW_PAGE"]); foreach($arrPage as $page) { $page = trim($page); if ($page <> '') { $arFields_i = array( "BANNER_ID" => $BANNER_ID, "PAGE" => "'".$DB->ForSql($page, 255)."'", "SHOW_ON_PAGE" => "'Y'" ); $DB->Insert("b_adv_banner_2_page",$arFields_i, $err_mess.__LINE__); } } } } if (in_array("arrNOT_SHOW_PAGE", $arrKeys)) { CAdvBanner::DeletePageLink($BANNER_ID, " and SHOW_ON_PAGE='N'"); if (is_array($arFields["arrNOT_SHOW_PAGE"])) { $arrPage = array_unique($arFields["arrNOT_SHOW_PAGE"]); foreach($arrPage as $page) { $page = trim($page); if ($page <> '') { $arFields_i = array( "BANNER_ID" => $BANNER_ID, "PAGE" => "'".$DB->ForSql($page, 255)."'", "SHOW_ON_PAGE" => "'N'" ); $DB->Insert("b_adv_banner_2_page",$arFields_i, $err_mess.__LINE__); } } } } if (in_array("arrCOUNTRY", $arrKeys)) { $iCounter = 0; CAdvBanner::DeleteCountryLink($BANNER_ID); if (is_array($arFields["arrCOUNTRY"])) { $arrCOUNTRY = array(); foreach($arFields["arrCOUNTRY"] as $COUNTRY) { if(is_array($COUNTRY)) { $COUNTRY["COUNTRY_ID"] = trim($COUNTRY["COUNTRY_ID"]); if($COUNTRY["COUNTRY_ID"] == '') continue; $key = $COUNTRY["COUNTRY_ID"]."|".$COUNTRY["REGION"]."|".$COUNTRY["CITY_ID"]; $strInsert = "'".$DB->ForSQL($COUNTRY["COUNTRY_ID"], 2)."', ".($COUNTRY["REGION"] == ''? "null": "'".$DB->ForSQL($COUNTRY["REGION"], 200)."'").", ".(intval($COUNTRY["CITY_ID"]) <= 0? "null": intval($COUNTRY["CITY_ID"])).""; } else { $COUNTRY = trim($COUNTRY); if($COUNTRY == '') continue; $key = $COUNTRY."||"; $strInsert = "'".$DB->ForSQL($COUNTRY, 2)."', null, null"; } $arrCOUNTRY[$key] = $strInsert; } foreach($arrCOUNTRY as $strInsert) { $strSql = "INSERT INTO b_adv_banner_2_country (BANNER_ID, COUNTRY_ID, REGION, CITY_ID) VALUES ($BANNER_ID, ".$strInsert.")"; $DB->Query($strSql, false, $err_mess.__LINE__); $iCounter++; } } $DB->Query("UPDATE b_adv_banner SET STAT_COUNT = ".$iCounter." WHERE ID = ".$BANNER_ID); } if (in_array("arrSTAT_ADV", $arrKeys)) { CAdvBanner::DeleteStatAdvLink($BANNER_ID); if (is_array($arFields["arrSTAT_ADV"])) { $arrSTAT_ADV = array_unique($arFields["arrSTAT_ADV"]); foreach($arrSTAT_ADV as $aid) { if (intval($aid)>0) { $strSql = "INSERT INTO b_adv_banner_2_stat_adv (BANNER_ID, STAT_ADV_ID) VALUES ($BANNER_ID, '".intval($aid)."')"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } if (in_array("arrWEEKDAY", $arrKeys)) { CAdvBanner::DeleteWeekdayLink($BANNER_ID); if (is_array($arFields["arrWEEKDAY"])) { $arrWeekday = array_keys($arFields["arrWEEKDAY"]); $arrWeekday = array_unique($arrWeekday); if (is_array($arrWeekday) && count($arrWeekday)>0) { foreach ($arrWeekday as $weekday) { if (is_array($arFields["arrWEEKDAY"][$weekday]) && count($arFields["arrWEEKDAY"][$weekday])>0) { $arrHour = $arFields["arrWEEKDAY"][$weekday]; array_walk( $arrHour, function (&$item) { $item = (int)$item; } ); $arrHour = array_unique($arrHour); foreach($arrHour as $hour) { if ($hour>=0 && $hour<=23) { $strSql = "INSERT INTO b_adv_banner_2_weekday (BANNER_ID, C_WEEKDAY, C_HOUR) VALUES ($BANNER_ID, '".$DB->ForSql($weekday, 10)."', $hour)"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } } } } if (in_array("arrUSERGROUP", $arrKeys)) { CAdvBanner::DeleteGroupLink($BANNER_ID); if (is_array($arFields["arrUSERGROUP"])) { $arrGROUPS = array_unique($arFields["arrUSERGROUP"]); foreach($arrGROUPS as $uid) { if (intval($uid)>0) { $strSql = "INSERT INTO b_adv_banner_2_group (BANNER_ID, GROUP_ID) VALUES ($BANNER_ID, ".intval($uid).")"; $DB->Query($strSql, false, $err_mess.__LINE__); } } } } // если необходимо оповестить $SEND_EMAIL = $arFields["SEND_EMAIL"] == "N" ? "N" : "Y"; if ($email_notify == "Y" && (!$isAdmin || !$isManager || $SEND_EMAIL == "Y")) { // получаем данные по баннеру CTimeZone::Disable(); $rsBanner = CAdvBanner::GetByID($BANNER_ID, $CHECK_RIGHTS); CTimeZone::Enable(); if ($arBanner=$rsBanner->Fetch()) { $BCC = array(); $OWNER_EMAIL = array(); $ADD_EMAIL = array(); $STAT_EMAIL = array(); $EDIT_EMAIL = array(); $MANAGER_EMAIL = CAdvContract::GetManagerEmails(); $ADMIN_EMAIL = CAdvContract::GetAdminEmails(); $ADMIN_EMAIL = array_merge($MANAGER_EMAIL, $ADMIN_EMAIL); $ADMIN_EMAIL = array_unique($ADMIN_EMAIL); CAdvContract::GetOwnerEmails($CONTRACT_ID, $OWNER_EMAIL, $ADD_EMAIL, $STAT_EMAIL, $EDIT_EMAIL); $CREATED_BY = $MODIFIED_BY = 0; if (intval($arBanner["CREATED_BY"])>0) { $rsUser = CUser::GetByID($arBanner["CREATED_BY"]); if ($arUser = $rsUser->Fetch()) { $CREATED_BY = "[".$arUser["ID"]."] (".$arUser["LOGIN"].") ".$arUser["NAME"]." ".$arUser["LAST_NAME"]; } } if (intval($arBanner["MODIFIED_BY"])==intval($arBanner["CREATED_BY"]) && intval($arBanner["CREATED_BY"])>0) { $MODIFIED_BY = $CREATED_BY; } elseif (intval($arBanner["MODIFIED_BY"])>0) { $rsUser = CUser::GetByID($arBanner["MODIFIED_BY"]); if ($arUser = $rsUser->Fetch()) { $MODIFIED_BY = "[".$arUser["ID"]."] (".$arUser["LOGIN"].") ".$arUser["NAME"]." ".$arUser["LAST_NAME"]; } } $arImage = CFile::GetFileArray($arBanner["IMAGE_ID"]); if ($arImage) $IMAGE_LINK = CHTTP::URN2URI($arImage["SRC"]); else $IMAGE_LINK = ""; $arImage = CFile::GetFileArray($arBanner["FLASH_IMAGE"]); if ($arImage) $FLASHIMAGE_LINK = CHTTP::URN2URI($arImage["SRC"]); else $FLASHIMAGE_LINK = ""; $EMAIL_TO = $OWNER_EMAIL; if (count($EMAIL_TO)<=0) { $EMAIL_TO = $ADMIN_EMAIL; } else $BCC = $ADMIN_EMAIL; $arEventFields = array( "ID" => $arBanner["ID"], "EMAIL_TO" => implode(",", $EMAIL_TO), "ADMIN_EMAIL" => implode(",", $ADMIN_EMAIL), "ADD_EMAIL" => implode(",", $ADD_EMAIL), "STAT_EMAIL" => implode(",", $STAT_EMAIL), "EDIT_EMAIL" => implode(",", $EDIT_EMAIL), "OWNER_EMAIL" => implode(",", $OWNER_EMAIL), "BCC" => implode(",", $BCC), "CONTRACT_ID" => $CONTRACT_ID, "CONTRACT_NAME" => $arContract["NAME"], "TYPE_SID" => $arBanner["TYPE_SID"], "TYPE_NAME" => $arBanner["TYPE_NAME"], "STATUS" => ( ( $arBanner["STATUS_SID"] <> '' ) ? GetMessage( "AD_STATUS_" . $arBanner["STATUS_SID"] ) : "" ), "STATUS_COMMENTS" => $arBanner["STATUS_COMMENTS"], "NAME" => $arBanner["NAME"], "GROUP_SID" => $arBanner["GROUP_SID"], "INDICATOR" => GetMessage("AD_".mb_strtoupper($arBanner["LAMP"])."_BANNER_STATUS"), "ACTIVE" => $arBanner["ACTIVE"], "MAX_SHOW_COUNT" => $arBanner["MAX_SHOW_COUNT"], "SHOW_COUNT" => $arBanner["SHOW_COUNT"], "MAX_CLICK_COUNT" => $arBanner["MAX_CLICK_COUNT"], "CLICK_COUNT" => $arBanner["CLICK_COUNT"], "DATE_LAST_SHOW" => $arBanner["DATE_LAST_SHOW"], "DATE_LAST_CLICK" => $arBanner["DATE_LAST_CLICK"], "DATE_SHOW_FROM" => $arBanner["DATE_SHOW_FROM"], "DATE_SHOW_TO" => $arBanner["DATE_SHOW_TO"], "IMAGE_LINK" => $IMAGE_LINK, "IMAGE_ALT" => $arBanner["IMAGE_ALT"], "URL" => $arBanner["URL"], "URL_TARGET" => $arBanner["URL_TARGET"], "NO_URL_IN_FLASH" => $arBanner["NO_URL_IN_FLASH"], "CODE" => $arBanner["CODE"], "CODE_TYPE" => $arBanner["CODE_TYPE"], "COMMENTS" => $arBanner["COMMENTS"], "DATE_CREATE" => $arBanner["DATE_CREATE"], "CREATED_BY" => $CREATED_BY, "DATE_MODIFY" => $arBanner["DATE_MODIFY"], "MODIFIED_BY" => $MODIFIED_BY, "AD_TYPE" => $arBanner["AD_TYPE"], "TEMPLATE" => unserialize($arBanner["TEMPLATE"], ['allowed_classes' => false]), "FLASH_TRANSPARENT" => $arBanner["FLASH_TRANSPARENT"], "FLASH_IMAGE_LINK" => $FLASHIMAGE_LINK, "FLASH_JS" => $arBanner["FLASH_JS"], "FLASH_VER" => $arBanner["FLASH_VER"], ); $arrSITE = CAdvBanner::GetSiteArray($arBanner["ID"]); CEvent::Send("ADV_BANNER_STATUS_CHANGE", $arrSITE, $arEventFields); } } } } } return $BANNER_ID; } public static function SetKeywords($keywords, $TYPE_SID="", $LOGIC="DESIRED") { global $arrADV_KEYWORDS; if ($LOGIC == '') return; if ($TYPE_SID == '') $TYPE_SID = ""; $arrKeywords = array(); if (is_array($keywords) && count($keywords)>0) { foreach($keywords as $word) { if (is_array($word)) { $exact_match = $word["EXACT_MATCH"]=="Y" ? "Y" : "N"; $value = $word["KEYWORD"]; } else { $exact_match = "N"; $value = $word; } $arrKeywords[$exact_match][] = trim($value); } } else { $arrWords = explode(",",$keywords); if (is_array($arrWords) && count($arrWords)>0) { foreach($arrWords as $word) { if (trim($word) <> '') $arrKeywords["N"][] = trim($word); } } } if(!is_set($arrADV_KEYWORDS, $TYPE_SID)) $arrADV_KEYWORDS[$TYPE_SID] = array(); $arr = array("Y","N"); foreach ($arr as $exact_match) { $arrWords = is_array($arrKeywords[$exact_match]) ? array_unique($arrKeywords[$exact_match]) : array(); if (count($arrWords)>0) { $arrTemp = $arrADV_KEYWORDS[$TYPE_SID][$LOGIC][$exact_match]; if (is_array($arrTemp) && count($arrTemp)>0) { $arrTemp = array_merge($arrWords, $arrTemp); $arrTemp = array_unique($arrTemp); $arrADV_KEYWORDS[$TYPE_SID][$LOGIC][$exact_match] = $arrTemp; } else $arrADV_KEYWORDS[$TYPE_SID][$LOGIC][$exact_match] = $arrWords; } } } public static function GetKeywords($TYPE_SID="", $LOGIC="", $EXACT_MATCH="") { global $arrADV_KEYWORDS, $APPLICATION; $arrReturn = $arrADV_KEYWORDS; if( !is_array($arrADV_KEYWORDS) || ( !array_key_exists("", $arrADV_KEYWORDS) && !array_key_exists($TYPE_SID, $arrADV_KEYWORDS) ) ) { $keywords = $APPLICATION->GetProperty("adv_desired_target_keywords"); if($keywords === false) $keywords = $APPLICATION->GetProperty("keywords"); $arrWords = explode(",", $keywords); $arrKeywords = array(); foreach($arrWords as $word) { $word = trim($word); if($word <> '') $arrKeywords[] = $word; } if(count($arrKeywords) > 0) $arrReturn[$TYPE_SID]["DESIRED"]["N"] = $arrKeywords; } if($TYPE_SID <> '') { if($LOGIC <> '') { if($EXACT_MATCH <> '') return $arrReturn[$TYPE_SID][$LOGIC][$EXACT_MATCH]; else return $arrReturn[$TYPE_SID][$LOGIC]; } else { return $arrReturn[$TYPE_SID]; } } else { return $arrReturn; } } public static function ResetKeywords($TYPE_SID="", $LOGIC="", $EXACT_MATCH="") { global $arrADV_KEYWORDS; if ($TYPE_SID <> '') { if ($LOGIC <> '') { if ($EXACT_MATCH <> '') $arrADV_KEYWORDS[$TYPE_SID][$LOGIC][$EXACT_MATCH] = array(); else $arrADV_KEYWORDS[$TYPE_SID][$LOGIC] = array(); } else $arrADV_KEYWORDS[$TYPE_SID] = array(); } else $arrADV_KEYWORDS = array(); } public static function SetRequiredKeywords($keywords, $TYPE_SID="") { CAdvBanner::SetKeywords($keywords, $TYPE_SID, "REQUIRED"); } public static function SetDesiredKeywords($keywords, $TYPE_SID="") { CAdvBanner::SetKeywords($keywords, $TYPE_SID, "DESIRED"); } public static function GetRequiredKeywords($TYPE_SID="", $EXACT_MATCH="") { return CAdvBanner::GetKeywords($TYPE_SID, "REQUIRED", $EXACT_MATCH); } public static function GetDesiredKeywords($TYPE_SID="", $EXACT_MATCH="") { return CAdvBanner::GetKeywords($TYPE_SID, "DESIRED", $EXACT_MATCH); } public static function arr_comp_uniform($a, $b) { if ($a["val"] < $b["val"]) return -1; elseif ($a["val"] > $b["val"]) return 1; else return 0; } // возвращает массив описывающий произвольный баннер public static function GetRandom($TYPE_SID) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetRandom<br>Line: "; global $APPLICATION, $DB, $arrViewedBanners, $arrADV_VIEWED_BANNERS; static $arrWeightSum = false; $TYPE_SID = trim($TYPE_SID); if ($TYPE_SID == '') { return false; } $DONT_USE_CONTRACT = COption::GetOptionString("advertising", "DONT_USE_CONTRACT", "N"); if ($arrWeightSum === false) { // получим массив весов для текущей страницы $arrWeightSum = array(); $arrCookie_counter = array(); // если мы уже получили на странице значение cookie то if (is_array($arrADV_VIEWED_BANNERS)) { foreach ($arrADV_VIEWED_BANNERS as $banner_id => $arr) { $arrCookie_counter[$banner_id] = $arr["COUNTER"]; } } else // если мы первый раз обращаемся к значению хранимому в cookie { $cookie_name = "BANNERS"; $arr = explode(",", $APPLICATION->get_cookie($cookie_name)); if (is_array($arr) && count($arr)>0) { foreach($arr as $str) { $ar = explode("_",$str); $banner_id = intval($ar[1]); $counter = intval($ar[2]); $arrCookie_counter[$banner_id] = $counter; } } } $arrWeightSum_RequiredKeywords = array(); $arrWeightSum_DesiredKeywords = array(); $arrWeightSum_EmptyKeywords = array(); $arrWeightSum_all = array(); $arKeywordsSet = array(); // заданы ли ключевые слова для того или иного типа $arrRequiredKeywordsBanners = array(); // массив баннеров для которых были найдены все ключевые слова $arrDesiredKeywordsBanners = array(); // массив баннеров для которых было найдено хотя бы одно желательное слово $arrEmptyKeywordsBanners = array(); // массив баннеров у которых поле "ключевые слова" не заполнено $arrPAGE_KEYWORDS = CAdvBanner::GetKeywords(); // массив ключевых слов заданных для данной страницы $arrDesiredPageKeywords_all = is_array($arrPAGE_KEYWORDS[""]["DESIRED"]) ? $arrPAGE_KEYWORDS[""]["DESIRED"] : array(); $arrRequiredPageKeywords_all = is_array($arrPAGE_KEYWORDS[""]["REQUIRED"]) ? $arrPAGE_KEYWORDS[""]["REQUIRED"] : array(); $rs = CAdvBanner::GetPageWeights_RS(); while($ar=$rs->Fetch()) { // Check for blocked uniformed banners if (isset($ar["FLYUNIFORM"]) and $ar["FLYUNIFORM"] == "Y") { $unitest = CAdvBanner_all::GetUniformityCoef($ar); if ($unitest >= 1.0 + BANNER_UNIFORMITY_DIVERGENCE_COEF) continue; } $arKeywordsSet[$ar["TYPE_SID"]] = "N"; if ((intval($ar["SHOWS_FOR_VISITOR"])>0 && intval($arrCookie_counter[$ar["BANNER_ID"]])<intval($ar["SHOWS_FOR_VISITOR"])) || intval($ar["SHOWS_FOR_VISITOR"])<=0) { $arr = $arrPAGE_KEYWORDS[$ar["TYPE_SID"]]["DESIRED"]; $arrDesiredPageKeywords = is_array($arr) ? $arr : array(); $arr = $arrPAGE_KEYWORDS[$ar["TYPE_SID"]]["REQUIRED"]; $arrRequiredPageKeywords = is_array($arr) ? $arr : array(); if (count($arrRequiredPageKeywords)>0 || count($arrRequiredPageKeywords_all)>0 || count($arrDesiredPageKeywords)>0 || count($arrDesiredPageKeywords_all)>0 ) { $arKeywordsSet[$ar["TYPE_SID"]] = "Y"; } $arrBannerKeywords = preg_split('/[\n\r]+/', $ar["BANNER_KEYWORDS"]); if (is_array($arrBannerKeywords)) { TrimArr($arrBannerKeywords); } if ($DONT_USE_CONTRACT <> "Y" && $ar["CONTRACT_KEYWORDS"] <> '') { $arrContractKeywords = preg_split('/[\n\r]+/', $ar["CONTRACT_KEYWORDS"]); if (is_array($arrContractKeywords)) { TrimArr($arrContractKeywords); } $arrBannerKeywords = array_unique(array_merge($arrBannerKeywords, $arrContractKeywords)); } if ($DONT_USE_CONTRACT == "Y" || !array_key_exists("CONTRACT_ID", $ar)) $ar["CONTRACT_ID"] = 0; if (count($arrBannerKeywords)>0) { $found_required = true; if (count($arrRequiredPageKeywords)>0 || count($arrRequiredPageKeywords_all)>0) { $arr = array("Y","N"); // совпадение | вхождение foreach($arr as $exact_match) { $arr1 = is_array($arrRequiredPageKeywords[$exact_match]) ? $arrRequiredPageKeywords[$exact_match] : array(); $arr2 = is_array($arrRequiredPageKeywords_all[$exact_match]) ? $arrRequiredPageKeywords_all[$exact_match] : array(); $arrRequiredKeywords = array_unique(array_merge($arr1, $arr2)); if (count($arrRequiredKeywords)>0) { reset($arrRequiredKeywords); foreach($arrRequiredKeywords as $page_word) { $page_word = mb_strtoupper($page_word); reset($arrBannerKeywords); $found = false; foreach($arrBannerKeywords as $banner_word) { $banner_word = mb_strtoupper($banner_word); // совпадение if ($exact_match=="Y") { if ($banner_word==$page_word) { $found = true; break; } } elseif ($exact_match=="N") { if (mb_strpos($page_word, $banner_word) !== false || mb_strpos($banner_word, $page_word) !== false) { $found = true; break; } } } if (!$found) { $found_required = false; break 2; } } } } // если все ключевые слова были найдены то if ($found_required) { // запоминаем баннер в массиве баннеров для которых были найдены все ключевые слова $arrRequiredKeywordsBanners[] = $ar["BANNER_ID"]; } } // если по обязательным словам баннер подходит то проверим по желательным словам if ($found_required && (count($arrDesiredPageKeywords)>0 || count($arrDesiredPageKeywords_all)>0)) { $found_desired = false; $arr = array("Y","N"); // совпадение | вхождение foreach($arr as $exact_match) { $arr1 = is_array($arrDesiredPageKeywords) ? $arrDesiredPageKeywords[$exact_match] : array(); $arr2 = is_array($arrDesiredPageKeywords_all) ? $arrDesiredPageKeywords_all[$exact_match] : array(); if (!is_array($arr1)) $arr1 = array(); if (!is_array($arr2)) $arr2 = array(); $arrDesiredKeywords = array_unique(array_merge($arr1, $arr2)); if (is_array($arrDesiredKeywords) && count($arrDesiredKeywords)>0) { reset($arrDesiredKeywords); foreach($arrDesiredKeywords as $page_word) { $page_word = mb_strtoupper($page_word); reset($arrBannerKeywords); foreach($arrBannerKeywords as $banner_word) { $banner_word = mb_strtoupper($banner_word); // совпадение if ($exact_match=="Y") { if ($banner_word==$page_word) { $found_desired = true; break 3; } } elseif ($exact_match=="N") { if (mb_strpos($page_word, $banner_word) !== false || mb_strpos($banner_word, $page_word) !== false) { $found_desired = true; break 3; } } } } } } // если все ключевые слова были найдены то if ($found_desired) { // запоминаем баннер в массиве баннеров для которых были найдены все ключевые слова $arrDesiredKeywordsBanners[] = $ar["BANNER_ID"]; } } } else { // запомнить баннеры у которых вообще не задано ключевых слов $arrEmptyKeywordsBanners[] = $ar["BANNER_ID"]; } if (in_array($ar["BANNER_ID"], $arrRequiredKeywordsBanners)) { $arrWeightSum_RequiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_RequiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } if (in_array($ar["BANNER_ID"], $arrDesiredKeywordsBanners)) { $arrWeightSum_DesiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_DesiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } if (in_array($ar["BANNER_ID"], $arrEmptyKeywordsBanners)) { $arrWeightSum_EmptyKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_EmptyKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } $arrWeightSum_all[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_all[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } } $arrAllTypies = array_keys($arrWeightSum_all); if (count($arrAllTypies)>0) { foreach($arrAllTypies as $tsid) { // если для данного типа ключевые слова заданы то if ($arKeywordsSet[$tsid]=="Y") { // желательные слова if (is_array($arrWeightSum_DesiredKeywords[$tsid]) && count($arrWeightSum_DesiredKeywords[$tsid])>0) { $arrWeightSum[$tsid] = $arrWeightSum_DesiredKeywords[$tsid]; } // обязательные слова elseif (is_array($arrWeightSum_RequiredKeywords[$tsid]) && count($arrWeightSum_RequiredKeywords[$tsid])>0) { $arrWeightSum[$tsid] = $arrWeightSum_RequiredKeywords[$tsid]; } // с пустыми словами elseif ($arKeywordsSet[$tsid]=="Y" && is_array($arrWeightSum_EmptyKeywords[$tsid])) { $arrWeightSum[$tsid] = $arrWeightSum_EmptyKeywords[$tsid]; } } else { $arrWeightSum[$tsid] = $arrWeightSum_all[$tsid]; } } } } $arrWSum = $arrWeightSum[$TYPE_SID]; // если массив весов подготовлен то if (is_array($arrWSum) && count($arrWSum)>0) { $CONTRACT_ID = 0; if ($DONT_USE_CONTRACT == "N" || !array_key_exists("0", $arrWSum)) { // получим сумму весов контрактов $intSum = 0; foreach ($arrWSum as $cid => $arr) { $CONTRACT_ID = $cid; $intSum += intval($arr["WEIGHT"]); } // выберем контракт по весу $intStep = 0; $rndWeight = $intSum * (mt_rand()/mt_getrandmax()); foreach ($arrWSum as $cid => $arr) { if($rndWeight>=$intStep && $rndWeight<=$intStep+$arr["WEIGHT"]) { $CONTRACT_ID = $cid; break; } $intStep += $arr["WEIGHT"]; } $CONTRACT_ID = intval($CONTRACT_ID)<=0 ? 1 : intval($CONTRACT_ID); } $arrWeightBanners = $arrWSum[$CONTRACT_ID]["BANNERS"]; // если ID контракта определен то if (is_array($arrWeightBanners) && count($arrWeightBanners)>0) { // получим сумму весов баннеров контракта $intSum = 0; $strBanners = "0"; foreach ($arrWeightBanners as $bid => $weight) { if(in_array($bid, $arrViewedBanners)) continue; $intSum += intval($weight); $strBanners .= ",".intval($bid); } if ($CONTRACT_ID>0) { $strSql = " SELECT B.*, ".$DB->DateToCharFunction("B.DATE_SHOW_FIRST", "FULL")." DATE_SHOW_FIRST, ".$DB->DateToCharFunction("B.DATE_SHOW_FROM", "FULL")." DATE_SHOW_FROM, ".$DB->DateToCharFunction("B.DATE_SHOW_TO", "FULL")." DATE_SHOW_TO, C.MAX_VISITOR_COUNT CONTRACT_MAX_VISITOR_COUNT FROM b_adv_banner B, b_adv_contract C WHERE B.CONTRACT_ID = $CONTRACT_ID and B.TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."' and B.ID in (".$strBanners.") and C.ID = B.CONTRACT_ID ORDER BY FLYUNIFORM DESC "; } else { $strSql = " SELECT B.*, ".$DB->DateToCharFunction("B.DATE_SHOW_FIRST", "FULL")." DATE_SHOW_FIRST, ".$DB->DateToCharFunction("B.DATE_SHOW_FROM", "FULL")." DATE_SHOW_FROM, ".$DB->DateToCharFunction("B.DATE_SHOW_TO", "FULL")." DATE_SHOW_TO FROM b_adv_banner B WHERE B.TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."' AND B.ID in (".$strBanners.") ORDER BY FLYUNIFORM DESC "; } $intSum = 0; $infVal = 0; $infUniform = null; $stubs = array(); $rsBanners = $DB->Query($strSql, false, $err_mess.__LINE__); while($arBanner = $rsBanners->Fetch()) { if (isset($arBanner["FLYUNIFORM"]) and $arBanner["FLYUNIFORM"] == "Y") { // Select most last (weak) rotated banner (x<<1) $unitest = CAdvBanner_all::GetUniformityCoef($arBanner); if ($unitest < $infVal or !$infUniform) { $infVal = $unitest; $infUniform = $arBanner; } } else { $intSum += intval($arBanner["WEIGHT"]); array_push($stubs, $arBanner); // Save stubs } } // Check out selected uniformed banner if ($infUniform == null or $infVal >= 1.0 + BANNER_UNIFORMITY_DIVERGENCE_COEF) { // If this, we have to stop alittle this banner, and show stub one. $infUniform = array(); if (count($stubs) > 0) { $intStep = 0; $rndWeight = $intSum * (mt_rand()/mt_getrandmax()); reset($stubs); $infUniform = current($stubs); if($rndWeight<$intStep or $rndWeight>$intStep+$infUniform["WEIGHT"]) { $intStep += $infUniform["WEIGHT"]; while ($infUniform = next($stubs)) { if($rndWeight>=$intStep && $rndWeight<=$intStep+$infUniform["WEIGHT"]) break; $intStep += $infUniform["WEIGHT"]; } } } } $arBanner = $infUniform; $BANNER_ID = intval($arBanner["ID"]); if ($BANNER_ID>0) { unset($arrWeightSum[$TYPE_SID][$CONTRACT_ID]["BANNERS"][$arBanner["ID"]]); if(count($arrWeightSum[$TYPE_SID][$CONTRACT_ID]["BANNERS"])<=0) unset($arrWeightSum[$TYPE_SID][$CONTRACT_ID]); $arrViewedBanners[] = $arBanner["ID"]; } return $arBanner; } } return null; } // возвращает массив, описывающий $quantity произвольных баннеров public static function GetRandomArray($TYPE_SID, $quantity = 1) { $err_mess = (CAdvBanner_all::err_mess())."<br>Function: GetRandom<br>Line: "; global $APPLICATION, $DB, $arrViewedBanners, $arrADV_VIEWED_BANNERS; static $arrWeightSum = false; $TYPE_SID = trim($TYPE_SID); if ($TYPE_SID == '') { return false; } $DONT_USE_CONTRACT = COption::GetOptionString("advertising", "DONT_USE_CONTRACT", "N"); if ($arrWeightSum === false) { // получим массив весов для текущей страницы $arrWeightSum = array(); $arrCookie_counter = array(); // если мы уже получили на странице значение cookie то if (is_array($arrADV_VIEWED_BANNERS)) { foreach ($arrADV_VIEWED_BANNERS as $banner_id => $arr) { $arrCookie_counter[$banner_id] = $arr["COUNTER"]; } } else // если мы первый раз обращаемся к значению хранимому в cookie { $cookie_name = "BANNERS"; $arr = explode(",", $APPLICATION->get_cookie($cookie_name)); if (is_array($arr) && count($arr)>0) { foreach($arr as $str) { $ar = explode("_",$str); if (count($ar) >= 3) { $banner_id = intval($ar[1]); $counter = intval($ar[2]); $arrCookie_counter[$banner_id] = $counter; } } } } $arrWeightSum_RequiredKeywords = array(); $arrWeightSum_DesiredKeywords = array(); $arrWeightSum_EmptyKeywords = array(); $arrWeightSum_all = array(); $arKeywordsSet = array(); // заданы ли ключевые слова для того или иного типа $arrRequiredKeywordsBanners = array(); // массив баннеров для которых были найдены все ключевые слова $arrDesiredKeywordsBanners = array(); // массив баннеров для которых было найдено хотя бы одно желательное слово $arrEmptyKeywordsBanners = array(); // массив баннеров у которых поле "ключевые слова" не заполнено $arrPAGE_KEYWORDS = CAdvBanner::GetKeywords(); // массив ключевых слов заданных для данной страницы $arrDesiredPageKeywords_all = $arrPAGE_KEYWORDS[""]["DESIRED"] ?? []; $arrRequiredPageKeywords_all = $arrPAGE_KEYWORDS[""]["REQUIRED"] ?? []; $rs = CAdvBanner::GetPageWeights_RS(); while($ar=$rs->Fetch()) { // Check for blocked uniformed banners if (isset($ar["FLYUNIFORM"]) and $ar["FLYUNIFORM"] == "Y") { $unitest = CAdvBanner_all::GetUniformityCoef($ar); if ($unitest >= 1.0 + BANNER_UNIFORMITY_DIVERGENCE_COEF) continue; } $arKeywordsSet[$ar["TYPE_SID"]] = "N"; if ((intval($ar["SHOWS_FOR_VISITOR"])>0 && intval($arrCookie_counter[$ar["BANNER_ID"]])<intval($ar["SHOWS_FOR_VISITOR"])) || intval($ar["SHOWS_FOR_VISITOR"])<=0) { $arrDesiredPageKeywords = $arrPAGE_KEYWORDS[$ar["TYPE_SID"]]["DESIRED"] ?? []; $arrRequiredPageKeywords = $arrPAGE_KEYWORDS[$ar["TYPE_SID"]]["REQUIRED"] ?? []; if (count($arrRequiredPageKeywords)>0 || count($arrRequiredPageKeywords_all)>0 || count($arrDesiredPageKeywords)>0 || count($arrDesiredPageKeywords_all)>0 ) { $arKeywordsSet[$ar["TYPE_SID"]] = "Y"; } $arrBannerKeywords = preg_split('/[\n\r]+/', $ar["BANNER_KEYWORDS"]); if (is_array($arrBannerKeywords)) { TrimArr($arrBannerKeywords); } if ($DONT_USE_CONTRACT <> "Y" && $ar["CONTRACT_KEYWORDS"] <> '') { $arrContractKeywords = preg_split('/[\n\r]+/', $ar["CONTRACT_KEYWORDS"]); if (is_array($arrContractKeywords)) { TrimArr($arrContractKeywords); } $arrBannerKeywords = array_unique(array_merge($arrBannerKeywords, $arrContractKeywords)); } if ($DONT_USE_CONTRACT == "Y" || !array_key_exists("CONTRACT_ID", $ar)) $ar["CONTRACT_ID"] = 0; if (count($arrBannerKeywords)>0) { $found_required = true; if (count($arrRequiredPageKeywords)>0 || count($arrRequiredPageKeywords_all)>0) { $arr = array("Y","N"); // совпадение | вхождение foreach($arr as $exact_match) { $arr1 = is_array($arrRequiredPageKeywords[$exact_match]) ? $arrRequiredPageKeywords[$exact_match] : array(); $arr2 = is_array($arrRequiredPageKeywords_all[$exact_match]) ? $arrRequiredPageKeywords_all[$exact_match] : array(); $arrRequiredKeywords = array_unique(array_merge($arr1, $arr2)); if (count($arrRequiredKeywords)>0) { reset($arrRequiredKeywords); foreach($arrRequiredKeywords as $page_word) { $page_word = mb_strtoupper($page_word); reset($arrBannerKeywords); $found = false; foreach($arrBannerKeywords as $banner_word) { $banner_word = mb_strtoupper($banner_word); // совпадение if ($exact_match=="Y") { if ($banner_word==$page_word) { $found = true; break; } } elseif ($exact_match=="N") { if (mb_strpos($page_word, $banner_word) !== false || mb_strpos($banner_word, $page_word) !== false) { $found = true; break; } } } if (!$found) { $found_required = false; break 2; } } } } // если все ключевые слова были найдены то if ($found_required) { // запоминаем баннер в массиве баннеров для которых были найдены все ключевые слова $arrRequiredKeywordsBanners[] = $ar["BANNER_ID"]; } } // если по обязательным словам баннер подходит то проверим по желательным словам if ($found_required && (count($arrDesiredPageKeywords)>0 || count($arrDesiredPageKeywords_all)>0)) { $found_desired = false; $arr = array("Y","N"); // совпадение | вхождение foreach($arr as $exact_match) { $arr1 = is_array($arrDesiredPageKeywords) ? $arrDesiredPageKeywords[$exact_match] : array(); $arr2 = is_array($arrDesiredPageKeywords_all) ? $arrDesiredPageKeywords_all[$exact_match] : array(); if (!is_array($arr1)) $arr1 = array(); if (!is_array($arr2)) $arr2 = array(); $arrDesiredKeywords = array_unique(array_merge($arr1, $arr2)); if (is_array($arrDesiredKeywords) && count($arrDesiredKeywords)>0) { reset($arrDesiredKeywords); foreach($arrDesiredKeywords as $page_word) { $page_word = mb_strtoupper($page_word); reset($arrBannerKeywords); foreach($arrBannerKeywords as $banner_word) { $banner_word = mb_strtoupper($banner_word); // совпадение if ($exact_match=="Y") { if ($banner_word==$page_word) { $found_desired = true; break 3; } } elseif ($exact_match=="N") { if (mb_strpos($page_word, $banner_word) !== false || mb_strpos($banner_word, $page_word) !== false) { $found_desired = true; break 3; } } } } } } // если все ключевые слова были найдены то if ($found_desired) { // запоминаем баннер в массиве баннеров для которых были найдены все ключевые слова $arrDesiredKeywordsBanners[] = $ar["BANNER_ID"]; } } } else { // запомнить баннеры у которых вообще не задано ключевых слов $arrEmptyKeywordsBanners[] = $ar["BANNER_ID"]; } if (in_array($ar["BANNER_ID"], $arrRequiredKeywordsBanners)) { $arrWeightSum_RequiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_RequiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } if (in_array($ar["BANNER_ID"], $arrDesiredKeywordsBanners)) { $arrWeightSum_DesiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_DesiredKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } if (in_array($ar["BANNER_ID"], $arrEmptyKeywordsBanners)) { $arrWeightSum_EmptyKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_EmptyKeywords[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } $arrWeightSum_all[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["WEIGHT"] = intval($ar["CONTRACT_WEIGHT"]); $arrWeightSum_all[$ar["TYPE_SID"]][$ar["CONTRACT_ID"]]["BANNERS"][$ar["BANNER_ID"]] = intval($ar["BANNER_WEIGHT"]); } } $arrAllTypies = array_keys($arrWeightSum_all); if (count($arrAllTypies)>0) { foreach($arrAllTypies as $tsid) { // если для данного типа ключевые слова заданы то if ($arKeywordsSet[$tsid]=="Y") { // желательные слова if (isset($arrWeightSum_DesiredKeywords[$tsid]) && is_array($arrWeightSum_DesiredKeywords[$tsid]) && !empty($arrWeightSum_DesiredKeywords[$tsid])) { $arrWeightSum[$tsid] = $arrWeightSum_DesiredKeywords[$tsid]; } // обязательные слова elseif (isset($arrWeightSum_RequiredKeywords[$tsid]) && is_array($arrWeightSum_RequiredKeywords[$tsid]) && !empty($arrWeightSum_RequiredKeywords[$tsid])) { $arrWeightSum[$tsid] = $arrWeightSum_RequiredKeywords[$tsid]; } // с пустыми словами elseif ($arKeywordsSet[$tsid]=="Y" && is_array($arrWeightSum_EmptyKeywords[$tsid])) { $arrWeightSum[$tsid] = $arrWeightSum_EmptyKeywords[$tsid]; } } else { $arrWeightSum[$tsid] = $arrWeightSum_all[$tsid]; } } } } $arrWSum = $arrWeightSum[$TYPE_SID]; // если массив весов подготовлен то if (is_array($arrWSum) && count($arrWSum)>0) { $CONTRACT_ID = 0; if ($DONT_USE_CONTRACT == "N" || !array_key_exists("0", $arrWSum)) { // получим сумму весов контрактов $intSum = 0; foreach ($arrWSum as $cid => $arr) { $CONTRACT_ID = $cid; $intSum += intval($arr["WEIGHT"]); } // выберем контракт по весу $intStep = 0; $rndWeight = $intSum * (mt_rand()/mt_getrandmax()); foreach ($arrWSum as $cid => $arr) { if($rndWeight>=$intStep && $rndWeight<=$intStep+$arr["WEIGHT"]) { $CONTRACT_ID = $cid; break; } $intStep += $arr["WEIGHT"]; } $CONTRACT_ID = intval($CONTRACT_ID)<=0 ? 1 : intval($CONTRACT_ID); } $arrWeightBanners = $arrWSum[$CONTRACT_ID]["BANNERS"]; // если ID контракта определен то if (is_array($arrWeightBanners) && count($arrWeightBanners)>0) { // получим сумму весов баннеров контракта $intSum = 0; $strBanners = "0"; foreach ($arrWeightBanners as $bid => $weight) { if(in_array($bid, $arrViewedBanners)) continue; $intSum += intval($weight); $strBanners .= ",".intval($bid); } if ($CONTRACT_ID>0) { $strSql = " SELECT B.*, ".$DB->DateToCharFunction("B.DATE_SHOW_FIRST", "FULL")." DATE_SHOW_FIRST, ".$DB->DateToCharFunction("B.DATE_SHOW_FROM", "FULL")." DATE_SHOW_FROM, ".$DB->DateToCharFunction("B.DATE_SHOW_TO", "FULL")." DATE_SHOW_TO, C.MAX_VISITOR_COUNT CONTRACT_MAX_VISITOR_COUNT FROM b_adv_banner B, b_adv_contract C WHERE B.CONTRACT_ID = $CONTRACT_ID and B.TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."' and B.ID in (".$strBanners.") and C.ID = B.CONTRACT_ID ORDER BY FLYUNIFORM DESC "; } else { $strSql = " SELECT B.*, ".$DB->DateToCharFunction("B.DATE_SHOW_FIRST", "FULL")." DATE_SHOW_FIRST, ".$DB->DateToCharFunction("B.DATE_SHOW_FROM", "FULL")." DATE_SHOW_FROM, ".$DB->DateToCharFunction("B.DATE_SHOW_TO", "FULL")." DATE_SHOW_TO FROM b_adv_banner B WHERE B.TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."' AND B.ID in (".$strBanners.") ORDER BY FLYUNIFORM DESC "; } $intSum = 0; $inf = array(); $stubs = array(); $rsBanners = $DB->Query($strSql, false, $err_mess.__LINE__); while($arBanner = $rsBanners->Fetch()) { if (isset($arBanner["FLYUNIFORM"]) and $arBanner["FLYUNIFORM"] == "Y") { $unitest = CAdvBanner_all::GetUniformityCoef($arBanner); if ($unitest < 1.0 + BANNER_UNIFORMITY_DIVERGENCE_COEF) $inf[$arBanner['ID']] = $arBanner; } else { $intSum += intval($arBanner["WEIGHT"]); $stubs[$arBanner['ID']] = $arBanner; // Save stubs } } // Sort array from most last (weak) rotated banner (x<<1) to strongest uasort($inf, array('CAdvBanner_all', 'arr_comp_uniform')); // Sorting stubs array $infStubs = array(); while (count($stubs)) { $intStep = 0; $rndWeight = $intSum * (mt_rand()/mt_getrandmax()); reset($stubs); $infCurr = current($stubs); if($rndWeight < $intStep or $rndWeight > $intStep + $infCurr["WEIGHT"]) { $intStep += $infCurr["WEIGHT"]; while (next($stubs)) { $infCurr = current($stubs); if($rndWeight>=$intStep && $rndWeight<=$intStep+$infCurr["WEIGHT"]) break; $intStep += $infCurr["WEIGHT"]; } } $infStubs[$infCurr['ID']] = $infCurr; unset($stubs[$infCurr['ID']]); } $arBanners = array_slice(array_merge($inf, $infStubs), 0, intval($quantity)); foreach ($arBanners as $arB) { $BANNER_ID = intval($arB["ID"]); if ($BANNER_ID > 0) { unset($arrWeightSum[$TYPE_SID][$CONTRACT_ID]["BANNERS"][$arB["ID"]]); if(count($arrWeightSum[$TYPE_SID][$CONTRACT_ID]["BANNERS"]) <= 0) unset($arrWeightSum[$TYPE_SID][$CONTRACT_ID]); $arrViewedBanners[] = $arB["ID"]; } } return $arBanners; } } return null; } // Uniformity coefficient public static function GetUniformityCoef($arBanner) { $arProgress = 0; $rot = CAdvBanner_all::CalculateRotationProgress($arBanner); $tim = CAdvBanner_all::CalculateTimeProgress($arBanner); if ($rot and $tim) $arProgress = $rot/$tim; return $arProgress; } public static function __innerExtractBitrixDates($arBanner) { $fs = array("to" => 0, "first" => 0, "from" => 0); if (isset($arBanner["DATE_SHOW_TO"])) $fs["to"] = $arBanner["DATE_SHOW_TO"]; if (isset($arBanner["DATE_SHOW_FIRST"])) $fs["first"] = $arBanner["DATE_SHOW_FIRST"]; if (isset($arBanner["DATE_SHOW_FROM"])) $fs["from"] = $arBanner["DATE_SHOW_FROM"]; if ($fs["to"] and mb_strstr(trim($fs["to"]), " ") == false) $fs["to"].=" 23:59:59"; if ($fs["first"] and mb_strstr(trim($fs["first"]), " ") == false) $fs["first"].=" 00:00:00"; if ($fs["from"] and mb_strstr(trim($fs["from"]), " ") == false) $fs["from"].=" 00:00:00"; return $fs; } // Returns TimeDifference in seconds beetween FROM,TO Dates of a banner public static function CalculateTimeDiff($arBanner) { $dt = CAdvBanner_all::__innerExtractBitrixDates($arBanner); if (!$dt["to"]) return 0; // 05.04.2007 19:26:26 $dtformat = "DD.MM.YYYY HH:MI:SS"; $stmpfirst = MakeTimeStamp($dt["first"], $dtformat); $stmpfrom = MakeTimeStamp($dt["from"], $dtformat); $stmpto = MakeTimeStamp($dt["to"], $dtformat); // Check if FirstShowDate valid, then use it. if ($stmpfirst>0 and $stmpfirst>=$stmpfrom and $stmpto>$stmpfirst) { $stmpfrom = $stmpfirst; } if ($stmpfrom >= $stmpto) return 0; $rStmp = $stmpto - $stmpfrom; return $rStmp; } // Calculate progress in 0.0<x<1.0 format of banner rotation public static function CalculateTimeProgress($arBanner) { $dt = CAdvBanner_all::__innerExtractBitrixDates($arBanner); $stmpnow = time(); $dtformat = "DD.MM.YYYY HH:MI:SS"; $stmpfirst = MakeTimeStamp($dt["first"], $dtformat); $stmpfrom = MakeTimeStamp($dt["from"], $dtformat); $stmpto = MakeTimeStamp($dt["to"], $dtformat); // Check if FirstShowDate valid, then use it. if ($stmpfirst>0 and $stmpfirst>=$stmpfrom and $stmpto>$stmpfirst) { $stmpfrom = $stmpfirst; } $stmpnow -= $stmpfrom; $diff = CAdvBanner_all::CalculateTimeDiff($arBanner); if ($stmpnow <= 0 or !$diff) return 0; return $stmpnow/$diff; } public static function CalculateRotationProgress($arBanner) { if (!isset($arBanner["MAX_SHOW_COUNT"]) or !isset($arBanner["SHOW_COUNT"]) or intval($arBanner["MAX_SHOW_COUNT"])==0) return 0; return intval($arBanner["SHOW_COUNT"])/intval($arBanner["MAX_SHOW_COUNT"]); } // Calculates speed //function CalculateActualRotationSpeed() //function GetAverageRotationSpeed() public static function PrepareHTML($text, $arBanner) { global $nRandom1, $nRandom2, $nRandom3, $nRandom4, $nRandom5; static $search = array("#RANDOM1#", "#RANDOM2#", "#RANDOM3#", "#RANDOM4#", "#RANDOM5#", "#BANNER_NAME#", "#BANNER_ID#", "#CONTRACT_ID#", "#TYPE_SID#"); if (trim($text) <> '') { $text = str_replace($search, array($nRandom1, $nRandom2, $nRandom3, $nRandom4, $nRandom5, $arBanner["NAME"], $arBanner["ID"], $arBanner["CONTRACT_ID"], $arBanner["TYPE_SID"]), $text); if (mb_strpos($text, "#EVENT_GID#") !== false) { if (CModule::IncludeModule("statistic")) { $text = str_replace("#EVENT_GID#", CStatEvent::GetGID(), $text); } } } return $text; } public static function GetRedirectURL($url, $arBanner) { return $url; } public static function ReplaceURL($text, $arBanner) { return $text; } // возвращает HTML баннера по массиву public static function GetHTML($arBanner, $bNoIndex=false) { $strReturn = ""; // обрабатываем изображение if(intval($arBanner["IMAGE_ID"]) > 0 && $arBanner["AD_TYPE"] <> "html" && $arBanner["AD_TYPE"] <> "template") { $arImage = CFile::GetFileArray($arBanner["IMAGE_ID"]); if ($arImage) { $file_type = GetFileType($arImage["FILE_NAME"]); $path = $arImage["SRC"]; switch($file_type) { case "FLASH": $arParams = array(); $url = $param = ""; $alt = $a_title = $a_target = ""; if (trim($arBanner["URL"]) <> '') { $param = CAdvBanner::PrepareHTML($arBanner["URL"], $arBanner); $param = CAdvBanner::GetRedirectURL($param, $arBanner); $url = $param; $arParams[] = "flash_link=".urlencode($param); if (trim($arBanner["URL_TARGET"]) <> '') { $arParams[] = "flash_target=".urlencode($arBanner["URL_TARGET"]); $a_target = ' target="'.htmlspecialcharsbx($arBanner["URL_TARGET"]).'" '; } } if (trim($arBanner["IMAGE_ALT"]) <> '') { $alt = CAdvBanner::PrepareHTML($arBanner["IMAGE_ALT"], $arBanner); $arParams[] = "flash_alt=".urlencode($alt); $a_title = " title=\"".htmlspecialcharsbx($alt)."\" "; } if (count($arParams)>0) $param = "?".implode("&",$arParams); if ($arBanner["FLASH_TRANSPARENT"] == '') $arBanner["FLASH_TRANSPARENT"] = 'transparent'; if ($arBanner["FLASH_JS"] != 'Y') { $strReturn = '<div style="width: '.$arImage["WIDTH"].'px; height: '.$arImage["HEIGHT"].'px; padding:0; margin:0">'; if(trim($arBanner["URL"]) <> '' && $arBanner["NO_URL_IN_FLASH"] == "Y") { $strReturn .= ($bNoIndex? '<noindex>':'').'<div style="position:absolute; z-index:100;"><a href="'.$url.'"'.$a_target.$a_title.($bNoIndex? ' rel="nofollow"':'').'><img src="/bitrix/images/1.gif" width="'.$arImage["WIDTH"].'" height="'.$arImage["HEIGHT"].'" style="border:0;" alt="'.htmlspecialcharsEx($alt).'" /></a></div>'.($bNoIndex? '</noindex>':''); } $strReturn .= '<OBJECT classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" id="banner_'.$arBanner["ID"].'" WIDTH="'.$arImage["WIDTH"].'" HEIGHT="'.$arImage["HEIGHT"].'"> <PARAM NAME="movie" VALUE="'.$path.$param.'" /> <PARAM NAME="quality" VALUE="high" /> <PARAM NAME="bgcolor" VALUE="#FFFFFF" /> <PARAM NAME="wmode" VALUE="'.$arBanner["FLASH_TRANSPARENT"].'" /> <EMBED src="'.$path.$param.'" quality="high" bgcolor="#FFFFFF" wmode="'.$arBanner["FLASH_TRANSPARENT"].'" WIDTH="'.$arImage["WIDTH"].'" HEIGHT="'.$arImage["HEIGHT"].'" NAME="banner" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> </EMBED> </OBJECT></div>'; } else { $strReturn = ""; static $bScript = null; if($bScript === null) { $bScript = true; $strReturn .= '<script src="'.CUtil::GetAdditionalFileURL('/bitrix/js/advertising/flash.js').'"></script>'; } $altImgPath = ''; $arAltImage = CFile::GetFileArray($arBanner["FLASH_IMAGE"]); if ($arAltImage) { $altImgPath = $arAltImage["SRC"]; } $test_id = 'id'.RandString(10); $strReturn .= '<div id="'.$test_id.'" style="width: '.$arImage["WIDTH"].'px; height: '.$arImage["HEIGHT"].'px; padding:0; margin:0;">'; $altHref = ''; if(trim($arBanner["URL"]) <> '') { if($arBanner["NO_URL_IN_FLASH"] == "Y") $strReturn .= ($bNoIndex? '<noindex>':'').'<div style="position:absolute; z-index:100;"><a href="'.$url.'"'.$a_target.$a_title.($bNoIndex? ' rel="nofollow"':'').'><img src="/bitrix/images/1.gif" width="'.$arImage["WIDTH"].'" height="'.$arImage["HEIGHT"].'" style="border:0;" alt="'.htmlspecialcharsEx($alt).'" /></a></div>'.($bNoIndex? '</noindex>':''); else $altHref = $url; } $strReturn .= '</div>'; $strReturn .= '<script>bx_adv_includeFlash("'.$test_id.'", "'. CUtil::JSEscape($path.$param).'", "'. $arImage["WIDTH"].'", "'.$arImage["HEIGHT"].'", "'. $arBanner["FLASH_TRANSPARENT"].'", "'. CUtil::JSEscape($altImgPath).'", '. (intval($arBanner["FLASH_VER"]) <= 0? 'null':intval($arBanner["FLASH_VER"])).', "'. CUtil::JSEscape($altHref).'", "'. CUtil::JSEscape(htmlspecialcharsbx($arBanner["URL_TARGET"])).'", "'. CUtil::JSEscape(htmlspecialcharsbx($alt)).'");</script>'; } break; default: $alt = CAdvBanner::PrepareHTML(trim($arBanner["IMAGE_ALT"]), $arBanner); $strImage = "<img alt=\"".htmlspecialcharsEx($alt)."\" title=\"".htmlspecialcharsEx($alt)."\" src=\"".$path."\" width=\"".$arImage["WIDTH"]."\" height=\"".$arImage["HEIGHT"]."\" style=\"border:0;\" />"; if (trim($arBanner["URL"]) <> '') { $url = $arBanner["URL"]; $url = CAdvBanner::PrepareHTML($url, $arBanner); $url = CAdvBanner::GetRedirectURL($url, $arBanner); $target = (trim($arBanner["URL_TARGET"]) <> '') ? " target=\"".$arBanner["URL_TARGET"]."\" " : ""; $strReturn = ($bNoIndex? '<noindex>':'')."<a href=\"".$url."\"".$target.($bNoIndex? ' rel="nofollow"':'').">".$strImage."</a>".($bNoIndex? '</noindex>':''); } else { $strReturn .= $strImage; } break; } } } if($arBanner["CODE"] <> '') { $code = $arBanner["CODE"]; if ($arBanner["CODE_TYPE"] == "text") { $code = TxtToHTML($code); } $code = CAdvBanner::PrepareHTML($code, $arBanner); $strReturn .= CAdvBanner::ReplaceURL($code, $arBanner); } return $strReturn; } public static function FixShowAll() { global $DB, $CACHE_ADVERTISING, $arrADV_VIEWED_BANNERS, $APPLICATION; $err_mess = (CAdvBanner::err_mess())."<br>Function: FixShowAll<br>Line: "; if (is_array($CACHE_ADVERTISING) && array_key_exists("BANNERS_ALL", $CACHE_ADVERTISING) && is_array($CACHE_ADVERTISING["BANNERS_ALL"]) && !empty($CACHE_ADVERTISING["BANNERS_ALL"]) && array_key_exists("BANNERS_CNT", $CACHE_ADVERTISING) && is_array($CACHE_ADVERTISING["BANNERS_CNT"])) { if( array_key_exists( "ALL_DATE_SHOW_FIRST", $CACHE_ADVERTISING ) && is_array( $CACHE_ADVERTISING["ALL_DATE_SHOW_FIRST"] ) ) { foreach( $CACHE_ADVERTISING["ALL_DATE_SHOW_FIRST"] as $key => $value ) { $DB->Update( "b_adv_banner", Array( "DATE_SHOW_FIRST" => $value ), "WHERE ID='" . $key . "'", $err_mess . __LINE__ ); } } $bEqualBanID = ($CACHE_ADVERTISING["BANNERS_ALL"] == $CACHE_ADVERTISING["BANNERS_CNT"]); //Update баннеров $arFields = Array( "SHOW_COUNT" => "SHOW_COUNT + 1", "DATE_LAST_SHOW" => $DB->GetNowFunction(), ); if ($bEqualBanID) $arFields["VISITOR_COUNT"] = "VISITOR_COUNT + 1"; $group_all = ''; foreach($CACHE_ADVERTISING["BANNERS_ALL"] as $b) $group_all .= ($group_all <> ''? ',':'').intval($b); $DB->Update("b_adv_banner",$arFields,"WHERE ID IN(".$group_all.")",$err_mess.__LINE__); if (!$bEqualBanID && !empty($CACHE_ADVERTISING["BANNERS_CNT"])) { $arFields = Array("VISITOR_COUNT" => "VISITOR_COUNT + 1"); $group_inc = ""; foreach($CACHE_ADVERTISING["BANNERS_CNT"] as $BANNERS_CNT) $group_inc .= ($group_inc <> ""? ",":"").intval($BANNERS_CNT); $DB->Update("b_adv_banner",$arFields,"WHERE ID IN(".$group_inc.")",$err_mess.__LINE__); } //Баннеры по дням $strSql = "SELECT BANNER_ID FROM b_adv_banner_2_day WHERE BANNER_ID IN (".$group_all.") and DATE_STAT = ".$DB->GetNowDate(); $res = $DB->Query($strSql, false, $err_mess.__LINE__); $arExist = $arInsert = Array(); while ($ar = $res->Fetch()) $arExist[] = $ar["BANNER_ID"]; $arInsert = array_diff($CACHE_ADVERTISING["BANNERS_ALL"], $arExist); foreach ($arInsert as $BANNER_ID) { $strSql = "INSERT INTO b_adv_banner_2_day (DATE_STAT, BANNER_ID, SHOW_COUNT, VISITOR_COUNT) VALUES (".$DB->GetNowDate().", $BANNER_ID,1,1)"; $DB->Query($strSql, true, $err_mess.__LINE__); } if (!empty($arExist)) { $arExistInc = array_intersect($arExist,$CACHE_ADVERTISING["BANNERS_CNT"]); if (!empty($arExistInc)) { $sExistInc = ''; foreach($arExistInc as $b) $sExistInc .= ($sExistInc <> ''? ',':'').intval($b); $arFields = Array("SHOW_COUNT" => "SHOW_COUNT + 1", "VISITOR_COUNT" => "VISITOR_COUNT + 1"); $DB->Update("b_adv_banner_2_day",$arFields,"WHERE BANNER_ID IN(".$sExistInc.") and DATE_STAT = ".$DB->GetNowDate(),$err_mess.__LINE__); } $arExistInc = array_diff($arExist, $arExistInc); if (!empty($arExistInc)) { $sExistInc = ''; foreach($arExistInc as $b) $sExistInc .= ($sExistInc <> ''? ',':'').intval($b); $arFields = Array("SHOW_COUNT" => "SHOW_COUNT + 1"); $DB->Update("b_adv_banner_2_day",$arFields,"WHERE BANNER_ID IN(".$sExistInc.") and DATE_STAT = ".$DB->GetNowDate(),$err_mess.__LINE__); } } //Контракты $DONT_USE_CONTRACT = COption::GetOptionString("advertising", "DONT_USE_CONTRACT", "N"); if ($DONT_USE_CONTRACT == "N" && array_key_exists("CONTRACTS_ALL", $CACHE_ADVERTISING) && is_array($CACHE_ADVERTISING["CONTRACTS_ALL"]) && !empty($CACHE_ADVERTISING["CONTRACTS_ALL"]) && array_key_exists("CONTRACTS_CNT", $CACHE_ADVERTISING) && is_array($CACHE_ADVERTISING["CONTRACTS_CNT"])) { $arCount = array_count_values($CACHE_ADVERTISING["CONTRACTS_ALL"]); $arUpdate = Array(); foreach($arCount as $CONTRACT_ID => $value) $arUpdate[$value][] = $CONTRACT_ID; foreach ($arUpdate as $count => $arContact) { $arFields = Array("SHOW_COUNT" => "SHOW_COUNT + ".$count); if ($arContact == (array_intersect($arContact, $CACHE_ADVERTISING["CONTRACTS_CNT"]))) { $arFields["VISITOR_COUNT"] = "VISITOR_COUNT + 1"; $CACHE_ADVERTISING["CONTRACTS_CNT"] = array_diff($CACHE_ADVERTISING["CONTRACTS_CNT"], $arContact); } $sContact = ''; foreach($arContact as $c) $sContact .= ($sContact <> ''? ',':'').intval($c); $DB->Update("b_adv_contract",$arFields,"WHERE ID IN(".$sContact.")",$err_mess.__LINE__); } if (!empty($CACHE_ADVERTISING["CONTRACTS_CNT"])) { $sContrCnt = ''; foreach($CACHE_ADVERTISING["CONTRACTS_CNT"] as $c) $sContrCnt .= ($sContrCnt <> ''? ',':'').intval($c); $arFields = Array("VISITOR_COUNT" => "VISITOR_COUNT + 1"); $DB->Update("b_adv_banner",$arFields,"WHERE ID IN(".$sContrCnt.")",$err_mess.__LINE__); } } // сформируем значение cookie if(is_array($arrADV_VIEWED_BANNERS) && count($arrADV_VIEWED_BANNERS) > 0) { $cookie_value = ""; $arrCookie = $arrADV_VIEWED_BANNERS; foreach($arrCookie as $key => $arr) if (intval($key)>0) $cookie_value .= intval($arr["CONTRACT_ID"])."_".$key."_".intval($arr["COUNTER"]). "_".trim($arr["EXPIRATION_DATE"]).","; // длина cookie не может превышать 4Кб $max_length = 4*1024; $j = 0; while (mb_strlen($cookie_value) > $max_length && $j<200) { $j++; $arrCookie_temp = $arrCookie; $arrCookie = array(); $i=0; foreach($arrCookie_temp as $key => $arrValue) { $i++; if ($i>1) $arrCookie[$key] = $arrValue; } $cookie_value = ""; foreach($arrCookie as $key => $arr) if (intval($key)>0) $cookie_value .= intval($arr["CONTRACT_ID"])."_".$key."_".intval($arr["COUNTER"]). "_".trim($arr["EXPIRATION_DATE"]).","; } $cookie_value = trim($cookie_value,","); $cookie_name = "BANNERS"; $secure = (COption::GetOptionString("main", "use_secure_password_cookies", "N") == "Y" && CMain::IsHTTPS()); $APPLICATION->set_cookie($cookie_name, $cookie_value, false, "/", false, $secure); } CAdvBanner::BeforeRestartBuffer(); } } // фиксируем показ баннера public static function FixShow($arBanner) { global $DB, $CACHE_ADVERTISING; if (intval($_SESSION["SESS_SEARCHER_ID"])<=0 && $arBanner["FIX_SHOW"] == "Y" && COption::GetOptionString('advertising', 'DONT_FIX_BANNER_SHOWS') <> "Y") { $BANNER_ID = intval($arBanner["ID"]); $CONTRACT_ID = intval($arBanner["CONTRACT_ID"]); if ($BANNER_ID>0) { CAdvBanner::SetCookie($arBanner, $inc_banner_counter, $inc_contract_counter); if ($arBanner["DATE_SHOW_FIRST"] == '') { $CACHE_ADVERTISING["ALL_DATE_SHOW_FIRST"][$BANNER_ID] = $DB->CurrentTimeFunction(); } if ( isset($_SESSION["SESS_VIEWED_BANNERS"]) && is_array($_SESSION["SESS_VIEWED_BANNERS"]) && in_array($BANNER_ID, $_SESSION["SESS_VIEWED_BANNERS"]) ) { $inc_banner_counter="N"; } if ( isset($_SESSION["SESS_VIEWED_CONTRACTS"]) && is_array($_SESSION["SESS_VIEWED_CONTRACTS"]) && in_array($CONTRACT_ID, $_SESSION["SESS_VIEWED_CONTRACTS"]) ) { $inc_contract_counter="N"; } $CACHE_ADVERTISING["BANNERS_ALL"][] = $BANNER_ID; if ($inc_banner_counter=="Y") { $CACHE_ADVERTISING["BANNERS_CNT"][] = $BANNER_ID; $_SESSION["SESS_VIEWED_BANNERS"][] = $BANNER_ID; } if ($CONTRACT_ID>0) { $CACHE_ADVERTISING["CONTRACTS_ALL"][] = $CONTRACT_ID; if ($inc_contract_counter=="Y") { $CACHE_ADVERTISING["CONTRACTS_CNT"][] = $CONTRACT_ID; $_SESSION["SESS_VIEWED_CONTRACTS"][] = $CONTRACT_ID; } } } } } public static function BeforeRestartBuffer() { global $CACHE_ADVERTISING, $arrADV_VIEWED_BANNERS; $CACHE_ADVERTISING = array( "BANNERS_ALL" => array(), "BANNERS_CNT" => array(), "CONTRACTS_ALL" => array(), "CONTRACTS_CNT" => array(), ); $arrADV_VIEWED_BANNERS = false; //return true; } // устанавливаем cookie посетителю о просмотре баннера public static function SetCookie($arBanner, &$inc_banner_counter, &$inc_contract_counter) { global $arrADV_VIEWED_BANNERS, $APPLICATION; if (intval($arBanner["ID"])>0) { $inc_contract_counter = "N"; $inc_banner_counter = "N"; $days = COption::GetOptionString("advertising", "COOKIE_DAYS"); $cookie_name = "BANNERS"; $arrCookie = array(); $arrContracts = array(); // если мы уже получили на странице значение cookie то if (is_array($arrADV_VIEWED_BANNERS)) { // берем массив arrCookie который уже определен на странице $arrCookie = $arrADV_VIEWED_BANNERS; // соберем массив контрактов foreach ($arrCookie as $arr) { $arrContracts[] = $arr["CONTRACT_ID"]; } if (in_array($arBanner["ID"],array_keys($arrCookie))) { $arrCookie[$arBanner["ID"]]["COUNTER"] = $arrCookie[$arBanner["ID"]]["COUNTER"]+1; $arrCookie[$arBanner["ID"]]["EXPIRATION_DATE"] = date("dmY",time()+(intval($days)*86400)); } } else // если мы первый раз обращаемся к значению хранимому в cookie { // то инициализируем массив arrCookie $arr = explode(",", $APPLICATION->get_cookie($cookie_name)); if (is_array($arr) && count($arr)>0) { $now = time(); foreach($arr as $str) { $ar = explode("_",$str); $contract_id = intval($ar[0]); $arrContracts[] = $contract_id; $banner_id = intval($ar[1]); $counter = intval($ar[2]); if ($arBanner["ID"]==$banner_id) { $counter++; $arrCookie[$arBanner["ID"]] = array( "CONTRACT_ID" => $arBanner["CONTRACT_ID"], "COUNTER" => $counter, "EXPIRATION_DATE" => date("dmY",time()+(intval($days)*86400)) ); } else { $strDate = trim($ar[3]); $month = intval(mb_substr($strDate, 2, 2)); $day = intval(mb_substr($strDate, 0, 2)); $year = intval(mb_substr($strDate, 4, 4)); $stmp = false; if ($month && $day && $year) { $stmp = mktime(0, 0, 0, $month, $day, $year); } if ( $stmp && $stmp > $now ) { $arrCookie[$banner_id] = array( "CONTRACT_ID" => $contract_id, "COUNTER" => $counter, "EXPIRATION_DATE" => ($stmp ? date("dmY", $stmp) : $strDate) ); } } } } } // если данный посетитель по контракту еще не фиксировался то if (!in_array($arBanner["CONTRACT_ID"], $arrContracts)) $inc_contract_counter = "Y"; // если посетитель еще не фиксировался по текущему баннеру то if (!in_array($arBanner["ID"], array_keys($arrCookie))) { // взводим флаг о необходимости увеличить счетчик посетителей $inc_banner_counter="Y"; // добавляем текущий баннер в массив arrCookie $arrCookie[$arBanner["ID"]] = array( "CONTRACT_ID" => $arBanner["CONTRACT_ID"], "COUNTER" => 1, "EXPIRATION_DATE" => date("dmY",time()+(intval($days)*86400)) ); } $arrADV_VIEWED_BANNERS = $arrCookie; } } // возвращает HTML произвольного баннера по типу public static function Show($TYPE_SID, $HTML_BEFORE="", $HTML_AFTER="") { global $APPLICATION, $USER; $debug = null; if(\Bitrix\Main\Application::getInstance()->getKernelSession()["SESS_SHOW_INCLUDE_TIME_EXEC"]=="Y" && $USER->IsAdmin()) { $debug = new CDebugInfo(); $debug->Start(); } $arBanner = CAdvBanner::GetRandom($TYPE_SID); $strReturn = CAdvBanner::GetHTML($arBanner); if($strReturn <> '') { CAdvBanner::FixShow($arBanner); if(($arIcons = CAdvBanner::GetEditIcons($arBanner, $TYPE_SID)) !== false) $strReturn = $APPLICATION->IncludeString($strReturn, $arIcons); $strReturn = $HTML_BEFORE.$strReturn.$HTML_AFTER; if($debug) $strReturn .= $debug->Output(); return $strReturn; } if($debug) echo $debug->Output(); return false; } public static function GetEditIcons($arBanner, $TYPE_SID="", $arIcons = array()) { global $USER, $APPLICATION; static $arContractTypes = false; static $arContracts = false; if($USER->IsAuthorized() && $APPLICATION->GetShowIncludeAreas()) { if(CAdvContract::IsManager() || CAdvContract::IsAdmin()) { if (is_array($arIcons) && count($arIcons) > 0) { if (!empty($arBanner) && isset($arBanner["ID"])) { $curIcon = array( "URL" => 'javascript:'.$APPLICATION->GetPopupLink( array( 'URL' => "/bitrix/admin/adv_banner_edit.php?bxpublic=Y&from_module=advertising&lang=".LANGUAGE_ID."&ID=".$arBanner["ID"]. "&CONTRACT_ID=".$arBanner["CONTRACT_ID"], 'PARAMS' => array( 'width' => 700, 'height' => 400, 'resize' => false, ) ) ), "TEXT" => $arBanner["NAME"] ); if (!is_array($arIcons[0]['MENU'])) { $arIcons[0]['MENU'] = array( array( "URL" => $arIcons[0]['URL'], "TEXT" => $arIcons[0]['MESS'] ) ); unset($arIcons[0]['URL']); unset($arIcons[0]['MESS']); } array_push($arIcons[0]['MENU'], $curIcon); } } else { $arIcons = array(); if (!empty($arBanner) && isset($arBanner["ID"])) { $arIcons[] = array( "URL" => 'javascript:'.$APPLICATION->GetPopupLink( array( 'URL' => "/bitrix/admin/adv_banner_edit.php?bxpublic=Y&from_module=advertising&lang=".LANGUAGE_ID."&ID=".$arBanner["ID"]. "&CONTRACT_ID=".$arBanner["CONTRACT_ID"], 'PARAMS' => array( 'width' => 700, 'height' => 400, 'resize' => false, ) ) ), "ICON" => "bx-context-toolbar-edit-icon", "TITLE" => GetMessage("AD_PUBLIC_ICON_EDIT_BANNER"), "MESS" => $arBanner["NAME"] ); $TYPE_SID = $arBanner["TYPE_SID"]; } if ($TYPE_SID <> '') { $arSubMenu = array(); if($arContracts === false) { $arContracts = array(); $arContractTypes = array(); $contracts = CAdvContract::GetList("s_sort", "desc", array("SITE" => SITE_ID)); while($arContract = $contracts->Fetch()) { $arContracts[] = $arContract; $arContractTypes[$arContract["ID"]] = CAdvContract::GetTypeArray($arContract["ID"]); } } foreach($arContracts as $arContract) { if (array_key_exists("ALL", $arContractTypes[$arContract["ID"]]) || array_key_exists($TYPE_SID, $arContractTypes[$arContract["ID"]])) { $arSubMenu[] = array( "URL" => 'javascript:'.$APPLICATION->GetPopupLink( array( 'URL' => "/bitrix/admin/adv_banner_edit.php?bxpublic=Y&from_module=advertising&lang=".LANGUAGE_ID."&TYPE_SID=".$TYPE_SID."&CONTRACT_ID=".$arContract["ID"], 'PARAMS' => array( 'width' => 700, 'height' => 400, 'resize' => false, ) ) ), "TEXT" => $arContract["NAME"] ); } } $arIcon = array( "ICON" => "bx-context-toolbar-create-icon", "TITLE" => GetMessage("AD_PUBLIC_ICON_ADD_BANNER") ); $nSubMenu = count($arSubMenu); if($nSubMenu == 1) { $arIcon["URL"] = $arSubMenu[0]["URL"]; $arIcons[] = $arIcon; } elseif($nSubMenu > 1) { $arIcon["MENU"] = $arSubMenu; $arIcons[] = $arIcon; } } $arIcons[] = array( "URL" => "/bitrix/admin/adv_banner_list.php?lang=".LANGUAGE_ID."&find_contract_id[]=".$arBanner["CONTRACT_ID"]. "&find_type_sid[]=".$arBanner["TYPE_SID"]."&set_filter=Y", "SRC" => "/bitrix/themes/.default/icons/advertising/comp_view.gif", "TITLE" => GetMessage("AD_PUBLIC_ICON_BANNER_LIST"), "IN_PARAMS_MENU" => true ); } return $arIcons; } } return false; } public static function CheckDynamicFilter($arFilter) { global $strError; $str = ""; $find_date_1 = $arFilter["DATE_1"]; $find_date_2 = $arFilter["DATE_2"]; if (trim($find_date_1) <> '' || trim($find_date_2) <> '') { $date_1_ok = false; $date1_stm = MkDateTime(ConvertDateTime($find_date_1,"D.M.Y"),"d.m.Y"); $date2_stm = MkDateTime(ConvertDateTime($find_date_2,"D.M.Y")." 23:59","d.m.Y H:i"); if (!$date1_stm && trim($find_date_1) <> '') $str.= GetMessage("AD_ERROR_WRONG_PERIOD_FROM")."<br>"; else $date_1_ok = true; if (!$date2_stm && trim($find_date_2) <> '') $str.= GetMessage("AD_ERROR_WRONG_PERIOD_TILL")."<br>"; elseif ($date_1_ok && $date2_stm <= $date1_stm && $date2_stm <> '') $str.= GetMessage("AD_ERROR_FROM_TILL_PERIOD")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } // возвращает массив описывающий динамику баннеров public static function GetDynamicList($arFilter, &$arrLegend, &$is_filtered) { $err_mess = (CAdvBanner::err_mess())."<br>Function: GetDynamicList<br>Line: "; global $DB; $arSqlSearch = Array(); if (CAdvBanner::CheckDynamicFilter($arFilter)) { if (is_array($arFilter)) { $filter_keys = array_keys($arFilter); for ($i=0, $n = count($filter_keys); $i < $n; $i++) { $key = $filter_keys[$i]; $val = $arFilter[$filter_keys[$i]]; if(is_array($val)) { if(count($val)<=0) continue; } else { if( ((string)$val == '') || ("$val"=="NOT_REF") ) continue; } $key = strtoupper($key); switch($key) { case "DATE_1": $arSqlSearch[] = "D.DATE_STAT>=".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE_2": $arSqlSearch[] = "D.DATE_STAT<=".$DB->CharToDateFunction($val." 23:59:59", "FULL"); break; } } } } $arContract = is_array($arFilter["CONTRACT_ID"]) ? $arFilter["CONTRACT_ID"] : array(); $arBanner = is_array($arFilter["BANNER_ID"]) ? $arFilter["BANNER_ID"] : array(); $arGroup = is_array($arFilter["GROUP_SID"]) ? $arFilter["GROUP_SID"] : array(); $contract_total = $arFilter["CONTRACT_SUMMA"]=="Y" ? "Y" : "N"; $banner_total = $arFilter["BANNER_SUMMA"]=="Y" ? "Y" : "N"; $group_total = $arFilter["GROUP_SUMMA"]=="Y" ? "Y" : "N"; $arShow = is_array($arFilter["WHAT_SHOW"]) ? $arFilter["WHAT_SHOW"] : array(); if (in_array("ctr",$arShow)) { $arShow[] = "show"; $arShow[] = "click"; } $arShow = array_unique($arShow); $arrDays = array(); $arrLegend = array(); $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strSql = CAdvBanner::GetDynamicList_SQL($strSqlSearch); $rsD = $DB->Query($strSql, false, $err_mess.__LINE__); while ($arD = $rsD->Fetch()) { $arrDays[$arD["DATE_STAT"]]["DATE"] = $arD["DATE_STAT"]; $arrDays[$arD["DATE_STAT"]]["D"] = $arD["DAY"]; $arrDays[$arD["DATE_STAT"]]["M"] = $arD["MONTH"]; $arrDays[$arD["DATE_STAT"]]["Y"] = $arD["YEAR"]; foreach($arShow as $ctype) { if ($ctype=="CTR") continue; $ctype_u = mb_strtoupper($ctype); if (intval($arD[$ctype_u."_COUNT"])>0) { if (in_array($arD["CONTRACT_ID"], $arContract)) { if ($contract_total=="N") { $arrLegend["3_CONTRACT_".$arD["CONTRACT_ID"]]["TYPE"] = "CONTRACT"; $arrLegend["3_CONTRACT_".$arD["CONTRACT_ID"]]["ID"] = $arD["CONTRACT_ID"]; $arrLegend["3_CONTRACT_".$arD["CONTRACT_ID"]]["NAME"] = $arD["CONTRACT_NAME"]; $arrLegend["3_CONTRACT_".$arD["CONTRACT_ID"]]["COUNTER_TYPE"] = "DETAIL"; $arrLegend["3_CONTRACT_".$arD["CONTRACT_ID"]][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["CONTRACT"]["DETAIL_".$ctype_u][$arD["CONTRACT_ID"]] += $arD[$ctype_u."_COUNT"]; } elseif ($contract_total=="Y") { $arrLegend["3_CONTRACT"]["TYPE"] = "CONTRACT"; $arrLegend["3_CONTRACT"]["COUNTER_TYPE"] = "TOTAL"; $arrLegend["3_CONTRACT"][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["CONTRACT"]["TOTAL_".$ctype_u] += $arD[$ctype_u."_COUNT"]; } } if (in_array($arD["BANNER_ID"], $arBanner)) { if ($banner_total=="N") { $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["TYPE"] = "BANNER"; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["ID"] = $arD["BANNER_ID"]; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["TYPE_SID"] = $arD["BANNER_TYPE_SID"]; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["GROUP"] = $arD["GROUP_SID"]; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["NAME"] = $arD["BANNER_NAME"]; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["CONTRACT_ID"] = $arD["CONTRACT_ID"]; $arrLegend["1_BANNER_".$arD["BANNER_ID"]]["COUNTER_TYPE"] = "DETAIL"; $arrLegend["1_BANNER_".$arD["BANNER_ID"]][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["BANNER"]["DETAIL_".$ctype_u][$arD["BANNER_ID"]] += $arD[$ctype_u."_COUNT"]; } elseif ($banner_total=="Y") { $arrLegend["1_BANNER"]["TYPE"] = "BANNER"; $arrLegend["1_BANNER"]["COUNTER_TYPE"] = "TOTAL"; $arrLegend["1_BANNER"][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["BANNER"]["TOTAL_".$ctype_u] += $arD[$ctype_u."_COUNT"]; } } if (in_array($arD["GROUP_SID"], $arGroup)) { if ($group_total=="N") { $arrLegend["2_GROUP_".$arD["GROUP_SID"]]["TYPE"] = "GROUP"; $arrLegend["2_GROUP_".$arD["GROUP_SID"]]["ID"] = $arD["GROUP_SID"]; $arrLegend["2_GROUP_".$arD["GROUP_SID"]]["COUNTER_TYPE"] = "DETAIL"; $arrLegend["2_GROUP_".$arD["GROUP_SID"]][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["GROUP"]["DETAIL_".$ctype_u][$arD["GROUP_SID"]] += $arD[$ctype_u."_COUNT"]; } elseif ($group_total=="Y") { $arrLegend["2_GROUP"]["TYPE"] = "GROUP"; $arrLegend["2_GROUP"]["COUNTER_TYPE"] = "TOTAL"; $arrLegend["2_GROUP"][$ctype_u] += $arD[$ctype_u."_COUNT"]; $arrDays[$arD["DATE_STAT"]]["GROUP"]["TOTAL_".$ctype_u] += $arD[$ctype_u."_COUNT"]; } } } } } if (in_array("ctr", $arShow)) { // рассчитаем CTR foreach ($arrDays as $keyD => $arD) { foreach ($arrLegend as $arrS) { if ($arrS["COUNTER_TYPE"]=="DETAIL") { $show_value = intval($arD[$arrS["TYPE"]][$arrS["COUNTER_TYPE"]."_SHOW"][$arrS["ID"]]); $click_value = intval($arD[$arrS["TYPE"]][$arrS["COUNTER_TYPE"]."_CLICK"][$arrS["ID"]]); if ($show_value<=0) $ctr_value=0; else $ctr_value = round(($click_value*100)/$show_value, 2); $arD[$arrS["TYPE"]]["DETAIL_CTR"][$arrS["ID"]] = $ctr_value; $arrDays[$keyD] = $arD; } else { $show_value = intval($arD[$arrS["TYPE"]][$arrS["COUNTER_TYPE"]."_SHOW"]); $click_value = intval($arD[$arrS["TYPE"]][$arrS["COUNTER_TYPE"]."_CLICK"]); if ($show_value<=0) $ctr_value=0; else $ctr_value = round(($click_value*100)/$show_value, 2); $arD[$arrS["TYPE"]]["TOTAL_CTR"] = $ctr_value; $arrDays[$keyD] = $arD; } } } } // Определим цвета и суммарный CTR $s = 0; if (in_array("ctr", $arShow)) $s++; if ($arFilter["WHAT_SHOW"]!=array("ctr") && in_array("show", $arShow)) $s++; if ($arFilter["WHAT_SHOW"]!=array("ctr") && in_array("click", $arShow)) $s++; if ($arFilter["WHAT_SHOW"]!=array("ctr") && in_array("visitor", $arShow)) $s++; $total = sizeof($arrLegend)*$s; $color = ""; foreach ($arrLegend as $key => $arr) { if (in_array("ctr", $arShow)) { $color = GetNextRGB($color, $total); $arr["COLOR_CTR"] = $color; if ($arr["SHOW"]<=0) $ctr = 0; else $ctr = round(($arr["CLICK"]*100)/$arr["SHOW"], 2); $arr["CTR"] = $ctr; } if ($arFilter["WHAT_SHOW"]!=array("ctr")) { if (in_array("show", $arShow)) { $color = GetNextRGB($color, $total); $arr["COLOR_SHOW"] = $color; } if (in_array("click", $arShow)) { $color = GetNextRGB($color, $total); $arr["COLOR_CLICK"] = $color; } if (in_array("visitor", $arShow)) { $color = GetNextRGB($color, $total); $arr["COLOR_VISITOR"] = $color; } } $arr["COLOR"] = $color; $arrLegend[$key] = $arr; } krsort($arrLegend); $is_filtered = (IsFiltered($strSqlSearch)); reset($arrDays); reset($arrLegend); return $arrDays; } public static function GetStatList($by, $order, $arFilter) { $err_mess = (CAdvBanner::err_mess())."<br>Function: GetStatList<br>Line: "; global $DB; $arSqlSearch = Array(); if (CAdvBanner::CheckDynamicFilter($arFilter)) { if (is_array($arFilter)) { $filter_keys = array_keys($arFilter); for ($i=0, $n = count($filter_keys); $i < $n; $i++) { $key = $filter_keys[$i]; $val = $arFilter[$filter_keys[$i]]; if(is_array($val)) { if(count($val)<=0) continue; } else { if( ((string)$val == '') || ("$val"=="NOT_REF") ) continue; } $key = strtoupper($key); switch($key) { case "DATE_1": $arSqlSearch[] = "D.DATE_STAT>=".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE_2": $arSqlSearch[] = "D.DATE_STAT<=".$DB->CharToDateFunction($val." 23:59:59", "FULL"); break; } } \Bitrix\Main\Type\Collection::normalizeArrayValuesByInt($arFilter['BANNER_ID']); if(!empty($arFilter['BANNER_ID'])) { $where = new CSQLWhere(); $arSqlSearch[] = $where->_NumberIN("D.BANNER_ID", $arFilter['BANNER_ID']); } } } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); if ($by == "s_date") { $strSqlOrder = " ORDER BY D.DATE_STAT "; } elseif ($by == "s_visitors") { $strSqlOrder = " ORDER BY VISITOR_COUNT "; } elseif ($by == "s_clicks") { $strSqlOrder = " ORDER BY CLICK_COUNT "; } elseif ($by == "s_ctr") { $strSqlOrder = " ORDER BY CTR"; } elseif ($by == "s_show") { $strSqlOrder = " ORDER BY SHOW_COUNT "; } elseif ($by == "s_id") { $strSqlOrder = " ORDER BY D.BANNER_ID"; } else { $strSqlOrder = " ORDER BY DATE_STAT"; $by = "s_date"; } if ($order!="asc") { $strSqlOrder .= " desc "; } if ($by != "s_date") { $strSqlOrder .= ', DATE_STAT ASC'; } if ($arFilter['BANNER_SUMMA'] == 'Y') { $strSql = " SELECT ".$DB->DateToCharFunction("D.DATE_STAT","SHORT")." DATE_STAT, SUM(D.SHOW_COUNT) SHOW_COUNT, SUM(D.CLICK_COUNT) CLICK_COUNT, SUM(D.VISITOR_COUNT) VISITOR_COUNT, " . CAdvBanner::getCTRSQL() . " FROM b_adv_banner_2_day D INNER JOIN b_adv_banner B ON (D.BANNER_ID = B.ID) INNER JOIN b_adv_contract C ON (B.CONTRACT_ID = C.ID) WHERE $strSqlSearch GROUP by DATE_STAT $strSqlOrder "; } else { $strSql = " SELECT ".$DB->DateToCharFunction("D.DATE_STAT","SHORT")." DATE_STAT, SUM(D.SHOW_COUNT) SHOW_COUNT, SUM(D.CLICK_COUNT) CLICK_COUNT, SUM(D.VISITOR_COUNT) VISITOR_COUNT, D.BANNER_ID, B.NAME BANNER_NAME, " . CAdvBanner::getCTRSQL() . " FROM b_adv_banner_2_day D INNER JOIN b_adv_banner B ON (D.BANNER_ID = B.ID) INNER JOIN b_adv_contract C ON (B.CONTRACT_ID = C.ID) WHERE $strSqlSearch GROUP by D.DATE_STAT, D.BANNER_ID, B.NAME $strSqlOrder "; } return $DB->Query($strSql, false, $err_mess.__LINE__); } } /***************************************************************** Класс "Тип баннера" *****************************************************************/ class CAdvType_all { public static function err_mess() { $module_id = "advertising"; return "<br>Module: ".$module_id."<br>Class: CAdvType_all<br>File: ".__FILE__; } public static function CheckFilter($arFilter) { global $strError; $str = ""; $find_date_modify_1 = $arFilter["DATE_MODIFY_1"]; $find_date_modify_2 = $arFilter["DATE_MODIFY_2"]; if (trim($find_date_modify_1) <> '' || trim($find_date_modify_2) <> '') { $date_1_ok = false; $date1_stm = MkDateTime(ConvertDateTime($find_date_modify_1,"D.M.Y"),"d.m.Y"); $date2_stm = MkDateTime(ConvertDateTime($find_date_modify_2,"D.M.Y")." 23:59","d.m.Y H:i"); if (!$date1_stm && trim($find_date_modify_1) <> '') $str.= GetMessage("AD_ERROR_WRONG_DATE_MODIFY_FROM")."<br>"; else $date_1_ok = true; if (!$date2_stm && trim($find_date_modify_2) <> '') $str.= GetMessage("AD_ERROR_WRONG_DATE_MODIFY_TILL")."<br>"; elseif ($date_1_ok && $date2_stm <= $date1_stm && $date2_stm <> '') $str.= GetMessage("AD_ERROR_FROM_TILL_DATE_MODIFY")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } // получаем следующий порядок сортировки public static function GetNextSort() { global $DB; $err_mess = (CAdvType_all::err_mess())."<br>Function: GetNextSort<br>Line: "; $strSql = "SELECT max(SORT) MAX_SORT FROM b_adv_type"; $z = $DB->Query($strSql, false, $err_mess.__LINE__); $zr = $z->Fetch(); return intval($zr["MAX_SORT"])+100; } public static function CheckFields($arFields, $OLD_SID, $CHECK_RIGHTS) { global $strError; $str = ""; $SID = $arFields["SID"]; if ($CHECK_RIGHTS=="Y") { $isAdmin = CAdvContract::IsAdmin(); } else { $isAdmin = true; } if ($isAdmin) { $arrKeys = array_keys($arFields); if (in_array("SID", $arrKeys)) { if(trim($SID) == '') { $str .= GetMessage("AD_ERROR_FORGOT_SID")."<br>"; } else { if (preg_match("/[^A-Za-z_0-9]/", $SID)) { $str .= GetMessage("AD_ERROR_INCORRECT_SID")."<br>"; } else { if ($OLD_SID!=$SID) { $arFilter = array("SID" => $SID." & ~".$OLD_SID, "SID_EXACT_MATCH" => "Y"); $rs = CAdvType::GetList('', '', $arFilter); $rows = 0; if (is_object($rs)) { $rs->NavStart(); $rows = intval($rs->SelectedRowsCount()); } if ($rows>=1 || $SID == "ALL" || $OLD_SID == "ALL") { $str .= str_replace("#SID#", ($OLD_SID == "ALL" ? $OLD_SID : $SID), GetMessage("AD_ERROR_SID_EXISTS")); } } } } } } else { if ($OLD_SID <> '') $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_TYPE")."<br>"; else $str .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_FOR_CREATE_TYPE")."<br>"; } $strError .= $str; if ($str <> '') return false; else return true; } // добавляем новый тип или модифицируем существующий public static function Set($arFields, $OLD_SID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvType_all::err_mess())."<br>Function: Set<br>Line: "; global $DB, $USER; $SID = false; $OLD_SID = trim($OLD_SID); if (CAdvType::CheckFields($arFields, $OLD_SID, $CHECK_RIGHTS)) { $arFields_i = array(); $arrKeys = array_keys($arFields); if (in_array("SID", $arrKeys)) $arFields_i["SID"] = "'".$DB->ForSql($arFields["SID"], 255)."'"; if (in_array("ACTIVE", $arrKeys) && ($arFields["ACTIVE"]=="Y" || $arFields["ACTIVE"]=="N")) $arFields_i["ACTIVE"] = "'".$arFields["ACTIVE"]."'"; if (in_array("SORT", $arrKeys)) $arFields_i["SORT"] = "'".intval($arFields["SORT"])."'"; if (in_array("NAME", $arrKeys)) $arFields_i["NAME"] = "'".$DB->ForSql($arFields["NAME"], 255)."'"; if (in_array("DESCRIPTION", $arrKeys)) $arFields_i["DESCRIPTION"] = "'".$DB->ForSql($arFields["DESCRIPTION"], 2000)."'"; if (count($arFields_i)>0) { if ($OLD_SID <> '') { if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER->GetID(); $str = ""; foreach ($arFields_i as $field => $value) { if ($value == '') $str .= "$field = '', "; else $str .= "$field = $value, "; } $str = trim($str, ", "); $strSql = "UPDATE b_adv_type SET ".$str." WHERE SID='".$DB->ForSql($OLD_SID, 255)."'"; $DB->Query($strSql, false, $err_mess.__LINE__); if (in_array("SID", $arrKeys)) { $SID = $arFields["SID"]; // если SID изменился то if ($arFields["SID"]!=$OLD_SID) { // обновим тип у баннеров $arF = array("TYPE_SID" => "'".$DB->ForSql($arFields["SID"],255)."'"); $DB->Update("b_adv_banner",$arF,"WHERE TYPE_SID='".$DB->ForSql($OLD_SID, 255)."'",$err_mess.__LINE__); // обновим тип у баннеров $arF = array("TYPE_SID" => "'".$DB->ForSql($arFields["SID"],255)."'"); $DB->Update("b_adv_contract_2_type",$arF,"WHERE TYPE_SID='".$DB->ForSql($OLD_SID, 255)."'",$err_mess.__LINE__); } } else $SID = $OLD_SID; } elseif ($arFields_i["SID"] <> '') { if (in_array("DATE_CREATE", $arrKeys) && CheckDateTime($arFields["DATE_CREATE"])) $arFields_i["DATE_CREATE"] = $DB->CharToDateFunction($arFields["DATE_CREATE"]); else $arFields_i["DATE_CREATE"] = $DB->GetNowFunction(); if (in_array("CREATED_BY", $arrKeys)) $arFields_i["CREATED_BY"] = intval($arFields["CREATED_BY"]); else $arFields_i["CREATED_BY"] = $USER->GetID(); if (in_array("DATE_MODIFY", $arrKeys) && CheckDateTime($arFields["DATE_MODIFY"])) $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]); else $arFields_i["DATE_MODIFY"] = $DB->GetNowFunction(); if (in_array("MODIFIED_BY", $arrKeys)) $arFields_i["MODIFIED_BY"] = intval($arFields["MODIFIED_BY"]); else $arFields_i["MODIFIED_BY"] = $USER->GetID(); $str1 = $str2 = ""; foreach ($arFields_i as $field => $value) { $str1 .= $field.", "; if ($value == '') $str2 .= "'', "; else $str2 .= "$value, "; } $str1 = trim($str1, ", "); $str2 = trim($str2, ", "); $strSql = "INSERT INTO b_adv_type (".$str1.") VALUES (".$str2.")"; $DB->Query($strSql, false, $err_mess.__LINE__); $SID = $arFields["SID"]; } } } else { $SID = $arFields["SID"]; } return $SID; } // получаем тип баннера по ID public static function GetByID($TYPE_SID) { if (trim($TYPE_SID) == '') return false; $arFilter = array( "SID" => $TYPE_SID, "SID_EXACT_MATCH" => "Y" ); $rs = CAdvType::GetList('', '', $arFilter); return $rs; } // удаляем тип баннера public static function Delete($TYPE_SID, $CHECK_RIGHTS="Y") { $err_mess = (CAdvType_all::err_mess())."<br>Function: Delete<br>Line: "; global $DB, $strError; if ($TYPE_SID == '') return false; if ($CHECK_RIGHTS=="Y") { $isAdmin = CAdvContract::IsAdmin(); } else { $isAdmin = true; } if ($isAdmin) { $strSql = "SELECT ID FROM b_adv_banner WHERE TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."'"; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while ($ar = $rs->Fetch()) CAdvBanner::Delete($ar["ID"], "N"); CAdvType::DeleteContractLink($TYPE_SID); $strSql = "DELETE FROM b_adv_type WHERE SID = '".$DB->ForSql($TYPE_SID,255)."'"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } else $strError .= GetMessage("AD_ERROR_NOT_ENOUGH_PERMISSIONS_TYPE")."<br>"; return false; } // удаляем связь типа с контрактом public static function DeleteContractLink($TYPE_SID) { $err_mess = (CAdvType_all::err_mess())."<br>Function: DeleteContractLink<br>Line: "; global $DB; if ($TYPE_SID == '') { return false; } $strSql = "DELETE FROM b_adv_contract_2_type WHERE TYPE_SID = '".$DB->ForSql($TYPE_SID,255)."'"; $DB->Query($strSql, false, $err_mess.__LINE__); return true; } // получаем список типов баннеров public static function GetList($by = "s_sort", $order = "asc", $arFilter = [], $is_filtered = null, $CHECK_RIGHTS = "Y") { $err_mess = (CAdvType_all::err_mess())."<br>Function: GetList<br>Line: "; global $DB; $arSqlSearch = Array(); if ($CHECK_RIGHTS=="Y") { $isAdmin = CAdvContract::IsAdmin(); $isDemo = CAdvContract::IsDemo(); $isManager = CAdvContract::IsManager(); $isAdvertiser = CAdvContract::IsAdvertiser(); } else { $isAdmin = true; $isDemo = true; $isManager = true; $isAdvertiser = true; } if ($isAdmin || $isDemo || $isManager || $isAdvertiser) { if (CAdvType::CheckFilter($arFilter)) { if (is_array($arFilter)) { $filter_keys = array_keys($arFilter); for ($i=0, $n = count($filter_keys); $i < $n; $i++) { $key = $filter_keys[$i]; $val = $arFilter[$filter_keys[$i]]; if(is_array($val)) { if(count($val) <= 0) continue; } else { if( ((string)$val == '') || ($val === "NOT_REF") ) continue; } $match_value_set = (in_array($key."_EXACT_MATCH", $filter_keys)) ? true : false; $key = strtoupper($key); switch($key) { case "SID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.SID", $val, $match); break; case "DATE_MODIFY_1": $arSqlSearch[] = "T.DATE_MODIFY>=".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE_MODIFY_2": $arSqlSearch[] = "T.DATE_MODIFY<=".$DB->CharToDateFunction($val." 23:59:59", "FULL"); break; case "ACTIVE": $arSqlSearch[] = ($val=="Y") ? "T.ACTIVE='Y'" : "T.ACTIVE='N'"; break; case "NAME": case "DESCRIPTION": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.".$key, $val, $match); break; } } } } if ($by == "s_sid") $strSqlOrder = " ORDER BY T.SID "; elseif ($by == "s_date_modify") $strSqlOrder = " ORDER BY T.DATE_MODIFY "; elseif ($by == "s_modified_by") $strSqlOrder = " ORDER BY T.MODIFIED_BY "; elseif ($by == "s_date_create") $strSqlOrder = " ORDER BY T.DATE_CREATE "; elseif ($by == "s_created_by") $strSqlOrder = " ORDER BY T.CREATED_BY "; elseif ($by == "s_active") $strSqlOrder = " ORDER BY T.ACTIVE "; elseif ($by == "s_name") $strSqlOrder = " ORDER BY T.NAME "; elseif ($by == "s_banners") $strSqlOrder = " ORDER BY BANNER_COUNT "; elseif ($by == "s_description") $strSqlOrder = " ORDER BY T.DESCRIPTION "; else { $strSqlOrder = " ORDER BY T.SORT "; } if ($order == "desc") { $strSqlOrder .= " desc "; } else { $strSqlOrder .= " asc "; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strContracts = ""; if (!$isAdmin && !$isDemo && !$isManager) { $strContracts = "0"; $arPermissions = CAdvContract::GetUserPermissions(); foreach ($arPermissions as $contract_id => $arContractPerms) { if (is_array($arContractPerms) && !empty($arContractPerms)) $strContracts .= ",".$contract_id; } } $strSql = " SELECT T.SID, T.ACTIVE, T.SORT, T.NAME, T.DESCRIPTION, ".$DB->DateToCharFunction("T.DATE_CREATE")." DATE_CREATE, ".$DB->DateToCharFunction("T.DATE_MODIFY")." DATE_MODIFY, T.CREATED_BY, T.MODIFIED_BY, count(distinct B.ID) BANNER_COUNT FROM b_adv_type T LEFT JOIN b_adv_banner B ON (B.TYPE_SID=T.SID".($strContracts == "" ? "" :" AND B.CONTRACT_ID IN (".$strContracts.")").") WHERE $strSqlSearch ". ($strContracts == "" ? "" : "and exists(select 'x' from b_adv_contract_2_type CT where (CT.TYPE_SID=T.SID OR CT.TYPE_SID='ALL') AND CT.CONTRACT_ID IN (".$strContracts.")) " ). " and T.SID<>'ALL' GROUP BY T.SID, T.ACTIVE, T.SORT, T.NAME, T.DESCRIPTION, T.DATE_CREATE, T.DATE_MODIFY, T.CREATED_BY, T.MODIFIED_BY $strSqlOrder "; $res = $DB->Query($strSql, false, $err_mess.__LINE__); return $res; } return null; } } /******************************************** совместимость со старой версией модуля *********************************************/ class CAdvertising { public static function GetAdv($TYPE_SID) { return CAdvBanner::Show($TYPE_SID); } public static function ClickAdv($BANNER_ID) { return CAdvBanner::Click($BANNER_ID); } }