Ejemplo n.º 1
0
 /**
  * <p>Добавляет <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событие</a> используя текущие параметры <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителя</a>. Если <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типа события</a> с <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификаторами</a> <i>event1</i>, <i>event2</i> не существует, то он будет автоматически создан с указанными идентификаторами.</p>
  *
  *
  * @param string $event1  Идентификатор типа события event1.
  *
  * @param string $event2 = "" Идентификатор типа события event2.
  *
  * @param string $event3 = "" <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Дополнительный параметр
  * event3</a> события.
  *
  * @param mixed $money = "" Денежная сумма.
  *
  * @param string $currency = "" Трехсимвольный идентификатор валюты. Идентификаторы валют
  * задаются в модуле "Валюты".
  *
  * @param string $goto = "" Адрес страницы куда перешел посетитель. Как правило используется
  * в скриптах вида /bitrix/redirect.php, перенаправляющих посетителей на
  * другие страницы с одновременной фиксацией события.
  *
  * @param string $chargeback = "N" Флаг отрицательной суммы. Используется когда необходимо
  * зафиксировать событие о возврате денег (chargeback). Возможные
  * значения: <ul> <li> <b>Y</b> - денежная сумма отрицательная; </li> <li> <b>N</b> -
  * денежная сумма положительная. </li> </ul>
  *
  * @param mixed $site_id = false ID сайта к которому будет привязано будущее событие.
  *
  * @return array <p>Метод возвращает массив вида: <br><br></p> <pre class="syntax">Array ( [TYPE_ID] =&gt; ID
  * типа события [EID] =&gt; ID добавленного события )</pre> <p></p>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // зафиксируем событие типа "Просмотр спец. страницы" (view/special_page)
  * <b>CStatEvent::AddCurrent</b>("softkey", "out", $GLOBALS["APPLICATION"]-&gt;GetCurPage());
  * ?&gt;
  * 
  * &lt;?
  * // зафиксируем событие типа "Уход на оплату заказа на Софткее" (softkey/out)
  * // если такого типа не существует, то он будет автоматически создан
  * // событие будет фиксироваться по параметрам текущего посетителя сайта
  * 
  * // в данной переменной может быть задана страница на которую осуществляется переход
  * $goto = "http://www.softkey.ru/catalog/basket.php?prodid=902&amp;quantity=1&amp;referer1=ritlabs_site&amp;referer2=BITRIX_SM.OTk1LjgyLk4wLjI1Lk4ucnU%3D";
  * 
  * <b>CStatEvent::AddCurrent</b>("softkey", "out", "", "", "", $goto);
  * ?&gt;
  * 
  * &lt;?
  * // зафиксируем событие типа "Скачивание файла manual.chm" (download/manual)
  * // если такого типа не существует, то он будет автоматически создан
  * // событие будет фиксироваться по параметрам текущего посетителя сайта
  * 
  * // сначала проверим не скачивал ли уже текущий посетитель этот файл
  * // в течение последнего часа
  * 
  * // получим ID типа события
  * $rs = CStatEventType::GetByEvents($event1, $event2);
  * if ($ar = $rs-&gt;Fetch())
  * {
  *     // теперь получим все события данного типа для текущего посетителя сайта
  *     // произошедшие за последний час (3600 секунд)
  *     $rs = CStatEvent::GetListByGuest($_SESSION["SESS_GUEST_ID"], $ar["TYPE_ID"], "", 3600);
  *     
  *     // если таких событий не было то
  *     if (!($ar=$rs-&gt;Fetch()))
  *     {
  *         // добавляем данное событие
  *         <b>CStatEvent::AddCurrent</b>("download", "manual");
  *     }
  * }
  * ?&gt;
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/add.php">CStatEvent::Add</a> </li> <li>
  * <a href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addbyevents.php">CStatEvent::AddByEvents</a>
  * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">Термин "Событие"</a> </li>
  * <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Термин "Дополнительный
  * параметр события (event3)"</a> </li> </ul> <a name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addcurrent.php
  * @author Bitrix
  */
 public static function AddCurrent($event1, $event2 = "", $event3 = "", $money = "", $currency = "", $goto = "", $chargeback = "N", $site_id = false)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     global $APPLICATION;
     $DB = CDatabase::GetModuleConnection('statistic');
     $event1 = trim($event1);
     $event2 = trim($event2);
     $event3 = trim($event3);
     if (strlen($event1) <= 0 && strlen($event2) <= 0) {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     //Check if register event for searcher
     if (intval($_SESSION["SESS_SEARCHER_ID"]) > 0 && COption::GetOptionString("statistic", "SEARCHER_EVENTS") != "Y") {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     // lookup event type ID
     $EVENT_ID = CStatEvent::SetEventType($event1, $event2, $arEventType);
     // return if it's unknown
     if ($EVENT_ID <= 0) {
         return array("EVENT_ID" => 0, "TYPE_ID" => 0, "EID" => 0);
     }
     if ($site_id === false) {
         if (defined("ADMIN_SECTION") && ADMIN_SECTION === true) {
             $sql_site = "null";
             $site_id = false;
         } elseif (defined("SITE_ID")) {
             $sql_site = "'" . $DB->ForSql(SITE_ID, 2) . "'";
             $site_id = SITE_ID;
         } else {
             $sql_site = "null";
             $site_id = false;
         }
     } else {
         if (strlen(trim($site_id)) > 0) {
             $sql_site = "'" . $DB->ForSql($site_id, 2) . "'";
         } else {
             $sql_site = "null";
             $site_id = false;
         }
     }
     $money = doubleval($money);
     // convert when currency specified
     if (strlen(trim($currency)) > 0) {
         $base_currency = GetStatisticBaseCurrency();
         if (strlen($base_currency) > 0) {
             if ($currency != $base_currency) {
                 if (CModule::IncludeModule("currency")) {
                     $rate = CCurrencyRates::GetConvertFactor($currency, $base_currency);
                     if ($rate > 0 && $rate != 1) {
                         $money = $money * $rate;
                     }
                 }
             }
         }
     }
     $money = round($money, 2);
     $chargeback = $chargeback == "Y" ? "Y" : "N";
     $goto = preg_replace("/#EVENT_GID#/i", CStatEvent::GetGID($site_id), $goto);
     $sql_KEEP_DAYS = intval($arEventType["KEEP_DAYS"]) > 0 ? intval($arEventType["KEEP_DAYS"]) : "null";
     $arr = false;
     $referer_url = strlen($_SERVER["HTTP_REFERER"]) <= 0 ? $_SESSION["SESS_HTTP_REFERER"] : $_SERVER["HTTP_REFERER"];
     if (strlen($referer_url) > 0) {
         if ($url = @parse_url($referer_url)) {
             $rs = CSite::GetList($v1 = "LENDIR", $v2 = "DESC", array("ACTIVE" => "Y", "DOMAIN" => "%" . $url["host"], "IN_DIR" => $url["path"]));
             $arr = $rs->Fetch();
         }
     }
     $sql_referer_site_id = is_array($arr) && strlen($arr["ID"]) > 0 ? "'" . $DB->ForSql($arr["ID"], 2) . "'" : "null";
     $HIT_ID = CKeepStatistics::GetCuurentHitID();
     $arFields = array("EVENT_ID" => "'" . $EVENT_ID . "'", "EVENT3" => "'" . $DB->ForSql($event3, 255) . "'", "MONEY" => $money, "DATE_ENTER" => $DB->GetNowFunction(), "REFERER_URL" => "'" . $DB->ForSql($referer_url, 2000) . "'", "URL" => "'" . $DB->ForSql(__GetFullRequestUri(), 2000) . "'", "REDIRECT_URL" => "'" . $DB->ForSql($goto, 2000) . "'", "SESSION_ID" => intval($_SESSION["SESS_SESSION_ID"]) > 0 ? intval($_SESSION["SESS_SESSION_ID"]) : "null", "GUEST_ID" => intval($_SESSION["SESS_GUEST_ID"]) > 0 ? intval($_SESSION["SESS_GUEST_ID"]) : "null", "ADV_ID" => $_SESSION["SESS_LAST_ADV_ID"] > 0 ? $_SESSION["SESS_LAST_ADV_ID"] : "null", "HIT_ID" => $HIT_ID > 0 ? $HIT_ID : "NULL", "COUNTRY_ID" => "'" . $DB->ForSql($_SESSION["SESS_COUNTRY_ID"], 2) . "'", "KEEP_DAYS" => $sql_KEEP_DAYS, "CHARGEBACK" => "'" . $chargeback . "'", "SITE_ID" => $sql_site, "REFERER_SITE_ID" => $sql_referer_site_id);
     if (intval($_SESSION["SESS_LAST_ADV_ID"]) > 0 && intval($_SESSION["SESS_ADV_ID"]) <= 0) {
         $arFields["ADV_BACK"] = "'Y'";
     }
     $eid = $DB->Insert("b_stat_event_list", $arFields, $err_mess . __LINE__);
     // in case of first occurence
     if (strlen($arEventType["DATE_ENTER"]) <= 0) {
         // set date of the first event
         $arFields = array("DATE_ENTER" => $DB->GetNowFunction());
         $DB->Update("b_stat_event", $arFields, "WHERE ID='" . $EVENT_ID . "'", $err_mess . __LINE__);
     }
     // day counter update
     $arFields = array("DATE_LAST" => $DB->GetNowFunction(), "COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
     $rows = $DB->Update("b_stat_event_day", $arFields, "WHERE EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__);
     // there was no records updated
     if (intval($rows) <= 0) {
         // so add one
         $arFields_i = array("DATE_STAT" => $DB->GetNowDate(), "DATE_LAST" => $DB->GetNowFunction(), "EVENT_ID" => $EVENT_ID, "COUNTER" => 1, "MONEY" => $money);
         $DB->Insert("b_stat_event_day", $arFields_i, $err_mess . __LINE__);
     } elseif (intval($rows) > 1) {
         // delete
         $strSql = "SELECT ID FROM b_stat_event_day WHERE EVENT_ID='" . $EVENT_ID . "' and  " . CStatistics::DBDateCompare("DATE_STAT") . " ORDER BY ID";
         $i = 0;
         $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
         while ($ar = $rs->Fetch()) {
             $i++;
             if ($i > 1) {
                 $strSql = "DELETE FROM b_stat_event_day WHERE ID = " . $ar["ID"];
                 $DB->Query($strSql, false, $err_mess . __LINE__);
             }
         }
     }
     // guest counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_guest", $arFields, "WHERE ID=" . intval($_SESSION["SESS_GUEST_ID"]), $err_mess . __LINE__, false, false, false);
     // session counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_session", $arFields, "WHERE ID=" . intval($_SESSION["SESS_SESSION_ID"]), $err_mess . __LINE__, false, false, false);
     // events counter
     $arFields = array("C_EVENTS" => "C_EVENTS+1");
     $DB->Update("b_stat_day", $arFields, "WHERE " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__, false, false, false);
     // when site defined
     if (strlen($site_id) > 0) {
         // update site
         $arFields = array("C_EVENTS" => "C_EVENTS+1");
         $DB->Update("b_stat_day_site", $arFields, "WHERE SITE_ID='" . $DB->ForSql($site_id, 2) . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__);
     }
     // there is advertising compaign defined
     if (intval($_SESSION["SESS_ADV_ID"]) > 0 || intval($_SESSION["SESS_LAST_ADV_ID"]) > 0) {
         // increase revenue
         if ($money != 0) {
             $sign = $chargeback == "Y" ? "-" : "+";
             $arFields = array("REVENUE" => "REVENUE " . $sign . " " . $money);
             $DB->Update("b_stat_adv", $arFields, "WHERE ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "'", $err_mess . __LINE__, false, false, false);
         }
         if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
             $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
         } else {
             $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $money);
         }
         $rows = $DB->Update("b_stat_adv_event", $arFields, "WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "'", $err_mess . __LINE__);
         if (intval($rows) <= 0) {
             $arFields = array("ADV_ID" => "'" . $_SESSION["SESS_LAST_ADV_ID"] . "'", "EVENT_ID" => "'" . $EVENT_ID . "'");
             if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
                 $arFields["COUNTER"] = "1";
                 $arFields["MONEY"] = $money;
             } else {
                 $arFields["COUNTER_BACK"] = "1";
                 $arFields["MONEY_BACK"] = $money;
             }
             $DB->Insert("b_stat_adv_event", $arFields, $err_mess . __LINE__);
         }
         if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
             $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $money);
         } else {
             $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $money);
         }
         $rows = $DB->Update("b_stat_adv_event_day", $arFields, "WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT"), $err_mess . __LINE__, false, false, false);
         if (intval($rows) <= 0) {
             $arFields = array("ADV_ID" => $_SESSION["SESS_LAST_ADV_ID"] > 0 ? $_SESSION["SESS_LAST_ADV_ID"] : "null", "EVENT_ID" => "'" . $EVENT_ID . "'", "DATE_STAT" => $DB->GetNowDate());
             if (intval($_SESSION["SESS_ADV_ID"]) > 0) {
                 $arFields["COUNTER"] = "1";
                 $arFields["MONEY"] = $money;
             } else {
                 $arFields["COUNTER_BACK"] = "1";
                 $arFields["MONEY_BACK"] = $money;
             }
             $DB->Insert("b_stat_adv_event_day", $arFields, $err_mess . __LINE__);
         } elseif (intval($rows) > 1) {
             $strSql = "SELECT ID FROM b_stat_adv_event_day WHERE ADV_ID='" . intval($_SESSION["SESS_LAST_ADV_ID"]) . "' and EVENT_ID='" . $EVENT_ID . "' and " . CStatistics::DBDateCompare("DATE_STAT") . " ORDER BY ID";
             $i = 0;
             $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
             while ($ar = $rs->Fetch()) {
                 $i++;
                 if ($i > 1) {
                     $strSql = "DELETE FROM b_stat_adv_event_day WHERE ID = " . $ar["ID"];
                     $DB->Query($strSql, false, $err_mess . __LINE__);
                 }
             }
         }
     }
     // todays traffic counters
     CTraffic::IncParam(array("EVENT" => 1), array("EVENT" => 1));
     if (strlen($_SESSION["SESS_COUNTRY_ID"]) > 0) {
         CStatistics::UpdateCountry($_SESSION["SESS_COUNTRY_ID"], array("C_EVENTS" => 1));
     }
     if ($_SESSION["SESS_CITY_ID"] > 0) {
         CStatistics::UpdateCity($_SESSION["SESS_CITY_ID"], array("C_EVENTS" => 1));
     }
     return array("EVENT_ID" => intval($EVENT_ID), "TYPE_ID" => intval($EVENT_ID), "EID" => intval($eid));
 }