/** * <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> * <? * // фильтр * $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)>0) InitFilterEx($FilterArr,"ADV_CONTRACT_LIST","set"); * else InitFilterEx($FilterArr,"ADV_CONTRACT_LIST","get"); * if (strlen($del_filter)>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" => $find_id, * "ID_EXACT_MATCH" => $find_id_exact_match, * "DATE_MODIFY_1" => $find_date_modify_1, * "DATE_MODIFY_2" => $find_date_modify_2, * "NAME" => $find_name, * "NAME_EXACT_MATCH" => $find_name_exact_match, * "DESCRIPTION" => $find_description, * "DESCRIPTION_EXACT_MATCH" => $find_description_exact_match, * "LAMP" => $find_lamp, * "OWNER" => $find_owner, * "OWNER_EXACT_MATCH" => $find_owner_exact_match, * "BANNER_COUNT_1" => $find_banner_count_1, * "BANNER_COUNT_2" => $find_banner_count_2, * "SHOW_COUNT_1" => $find_show_count_1, * "SHOW_COUNT_2" => $find_show_count_2, * "CLICK_COUNT_1" => $find_click_count_1, * "CLICK_COUNT_2" => $find_click_count_2, * "CTR_1" => $find_ctr_1, * "CTR_2" => $find_ctr_2, * "ADMIN_COMMENTS" => $find_admin_comments, * "ADMIN_COMMENTS_EXACT_MATCH" => $find_admin_comments_exact_match * ); * $rsAdvContract = <b>CAdvContract::GetList</b>($by, $order, $arFilter, $is_filtered, "N"); * ?> * * <? * Array * ( * [LAMP] => green * [ID] => 3 * [ACTIVE] => Y * [NAME] => заголовок контракта * [DESCRIPTION] => описание контракта * [ADMIN_COMMENTS] => административный комментарий * [WEIGHT] => 1000 * [SORT] => 200 * [MAX_SHOW_COUNT] => 1000 * [SHOW_COUNT] => 312 * [MAX_CLICK_COUNT] => 100 * [CLICK_COUNT] => 64 * [EMAIL_COUNT] => 0 * [CREATED_BY] => 2 * [MODIFIED_BY] => 2 * [DEFAULT_STATUS_SID] => READY * [CTR] => 20.51 * [DATE_SHOW_FROM] => 15.06.2004 * [DATE_SHOW_TO] => 07.07.2009 * [DATE_CREATE] => 07.06.2004 19:04:55 * [DATE_MODIFY] => 24.06.2004 10:56:08 * [BANNER_COUNT] => 12 * ) * ?> * </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; }