Ejemplo n.º 1
0
 /**
  * <p>Функция предназначена для получения списка контрактов.</p>
  *
  *
  *
  *
  * @param varchar &$by  Идентификатор позволяющий задать имя поля для сортировки.
  * Допустимы следующие значения: <ul> <li>s_id - по ID </li> <li>s_lamp - по
  * индикатору контракта </li> <li>s_name - по заголовку контракта </li>
  * <li>s_description - по описанию контракта </li> <li>s_active - по флагу активности
  * </li> <li>s_weight - по весу </li> <li>s_sort - по сортировки </li> <li>s_date_modify - по дате
  * модификации </li> <li>s_modified_by - по ID пользователя изменившего
  * контракт </li> <li>s_banner_count - по числу баннеров приписанных к
  * контракту </li> <li>s_ctr - по отклику (CTR) контракта </li> <li>s_show_count - по
  * суммарному числу показов баннеров контракта </li> <li>s_max_show_count - по
  * максимальному суммарному числу всех показов баннеров контракта
  * </li> <li>s_click_count - по суммарному числу кликов на баннеры контракта </li>
  * <li>s_max_click_count - по максимальному суммарному числу кликов на баннеры
  * контракта</li> </ul>
  *
  *
  *
  * @param varchar &$order  Массив для фильтрации значений. Необязательный параметр. В
  * массиве допустимы следующие индексы: <ul> <li>ID - ID контракта
  * (допускается сложная логика) </li> <li>- "Y" - при фильтрации по ID
  * контракта будет искаться точное совпадение (по умолчанию); "N" - в
  * противном случае будет искаться вхождение </li> <li>LAMP - значение
  * индикатора: "red", "green" </li> <li>DATE_MODIFY_1 - левая часть интервала для даты
  * модификации контракта </li> <li>DATE_MODIFY_2 - правая часть интервала для
  * даты модификации контракта </li> <li>NAME - имя контракта (допускается
  * сложная логика) </li> <li>NAME_EXACT_MATCH - "Y" - при фильтрации по имени
  * контракта будет искаться точное совпадение; "N" - в противном
  * случае будет искаться вхождение (по умолчанию) </li> <li>DESCRIPTION -
  * описание контракта (допускается сложная логика) </li>
  * <li>DESCRIPTION_EXACT_MATCH - "Y" - при фильтрации по описанию контракта будет
  * искаться точное совпадение; "N" - в противном случае будет искаться
  * вхождение (по умолчанию) </li> <li>OWNER - ID, ФИО, логин владельца
  * контракта (допускается сложная логика) </li> <li>OWNER_EXACT_MATCH - "Y" - при
  * фильтрации по ID, ФИО, логину владельца контракта будет искаться
  * точное совпадение; "N" - в противном случае будет искаться
  * вхождение (по умолчанию) </li> <li>BANNER_COUNT_1 - левая часть интервала для
  * числа баннеров контракта </li> <li>BANNER_COUNT_2 - правая часть интервала
  * для числа баннеров контракта </li> <li>SHOW_COUNT_1 - левая часть интервала
  * для суммарного числа показов баннеров контракта </li> <li>SHOW_COUNT_2 -
  * правая часть интервала для суммарного числа показов баннеров
  * контракта </li> <li>CLICK_COUNT_1 - левая часть интервала для суммарного
  * числа кликов по баннерам контракта </li> <li>CLICK_COUNT_2 - правая часть
  * интервала для суммарного числа кликов по баннерам контракта </li>
  * <li>CTR_1 - левая часть интервала для CTR контракта </li> <li>CTR_2 - правая
  * часть интервала для CTR контракта </li> <li>ADMIN_COMMENTS - административный
  * комментарий к контракту (допускается сложная логика) </li>
  * <li>ADMIN_COMMENTS_EXACT_MATCH - "Y" - при фильтрации по административному
  * комментарию к контракту будет искаться точное совпадение; "N" - в
  * противном случае будет искаться вхождение (по умолчанию)</li> </ul>
  *
  *
  *
  * @param array $arFilter = array() Параметр проверяет уровень доступа к модулю Реклама
  * (администратор рекламы, рекламодатель и т.д.) Если параметр
  * определён как "N", то считается, что текущий пользователь обладает
  * административными правами доступа к модулю Реклама. Если
  * параметр пропущен либо равен "Y", то функция проверяет уровень
  * доступа к контракту, которому принадлежит баннер. Необязательный
  * параметр.
  *
  *
  *
  * @param boolean &$is_filtered  
  *
  *
  *
  * @param char(1) $CHECK_RIGHTS = "Y" 
  *
  *
  *
  * @return record 
  *
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // фильтр
  * $FilterArr = Array(
  * 	"find_id",
  * 	"find_id_exact_match",
  * 	"find_date_modify_1", 
  * 	"find_date_modify_2", 
  * 	"find_name",
  * 	"find_name_exact_match",
  * 	"find_description", 
  * 	"find_description_exact_match",
  * 	"find_lamp", 
  * 	"find_owner",
  * 	"find_owner_exact_match",
  * 	"find_banner_count_1",
  * 	"find_banner_count_2",
  * 	"find_show_count_1",
  * 	"find_show_count_2",
  * 	"find_click_count_1",
  * 	"find_click_count_2",
  * 	"find_ctr_1",
  * 	"find_ctr_2",
  * 	"find_admin_comments",
  * 	"find_admin_comments_exact_match"
  * 	);
  * if (strlen($set_filter)&gt;0) InitFilterEx($FilterArr,"ADV_CONTRACT_LIST","set"); 
  * else InitFilterEx($FilterArr,"ADV_CONTRACT_LIST","get");
  * if (strlen($del_filter)&gt;0) DelFilterEx($FilterArr,"ADV_CONTRACT_LIST");
  * InitBVar($find_id_exact_match);
  * InitBVar($find_name_exact_match);
  * InitBVar($find_description_exact_match);
  * InitBVar($find_owner_exact_match);
  * InitBVar($find_admin_comments_exact_match);
  * $arFilter = Array(
  * 	"ID"							=&gt; $find_id,
  * 	"ID_EXACT_MATCH"				=&gt; $find_id_exact_match,
  * 	"DATE_MODIFY_1"				 =&gt; $find_date_modify_1, 
  * 	"DATE_MODIFY_2"				 =&gt; $find_date_modify_2, 
  * 	"NAME"						  =&gt; $find_name,
  * 	"NAME_EXACT_MATCH"			  =&gt; $find_name_exact_match,
  * 	"DESCRIPTION"				   =&gt; $find_description,
  * 	"DESCRIPTION_EXACT_MATCH"	   =&gt; $find_description_exact_match,
  * 	"LAMP"						  =&gt; $find_lamp,
  * 	"OWNER"						 =&gt; $find_owner,
  * 	"OWNER_EXACT_MATCH"			 =&gt; $find_owner_exact_match,
  * 	"BANNER_COUNT_1"				=&gt; $find_banner_count_1,
  * 	"BANNER_COUNT_2"				=&gt; $find_banner_count_2,
  * 	"SHOW_COUNT_1"				  =&gt; $find_show_count_1,
  * 	"SHOW_COUNT_2"				  =&gt; $find_show_count_2,
  * 	"CLICK_COUNT_1"				 =&gt; $find_click_count_1,
  * 	"CLICK_COUNT_2"				 =&gt; $find_click_count_2,
  * 	"CTR_1"						 =&gt; $find_ctr_1,
  * 	"CTR_2"						 =&gt; $find_ctr_2,
  * 	"ADMIN_COMMENTS"				=&gt; $find_admin_comments,
  * 	"ADMIN_COMMENTS_EXACT_MATCH"	=&gt; $find_admin_comments_exact_match
  * 	);
  * $rsAdvContract = <b>CAdvContract::GetList</b>($by, $order, $arFilter, $is_filtered, "N");
  * ?&gt;
  * 
  * &lt;?
  * Array
  * (
  * 	[LAMP] =&gt; green
  * 	[ID] =&gt; 3
  * 	[ACTIVE] =&gt; Y
  * 	[NAME] =&gt; заголовок контракта
  * 	[DESCRIPTION] =&gt; описание контракта
  * 	[ADMIN_COMMENTS] =&gt; административный комментарий
  * 	[WEIGHT] =&gt; 1000
  * 	[SORT] =&gt; 200
  * 	[MAX_SHOW_COUNT] =&gt; 1000
  * 	[SHOW_COUNT] =&gt; 312
  * 	[MAX_CLICK_COUNT] =&gt; 100
  * 	[CLICK_COUNT] =&gt; 64
  * 	[EMAIL_COUNT] =&gt; 0
  * 	[CREATED_BY] =&gt; 2
  * 	[MODIFIED_BY] =&gt; 2
  * 	[DEFAULT_STATUS_SID] =&gt; READY
  * 	[CTR] =&gt; 20.51
  * 	[DATE_SHOW_FROM] =&gt; 15.06.2004
  * 	[DATE_SHOW_TO] =&gt; 07.07.2009
  * 	[DATE_CREATE] =&gt; 07.06.2004 19:04:55
  * 	[DATE_MODIFY] =&gt; 24.06.2004 10:56:08
  * 	[BANNER_COUNT] =&gt; 12
  * )
  * ?&gt;
  * </pre>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/advertising/classes/cadvcontract/getlist.php
  * @author Bitrix
  */
 public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered, $CHECK_RIGHTS = "Y")
 {
     $err_mess = CAdvContract::err_mess() . "<br>Function: GetList<br>Line: ";
     global $DB, $USER, $APPLICATION, $strError;
     if ($CHECK_RIGHTS == "Y") {
         $USER_ID = intval($USER->GetID());
         $isAdmin = CAdvContract::IsAdmin();
         $isDemo = CAdvContract::IsDemo();
         $isManager = CAdvContract::IsManager();
         $isAdvertiser = CAdvContract::IsAdvertiser();
     } else {
         if (is_object($USER)) {
             $USER_ID = intval($USER->GetID());
         } else {
             $USER_ID = 0;
         }
         $isAdmin = true;
         $isDemo = true;
         $isManager = true;
         $isAdvertiser = true;
     }
     $arSqlSearch = array();
     $strSqlSearch = "";
     $lamp = "\n\t\t\tif ((\n\t\t\t\t(C.DATE_SHOW_FROM<=now() or C.DATE_SHOW_FROM is null or length(C.DATE_SHOW_FROM)<=0) and\n\t\t\t\t(C.DATE_SHOW_TO>=now() or C.DATE_SHOW_TO is null or length(C.DATE_SHOW_TO)<=0) and\n\t\t\t\t(ifnull(C.MAX_SHOW_COUNT,0)>ifnull(C.SHOW_COUNT,0) or ifnull(C.MAX_SHOW_COUNT,0)=0) and\n\t\t\t\t(ifnull(C.MAX_CLICK_COUNT,0)>ifnull(C.CLICK_COUNT,0) or ifnull(C.MAX_CLICK_COUNT,0)=0) and\n\t\t\t\t(ifnull(C.MAX_VISITOR_COUNT,0)>ifnull(C.VISITOR_COUNT,0) or ifnull(C.MAX_VISITOR_COUNT,0)=0) and\n\t\t\t\t(C.ACTIVE='Y')\n\t\t\t\t),\n\t\t\t\t'green',\n\t\t\t\t'red')\n\t\t\t";
     if (CAdvContract::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 ($val == '' || "{$val}" == "NOT_REF") {
                     continue;
                 }
                 if (is_array($val) && count($val) <= 0) {
                     continue;
                 }
                 $match_value_set = in_array($key . "_EXACT_MATCH", $filter_keys) ? true : false;
                 $key = strtoupper($key);
                 switch ($key) {
                     case "ID":
                         $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                         $arSqlSearch[] = GetFilterQuery("C.ID", $val, $match);
                         break;
                     case "SITE":
                         if (is_array($val)) {
                             $val = implode(" | ", $val);
                         }
                         $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                         $arSqlSearch[] = GetFilterQuery("CS.SITE_ID", $val, $match);
                         $left_join = "LEFT JOIN b_adv_contract_2_site CS ON (C.ID = CS.CONTRACT_ID)";
                         break;
                     case "DATE_MODIFY_1":
                         $arSqlSearch[] = "C.DATE_MODIFY>=" . $DB->CharToDateFunction($val, "SHORT");
                         break;
                     case "DATE_MODIFY_2":
                         $arSqlSearch[] = "C.DATE_MODIFY<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY";
                         break;
                     case "NAME":
                     case "DESCRIPTION":
                     case "ADMIN_COMMENTS":
                         $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                         $arSqlSearch[] = GetFilterQuery("C." . $key, $val, $match);
                         break;
                     case "LAMP":
                         $arSqlSearch[] = " " . $lamp . " = '" . $DB->ForSQL($val) . "'";
                         break;
                     case "OWNER":
                         $from = "\n\t\t\t\t\t\t\t\tINNER JOIN b_user U ON (U.ID = CU.USER_ID)\n\t\t\t\t\t\t\t\t";
                         $admin_from_1 = "\n\t\t\t\t\t\t\t\tINNER JOIN b_adv_contract_2_user CU ON (CU.CONTRACT_ID=C.ID)\n\t\t\t\t\t\t\t\t";
                         $admin_from_2 = "\n\t\t\t\t\t\t\t\tINNER JOIN b_user U ON (U.ID = CU.USER_ID)\n\t\t\t\t\t\t\t\t";
                         $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                         $arSqlSearch[] = GetFilterQuery("CU.USER_ID, U.LOGIN, U.NAME, U.LAST_NAME", $val, $match);
                         break;
                     case "BANNER_COUNT_1":
                         $arSqlSearch_h[] = "BANNER_COUNT>='" . intval($val) . "'";
                         break;
                     case "BANNER_COUNT_2":
                         $arSqlSearch_h[] = "BANNER_COUNT<='" . intval($val) . "'";
                         break;
                     case "SHOW_COUNT_1":
                         $arSqlSearch[] = "C.SHOW_COUNT>='" . intval($val) . "'";
                         break;
                     case "SHOW_COUNT_2":
                         $arSqlSearch[] = "C.SHOW_COUNT<='" . intval($val) . "'";
                         break;
                     case "EMAIL_COUNT_1":
                         $arSqlSearch[] = "C.EMAIL_COUNT>='" . intval($val) . "'";
                         break;
                     case "EMAIL_COUNT_2":
                         $arSqlSearch[] = "C.EMAIL_COUNT<='" . intval($val) . "'";
                         break;
                     case "VISITOR_COUNT_1":
                         $arSqlSearch[] = "C.VISITOR_COUNT>='" . intval($val) . "'";
                         break;
                     case "VISITOR_COUNT_2":
                         $arSqlSearch[] = "C.VISITOR_COUNT<='" . intval($val) . "'";
                         break;
                     case "CLICK_COUNT_1":
                         $arSqlSearch[] = "C.CLICK_COUNT>='" . intval($val) . "'";
                         break;
                     case "CLICK_COUNT_2":
                         $arSqlSearch[] = "C.CLICK_COUNT<='" . intval($val) . "'";
                         break;
                     case "CTR_1":
                         $arSqlSearch[] = "if(C.SHOW_COUNT<=0,0,round((C.CLICK_COUNT*100)/C.SHOW_COUNT,2))>='" . DoubleVal(str_replace(',', '.', $val)) . "'";
                         break;
                     case "CTR_2":
                         $arSqlSearch[] = "if(C.SHOW_COUNT<=0,0,round((C.CLICK_COUNT*100)/C.SHOW_COUNT,2))<='" . DoubleVal(str_replace(',', '.', $val)) . "'";
                         break;
                     case "USER_PERMISSIONS":
                         $admin_from_1 = " INNER JOIN b_adv_contract_2_user CU ON (CU.CONTRACT_ID=C.ID) ";
                         $arSqlSearch[] = GetFilterQuery("CU.PERMISSION", $val, "N");
                         break;
                 }
             }
         }
     }
     if ($by == "s_id") {
         $strSqlOrder = "ORDER BY C.ID";
     } elseif ($by == "s_lamp") {
         $strSqlOrder = "ORDER BY LAMP";
     } elseif ($by == "s_date_modify") {
         $strSqlOrder = "ORDER BY C.DATE_MODIFY";
     } elseif ($by == "s_name") {
         $strSqlOrder = "ORDER BY C.NAME";
     } elseif ($by == "s_description") {
         $strSqlOrder = "ORDER BY C.DESCRIPTION";
     } elseif ($by == "s_modified_by") {
         $strSqlOrder = "ORDER BY C.MODIFIED_BY";
     } elseif ($by == "s_active") {
         $strSqlOrder = "ORDER BY C.ACTIVE";
     } elseif ($by == "s_weight") {
         $strSqlOrder = "ORDER BY C.WEIGHT";
     } elseif ($by == "s_sort") {
         $strSqlOrder = "ORDER BY ifnull(C.SORT,0)";
     } elseif ($by == "s_banner_count") {
         $strSqlOrder = "ORDER BY BANNER_COUNT";
     } elseif ($by == "s_ctr") {
         $strSqlOrder = "ORDER BY CTR";
     } elseif ($by == "s_show_count") {
         $strSqlOrder = "ORDER BY C.SHOW_COUNT";
     } elseif ($by == "s_max_show_count") {
         $strSqlOrder = "ORDER BY ifnull(C.MAX_SHOW_COUNT,0)";
     } elseif ($by == "s_click_count") {
         $strSqlOrder = "ORDER BY C.CLICK_COUNT";
     } elseif ($by == "s_max_click_count") {
         $strSqlOrder = "ORDER BY ifnull(C.MAX_CLICK_COUNT,0)";
     } elseif ($by == "s_visitor_count") {
         $strSqlOrder = "ORDER BY C.VISITOR_COUNT";
     } elseif ($by == "s_max_visitor_count") {
         $strSqlOrder = "ORDER BY ifnull(C.MAX_VISITOR_COUNT,0)";
     } else {
         $by = "s_sort";
         $strSqlOrder = "ORDER BY ifnull(C.SORT,0)";
     }
     if ($order != "asc") {
         $strSqlOrder .= " desc ";
         $order = "desc";
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     $strSqlSearch_h = GetFilterSqlSearch($arSqlSearch_h);
     if ($isAdmin || $isDemo || $isManager) {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\t{$lamp} LAMP,\n\t\t\t\t\tC.ID, C.ACTIVE, C.NAME, C.DESCRIPTION, C.ADMIN_COMMENTS, C.WEIGHT, C.SORT, C.MAX_SHOW_COUNT,\tC.SHOW_COUNT, C.EMAIL_COUNT, C.CREATED_BY, C.MODIFIED_BY, C.MAX_CLICK_COUNT, C.CLICK_COUNT, C.DEFAULT_STATUS_SID, C.MAX_VISITOR_COUNT, C.VISITOR_COUNT, C.KEYWORDS,\n\t\t\t\t\tif(C.SHOW_COUNT<=0,0,round((C.CLICK_COUNT*100)/C.SHOW_COUNT,2))\tCTR,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_SHOW_FROM") . "\t\tDATE_SHOW_FROM,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_SHOW_TO") . "\t\tDATE_SHOW_TO,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_CREATE") . "\t\t\t\tDATE_CREATE,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_MODIFY") . "\t\t\t\tDATE_MODIFY,\n\t\t\t\t\tcount(distinct B.ID)\t\t\t\t\t\t\t\tBANNER_COUNT\n\t\t\t\tFROM\n\t\t\t\t\tb_adv_contract C\n\t\t\t\tLEFT JOIN b_adv_banner B ON (B.CONTRACT_ID=C.ID)\n\t\t\t\t{$left_join}\n\t\t\t\t{$admin_from_1}\n\t\t\t\t{$admin_from_2}\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tGROUP BY\n\t\t\t\t\tC.ID\n\t\t\t\tHAVING\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\t";
     } else {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\t{$lamp} LAMP,\n\t\t\t\t\tC.ID, C.ACTIVE, C.NAME, C.DESCRIPTION, C.ADMIN_COMMENTS, C.WEIGHT, C.SORT, C.MAX_SHOW_COUNT, \tC.SHOW_COUNT, C.MAX_CLICK_COUNT, C.CLICK_COUNT, C.EMAIL_COUNT, C.CREATED_BY, C.MODIFIED_BY, C.DEFAULT_STATUS_SID, C.MAX_VISITOR_COUNT, C.VISITOR_COUNT, C.KEYWORDS,\n\t\t\t\t\tif(C.SHOW_COUNT<=0,0,round((C.CLICK_COUNT*100)/C.SHOW_COUNT,2))\tCTR,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_SHOW_FROM") . "\t\tDATE_SHOW_FROM,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_SHOW_TO") . "\t\tDATE_SHOW_TO,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_CREATE") . "\t\t\t\tDATE_CREATE,\n\t\t\t\t\t" . $DB->DateToCharFunction("C.DATE_MODIFY") . "\t\t\t\tDATE_MODIFY,\n\t\t\t\t\tcount(distinct B.ID)\t\t\t\t\t\t\t\t\t\tBANNER_COUNT\n\t\t\t\tFROM\n\t\t\t\t\tb_adv_contract C\n\t\t\t\tLEFT JOIN b_adv_banner B ON (B.CONTRACT_ID=C.ID)\n\t\t\t\tINNER JOIN b_adv_contract_2_user CU ON (CU.CONTRACT_ID=C.ID and CU.USER_ID={$USER_ID})\n\t\t\t\t{$left_join}\n\t\t\t\t{$from}\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tGROUP BY\n\t\t\t\t\tC.ID\n\t\t\t\tHAVING\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\t";
     }
     $res = $DB->Query($strSql, false, $err_mess . __LINE__);
     $is_filtered = IsFiltered($strSqlSearch);
     return $res;
 }