/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителей</a>.</p> * * * * * @param string &$by = "s_last_date" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID * посетителя; </li> <li> <b>s_events</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событий</a> сгенерированных * посетителем; </li> <li> <b>s_sessions</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#session">сессий</a> посетителя; </li> <li> * <b>s_hits</b> - суммарное кол-во <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хитов</a> посетителя; </li> <li> * <b>s_first_site_id</b> - ID сайта на который впервые пришел посетитель; </li> <li> * <b>s_first_date</b> - время первого захода на сайт; </li> <li> <b>s_first_url_from</b> - * страница с которой впервые пришел посетитель; </li> <li> <b>s_first_url_to</b> - * страница куда впервые пришел посетитель; </li> <li> <b>s_first_adv_id</b> - ID <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv">рекламной кампании</a> первого * захода; </li> <li> <b>s_last_site_id</b> - ID сайта последнего захода посетителя; * </li> <li> <b>s_last_date</b> - время последнего захода поестителя; </li> <li> * <b>s_last_user_id</b> - ID пользователя; </li> <li> <b>s_last_url_last</b> - последняя * страница на которую заходил посетитель; </li> <li> <b>s_last_user_agent</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user_agent">UserAgent</a> посетителя на * последнем заходе; </li> <li> <b>s_last_ip</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#ip">IP адрес</a> посетителя на * последнем заходе; </li> <li> <b>s_last_adv_id</b> - ID рекламной кампании на * последнем заходе; </li> <li> <b>s_last_country_id</b> - ID страны посетителя на * последнем заходе. </li> </ul> * * * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID посетителя; </li> <li> * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение; </li> <li> <b>REGISTERED</b> - был ли посетитель * когда либо авторизован на сайте, возможные значения: <ul> <li> <b>Y</b> - * был; </li> <li> <b>N</b> - не был. </li> </ul> </li> <li> <b>FIRST_DATE1</b> - начальное * значение интервала для поля "дата первого захода на сайт"; </li> <li> * <b>FIRST_DATE2</b> - конечное значение интервала для поля "дата первого * захода на сайт"; </li> <li> <b>LAST_DATE1</b> - начальное значение интервала * для поля "дата последнего захода на сайт"; </li> <li> <b>LAST_DATE2</b> - * конечное значение интервала для поля "дата первого захода на * сайт"; </li> <li> <b>PERIOD_DATE1</b> - начальное значение интервала для даты * посещения посетителем сайта; </li> <li> <b>PERIOD_DATE2</b> - конечно значение * интервала для даты посещения посетителем сайта; </li> <li> <b>SITE_ID</b>* - ID * сайта первого либо последнего захода; </li> <li> <b>SITE_ID_EXACT_MATCH</b> - если * значение равно "N", то при фильтрации по <b>SITE_ID</b> будет искаться * вхождение; </li> <li> <b>FIRST_SITE_ID</b>* - ID сайта первого захода; </li> <li> * <b>FIRST_SITE_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по * <b>FIRST_SITE_ID</b> будет искаться вхождение; </li> <li> <b>LAST_SITE_ID</b>* - ID сайта * последнего захода; </li> <li> <b>LAST_SITE_ID_EXACT_MATCH</b> - если значение равно * "N", то при фильтрации по <b>LAST_SITE_ID</b> будет искаться вхождение; </li> * <li> <b>URL</b>* - страница откуда впервые пришел посетитель, страница на * которую впервые пришел посетитель и последняя страница * просмотренная посетителем; </li> <li> <b>URL_EXACT_MATCH</b> - если значение * равно "Y", то при фильтрации по <b>URL</b> будет искаться точное * совпадение; </li> <li> <b>URL_404</b> - была ли <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#404">404 ошибка</a> на первой странице * или на последней странице посещенной посетителем, возможные * значения: <ul> <li> <b>Y</b> - была; </li> <li> <b>N</b> - не было. </li> </ul> </li> <li> * <b>USER_AGENT</b>* - UserAgent посетителя на последнем заходе; </li> <li> * <b>USER_AGENT_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>USER_AGENT</b> будет искаться точное совпадение; </li> <li> <b>ADV</b> - флаг * "приходил ли посетитель когда либо по рекламной кампании (не * равной NA/NA)", возможные значения: <ul> <li> <b>Y</b> - посетитель приходил * по какой либо рекламной кампании (не равной NA/NA); </li> <li> <b>N</b> - не * приходил никогда ни по одной рекламной кампании (не равной NA/NA). * </li> </ul> </li> <li> <b>ADV_ID</b> - ID рекламной кампании первого либо * последнего захода посетителя (при этом это мог быть как <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_first">прямой заход</a> так и <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_back">возврат</a> по рекламной * кампании); </li> <li> <b>REFERER1</b>* - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_id">идентификатор</a> referer1 * рекламной кампании первого либо последнего захода посетителя; * </li> <li> <b>REFERER1_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>REFERER1</b> будет искаться точное совпадение; </li> <li> <b>REFERER2</b>* - * идентификатор referer2 рекламной кампании первого либо последнего * захода посетителя; </li> <li> <b>REFERER2_EXACT_MATCH</b> - если значение равно "Y", * то при фильтрации по <b>REFERER2</b> будет искаться точное совпадение; * </li> <li> <b>REFERER3</b>* - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_referer3">дополнительный * параметр</a> referer3 рекламной кампании первого либо последнего * захода посетителя; </li> <li> <b>REFERER3_EXACT_MATCH</b> - если значение равно "Y", * то при фильтрации по <b>REFERER3</b> будет искаться точное совпадение; * </li> <li> <b>EVENTS1</b> - начальное значение для интервала кол-ва событий * сгенерированных посетителем; </li> <li> <b>EVENTS2</b> - конечное значение * для интервала кол-ва событий сгенерированных посетителем; </li> <li> * <b>SESS1</b> - начальное значение для интервала кол-ва сессий * сгенерированных посетителем; </li> <li> <b>SESS2</b> - конечное значение * для интервала кол-ва сессий сгенерированных посетителем; </li> <li> * <b>HITS1</b> - начальное значение для интервала кол-ва хитов * сгенерированных посетителем; </li> <li> <b>HITS2</b> - конечное значение * для интервала кол-ва хитов сгенерированных посетителем; </li> <li> * <b>FAVORITES</b> - флаг "добавлял ли посетитель сайт в "<a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#favorites">Избранное</a>"", возможные * значения: <ul> <li> <b>Y</b> - добавлял; </li> <li> <b>N</b> - не добавлял. </li> </ul> </li> * <li> <b>IP</b> - IP адрес посетителя сайта в последнем заходе; </li> <li> * <b>LANG</b> - <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#browser_lang">языки * установленные в настройках браузера</a> посетителя в последнем * заходе; </li> <li> <b>COUNTRY_ID</b>* - ID страны (двухсимвольный идентификатор) * посетителя в последнем заходе; </li> <li> <b>COUNTRY_ID_EXACT_MATCH</b> - если * значение равно "Y", то при фильтрации по <b>COUNTRY_ID</b> будет искаться * точное совпадение; </li> <li> <b>COUNTRY</b>* - название страны; </li> <li> * <b>COUNTRY_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>COUNTRY</b> будет искаться точное совпадение; </li> <li> <b>USER</b>* - ID, логин, * имя, фамилия <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#user">пользователя</a>, * под которыми посетитель последний раз был авторизован; </li> <li> * <b>USER_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по <b>USER</b> * будет искаться точное совпадение; </li> <li> <b>USER_ID</b>* - ID пользователя, * под которым посетитель последний раз был авторизован; </li> <li> * <b>USER_ID_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>USER_ID</b> будет искаться точное совпадение. </li> </ul> <br> * - * допускается <a href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная * логика</a> * * * * @param bool &$is_filtered Флаг отфильтрованности списка посетителей. Если значение равно * "true", то список был отфильтрован. * * * * @return CDBResult * * * <h4>Example</h4> * <pre> * <? * // выберем только тех посетителей UserAgent которых содержит "Opera" * $arFilter = array( * "USER_AGENT" => "Opera" * ); * * // получим список записей * $rs = <b>CGuest::GetList</b>( * ($by = "s_id"), * ($order = "desc"), * $arFilter, * $is_filtered * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * * <h4>See Also</h4> * <ul><li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">Термин "Посетитель"</a> * </li></ul><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cguest/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter=Array(), &$is_filtered) { $err_mess = "File: ".__FILE__."<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = Array(); $strSqlSearch = ""; $bGroup = false; $arrGroup = array( "G.ID" => true, "G.C_EVENTS" => true, "G.FIRST_SITE_ID" => true, "G.LAST_SITE_ID" => true, "G.SESSIONS" => true, "G.HITS" => true, "G.FAVORITES" => true, "G.FIRST_URL_FROM" => true, "G.FIRST_URL_TO" => true, "G.FIRST_URL_TO_404" => true, "G.FIRST_ADV_ID" => true, "G.FIRST_REFERER1" => true, "G.FIRST_REFERER2" => true, "G.FIRST_REFERER3" => true, "G.LAST_ADV_ID" => true, "G.LAST_ADV_BACK" => true, "G.LAST_REFERER1" => true, "G.LAST_REFERER2" => true, "G.LAST_REFERER3" => true, "G.LAST_USER_ID" => true, "G.LAST_USER_AUTH" => true, "G.LAST_URL_LAST" => true, "G.LAST_URL_LAST_404" => true, "G.LAST_USER_AGENT" => true, "G.LAST_IP" => true, "G.LAST_LANGUAGE" => true, "G.LAST_COUNTRY_ID" => true, "G.LAST_CITY_ID" => true, "G.FIRST_DATE" => true, "G.LAST_DATE" => true, "G.FIRST_SESSION_ID" => true, "G.LAST_SESSION_ID" => true, "CITY.REGION" => true, "CITY.NAME" => true, ); if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if(is_array($val)) { if(count($val) <= 0) continue; } else { if( (strlen($val) <= 0) || ($val === "NOT_REF") ) continue; } $match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch($key) { case "ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.ID",$val,$match); break; case "REGISTERED": if ($val=="Y") $arSqlSearch[] = "G.LAST_USER_ID>0 and G.LAST_USER_ID is not null"; elseif ($val=="N") $arSqlSearch[] = "G.LAST_USER_ID<=0 or G.LAST_USER_ID is null"; break; case "FIRST_DATE1": if (CheckDateTime($val)) $arSqlSearch[] = "G.FIRST_DATE >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "FIRST_DATE2": if (CheckDateTime($val)) $arSqlSearch[] = "G.FIRST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); break; case "LAST_DATE1": if (CheckDateTime($val)) $arSqlSearch[] = "G.LAST_DATE >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "LAST_DATE2": if (CheckDateTime($val)) $arSqlSearch[] = "G.LAST_DATE < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); break; case "PERIOD_DATE1": ResetFilterLogic(); if (CheckDateTime($val)) { $arSqlSearch[] = "S.DATE_FIRST >= ".$DB->CharToDateFunction($val, "SHORT"); $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) "; $select0 = "count(S.ID) as SESS,"; $bGroup = true; } break; case "PERIOD_DATE2": ResetFilterLogic(); if (CheckDateTime($val)) { $arSqlSearch[] = "S.DATE_LAST < ".CStatistics::DBDateAdd($DB->CharToDateFunction($val, "SHORT"), 1); $from0 = " INNER JOIN b_stat_session S ON (S.GUEST_ID = G.ID) "; $select0 = "count(S.ID) as SESS,"; $bGroup = true; } break; case "SITE_ID": if (is_array($val)) $val = implode(" | ", $val); $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.LAST_SITE_ID, G.FIRST_SITE_ID", $val, $match); break; case "LAST_SITE_ID": case "FIRST_SITE_ID": if (is_array($val)) $val = implode(" | ", $val); $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.".$key, $val, $match); break; case "URL": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_URL_FROM,G.FIRST_URL_TO,G.LAST_URL_LAST", $val, $match, array("/","\\",".","?","#",":")); break; case "URL_404": if ($val=="Y") $arSqlSearch[] = "G.FIRST_URL_TO_404='Y' or G.LAST_URL_LAST_404='Y'"; elseif ($val=="N") $arSqlSearch[] = "G.FIRST_URL_TO_404='N' and G.LAST_URL_LAST_404='N'"; break; case "USER_AGENT": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_AGENT", $val, $match); break; case "ADV": if ($val=="Y") { $arSqlSearch[] = "( G.FIRST_ADV_ID>0 and G.FIRST_ADV_ID is not null and G.FIRST_REFERER1<>'NA' and G.FIRST_REFERER2<>'NA' or G.LAST_ADV_ID>0 and G.LAST_ADV_ID is not null and G.LAST_REFERER1<>'NA' and G.LAST_REFERER2<>'NA' )"; } elseif ($val=="N") { $arSqlSearch[] = "(( G.FIRST_ADV_ID<=0 or G.FIRST_ADV_ID is null or (G.FIRST_REFERER1='NA' and G.FIRST_REFERER2='NA') ) and ( G.LAST_ADV_ID<=0 or G.LAST_ADV_ID is null or (G.LAST_REFERER1='NA' and G.LAST_REFERER2='NA') ))"; } break; case "ADV_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("G.FIRST_ADV_ID,G.LAST_ADV_ID", $val, $match); break; case "REFERER1": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER1,G.LAST_REFERER1", $val, $match); break; case "REFERER2": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER2,G.LAST_REFERER2", $val, $match); break; case "REFERER3": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.FIRST_REFERER3,G.LAST_REFERER3", $val, $match); break; case "EVENTS1": $arSqlSearch[] = "G.C_EVENTS>='".intval($val)."'"; break; case "EVENTS2": $arSqlSearch[] = "G.C_EVENTS<='".intval($val)."'"; break; case "SESS1": $arSqlSearch[] = "G.SESSIONS>='".intval($val)."'"; break; case "SESS2": $arSqlSearch[] = "G.SESSIONS<='".intval($val)."'"; break; case "HITS1": $arSqlSearch[] = "G.HITS>='".intval($val)."'"; break; case "HITS2": $arSqlSearch[] = "G.HITS<='".intval($val)."'"; break; case "FAVORITES": if ($val=="Y") $arSqlSearch[] = "G.FAVORITES='Y'"; elseif ($val=="N") $arSqlSearch[] = "G.FAVORITES<>'Y'"; break; case "IP": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_IP",$val,$match,array(".")); break; case "LANG": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_LANGUAGE", $val, $match); break; case "COUNTRY_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_COUNTRY_ID", $val, $match); break; case "COUNTRY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("C.NAME", $val, $match); $select1 .= " , C.NAME LAST_COUNTRY_NAME "; $from2 = " LEFT JOIN b_stat_country C ON (C.ID = G.LAST_COUNTRY_ID) "; $arrGroup["C.NAME"] = true; $bGroup = true; break; case "REGION": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.REGION", $val, $match); break; case "CITY_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("G.LAST_CITY_ID", $val, $match); break; case "CITY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("CITY.NAME", $val, $match); break; case "USER": if(COption::GetOptionString("statistic", "dbnode_id") <= 0) { $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID,A.LOGIN,A.LAST_NAME,A.NAME", $val, $match); $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN"; $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) "; $arrGroup["A.NAME"] = true; $arrGroup["A.LAST_NAME"] = true; $arrGroup["A.LOGIN"] = true; $bGroup = true; } break; case "USER_ID": if(COption::GetOptionString("statistic", "dbnode_id") <= 0) { $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = $DB->IsNull("G.LAST_USER_ID","0").">0"; $arSqlSearch[] = GetFilterQuery("G.LAST_USER_ID", $val, $match); $select1 .= ", ".$DB->Concat($DB->IsNull("A.NAME","''"), "' '", $DB->IsNull("A.LAST_NAME","''"))." USER_NAME, A.LOGIN"; $from1 = "LEFT JOIN b_user A ON (A.ID = G.LAST_USER_ID) "; $arrGroup["A.NAME"] = true; $arrGroup["A.LAST_NAME"] = true; $arrGroup["A.LOGIN"] = true; $bGroup = true; } break; } } } if ($by == "s_id") $strSqlOrder = "ORDER BY G.ID"; elseif ($by == "s_first_site_id") $strSqlOrder = "ORDER BY G.FIRST_SITE_ID"; elseif ($by == "s_last_site_id") $strSqlOrder = "ORDER BY G.LAST_SITE_ID"; elseif ($by == "s_events") $strSqlOrder = "ORDER BY G.C_EVENTS"; elseif ($by == "s_sessions") $strSqlOrder = "ORDER BY G.SESSIONS"; elseif ($by == "s_hits") $strSqlOrder = "ORDER BY G.HITS"; elseif ($by == "s_first_date") $strSqlOrder = "ORDER BY G.FIRST_DATE"; elseif ($by == "s_first_url_from") $strSqlOrder = "ORDER BY G.FIRST_URL_FROM"; elseif ($by == "s_first_url_to") $strSqlOrder = "ORDER BY G.FIRST_URL_TO"; elseif ($by == "s_first_adv_id") $strSqlOrder = "ORDER BY G.FIRST_ADV_ID"; elseif ($by == "s_last_date") $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE"); elseif ($by == "s_last_user_id") $strSqlOrder = "ORDER BY G.LAST_USER_ID"; elseif ($by == "s_last_url_last") $strSqlOrder = "ORDER BY G.LAST_URL_LAST"; elseif ($by == "s_last_user_agent") $strSqlOrder = "ORDER BY G.LAST_USER_AGENT"; elseif ($by == "s_last_ip") $strSqlOrder = "ORDER BY G.LAST_IP"; elseif ($by == "s_last_adv_id") $strSqlOrder = "ORDER BY G.LAST_ADV_ID"; elseif ($by == "s_last_country_id") $strSqlOrder = "ORDER BY G.LAST_COUNTRY_ID"; elseif ($by == "s_last_region_name") $strSqlOrder = "ORDER BY CITY.REGION"; elseif ($by == "s_last_city_id") $strSqlOrder = "ORDER BY G.LAST_CITY_ID"; else { $by = "s_last_date"; $strSqlOrder = "ORDER BY ".CStatistics::DBFirstDate("G.LAST_DATE"); } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } if($bGroup) { $strSqlGroup = "GROUP BY ".implode(", ", array_keys($arrGroup)); } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $strSql = " SELECT /*TOP*/ ".$select0." G.ID, G.FIRST_SITE_ID, G.FIRST_SESSION_ID, G.LAST_SESSION_ID, G.LAST_SITE_ID, G.C_EVENTS, G.SESSIONS, G.HITS, G.FAVORITES, G.FIRST_URL_FROM, G.FIRST_URL_TO, G.FIRST_URL_TO_404, G.FIRST_ADV_ID, G.FIRST_REFERER1, G.FIRST_REFERER2, G.FIRST_REFERER3, G.LAST_ADV_ID, G.LAST_ADV_BACK, G.LAST_REFERER1, G.LAST_REFERER2, G.LAST_REFERER3, G.LAST_USER_ID, G.LAST_USER_AUTH, G.LAST_URL_LAST, G.LAST_URL_LAST_404, G.LAST_USER_AGENT, G.LAST_IP, G.LAST_LANGUAGE, G.LAST_COUNTRY_ID, CITY.REGION as LAST_REGION_NAME, G.LAST_CITY_ID, CITY.NAME as LAST_CITY_NAME, ".$DB->DateToCharFunction("G.FIRST_DATE")." FIRST_DATE, ".$DB->DateToCharFunction("G.LAST_DATE")." LAST_DATE ".$select1." FROM b_stat_guest G ".$from0." ".$from1." ".$from2." LEFT JOIN b_stat_city CITY ON (CITY.ID = G.LAST_CITY_ID) WHERE ".$strSqlSearch." ".$strSqlGroup." ".$strSqlOrder." "; $res = $DB->Query(CStatistics::DBTopSql($strSql), false, $err_mess.__LINE__); $is_filtered = (IsFiltered($strSqlSearch)); return $res; }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search">поисковых систем</a> и количество <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search_hit">хитов</a> (проиндексированных страниц) каждой из них за все время ведения статистики, за последние 3 дня, либо за указанный интервал времени.</p> * * * @param string &$by = "s_today_hits" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID поисковой * системы; </li> <li> <b>s_date_last</b> - дата последнего хита; </li> <li> <b>s_today_hits</b> - * количество хитов за сегодня; </li> <li> <b>s_yesterday_hits</b> - количество * хитов за вчера; </li> <li> <b>s_b_yesterday_hits</b> - количество хитов за * позавчера; </li> <li> <b>s_total_hits</b> - суммарное количество хитов; </li> <li> * <b>s_period_hits</b> - количество хитов за установленный период времени * (<i>filter</i>["<b>DATE1</b>"], <i>filter</i>["<b>DATE2</b>"]); </li> <li> <b>s_name</b> - название * поисковой системы; </li> <li> <b>s_user_agent</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search_useragent">UserAgent поисковой * системы</a>. </li> </ul> * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID поисковой системы; </li> * <li> <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение </li> <li> <b>ACTIVE</b> - флаг активности, * возможные значения: <ul> <li> <b>Y</b> - активна; </li> <li> <b>N</b> - не активна. * </li> </ul> </li> <li> <b>SAVE_STATISTIC</b> - флаг "сохранять хиты поисковой системы", * возможные значения: <ul> <li> <b>Y</b> - да; </li> <li> <b>N</b> - нет. </li> </ul> </li> <li> * <b>DIAGRAM_DEFAULT</b> - флаг "включать в круговую диаграмму и график по * умолчанию", возможные значения: <ul> <li> <b>Y</b> - да; </li> <li> <b>N</b> - нет. </li> * </ul> </li> <li> <b>HITS1</b> - начальное значение интервала для поля * "количество хитов"; </li> <li> <b>HITS2</b> - конечное значение интервала для * поля "количество хитов"; </li> <li> <b>DATE1_PERIOD</b> - начальное значение * значение для произвольного периода; </li> <li> <b>DATE2_PERIOD</b> - конечное * значение значение для произвольного периода; </li> <li> <b>DATE1</b> - * начальное значение интервала для поля "дата последнего хита * поисковой системы"; </li> <li> <b>DATE2</b> - конечное значение интервала * для поля "дата последнего хита поисковой системы"; </li> <li> <b>NAME</b>* - * наименование поисковой системы; </li> <li> <b>NAME_EXACT_MATCH</b> - если * значение равно "Y", то при фильтрации по <b>NAME</b> будет искаться * точное совпадение; </li> <li> <b>USER_AGENT</b>* - UserAgent поисковой системы; </li> * <li> <b>USER_AGENT_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>USER_AGENT</b> будет искаться точное совпадение. </li> </ul> * - допускается * <a href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a> * * @param bool &$is_filtered Флаг отфильтрованности списка поисковых систем. Если значение * равно "true", то список был отфильтрован. * * @param mixed $limit = false Максимальное количество поисковых систем которые будут выбраны * в списке. Если значение равно false, то кол-во РК будет ограничено в * соответствии со значением параметра "Максимальное кол-во * показываемых записей в таблицах" из настроек модуля "Статистика". * * @return CDBResult * * <h4>Example</h4> * <pre> * <? * // отфильтруем данные только для поисковой системы #20 и #21 * // а также получим дополнительные данные на декабрь 2005 года * $arFilter = array( * "ID" => "20 | 21", * "DATE1_PERIOD" => "01.12.2005", * "DATE2_PERIOD" => "31.12.2005", * ); * * // получим список записей * $rs = <b>CSearcher::GetList</b>( * ($by = "s_today_hits"), * ($order = "desc"), * $arFilter, * $is_filtered * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * <h4>See Also</h4> * <ul> <li> <a * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/csearcher/getdropdownlist.php">CSearcher::GetDropdownList</a> * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#search">Термин "Поисковая * система"</a> </li> </ul> <a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/csearcher/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered, $LIMIT = false) { $err_mess = "File: " . __FILE__ . "<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $arSqlSearch = array("S.ID <> 1"); $arSqlSearch_h = array(); $strSqlSearch_h = ""; $filter_period = false; $strSqlPeriod = ""; $strT = ""; if (is_array($arFilter)) { ResetFilterLogic(); $date1 = $arFilter["DATE1_PERIOD"]; $date2 = $arFilter["DATE2_PERIOD"]; $date_from = MkDateTime(ConvertDateTime($date1, "D.M.Y"), "d.m.Y"); $date_to = MkDateTime(ConvertDateTime($date2, "D.M.Y") . " 23:59", "d.m.Y H:i"); if (CheckDateTime($date1) && strlen($date1) > 0) { $filter_period = true; if (strlen($date2) > 0) { $strSqlPeriod = "sum(if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0, if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,"; $strT = ")))"; } else { $strSqlPeriod = "sum(if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0,"; $strT = "))"; } } elseif (CheckDateTime($date2) && strlen($date2) > 0) { ResetFilterLogic(); $filter_period = true; $strSqlPeriod = "sum(if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,"; $strT = "))"; } foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("S.ID", $val, $match); break; case "ACTIVE": case "SAVE_STATISTIC": case "DIAGRAM_DEFAULT": $arSqlSearch[] = $val == "Y" ? "S." . $key . "='Y'" : "S." . $key . "='N'"; break; case "HITS1": $arSqlSearch_h[] = "(sum(ifnull(D.TOTAL_HITS,0))+ifnull(S.TOTAL_HITS,0))>='" . intval($val) . "'"; break; case "HITS2": $arSqlSearch_h[] = "(sum(ifnull(D.TOTAL_HITS,0))+ifnull(S.TOTAL_HITS,0))<='" . intval($val) . "'"; break; case "DATE1": if (CheckDateTime($val)) { $arSqlSearch_h[] = "max(D.DATE_LAST)>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE2": if (CheckDateTime($val)) { $arSqlSearch_h[] = "max(D.DATE_LAST)<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "NAME": case "USER_AGENT": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("S." . $key, $val, $match); break; } } } if ($by == "s_id") { $strSqlOrder = "ORDER BY S.ID"; } elseif ($by == "s_date_last") { $strSqlOrder = "ORDER BY S_DATE_LAST"; } elseif ($by == "s_today_hits") { $strSqlOrder = "ORDER BY TODAY_HITS"; } elseif ($by == "s_yesterday_hits") { $strSqlOrder = "ORDER BY YESTERDAY_HITS"; } elseif ($by == "s_b_yesterday_hits") { $strSqlOrder = "ORDER BY B_YESTERDAY_HITS"; } elseif ($by == "s_total_hits") { $strSqlOrder = "ORDER BY TOTAL_HITS"; } elseif ($by == "s_period_hits") { $strSqlOrder = "ORDER BY PERIOD_HITS"; } elseif ($by == "s_name") { $strSqlOrder = "ORDER BY S.NAME"; } elseif ($by == "s_user_agent") { $strSqlOrder = "ORDER BY S.USER_AGENT"; } elseif ($by == "s_chart") { $strSqlOrder = "ORDER BY S.DIAGRAM_DEFAULT desc, TOTAL_HITS "; } elseif ($by == "s_stat") { $strSqlOrder = "ORDER BY TODAY_HITS desc, YESTERDAY_HITS desc, B_YESTERDAY_HITS desc, TOTAL_HITS desc, PERIOD_HITS"; } else { $by = "s_today_hits"; $strSqlOrder = "ORDER BY TODAY_HITS desc, YESTERDAY_HITS desc, B_YESTERDAY_HITS desc, TOTAL_HITS desc, PERIOD_HITS"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $limit_sql = "LIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT')); if (intval($LIMIT) > 0) { $limit_sql = "LIMIT " . intval($LIMIT); } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); foreach ($arSqlSearch_h as $sqlWhere) { $strSqlSearch_h .= " and (" . $sqlWhere . ") "; } $strSql = "\n\t\tSELECT\n\t\t\tS.ID,\n\t\t\tS.TOTAL_HITS,\n\t\t\tS.USER_AGENT,\n\t\t\tS.DIAGRAM_DEFAULT,\n\t\t\t" . $DB->DateToCharFunction("max(D.DATE_LAST)") . "\t\t\t\t\t\tDATE_LAST,\n\t\t\tmax(ifnull(D.DATE_LAST,'1980-01-01'))\t\t\t\t\t\t\t\tS_DATE_LAST,\n\t\t\tsum(ifnull(D.TOTAL_HITS,0))+ifnull(S.TOTAL_HITS,0)\t\t\t\t\tTOTAL_HITS,\n\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.TOTAL_HITS,0),0))\tTODAY_HITS,\n\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.TOTAL_HITS,0),0))\tYESTERDAY_HITS,\n\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.TOTAL_HITS,0),0))\tB_YESTERDAY_HITS,\n\t\t\t" . ($filter_period ? $strSqlPeriod . 'ifnull(D.TOTAL_HITS,0)' . $strT . ' PERIOD_HITS, ' : '0 PERIOD_HITS,') . "\n\t\t\tS.NAME\n\t\tFROM\n\t\t\tb_stat_searcher S\n\t\tLEFT JOIN b_stat_searcher_day D ON (D.SEARCHER_ID = S.ID)\n\t\tWHERE\n\t\t{$strSqlSearch}\n\t\tand S.ID<>1\n\t\tGROUP BY S.ID\n\t\tHAVING\n\t\t\t'1'='1'\n\t\t\t{$strSqlSearch_h}\n\t\t{$strSqlOrder}\n\t\t{$limit_sql}\n\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); $is_filtered = IsFiltered($strSqlSearch) || $filter_period || strlen($strSqlSearch_h) > 0; return $res; }
/** * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типов событий</a>.</p> * * * * * @param string &$by = "s_today_counter" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID типа * события; </li> <li> <b>s_date_last</b> - дата последнего <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">события</a> данного типа; </li> <li> * <b>s_date_enter</b> - дата первого события данного типа; </li> <li> <b>s_today_counter</b> * - количество событий данного типа за сегодня; </li> <li> <b>s_yesterday_counter</b> * - количество событий данного типа за вчера; </li> <li> <b>s_b_yesterday_counter</b> - * количество событий данного типа за позавчера; </li> <li> <b>s_total_counter</b> - * суммарное количество событий данного типа; </li> <li> <b>s_period_counter</b> - * количество событий данного типа за указанный период * <nobr>(<i>filter</i>[<b>DATE1_PERIOD</b>], <i>filter</i>[<b>DATE2_PERIOD</b>])</nobr>; </li> <li> <b>s_name</b> - * название типа события; </li> <li> <b>s_event1</b> - <a * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификатор event1</a> типа * события; </li> <li> <b>s_event2</b> - идентификатор event2 типа события; </li> <li> * <b>s_event12</b> - сортировка по "EVENT1, EVENT2"; </li> <li> <b>s_chart</b> - сортировка по * "DIAGRAM_DEFAULT desc, TOTAL_COUNTER"; </li> <li> <b>s_stat</b> - сортировка по "TODAY_COUNTER desc, * YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER". </li> </ul> * * * * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul> * * * * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID типа события; </li> <li> * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b> * будет искаться вхождение; </li> <li> <b>EVENT1</b>* - идентификатор event1 типа * события; </li> <li> <b>EVENT1_EXACT_MATCH</b> - если значение равно "Y", то при * фильтрации по <b>EVENT1</b> будет искаться точное совпадение; </li> <li> * <b>EVENT2</b>* - идентификатор event2 типа события; </li> <li> <b>EVENT2_EXACT_MATCH</b> - * если значение равно "Y", то при фильтрации по <b>EVENT2</b> будет * искаться точное совпадение; </li> <li> <b>NAME</b>* - название типа события; * </li> <li> <b>NAME_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по * <b>NAME</b> будет искаться точное совпадение; </li> <li> <b>DESCRIPTION</b>* - * описание типа события; </li> <li> <b>DESCRIPTION_EXACT_MATCH</b> - если значение * равно "Y", то при фильтрации по <b>DESCRIPTION</b> будет искаться точное * совпадение; </li> <li> <b>DATE_ENTER_1</b> - начальное значение интервала для * поля "дата первого события данного типа"; </li> <li> <b>DATE_ENTER_2</b> - * конечное значение интервала для поля "дата первого события * данного типа"; </li> <li> <b>DATE_LAST_1</b> - начальное значение интервала для * поля "дата последнего события данного типа"; </li> <li> <b>DATE_LAST_2</b> - * конечное значение интервала для поля "дата последнего события * данного типа"; </li> <li> <b>DATE1_PERIOD</b> - начальное значение значение для * произвольного периода; </li> <li> <b>DATE2_PERIOD</b> - конечное значение * значение для произвольного периода; </li> <li> <b>COUNTER1</b> - начальное * значение интервала для поля "суммарное количество событий * данного типа"; </li> <li> <b>COUNTER2</b> - конечное значение интервала для * поля "суммарное количество событий данного типа"; </li> <li> <b>ADV_VISIBLE</b> * - флаг включать ли статистику по данному типу события в отчет по * рекламным кампаниям, возможные значения: <ul> <li> <b>Y</b> - включать; </li> * <li> <b>N</b> - не включать. </li> </ul> </li> <li> <b>DIAGRAM_DEFAULT</b> - флаг включать ли * данный тип события в круговую диаграмму и график по умолчанию, * возможные значения: <ul> <li> <b>Y</b> - включать; </li> <li> <b>N</b> - не включать. * </li> </ul> </li> <li> <b>KEEP_DAYS1</b> - начальное значение интервала для поля * "количество дней отведенное для хранения событий данного типа"; * </li> <li> <b>KEEP_DAYS2</b> - конечное значение интервала для поля * "количество дней отведенное для хранения событий данного типа"; * </li> <li> <b>DYNAMIC_KEEP_DAYS1</b> - начальное значение интервала для поля * "количество дней отведенное для хранения статистики по данному * типу события в разрезе по дням"; </li> <li> <b>DYNAMIC_KEEP_DAYS2</b> - конечное * значение интервала для поля "количество дней отведенное для * хранения статистики по данному типу события в разрезе по дням"; * </li> <li> <b>MONEY1</b> - начальное значение интервала для поля "суммарная * денежная сумма для данного типа событий"; </li> <li> <b>MONEY2</b> - конечное * значение интервала для поля "суммарная денежная сумма для * данного типа событий"; </li> <li> <b>CURRENCY</b> - трехсимвольный * идентификатор валюты для денежной суммы; </li> <li> <b>GROUP</b> - * группировка результирующего списка, возможные значения: <ul> <li> * <b>event1</b> - группировка по <i>event1</i>; </li> <li> <b>event2</b> - группировка по * <i>event2</i>. </li> </ul> </li> </ul> * - допускается <a * href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a> * * * * @param bool &$is_filtered Флаг отфильтрованности результирующего списка. Если значение * равно "true", то список был отфильтрован. * * * * @param mixed $limit = false Максимальное число типов событий которые будут выбраны в списке. * Если значение равно "false", то кол-во РК будет ограничено в * соответствии со значением параметра <b>Максимальное кол-во * показываемых записей в таблицах</b> из настроек модуля * "Статистика". * * * * @return CDBResult * * * <h4>Example</h4> * <pre> * <? * // получим данные только по тем типам событий * // у которых event1 = "download" * // а также получим дополнительные данные на декабрь 2007 года * $arFilter = array( * "DATE1_PERIOD" => "01.12.2007", * "DATE2_PERIOD" => "31.12.2007", * "EVENT1" => "download" * ); * * // получим список записей * $rs = <b>CStatEventType::GetList</b>( * ($by = "s_today_counter"), * ($order = "desc"), * $arFilter, * $is_filtered * ); * * // выведем все записи * while ($ar = $rs->Fetch()) * { * echo "<pre>"; print_r($ar); echo "</pre>"; * } * ?> * </pre> * * * * <h4>See Also</h4> * <ul> <li> <a * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getdynamiclist.php">CStatEventType::GetDynamicList</a> * </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getsimplelist.php">CStatEventType::GetSimpleList</a> * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">Термин "Тип * события"</a> </li> </ul> </ht<a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered, $LIMIT = false) { $err_mess = "File: " . __FILE__ . "<br>Line: "; $DB = CDatabase::GetModuleConnection('statistic'); $find_group = $arFilter["GROUP"]; if ($find_group != "event1" && $find_group != "event2" && $find_group != "total") { $find_group = ""; } $arSqlSearch = array(); $arSqlSearch_h = array(); $strSqlSearch_h = ""; $filter_period = false; $strSqlPeriod = ""; $strT = ""; $CURRENCY = ""; if (is_array($arFilter)) { ResetFilterLogic(); $date1 = $arFilter["DATE1_PERIOD"]; $date2 = $arFilter["DATE2_PERIOD"]; $date_from = MkDateTime(ConvertDateTime($date1, "D.M.Y"), "d.m.Y"); $date_to = MkDateTime(ConvertDateTime($date2, "D.M.Y") . " 23:59", "d.m.Y H:i"); if (strlen($date1) > 0) { $filter_period = true; if (strlen($date2) > 0) { $strSqlPeriod = "if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0, if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,"; $strT = "))"; } else { $strSqlPeriod = "if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0,"; $strT = ")"; } } elseif (strlen($date2) > 0) { $filter_period = true; $strSqlPeriod = "if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,"; $strT = ")"; } foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match); break; case "DATE_ENTER_1": if (CheckDateTime($val)) { $arSqlSearch[] = "E.DATE_ENTER>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_ENTER_2": if (CheckDateTime($val)) { $arSqlSearch[] = "E.DATE_ENTER<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "DATE_LAST_1": if (CheckDateTime($val)) { $arSqlSearch_h[] = "max(D.DATE_LAST)>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_LAST_2": if (CheckDateTime($val)) { $arSqlSearch_h[] = "max(D.DATE_LAST)<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "EVENT1": case "EVENT2": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match); break; case "COUNTER1": $arSqlSearch_h[] = "TOTAL_COUNTER>='" . intval($val) . "'"; break; case "COUNTER2": $arSqlSearch_h[] = "TOTAL_COUNTER<='" . intval($val) . "'"; break; case "MONEY1": $arSqlSearch_h[] = "TOTAL_MONEY>='" . roundDB($val) . "'"; break; case "MONEY2": $arSqlSearch_h[] = "TOTAL_MONEY<='" . roundDB($val) . "'"; break; case "ADV_VISIBLE": case "DIAGRAM_DEFAULT": $arSqlSearch[] = $val == "Y" ? "E." . $key . "='Y'" : "E." . $key . "='N'"; break; case "DESCRIPTION": case "NAME": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match); break; case "KEEP_DAYS1": $arSqlSearch[] = "E.KEEP_DAYS>='" . intval($val) . "'"; break; case "KEEP_DAYS2": $arSqlSearch[] = "E.KEEP_DAYS<='" . intval($val) . "'"; break; case "DYNAMIC_KEEP_DAYS1": $arSqlSearch[] = "E.DYNAMIC_KEEP_DAYS>='" . intval($val) . "'"; break; case "DYNAMIC_KEEP_DAYS2": $arSqlSearch[] = "E.DYNAMIC_KEEP_DAYS<='" . intval($val) . "'"; break; case "CURRENCY": $CURRENCY = $val; break; } } } $rate = 1; $base_currency = GetStatisticBaseCurrency(); $view_currency = $base_currency; if (strlen($base_currency) > 0) { if (CModule::IncludeModule("currency")) { if ($CURRENCY != $base_currency && strlen($CURRENCY) > 0) { $rate = CCurrencyRates::GetConvertFactor($base_currency, $CURRENCY); $view_currency = $CURRENCY; } } } if ($by == "s_id" && $find_group == "") { $strSqlOrder = "ORDER BY E.ID"; } elseif ($by == "s_date_last") { $strSqlOrder = "ORDER BY E_DATE_LAST"; } elseif ($by == "s_date_enter") { $strSqlOrder = "ORDER BY DATE_ENTER"; } elseif ($by == "s_today_counter") { $strSqlOrder = "ORDER BY TODAY_COUNTER"; } elseif ($by == "s_yesterday_counter") { $strSqlOrder = "ORDER BY YESTERDAY_COUNTER"; } elseif ($by == "s_b_yesterday_counter") { $strSqlOrder = "ORDER BY B_YESTERDAY_COUNTER"; } elseif ($by == "s_total_counter") { $strSqlOrder = "ORDER BY TOTAL_COUNTER"; } elseif ($by == "s_period_counter") { $strSqlOrder = "ORDER BY PERIOD_COUNTER"; } elseif ($by == "s_name" && $find_group == "") { $strSqlOrder = "ORDER BY E.NAME"; } elseif ($by == "s_event1" && $find_group == "") { $strSqlOrder = "ORDER BY E.EVENT1"; } elseif ($by == "s_event1" && $find_group == "event1") { $strSqlOrder = "ORDER BY E.EVENT1"; } elseif ($by == "s_event2" && $find_group == "") { $strSqlOrder = "ORDER BY E.EVENT2"; } elseif ($by == "s_event2" && $find_group == "event2") { $strSqlOrder = "ORDER BY E.EVENT2"; } elseif ($by == "s_event12" && $find_group == "") { $strSqlOrder = "ORDER BY E.EVENT1, E.EVENT2"; } elseif ($by == "s_chart" && $find_group == "") { $strSqlOrder = "ORDER BY E.DIAGRAM_DEFAULT desc, TOTAL_COUNTER "; } elseif ($by == "s_stat") { $strSqlOrder = "ORDER BY TODAY_COUNTER desc, YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER"; } else { $by = "s_today_counter"; $strSqlOrder = "ORDER BY TODAY_COUNTER desc, YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); foreach ($arSqlSearch_h as $sqlWhere) { $strSqlSearch_h .= " and (" . $sqlWhere . ") "; } $limit_sql = "LIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT')); if (intval($LIMIT) > 0) { $limit_sql = "LIMIT " . intval($LIMIT); } if ($find_group == "") { $strSql = "\n\t\t\tSELECT\n\t\t\t\tE.ID,\n\t\t\t\tE.EVENT1,\n\t\t\t\tE.EVENT2,\n\t\t\t\tE.COUNTER,\n\t\t\t\tE.DIAGRAM_DEFAULT,\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\t\t\t\tCURRENCY,\n\t\t\t\t" . $DB->DateToCharFunction("E.DATE_ENTER") . "\t\t\t\t\t\tDATE_ENTER,\n\t\t\t\t" . $DB->DateToCharFunction("max(D.DATE_LAST)") . "\t\t\t\t\t\tDATE_LAST,\n\t\t\t\tmax(ifnull(D.DATE_LAST,'1980-01-01'))\t\t\t\t\t\t\tE_DATE_LAST,\n\t\t\t\tsum(ifnull(D.COUNTER,0))+ifnull(E.COUNTER,0)\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))+round(ifnull(E.MONEY,0)*{$rate},2)\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY,\n\t\t\t\tE.NAME,\n\t\t\t\tE.DESCRIPTION,\n\t\t\t\tif (length(E.NAME)>0, E.NAME, concat(E.EVENT1,' / ',ifnull(E.EVENT2,'')))\t\tEVENT\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY E.ID\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t{$strSqlOrder}\n\t\t\t{$limit_sql}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); } elseif ($find_group == "total") { $arResult = array("TOTAL_COUNTER" => 0, "TOTAL_MONEY" => 0, "TODAY_COUNTER" => 0, "YESTERDAY_COUNTER" => 0, "B_YESTERDAY_COUNTER" => 0, "PERIOD_COUNTER" => 0, "TODAY_MONEY" => 0, "YESTERDAY_MONEY" => 0, "B_YESTERDAY_MONEY" => 0, "PERIOD_MONEY" => 0); $strSql = "\n\t\t\tSELECT\n\t\t\t\tsum(ifnull(D.COUNTER,0))\t\t\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))\t\t\t\t\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); if ($ar = $res->Fetch()) { foreach ($ar as $k => $v) { $arResult[$k] += $v; } } $strSql = "\n\t\t\tSELECT\n\t\t\t\tsum(ifnull(E.COUNTER,0))\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(E.MONEY,0)*{$rate},2))\tTOTAL_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); if ($ar = $res->Fetch()) { foreach ($ar as $k => $v) { $arResult[$k] += $v; } } $arResult["CURRENCY"] = $view_currency; $res = new CDBResult(); $res->InitFromArray(array($arResult)); } else { $arResult = array(); if ($find_group == "event1") { $group = "E.EVENT1"; } else { $group = "E.EVENT2"; } $strSql = "\n\t\t\tSELECT\n\t\t\t\t{$group}\t\t\t\t\t\t\t\t\t\t\tGROUPING_KEY,\n\t\t\t\t{$group},\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\t\t\t\tCURRENCY,\n\t\t\t\t" . $DB->DateToCharFunction("min(E.DATE_ENTER)") . "\t\t\t\t\tDATE_ENTER,\n\t\t\t\t" . $DB->DateToCharFunction("max(D.DATE_LAST)") . "\t\t\t\t\t\tDATE_LAST,\n\t\t\t\tmax(ifnull(D.DATE_LAST,'1980-01-01'))\t\t\t\t\t\t\tE_DATE_LAST,\n\t\t\t\tsum(ifnull(D.COUNTER,0))\t\t\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))\t\t\t\t\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY {$group}\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t{$strSqlOrder}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); while ($ar = $res->Fetch()) { $arResult[$ar["GROUPING_KEY"]] = $ar; } $strSql = "\n\t\t\tSELECT\n\t\t\t\t{$group}\t\t\t\t\t\t\tGROUPING_KEY,\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\tCURRENCY,\n\t\t\t\tsum(ifnull(E.COUNTER,0))\t\t\t\tCOUNTER,\n\t\t\t\tsum(round(ifnull(E.MONEY,0)*{$rate},2))\t\t\tTOTAL_MONEY,\n\t\t\t\t" . $DB->DateToCharFunction("min(E.DATE_ENTER)") . "\tDATE_ENTER\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY {$group}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); while ($ar = $res->Fetch()) { if (array_key_exists($ar["GROUPING_KEY"], $arResult)) { $arResult[$ar["GROUPING_KEY"]]["TOTAL_COUNTER"] += $ar["COUNTER"]; $arResult[$ar["GROUPING_KEY"]]["TOTAL_MONEY"] += $ar["MONEY"]; } else { $arResult[$ar["GROUPING_KEY"]] = array("GROUPING_KEY" => $ar["GROUPING_KEY"], $find_group == "event1" ? "EVENT1" : "EVENT2" => $ar["GROUPING_KEY"], "CURRENCY" => $ar["CURRENCY"], "DATE_ENTER" => $ar["DATE_ENTER"], "TOTAL_COUNTER" => $ar["COUNTER"], "TOTAL_MONEY" => $ar["MONEY"], "TODAY_COUNTER" => 0, "YESTERDAY_COUNTER" => 0, "B_YESTERDAY_COUNTER" => 0, "PERIOD_COUNTER" => 0, "TODAY_MONEY" => 0, "YESTERDAY_MONEY" => 0, "B_YESTERDAY_MONEY" => 0, "PERIOD_MONEY" => 0); /*DATE_LAST,E_DATE_LAST,*/ } } $res = new CDBResult(); $res->InitFromArray($arResult); } $is_filtered = IsFiltered($strSqlSearch) || $filter_period || strlen($strSqlSearch_h) > 0 || $find_group != ""; return $res; }