%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/seo/admin/ |
Current File : /home/bitrix/www/bitrix/modules/seo/admin/seo_search_yandex_direct_banner_edit.php |
<?php require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/prolog_admin_before.php"); /** * Bitrix vars * @global CUser $USER * @global CMain $APPLICATION * @global CDatabase $DB * @global CUserTypeManager $USER_FIELD_MANAGER * @global CCacheManager $CACHE_MANAGER */ define('ADMIN_MODULE_NAME', 'seo'); use Bitrix\Main; use Bitrix\Main\Localization\Loc; use Bitrix\Seo\AdvSession; use Bitrix\Seo\Engine; use Bitrix\Seo\Adv; use Bitrix\Main\Text\HtmlFilter; Loc::loadMessages(dirname(__FILE__).'/../../main/tools.php'); Loc::loadMessages(dirname(__FILE__).'/seo_search.php'); Loc::loadMessages(dirname(__FILE__).'/seo_adv.php'); if (!$USER->CanDoOperation('seo_tools')) { $APPLICATION->AuthForm(Loc::getMessage("ACCESS_DENIED")); } if(!Main\Loader::includeModule('seo')) { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); ShowError(Loc::getMessage("SEO_ERROR_NO_MODULE")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); } if(!Main\Loader::includeModule('socialservices')) { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); ShowError(Loc::getMessage("SEO_ERROR_NO_MODULE_SOCSERV")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); } $engine = new Engine\YandexDirect(); $currentUser = $engine->getCurrentUser(); $bNeedAuth = !is_array($currentUser); //get string of campaign CURRENCY name try { $clientsSettings = $engine->getClientsSettings(); $clientCurrency = current($clientsSettings); $clientCurrency = Loc::getMessage('SEO_YANDEX_CURRENCY__'.$clientCurrency['Currency']); } catch(Engine\YandexDirectException $e) { $seoproxyAuthError = new CAdminMessage(array( "TYPE" => "ERROR", "MESSAGE" => Loc::getMessage('SEO_YANDEX_SEOPROXY_AUTH_ERROR'), "DETAILS" => $e->getMessage(), )); } $bReadOnly = $bNeedAuth; $bAllowUpdate = !$bNeedAuth; $bSale = Main\ModuleManager::isModuleInstalled('sale') && Main\ModuleManager::isModuleInstalled('catalog') && Main\Loader::includeModule('currency'); $request = Main\Context::getCurrent()->getRequest(); $back_url = isset($request["back_url"]) ? $request["back_url"] : ''; $campaignId = intval($request["campaign"]); $elementId = intval($request["element"]); $ID = intval($request["ID"]); $message = null; if($ID > 0) { $dbRes = Adv\YandexBannerTable::getByPrimary($ID); $banner = $dbRes->fetch(); if($banner) { $campaignId = $banner["CAMPAIGN_ID"]; } else { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); $message = new CAdminMessage(array( "TYPE" => "ERROR", "DETAILS" => Loc::getMessage("SEO_ERROR_NO_BANNER"), "HTML" => true )); echo $message->Show(); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); } } $campaign = false; if($campaignId > 0) { $dbRes = Adv\YandexCampaignTable::getByPrimary($campaignId); $campaign = $dbRes->fetch(); } if(!$campaign) { require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); $message = new CAdminMessage(array( "TYPE" => "ERROR", "DETAILS" => Loc::getMessage("SEO_ERROR_NO_CAMPAIGN"), )); echo $message->Show(); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); } if($campaign['OWNER_ID'] != $currentUser['id']) { $bReadOnly = true; $bAllowUpdate = false; $message = new CAdminMessage(array( "TYPE" => "ERROR", "MESSAGE" => Loc::getMessage('SEO_CAMPAIGN_WRONG_OWNER', array("#USERINFO#" => "(".$campaign["OWNER_ID"].") ".$campaign["OWNER_NAME"])) )); } elseif(!in_array($campaign["SETTINGS"]['Strategy']['StrategyName'], Adv\YandexCampaignTable::$supportedStrategy)) { $bReadOnly = true; $message = new CAdminMessage(array( "TYPE" => "ERROR", "MESSAGE" => Loc::getMessage("SEO_CAMPAIGN_STRATEGY_NOT_SUPPORTED", array( "#STRATEGY#" => Loc::getMessage('SEO_CAMPAIGN_STRATEGY_'.$campaign["SETTINGS"]['Strategy']['StrategyName']), )) )); } $bShowStats = $ID > 0 && $bAllowUpdate; $bShowAuto = $ID > 0 && $bAllowUpdate && IsModuleInstalled("catalog"); if($ID <= 0) { $host = str_replace(array(':80', ':443'), '', $request->getHttpHost()); $errors = null; $host = \CBXPunycode::ToUnicode($host, $errors); $banner = array( "SETTINGS" => array( "CampaignID" => $campaign["SETTINGS"]["CampaignID"], "Title" => "", "Text" => "", "Href" => 'http'.($request->isHttps() ? 's' : '').'://'.$host, "Geo" => Main\Config\Option::get('seo', 'yandex_direct_region_last_list', ''), "Phrases" => array(), "MinusKeywords" => array(), ) ); if($elementId > 0 && Main\Loader::includeModule('iblock')) { $dbElement = \CIBlockElement::getByID($elementId); if($element = $dbElement->fetch()) { $banner['SETTINGS']['Href'] .= \CIBlock::replaceDetailUrl($element['DETAIL_PAGE_URL'], $element, false, "E"); } } else { $banner['SETTINGS']['Href'] .= '/'; } $banner['SETTINGS']['Href'] .= strpos($banner['SETTINGS']['Href'], "?") >= 0 ? '?' : '&'; $banner['SETTINGS']['Href'] .= AdvSession::URL_PARAM_CAMPAIGN.'='.AdvSession::URL_PARAM_CAMPAIGN_VALUE.'&'.AdvSession::URL_PARAM_BANNER.'='.AdvSession::URL_PARAM_BANNER_VALUE; } $banner["SETTINGS"]["Geo"] = explode(",", $banner["SETTINGS"]["Geo"]); $banner["SETTINGS"]["MinusKeywords"] = !empty($banner["SETTINGS"]["MinusKeywords"]) ? implode(", ", $banner["SETTINGS"]["MinusKeywords"]) : ''; $aTabs = array( array( "DIV" => "edit_main", "TAB" => Loc::getMessage("SEO_BANNER_TAB_MAIN"), "TITLE" => Loc::getMessage("SEO_BANNER_TAB_MAIN_TITLE"), ), array( "DIV" => "edit_geo", "TAB" => Loc::getMessage("SEO_BANNER_TAB_GEO"), "TITLE" => Loc::getMessage("SEO_BANNER_TAB_GEO_TITLE"), ), array( "DIV" => "edit_keywords", "TAB" => Loc::getMessage("SEO_BANNER_TAB_KEYWORDS"), "TITLE" => Loc::getMessage("SEO_BANNER_TAB_KEYWORDS_TITLE"), ), ); if($ID > 0 && $bShowAuto) { $aTabs[] = array( "DIV" => "edit_auto", "TAB" => Loc::getMessage("SEO_BANNER_TAB_AUTO"), "TITLE" => Loc::getMessage("SEO_BANNER_TAB_AUTO_TITLE"), ); } if($ID > 0 && $bShowStats) { $aTabs[] = array( "DIV" => "edit_stats", "TAB" => Loc::getMessage("SEO_BANNER_TAB_STATS"), "TITLE" => Loc::getMessage("SEO_BANNER_TAB_STATS_TITLE"), "ONSELECT" => "showStats()" ); } $tabControl = new CAdminTabControl("tabControl", $aTabs); if(!$bReadOnly && $request->isPost() && ($request["save"]<>'' || $request["apply"]<>'') && check_bitrix_sessid()) { $bannerSettings = $request["SETTINGS"]; $phraseList = $request['Phrase']; $phrasePriority = $request['PhrasePriority']; if(!is_array($phraseList)) { $phraseList = array(); $phrasePriority = array(); } $bannerSettings['Phrases'] = array(); foreach($phraseList as $key => $phrase) { $bannerSettings['Phrases'][] = array( 'PhraseID' => '0', 'Phrase' => trim($phrase), 'AutoBudgetPriority' => $phrasePriority[$key] ); } $bannerSettings['MinusKeywords'] = preg_split("/[\\r\\n,;]+\\s*/", $bannerSettings['MinusKeywords']); $bannerFields = array( "CAMPAIGN_ID" => $campaignId, "SETTINGS" => $bannerSettings ); if($bShowAuto && $banner["AUTO_QUANTITY_OFF"] != Adv\YandexBannerTable::MARKED) { $bannerFields["AUTO_QUANTITY_OFF"] = $request["AUTO_QUANTITY_OFF"] == Adv\YandexBannerTable::ACTIVE ? Adv\YandexBannerTable::ACTIVE : Adv\YandexBannerTable::INACTIVE; } if($bShowAuto && $banner["AUTO_QUANTITY_ON"] != Adv\YandexBannerTable::MARKED) { $bannerFields["AUTO_QUANTITY_ON"] = $request["AUTO_QUANTITY_ON"] == Adv\YandexBannerTable::ACTIVE ? Adv\YandexBannerTable::ACTIVE : Adv\YandexBannerTable::INACTIVE; } if($ID > 0) { $result = Adv\YandexBannerTable::update($ID, $bannerFields); } else { $result = Adv\YandexBannerTable::add($bannerFields); } if($result->isSuccess()) { if($ID <= 0 && $elementId > 0) { Adv\LinkTable::add(array( 'LINK_TYPE' => Adv\LinkTable::TYPE_IBLOCK_ELEMENT, 'LINK_ID' => $elementId, 'BANNER_ID' => $result->getId() )); } if($ID <= 0) { Main\Config\Option::set('seo', 'yandex_direct_region_last_list', $bannerSettings["Geo"]); } $ID = $result->getId(); if($request["apply"]<>'') { LocalRedirect('/bitrix/admin/seo_search_yandex_direct_banner_edit.php?lang='.LANGUAGE_ID.'&ID='.$ID.'&'.$tabControl->ActiveTabParam()); } else { if($back_url == '') { LocalRedirect("/bitrix/admin/seo_search_yandex_direct_banner.php?lang=".LANGUAGE_ID.'&campaign='.$campaign['ID']); } else { LocalRedirect($back_url); } } } else { $oldSettings = $banner['SETTINGS']; $banner["SETTINGS"] = $request["SETTINGS"]; $banner["SETTINGS"]["Geo"] = explode(",", $banner["SETTINGS"]["Geo"]); $banner["SETTINGS"]["Phrases"] = array(); if(is_array($request['Phrase'])) { foreach($request["Phrase"] as $key => $phrase) { $phraseStatus = Engine\YandexDirect::STATUS_NEW; if(is_array($oldSettings["Phrases"])) { foreach($oldSettings["Phrases"] as $phraseInfo) { if($phraseInfo['Phrase'] == $phrase) { $phraseStatus = $phraseInfo['StatusPhraseModerate']; break; } } } $banner["SETTINGS"]["Phrases"][] = array( 'Phrase' => $phrase, 'AutoBudgetPriority' => $request["PhrasePriority"][$key], 'StatusPhraseModerate' => $phraseStatus, ); } } $message = new CAdminMessage(array( "TYPE" => "ERROR", "MESSAGE" => Loc::getMessage('SEO_BANNER_ERROR'), "DETAILS" => implode('<br>', $result->getErrorMessages()), )); } } $APPLICATION->SetTitle( $ID > 0 ? Loc::getMessage("SEO_BANNER_EDIT_TITLE", array( "#ID#" => $ID, "#XML_ID#" => $banner["XML_ID"], )) : Loc::getMessage("SEO_BANNER_NEW_TITLE") ); require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_admin_after.php"); $aMenu = array( array( "ICON" => "btn_list", "TEXT" => Loc::getMessage("SEO_BANNER_LIST"), "LINK" => "seo_search_yandex_direct_banner.php?lang=".LANGUAGE_ID."&campaign=".$campaignId ) ); if($ID > 0) { if(!$bReadOnly) { $aMenu[] = array( "ICON" => "btn_new", "TEXT" => Loc::getMessage("MAIN_ADD"), "LINK" => "seo_search_yandex_direct_banner_edit.php?lang=".LANGUAGE_ID."&campaign=".$campaignId ); $aMenu[] = array( "TEXT" => Loc::getMessage("MAIN_DELETE"), "ICON" => "btn_delete", "LINK" => "seo_search_yandex_direct_banner.php?lang=".LANGUAGE_ID."&campaign=".$campaignId."&ID=".$ID."&action=delete&".bitrix_sessid_get() ); } } if(!defined('BX_PUBLIC_MODE') || !BX_PUBLIC_MODE) { require_once("tab/seo_search_yandex_direct_auth.php"); } if(isset($seoproxyAuthError)) echo $seoproxyAuthError->Show(); $context = new CAdminContextMenu($aMenu); $context->Show(); if(!$message && $bShowAuto) { if($banner["AUTO_QUANTITY_OFF"] == Adv\YandexBannerTable::MARKED) { $message = new CAdminMessage(array( "TYPE" => "ERROR", "MESSAGE" => Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_OFF_D"), "DETAILS" => Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_OFF_D_DETAILS"), )); } elseif($banner["AUTO_QUANTITY_ON"] == Adv\YandexBannerTable::MARKED) { $message = new CAdminMessage(array( "TYPE" => "OK", "MESSAGE" => Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_ON_D"), "DETAILS" => Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_ON_D_DETAILS"), )); } } if($message) { echo $message->Show(); } if($bReadOnly && $ID <= 0) { require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin.php"); } // draw form even in readonly mode ?> <form method="POST" action="<?echo $APPLICATION->GetCurPage()?>?lang=<?=LANGUAGE_ID?>&ID=<?=$ID?>&campaign=<?=$campaignId?>" name="form1" id="form1"<?=$bReadOnly?' onsubmit="return false;' : ''?>> <? $tabControl->Begin(); // main settings tab $tabControl->BeginNextTab(); ?> <style> .yandex-adv-stats { display: block; white-space: nowrap; padding: 9px 5px 3px 5px; width: 15px; text-align: right; } </style> <? if($ID > 0): $active = ''; $active_title = ''; if($banner['SETTINGS']['StatusBannerModerate'] == Engine\YandexDirect::STATUS_NEW) { $active = 'grey'; $active_title = Loc::getMessage('SEO_STATUS_MODERATE_NEW'); } else { if($banner['SETTINGS']['IsActive'] == Engine\YandexDirect::BOOL_YES) { if($banner['SETTINGS']['StatusActivating'] == Engine\YandexDirect::STATUS_PENDING) { $active = 'yellow'; $active_title = Loc::getMessage('SEO_STATUS_PENDING'); } else { $active = 'green'; $active_title = Loc::getMessage('SEO_STATUS_SHOW_YES'); } } else { if($banner['SETTINGS']['StatusActivating'] == Engine\YandexDirect::STATUS_PENDING) { if($banner['SETTINGS']['StatusBannerModerate'] == Engine\YandexDirect::STATUS_PENDING) { $active = 'grey'; $active_title = Loc::getMessage('SEO_STATUS_MODERATE_PENDING'); } elseif($banner['SETTINGS']['StatusShow'] == Engine\YandexDirect::BOOL_YES) { $active = 'grey'; $active_title = Loc::getMessage('SEO_STATUS_SHOW_PENDING'); } else { $active = 'grey'; $active_title = Loc::getMessage('SEO_STATUS_SHOW_OFF'); } } else { $active = 'red'; $active_title = Loc::getMessage('SEO_ISACTIVE_NO'); } } } ?> <tr> <td><?=Loc::getMessage("SEO_ISACTIVE")?>:</td> <td colspan="3"> <div class="lamp-<?=$active?>" style="display:inline-block;"></div> <?=$active_title?> <? if($bAllowUpdate) { ?> <a href="javascript:void(0)" onclick="updateBanner(this, '<?=$ID?>')"><?=Loc::getMessage("SEO_BANNER_LIST_UPDATE");?></a> <? } ?> </td> </tr> <? endif; ?> <tr class="adm-detail-required-field"> <td width="40%" valign="top"><?=Loc::getMessage("SEO_BANNER_DATA")?>:</td> <td width="0" valign="top"> <input type="text" name="SETTINGS[Title]" placeholder="<?=Loc::getMessage('SEO_BANNER_DATA_TITLE')?>" value="<?=HtmlFilter::encode($banner["SETTINGS"]["Title"])?>" id="title_content" style="width: 250px;" maxlength="<?=Adv\YandexBannerTable::MAX_TITLE_LENGTH;?>" onkeyup="updateAdv()" onchange="updateAdv()" onpaste="updateAdv()" tabindex="1"> </td> <td width="0" valign="top"> <span id="title_stats" class="yandex-adv-stats"><?=Adv\YandexBannerTable::MAX_TITLE_LENGTH-strlen($banner["SETTINGS"]["Title"])?></span> </td> <td width="60%" valign="top" rowspan="2"> <? $bannerInfo = $ID > 0 ? $banner : null; require("tab/seo_search_yandex_direct_banner.php"); ?> </td> </tr> <tr> <td></td> <td valign="top"> <textarea name="SETTINGS[Text]" placeholder="<?=Loc::getMessage('SEO_BANNER_DATA_TEXT')?>" id="text_content" style="width: 250px; height: 100px;" maxlength="<?=Adv\YandexBannerTable::MAX_TEXT_LENGTH;?>" onkeyup="updateAdv()" onchange="updateAdv()" onpaste="updateAdv()" tabindex="2"><?=HtmlFilter::encode($banner["SETTINGS"]["Text"])?></textarea> </td> <td valign="top"> <span id="text_stats" class="yandex-adv-stats"><?=Adv\YandexBannerTable::MAX_TEXT_LENGTH-strlen($banner["SETTINGS"]["Text"])?></span> </td> </tr> <tr class="adm-detail-required-field"> <td width="40%" valign="top"><?=Loc::getMessage("SEO_BANNER_HREF")?>:</td> <td colspan="3"> <input type="text" name="SETTINGS[Href]" value="<?=HtmlFilter::encode($banner["SETTINGS"]["Href"])?>" id="link_content" style="width: 500px;" onkeyup="updateAdv()" onchange="updateAdv()" onpaste="updateAdv()" tabindex="3"> <div id="link_hint" style="display: none;"> <? echo BeginNote(); echo Loc::getMessage('SEO_LINK_HINT', array( "#PARAMS_HINT#" => "<ul><li>".AdvSession::URL_PARAM_CAMPAIGN."=".AdvSession::URL_PARAM_CAMPAIGN_VALUE."</li><li>".AdvSession::URL_PARAM_BANNER."=".AdvSession::URL_PARAM_BANNER_VALUE."</li></ul>" )); ?> <a class="bx-action-href" hidefocus="true" onclick="addUrlParams();" href="javascript:void(0)"><?=Loc::getMessage('SEO_LINK_HINT_ACTION')?></a> <? echo EndNote(); ?> </div> </td> </tr> <? if(($ID > 0 || $elementId > 0) && Main\Loader::includeModule('iblock')) { ?> <tr class="heading"><td colspan="4"><?=Loc::getMessage("SEO_BANNER_SALE_SECTION")?></td></tr> <tr> <td valign="top"><?=Loc::getMessage("SEO_BANNER_LINKS")?>:</td> <td valign="top" colspan="3"> <? if($ID > 0) { $dbRes = Adv\LinkTable::getList(array( "filter" => array( '=BANNER_ID' => $ID, ), "select" => array( "LINK_TYPE", "LINK_ID", "ELEMENT_NAME" => "IBLOCK_ELEMENT.NAME", "ELEMENT_IBLOCK_ID" => "IBLOCK_ELEMENT.IBLOCK_ID", "ELEMENT_IBLOCK_TYPE_ID" => "IBLOCK_ELEMENT.IBLOCK.IBLOCK_TYPE_ID", 'ELEMENT_IBLOCK_SECTION_ID' => 'IBLOCK_ELEMENT.IBLOCK_SECTION_ID', ) )); } else { $dbRes = \Bitrix\Iblock\ElementTable::getList(array( 'filter' => array( "=ID" => $elementId, ), 'select' => array( 'LINK_ID' => 'ID', 'ELEMENT_NAME' => 'NAME', 'ELEMENT_IBLOCK_ID' => 'IBLOCK_ID', 'ELEMENT_IBLOCK_TYPE_ID' => 'IBLOCK.IBLOCK_TYPE_ID', 'ELEMENT_IBLOCK_SECTION_ID' => 'IBLOCK_SECTION_ID', ) )); } $arLinks = array(); while($link = $dbRes->fetch()) { if(!isset($link['LINK_TYPE']) && $elementId > 0) { $link['LINK_TYPE'] = Adv\LinkTable::TYPE_IBLOCK_ELEMENT; } $arLinks[] = $link; } ?> <div id="adv_link_list"> <? require_once("tab/seo_search_yandex_direct_list_banner.php"); ?> </div> </td> </tr> <? if($ID > 0) { ?> <tr> <td></td> <td colspan="3"> <input type="hidden" id="new_link_container[]" onchange="createLink(this.value, '<?=Adv\LinkTable::TYPE_IBLOCK_ELEMENT?>')"> <a href="javascript:void(0)" onclick="BX.util.popup('/bitrix/admin/iblock_element_search.php?lang=ru&n=new_link_container', 1000, 700);"><?=Loc::getMessage('SEO_BANNER_LINK_CREATE_ITEM')?></a><br /> </td> </tr> <? if($bShowAuto): ?> <tr> <td colspan=4" align="center"> <?=BeginNote().Loc::getMessage("SEO_BANNER_AUTO_HINT").EndNote();?> </td> </tr> <? endif; ?> <script> function createLink(linkId, linkType) { BX.ajax.loadJSON('/bitrix/tools/seo_yandex_direct.php?action=link_create&banner=<?=$ID?>&link='+linkId+'&link_type='+linkType+'&get_list_html=2&sessid='+BX.bitrix_sessid(), function(res) { BX('adv_link_list').innerHTML = res.list_html; BX.onCustomEvent("OnSeoYandexDirectLinksChange", [BX('adv_link_list')]); }); } </script> <? } } ?> <script> <? if($bAllowUpdate): ?> function updateBanner(btn, bannerId) { if(!!btn._innerHTML) { return; } //BX.addClass(btn, 'adm-btn-active'); btn._innerHTML = btn.innerHTML; btn.innerHTML = '<?=Loc::getMessage('SEO_YANDEX_DIRECT_LOADING')?>'; var url = '/bitrix/tools/seo_yandex_direct.php?action=banner_update&campaign=<?=$campaignId?>&banner=' + BX.util.urlencode(bannerId); BX.ajax.loadJSON(url + '&sessid=' + BX.bitrix_sessid(), function(res){ if(BX.hasClass(btn, 'adm-btn-active')) { //BX.removeClass(btn, 'adm-btn-active'); btn.innerHTML = btn._innerHTML; delete btn._innerHTML; } if(!!res.error && (!!res.error.message || !!res.error.code)) { alert(res.error.message||res.error.code); } else { BX.reload(); } }); } <? endif; ?> var urlParams = [ ['<?=AdvSession::URL_PARAM_CAMPAIGN?>', '<?=AdvSession::URL_PARAM_CAMPAIGN_VALUE?>'], ['<?=AdvSession::URL_PARAM_BANNER?>', '<?=AdvSession::URL_PARAM_BANNER_VALUE?>'] ]; function checkUrl(url) { return url.indexOf(urlParams[0].join('=')) >= 0 && url.indexOf(urlParams[1].join('=')) >= 0; } function addUrlParams() { var s = BX('link_content').value; if(s.indexOf('?') < 0 && s[s.length-1] != '/') s += '/'; var p = {}; p[urlParams[0][0]] = urlParams[0][1]; p[urlParams[1][0]] = urlParams[1][1]; BX('link_content').value = BX.util.add_url_param(s, p); updateAdv(); } function showUrlHint(link) { BX('link_hint').style.display = checkUrl(link) ? 'none' : 'block'; } function updateAdv() { var title = BX('title_content').value, text = BX('text_content').value, link = BX('link_content').value, domain = window.location.host; showUrlHint(link) var r = link.match(/\/\/([^\/]+)/i); if(r) { domain = r[1]; } BX('title_stats').innerHTML = <?=Adv\YandexBannerTable::MAX_TITLE_LENGTH;?>-title.length; BX('text_stats').innerHTML = <?=Adv\YandexBannerTable::MAX_TEXT_LENGTH;?>-text.length; BX('yandex_title_content').innerHTML = BX.util.htmlspecialchars(title||BX('title_content').placeholder); BX('yandex_text_content').innerHTML = BX.util.htmlspecialchars(text||BX('text_content').placeholder).replace(/\n+/g, ' '); BX('yandex_link_content').innerHTML = BX.util.htmlspecialchars(domain); BX('yandex_link_content_link').innerHTML = BX.util.htmlspecialchars(domain); BX('yandex_link').href = link; BX('yandex_link_content_link').href = link; } BX.ready(updateAdv); </script> <? // geo tab $tabControl->BeginNextTab(); $dbRes = Adv\YandexRegionTable::getList(array( 'order' => array('PARENT_XML_ID' => 'ASC'), 'select' => array('ID', 'NAME', 'XML_ID', 'PARENT_ID', 'PARENT_XML_ID' => 'PARENT.XML_ID') )); $regions = array(); $regionsOutput = array(); while($region = $dbRes->fetch()) { $regionsOutput[$region['PARENT_XML_ID']] = ''; $regions[] = $region; } foreach($regions as $region) { $bHasChildren = isset($regionsOutput[$region["XML_ID"]]); $bHasParent = $region['PARENT_XML_ID'] !== null; if($regionsOutput[$region["PARENT_XML_ID"]] === '') { $regionsOutput[$region["PARENT_XML_ID"]] = '<div id="regions_'.$region["PARENT_XML_ID"].'" style="display:'.($bHasParent ? 'none' : 'block').'">'; } if($bHasChildren) { $button = '<span onclick="showRegions(\''.$region["XML_ID"].'\', this.parentNode)" class="openbutton"></span>'; } else { $button = '<span class="openbutton empty"></span>'; } $regionsOutput[$region["PARENT_XML_ID"]] .= '<div class="region-closed">'.$button.'<input type="checkbox" name="region[]" id="region_'.$region['XML_ID'].'" value="'.$region['XML_ID'].'" data-parent="'.$region['PARENT_XML_ID'].'" data-title="'.HtmlFilter::encode($region['NAME']).'"> <label for="region_'.$region['XML_ID'].'">'.HtmlFilter::encode($region['NAME']).'</label></div>'; } ?> <style> .openbutton { display: inline-block; height: 20px; width: 20px; cursor: pointer; } .region-opened, .region-closed { cursor: pointer; } .region-closed .openbutton { background: url("/bitrix/panel/main/images/bx-admin-sprite.png") no-repeat scroll -10px -233px rgba(0, 0, 0, 0); } .region-opened > .openbutton { background: url("/bitrix/panel/main/images/bx-admin-sprite.png") no-repeat scroll -10px -211px rgba(0, 0, 0, 0); } .openbutton.empty { background: url("/bitrix/panel/main/images/bx-admin-sprite-small-1.png") no-repeat scroll -3px -1132px rgba(0, 0, 0, 0) !important; } span.loading-message-text { background: url('/bitrix/panel/main/images/waiter-small-white.gif') no-repeat left center; padding-left: 20px; margin: 0 0 0 15px; line-height: 15px; font-size: 11px; display: inline-block; } span.yandex-delete { display: inline-block; height: 20px; width: 20px; cursor: pointer; background: url("/bitrix/panel/main/images/bx-admin-sprite-small-1.png") no-repeat scroll 5px -2446px rgba(0, 0, 0, 0); } </style> <input type="hidden" id="geo_settings" name="SETTINGS[Geo]" value="<?=implode(',',$banner["SETTINGS"]["Geo"])?>" /> <tr> <td colspan="2" align="center"> <table class="internal" width="80%"> <tr class="heading"> <td width="50%"><?=Loc::getMessage('SEO_YANDEX_DIRECT_CHOOSE_REGIONS')?></td> <td width="50%"><?=Loc::getMessage('SEO_YANDEX_DIRECT_CHOSEN_REGIONS')?></td> </tr> <tr> <td valign="top"> <div class="regions-list" id="regions-list"> <? echo implode('</div>', $regionsOutput).'</div>'; ?> </div> </td> <td valign="top"><ul id="regions-selected"> </ul></td> </tr> </table> </td> </tr> <script> function showRegions(id, el) { var r = BX('regions_' + id); if(r) { if(BX.hasClass(el, 'region-opened')) { el.className = 'region-closed'; r.style.display = 'none'; } else { el.appendChild(r); r.style.display = 'block'; r.style.paddingLeft = '20px'; el.className = 'region-opened'; } } } BX.ready(function() { var listCont = BX('regions-list'), resultCont = BX('regions-selected'); function checkAll(id, bChecked) { var r = BX('regions_' + id); if(r) { var subReg = BX.findChildren(r, {tag: 'INPUT', property: {type: 'checkbox', name: 'region[]'}}, true); if (subReg) { for (var i = 0; i < subReg.length; i++) { subReg[i].checked = bChecked; checkAll(subReg[i].value, bChecked); } } } } function drawAll(id, bParentChecked, drawRes, valueRes) { var c = BX('region_' + id); if(c.checked != bParentChecked) { if(c.checked) { drawRes.push('<b>' + BX.util.htmlspecialchars(c.getAttribute('data-title')) + '</b>'); } else { drawRes.push('<?=Loc::getMessage('SEO_YANDEX_REGIONS_BESIDES', array("#NAME#" => "' + BX.util.htmlspecialchars(c.getAttribute('data-title')) + '"))?>'); } valueRes.push((c.checked ? '' : '-') + c.value); } var r = BX('regions_' + id); if(r) { var subReg = BX.findChildren(r, {tag: 'INPUT', property: {type: 'checkbox', name: 'region[]'}, attribute: {'data-parent': id}}, true); if (subReg) { for (var i = 0; i < subReg.length; i++) { drawAll(subReg[i].value, c.checked, drawRes, valueRes); } } } } var h = function() { var i, id = this.value,drawRes = [], valueRes = []; checkAll(id, this.checked); drawAll('0', false, drawRes, valueRes); if(drawRes.length > 0) resultCont.innerHTML = '<li>' + drawRes.join('</li><li>') + '</li>'; else resultCont.innerHTML = '<li><b><?=Loc::getMessage('SEO_YANDEX_REGIONS_ALL')?></b></li>'; document.forms.form1['SETTINGS[Geo]'].value = valueRes.join(','); }; var startValue = document.forms.form1['SETTINGS[Geo]'].value; BX.bindDelegate(listCont, 'click', {tag: 'INPUT', props: {type: 'checkbox', name: 'region[]'}}, h) if(startValue == '') { startValue = '0'; } startValue = startValue.split(','); for(var i = 0; i < startValue.length; i++) { var bChecked = true; if(startValue[i].charAt(0) == '-') { bChecked = false; startValue[i] = startValue[i].substring(1); } var checkbox = BX('region_' + startValue[i]); checkbox.checked = bChecked; h.apply(checkbox, []); } showRegions("0", BX('region_0').parentNode); }) </script> <? // keywords tab $tabControl->BeginNextTab(); $phraseString = ""; $phrasePriority = array(); $phraseStatus = array(); foreach($banner["SETTINGS"]["Phrases"] as $phraseData) { $phraseString .= $phraseData["Phrase"]."\n"; $phrasePriority[$phraseData["Phrase"]] = $phraseData["AutoBudgetPriority"]; $phraseStatus[$phraseData["Phrase"]] = $phraseData["StatusPhraseModerate"]; } ?> <tr class="heading"> <td colspan="2"><?=Loc::getMessage('SEO_YANDEX_WORDSTAT')?></td> </tr> <tr> <td colspan="2"> <textarea id="phrase_text" style="width: 99%; margin-bottom: 15px;" rows="3"><?=HtmlFilter::encode($phraseString)?></textarea><br /> <input type="button" value="<?=Loc::getMessage('SEO_YANDEX_WORDSTAT_STAT')?>" onclick="showWordstatReport();" name="template_preview" id="wordstat_button"><span id="wordstat_wait" class="loading-message-text" style="display: none"><?=Loc::getMessage('SEO_YANDEX_WORDSTAT_WAIT')?></span><span id="wordstat_wait_more" class="loading-message-text" style="display: none"><?=Loc::getMessage('SEO_YANDEX_WORDSTAT_WAIT_MORE')?></span> <div id="worstat_report" style="text-align: center;"></div> </td> </tr> <tr class="heading"> <td colspan="2"><?=Loc::getMessage('SEO_YANDEX_FORECAST')?></td> </tr> <tr id="forecast_block"> <td colspan="2"> <input type="button" name="template_preview" id="forecast_button" value="<?=Loc::getMessage('SEO_YANDEX_FORECAST_GET');?>" onclick="showForecast();" /><span id="forecast_wait" class="loading-message-text" style="display: none;"><?=Loc::getMessage('SEO_YANDEX_FORECAST_WAIT');?></span><span id="forecast_wait_more" class="loading-message-text" style="display: none;"><?=Loc::getMessage('SEO_YANDEX_FORECAST_WAIT_MORE')?></span> <div id="forecast_block_content" style="text-align: center; margin-top: 15px;"></div> </td> </tr> <tr class="heading"> <td colspan="2"><?=Loc::getMessage('SEO_MINUS_KEYWORDS')?></td> </tr> <tr> <td colspan="2"> <textarea id="minus_text" style="width: 99%;" rows="3" name="SETTINGS[MinusKeywords]"><?=HtmlFilter::encode($banner["SETTINGS"]["MinusKeywords"])?></textarea> </td> </tr> <script> var phraseList = []; var phrasePriority = <?=count($phrasePriority) > 0 ? CUtil::PhpToJSObject($phrasePriority) : '{}';?>; var phraseStatus = <?=count($phraseStatus) > 0 ? CUtil::PhpToJSObject($phraseStatus) : '{}';?>; var lastForecast = {}; function parsePhraseList() { var textInput = BX('phrase_text'); if(textInput.offsetHeight < textInput.scrollHeight) { textInput.style.height = (textInput.offsetHeight + 20) + 'px'; } var v = BX.util.trim(textInput.value); if(v.length > 0) { phraseList = BX.util.array_unique(v.split(/[\n,;]+\s*/)); } else { phraseList = []; } updatePhraseList(); BX('wordstat_button').disabled = phraseList.length <= 0; BX('forecast_button').disabled = phraseList.length <= 0; } function addPhrase(phrase) { phraseList.push(phrase); BX('phrase_text').value = BX.util.array_unique(phraseList).join('\n'); parsePhraseList(); } function removePhrase(phrase) { var key = BX.util.array_search(phrase, phraseList); if(key >= 0) { phraseList = BX.util.deleteFromArray(phraseList, key); } BX('phrase_text').value = phraseList.join('\n'); parsePhraseList(); } function updatePhraseList() { var phraseStruct = {Phrases:[]}; for(var i = 0; i < phraseList.length; i++) { if(phraseList[i].length > 0) { phraseStruct.Phrases.push({ Phrase: phraseList[i], Shows: 'N/A', Clicks: 'N/A', Min: 'N/A', CTR: 'N/A' }); } } BX('forecast_block_content').innerHTML = getForecastContent(phraseStruct, true); } function showWordstatReport() { BX('wordstat_button').disabled = true; BX('wordstat_wait').style.display = 'inline-block'; BX('wordstat_wait_more').style.display = 'none'; var yandexTimeout = null; var f = function (bClear) { BX.ajax.loadJSON('/bitrix/tools/seo_yandex_direct.php', { action: !!bClear ? 'wordstat_report_clear' : 'wordstat_report', phrase: phraseList, geo: document.forms.form1['SETTINGS[Geo]'].value, sessid: BX.bitrix_sessid() }, function (res) { if (res.error) { switch (res.error.code + '') { case '92': if(!yandexTimeout) { yandexTimeout = setTimeout(function(){ BX('wordstat_wait').style.display = 'none'; BX('wordstat_wait_more').style.display = 'inline-block'; }, 30000); } setTimeout(f, 5000); break; // report not ready yet case '31': f(true); break; // reached max amount of wordstat reports default: clearTimeout(yandexTimeout); BX('wordstat_button').disabled = false; BX('wordstat_wait').style.display = 'none'; BX('wordstat_wait_more').style.display = 'none'; BX('worstat_report').innerHTML = '<b><?=Loc::getMessage('SEO_ERROR')?></b> ' + BX.util.htmlspecialchars(res.error.message); } } else if (res.REPORT_ID) { setTimeout(f, 2000); } else { clearTimeout(yandexTimeout); BX('wordstat_button').disabled = false; BX('wordstat_wait').style.display = 'none'; BX('wordstat_wait_more').style.display = 'none'; BX('worstat_report').innerHTML = getWordstatReportContent(res); } }); }; f(); } function getWordstatReportContent(res) { var bMult = res.length > 1; var html = '', i, j, r = Math.random(), p, bChecked; html = '<table class="internal" width="100%"><tr class="heading"><td><?=Loc::getMessage('SEO_BANNER_PHRASE')?></td><td class="bx-digit-cell"><?=Loc::getMessage('SEO_BANNER_PHRASE_SHOWS')?></td></tr>'; for(i = 0; i < res.length; i++) { var phraseEnc = BX.util.htmlspecialchars(res[i]['Phrase']); var cnt = 'N/A'; var info = ''; info += '<table width="100%" class="internal"><tr class="heading"><td width="50%"><?=Loc::getMessage('SEO_SEARCH_WITH', array("#PHRASE#" => "'+phraseEnc+'"))?></td><td width="50%"><?=Loc::getMessage('SEO_SEARCH_WHATELSE', array("#PHRASE#" => "'+phraseEnc+'"))?></td></tr>'; info += '<tr><td valign="top" style="padding:0 !important;">'; if(res[i]['SearchedWith']) { info += '<div style="max-height: 400px; overflow: auto;"><table class="internal" width="100%"><tr class="heading"><td width="0"></td><td width="70%"><?=Loc::getMessage('SEO_BANNER_PHRASE')?></td><td width="30%" class="bx-digit-cell"><?=Loc::getMessage('SEO_BANNER_PHRASE_SHOWS')?></td></tr>'; for(j = 0; j < res[i]['SearchedWith'].length; j++) { if(res[i]['Phrase'] == res[i]['SearchedWith'][j]['Phrase']) { bChecked = true; cnt = res[i]['SearchedWith'][j]['Shows']; } else { bChecked = false; } p = BX.util.htmlspecialchars(res[i]['SearchedWith'][j]['Phrase']); info += '<tr><td><input name="wordstat_phrase[]" type="checkbox" id="sw_'+i+'_'+j+'_'+r+'" value="'+p+'"' +(bChecked?' checked="checked"':'')+'></td><td><label for="sw_'+i+'_'+j+'_'+r+'">'+p +'</label></td><td class="bx-digit-cell">'+res[i]['SearchedWith'][j]['Shows']+'</td></tr>'; } info += '</table></div>'; } else { info += '<div style="text-align: center;"><b><?=Loc::getMessage('SEO_SEARCH_EMPTY')?></b></div>'; } info += '</td><td valign="top" style="padding:0 !important;">'; if(res[i]['SearchedAlso']) { info += '<div style="max-height: 400px; overflow: auto; text-align: left;"><table class="internal" width="100%"><tr class="heading"><td width="0"></td><td width="70%"><?=Loc::getMessage('SEO_BANNER_PHRASE')?></td><td width="30%" class="bx-digit-cell"><?=Loc::getMessage('SEO_BANNER_PHRASE_SHOWS')?></td></tr>'; for(j = 0; j < res[i]['SearchedAlso'].length; j++) { bChecked = res[i]['Phrase'] == res[i]['SearchedAlso'][j]['Phrase']; p = BX.util.htmlspecialchars(res[i]['SearchedAlso'][j]['Phrase']); info += '<tr><td><input name="wordstat_phrase[]" type="checkbox" id="sa_'+i+'_'+j+'_'+r+'" value="'+p+'"' +(bChecked?' checked="checked"':'')+'></td><td><label for="sa_'+i+'_'+j+'_'+r+'">'+p +'</label></td><td class="bx-digit-cell">'+res[i]['SearchedAlso'][j]['Shows']+'</td></tr>'; } info += '</table></div>'; } else { info += '<div style="text-align: center;"><b><?=Loc::getMessage('SEO_SEARCH_EMPTY')?></b></div>'; } info += '</td></tr></table>'; html += '<tr><td>'; if(bMult) { html += '<div class="region-closed" onclick="toggleDataRow(this,\'wordstat\',\''+i+'\', \''+r+'\')"><span class="openbutton"></span>' + phraseEnc + '</div>'; } else { html += '<div>' + phraseEnc + '</div>'; } html += '</td><td class="bx-digit-cell">' + cnt + '</td></tr>'; html += '<tr id="wordstat_'+i+'_0_'+r+'" style="display:'+(bMult ? 'none' : '')+'"><td colspan="2">' + info + '</td></tr>'; } return '<div style="margin-top: 15px; text-align: left;">' + html + '</div>'; } BX.ready(function(){ var timeOut = null; // phrases hint binds var textInput = BX('phrase_text'); var hint = new BX.PopupWindow('phrase_hint_' + Math.random(), textInput, { content: '<div style="max-width: 250px;"><?=Loc::getMessage('SEO_PHRASE_HINT')?></div>', angle: {postion: 'top', offset: 230}, bindOptions: {position: 'bottom'} }); BX.bind(textInput, 'focus', function(){ var pos = BX.pos(textInput); hint.setOffset({ offsetLeft: pos.width - 250 }); hint.show(); timeOut = setTimeout(BX.proxy(hint.close, hint), 10000) }); BX.bind(textInput, 'blur', function(){hint.close(); clearTimeout(timeOut);}); BX.bind(textInput, 'keyup', parsePhraseList); // minus keywords hint binds var minusKWInput = BX('minus_text'); var hintMinus = new BX.PopupWindow('minus_keywords_hint_' + Math.random(), minusKWInput, { content: '<div style="max-width: 250px;"><?=Loc::getMessage('SEO_MINUS_KW_HINT')?></div>', angle: {postion: 'top', offset: 230}, bindOptions: {position: 'top'} }); BX.bind(minusKWInput, 'focus', function(){ var pos = BX.pos(minusKWInput); hintMinus.setOffset({ offsetLeft: pos.width - 250 }); hintMinus.show(); timeOut = setTimeout(BX.proxy(hintMinus.close, hintMinus), 10000) }); BX.bind(minusKWInput, 'blur', function(){hintMinus.close(); clearTimeout(timeOut);}); BX.bindDelegate( BX('worstat_report'), 'click', {tag: 'INPUT', props: {type: 'checkbox', name: 'wordstat_phrase[]'}}, function(){ if(this.checked) { addPhrase(this.value); } else { removePhrase(this.value); } } ); parsePhraseList(); }); function showForecast() { var list = phraseList, yandexTimeout = null; if(list.length > 0) { BX('forecast_button').disabled = true; BX('forecast_wait').style.display = 'inline-block'; BX('forecast_wait_more').style.display = 'none'; var f = function (bClear) { BX.ajax.loadJSON('/bitrix/tools/seo_yandex_direct.php', { action: !!bClear ? 'forecast_report_clear' : 'forecast_report', phrase: list, geo: document.forms.form1['SETTINGS[Geo]'].value, sessid: BX.bitrix_sessid() }, function (res) { if (res.error) { switch (res.error.code+'') { case '74': if(!yandexTimeout) { yandexTimeout = setTimeout(function(){ BX('forecast_wait').style.display = 'none'; BX('forecast_wait_more').style.display = 'inline-block'; }, 15000); } setTimeout(f, 1000); break; // report not ready yet case '31': f(true); break; // reached max amount of forecast reports default: clearTimeout(yandexTimeout); BX('forecast_button').disabled = false; BX('forecast_wait').style.display = 'none'; BX('forecast_wait_more').style.display = 'none'; BX('forecast_block_content').innerHTML = '<b><?=Loc::getMessage('SEO_ERROR')?></b> ' + BX.util.htmlspecialchars(res.error.message); } } else if (res.REPORT_ID) { setTimeout(f, 2000); } else { clearTimeout(yandexTimeout); BX('forecast_button').disabled = false; BX('forecast_wait').style.display = 'none'; BX('forecast_wait_more').style.display = 'none'; BX('forecast_block_content').innerHTML = getForecastContent(res); } }); }; f(); } } function getForecastContent(res, bFromForm) { var r = Math.random(), h = '<table width="100%" class="internal">'; if(!bFromForm) { h += '<tr class="heading"><td></td><td><?=Loc::getMessage('SEO_FORECAST_SHOWS')?></td><td><?=Loc::getMessage('SEO_FORECAST_CLICKS')?></td><td colspan="2"><?=Loc::getMessage('SEO_FORECAST_COST')?>, <?=$clientCurrency?></td><td colspan="2"></td></tr>'; h += '<tr>' + '<td style="text-align: left;"><span class="region-closed" onclick="toggleDataRow(this,\'forecast\',\'common\',\'' + r + '\');"><span class="openbutton"></span><b><?=Loc::getMessage('SEO_FORECAST_COMMON')?></b></span></td>' + '<td>' + res['Common']['Shows'] + '</td>' + '<td>' + res['Common']['Clicks'] + '</td>' + '<td colspan="2">' + res['Common']['Min'] + '/' + res['Common']['Max'] + '</td>' + '<td colspan="2"></td>' + '</tr>'; h += '<tr id="forecast_common_0_' + r + '" style="display:none;">' + '<td style="text-align: right;"><?=Loc::getMessage('SEO_FORECAST_COMMON_PLACE')?><br /><small><?=Loc::getMessage('SEO_FORECAST_COMMON_FIRSTPLACE')?></small></td>' + '<td></td>' + '<td>' + res['Common']['Clicks'] + '<br /><small>' + res['Common']['FirstPlaceClicks'] + '</small></td>' + '<td colspan="2">' + res['Common']['Min'] + '<br /><small>' + res['Common']['Max'] + '</small></td>' + '<td colspan="2"></td>' + '</tr><tr id="forecast_common_1_' + r + '" style="display:none;">' + '<td style="text-align: right;"><?=Loc::getMessage('SEO_FORECAST_PREMIUM_PLACE')?></td>' + '<td></td>' + '<td>' + res['Common']['PremiumClicks'] + '</td>' + '<td colspan="2">' + res['Common']['PremiumMin'] + '</td>' + '<td colspan="2"></td>' + '</tr>'; } h += '<tr class="heading"><td><?=Loc::getMessage('SEO_FORECAST_PHRASE')?></td><td><?=Loc::getMessage('SEO_FORECAST_SHOWS')?></td><td><?=Loc::getMessage('SEO_FORECAST_CLICKS')?></td><td><?=Loc::getMessage('SEO_FORECAST_PRICE')?>, <?=$clientCurrency?></td><td><?=Loc::getMessage('SEO_FORECAST_CTR')?></td><td><?=Loc::getMessage('SEO_FORECAST_PRIORITY')?></td><td></td></tr>'; for(var i = 0; i < res['Phrases'].length; i++) { var bShowDetails = !bFromForm; if(!bFromForm) { lastForecast[res['Phrases'][i]['Phrase']] = res['Phrases'][i]; } else if(typeof lastForecast[res['Phrases'][i]['Phrase']] != 'undefined') { res['Phrases'][i] = lastForecast[res['Phrases'][i]['Phrase']]; bShowDetails = true; } h += '<tr>' + '<td style="text-align: left;"><input type="hidden" name="Phrase[]" value="'+BX.util.htmlspecialchars(res['Phrases'][i]['Phrase'])+'">'+(bShowDetails?'<span class="region-closed" onclick="toggleDataRow(this,\'forecast\',\''+i+'\',\''+r+'\');"><span class="openbutton"></span>':'<span>'); var status = phraseStatus[res['Phrases'][i]['Phrase']]||'<?=Engine\YandexDirect::STATUS_NEW?>'; switch(status) { case '<?=Engine\YandexDirect::STATUS_NEW?>': h += '<div title="<?=Loc::getMessage('SEO_FORECAST_STATUS_NEW')?>" class="lamp-grey" style="display: inline-block;"></div>'; break; case '<?=Engine\YandexDirect::BOOL_YES?>': h += '<div title="<?=Loc::getMessage('SEO_FORECAST_STATUS_YES')?>" class="lamp-green" style="display: inline-block;"></div>'; break; case '<?=Engine\YandexDirect::BOOL_NO?>': h += '<div title="<?=Loc::getMessage('SEO_FORECAST_STATUS_NO')?>" class="lamp-red" style="display: inline-block;"></div>'; break; } h += ' ' + BX.util.htmlspecialchars(res['Phrases'][i]['Phrase'])+'</span></td><td>' + res['Phrases'][i]['Shows'] + '</td><td>' + res['Phrases'][i]['Clicks'] + '</td>' + '<td>' + res['Phrases'][i]['Min'] + (typeof res['Phrases'][i]['Max'] != 'undefined' ? ('/' + res['Phrases'][i]['Max']) : '') + '</td>' + '<td>' + res['Phrases'][i]['CTR'] + '</td>' + '<td><select name="PhrasePriority[]" onchange="phrasePriority[\''+BX.util.htmlspecialchars(res['Phrases'][i]['Phrase']).replace('\'','\\\'')+'\'] = this.value;">'; var priority = phrasePriority[res['Phrases'][i]['Phrase']]||'<?=Engine\YandexDirect::PRIORITY_MEDIUM?>'; h += '<option value="<?=Engine\YandexDirect::PRIORITY_LOW?>"'+(priority=='<?=Engine\YandexDirect::PRIORITY_LOW?>' ? ' selected="selected"' : '')+'><?=Loc::getMessage('SEO_FORECAST_PRIORITY_LOW')?></option><option value="<?=Engine\YandexDirect::PRIORITY_MEDIUM?>"'+(priority=='<?=Engine\YandexDirect::PRIORITY_MEDIUM?>' ? ' selected="selected"' : '')+'><?=Loc::getMessage('SEO_FORECAST_PRIORITY_MEDIUM')?></option><option value="<?=Engine\YandexDirect::PRIORITY_HIGH?>"'+(priority=='<?=Engine\YandexDirect::PRIORITY_HIGH?>' ? ' selected="selected"' : '')+'><?=Loc::getMessage('SEO_FORECAST_PRIORITY_HIGH')?></option>'; h += '</select></td>' + '<td><span onclick="removePhrase(\''+BX.util.htmlspecialchars(res['Phrases'][i]['Phrase'].replace(/'/, '\\\''))+'\'); this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);" class="yandex-delete"></span></td>' + '</tr>'; if(bShowDetails) { h += '<tr id="forecast_' + i + '_0_' + r + '" style="display:none;">' + '<td style="text-align: right;"><?=Loc::getMessage('SEO_FORECAST_COMMON_PLACE')?><br /><small><?=Loc::getMessage('SEO_FORECAST_COMMON_FIRSTPLACE')?></small></td>' + '<td></td>' + '<td>' + res['Phrases'][i]['Clicks'] + '<br /><small>' + res['Phrases'][i]['FirstPlaceClicks'] + '</small></td>' + '<td>' + res['Phrases'][i]['Min'] + '<br /><small>' + res['Phrases'][i]['Max'] + '</small></td>' + '<td>' + res['Phrases'][i]['CTR'] + '<br /><small>' + res['Phrases'][i]['FirstPlaceCTR'] + '</small></td>' + '<td colspan="2"></td>' + '</tr><tr id="forecast_' + i + '_1_' + r + '" style="display:none;">' + '<td style="text-align: right;"><?=Loc::getMessage('SEO_FORECAST_PREMIUM_PLACE')?><br /><small><?=Loc::getMessage('SEO_FORECAST_PREMIUM_FIRSTPLACE')?></small></td>' + '<td></td>' + '<td>' + res['Phrases'][i]['PremiumClicks'] + '</td>' + '<td>' + res['Phrases'][i]['PremiumMin'] + '<br /><small>' + res['Phrases'][i]['PremiumMax'] + '</small></td>' + '<td>' + res['Phrases'][i]['PremiumCTR'] + '</td>' + '<td colspan="2"></td>' + '</tr>'; } } h += '</table>'; return h; } function toggleDataRow(el,prefix,i,r) { if(BX.hasClass(el, 'region-closed')) { el.className = 'region-opened'; BX(prefix+'_'+i+'_0_'+r).style.display = ''; if(BX(prefix+'_'+i+'_1_'+r)) { BX(prefix+'_'+i+'_1_'+r).style.display = ''; } } else { el.className = 'region-closed'; BX(prefix+'_'+i+'_0_'+r).style.display = 'none'; if(BX(prefix+'_'+i+'_1_'+r)) { BX(prefix+'_'+i+'_1_'+r).style.display = 'none'; } } } </script> <? // Auto tab if($bShowAuto) { $tabControl->BeginNextTab(); ?> <tr> <td colspan="2" align="center"><?= BeginNote().Loc::getMessage("SEO_BANNER_AUTO_HINT").EndNote();?></td> </tr> <tr> <td width="60%"> <label for="AUTO_QUANTITY_OFF"><?= Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_OFF");?></label> </td> <td width="40%"> <input type="hidden" name="AUTO_QUANTITY_OFF" value="<?=Adv\YandexBannerTable::INACTIVE?>"> <input type="checkbox" name="AUTO_QUANTITY_OFF" id="AUTO_QUANTITY_OFF" value="<?=Adv\YandexBannerTable::ACTIVE?>"<?=$banner["AUTO_QUANTITY_OFF"] == Adv\YandexBannerTable::ACTIVE || $banner["AUTO_QUANTITY_OFF"] == Adv\YandexBannerTable::MARKED ? ' checked="checked"' : ''?>> <label for="AUTO_QUANTITY_OFF"><?= Loc::getMessage("MAIN_YES");?></label> </td> </tr><tr> <td width="60%"> <label for="AUTO_QUANTITY_ON"><?= Loc::getMessage("SEO_BANNER_AUTO_QUANTITY_ON");?></label> </td> <td width="40%"> <input type="hidden" name="AUTO_QUANTITY_ON" value="<?=Adv\YandexBannerTable::INACTIVE?>"> <input type="checkbox" name="AUTO_QUANTITY_ON" id="AUTO_QUANTITY_ON" value="<?=Adv\YandexBannerTable::ACTIVE?>"<?=$banner["AUTO_QUANTITY_ON"] == Adv\YandexBannerTable::ACTIVE || $banner["AUTO_QUANTITY_ON"] == Adv\YandexBannerTable::MARKED ? ' checked="checked"' : ''?>> <label for="AUTO_QUANTITY_ON"><?= Loc::getMessage("MAIN_YES");?></label> </td> </tr> <script> BX.addCustomEvent("OnSeoYandexDirectLinksChange", BX.defer(function(el){ var disabled = true; var c = BX.firstChild(el); if(c && c.tagName == 'DIV') { var c1 = BX.nextSibling(c); if(!c1 || c1.tagName != "DIV") { disabled = false; } } BX('AUTO_QUANTITY_OFF').disabled = disabled; BX('AUTO_QUANTITY_ON').disabled = disabled; if(disabled) { window.tabControl.DisableTab("edit_auto"); } else { window.tabControl.EnableTab("edit_auto"); } })); </script> <? } if($bShowStats) { $tabControl->BeginNextTab(); CJSCore::Init(array('amcharts_serial')); $dateStart = new Main\Type\Date(); $dateStart->add("-".Engine\YandexDirect::MAX_STAT_DAYS_DELTA." days"); $dateFinish = new Main\Type\Date(); $statsData = Adv\YandexStatTable::getBannerStat( $banner['ID'], $dateStart, $dateFinish ); $gaps = Adv\YandexStatTable::getMissedPeriods($statsData, $dateStart, $dateFinish); $graphData = array(); $currency = $clientCurrency; foreach($statsData as $date => $dayData) { if($dayData['CURRENCY'] != '') { $currency = $dayData['CURRENCY']; } unset($dayData['ID']); unset($dayData['CAMPAIGN_ID']); unset($dayData['BANNER_ID']); unset($dayData['DATE_DAY']); $dayData['date'] = $date; $graphData[] = $dayData; } $bLoadStats = count($gaps) > 0; $bShowStats = count($graphData) > 0 || $bLoadStats; $bannerProfit = 0; if(!$bLoadStats && $bSale) { $orderStats = Adv\OrderTable::getList(array( 'filter' => array( '=BANNER_ID' => $banner['ID'], '=PROCESSED' => Adv\OrderTable::PROCESSED, ">=TIMESTAMP_X" => $dateStart, "<TIMESTAMP_X" => $dateFinish, ), 'group' => array( 'BANNER_ID' ), 'select' => array('BANNER_SUM'), 'runtime' => array( new \Bitrix\Main\Entity\ExpressionField('BANNER_SUM', 'SUM(SUM)'), ), )); if($stat = $orderStats->fetch()) { $bannerProfit = $stat['BANNER_SUM']; } } ?> <tr> <td width="30%" class="adm-detail-required-field"><?=Loc::getMessage('SEO_YANDEX_STATS_PERIOD')?>:</td> <td width="70%"> <span style="white-space: nowrap; display:inline-block;"><select name="period_sel" onchange="setGraphInterval(this.value)"> <option value="interval"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_INTERVAL')?></option> <option value="week_ago"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_WEEK')?></option> <option value="month_ago"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_MONTH')?></option> </select> <span id="seo_graph_interval"><?=CalendarDate("date_from", $dateStart->toString(), 'form1', "4")?> …<?=CalendarDate("date_to", $dateFinish->toString(), 'form1', "4")?></span></span> <input type="button" value="<?=Loc::getMessage('SEO_YANDEX_STATS_PERIOD_APPLY')?>" onclick="loadGraphData()" id="stats_loading_button" name="template_preview"><span id="stats_wait" class="loading-message-text" style="display: none; margin-top: 5px;"><?=Loc::getMessage('SEO_YANDEX_STATS_WAIT')?></span> </td> </tr> <? if($bSale): ?> <tr> <td><?=Loc::getMessage('SEO_YANDEX_STATS_SUM_ORDER_REPIOD')?>:</td> <td><span id="banner_profit"><?=\CCurrencyLang::CurrencyFormat(doubleval($bannerProfit), \Bitrix\Currency\CurrencyManager::getBaseCurrency(), true)?></span></td> </tr> <? endif; ?> <tr> <td><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TYPE')?>:</td> <td><select onchange="setGraph(this.value)"> <option value="sum"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TYPE_SUM')?></option> <option value="shows"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TYPE_SHOWS')?></option> <option value="clicks"><?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TYPE_CLICKS')?></option> </select></td> </tr> <tr> <td colspan="2"> <? if($errorMessage) { echo $errorMessage->Show(); } if($bShowStats): ?> <div style="padding: 0 50px; text-align: center;"> <div id="statschart" style="width: 100%; height: 600px;"></div> </div> <script> var currentGraph = 'sum'; function setGraphInterval(val) { BX('seo_graph_interval').style.display = val == 'interval' ? 'inline' : 'none'; } function getGraph(id, valueField, title) { return { "bullet": "square", "bulletBorderAlpha": 1, "bulletBorderThickness": 1, "bulletSize": 10, "id": id, "lineThickness": 3, "title": title, "valueField": valueField } } function setGraph(graph) { currentGraph = graph; window.yandexChart.graphs = yandexGraphs[currentGraph]; window.yandexChart.valueAxes = [yandexAxis[currentGraph]]; window.yandexChart.validateData(); } function setData(data) { window.yandexChart.dataProvider = data; window.yandexChart.validateData(); if(data.length > 0) { yandexAxis['sum'].title = "<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_AXIS_SUM')?>, " + (data[0].CURRENCY || '<?=$clientCurrency?>'); if (currentGraph == 'sum') { BX.defer(setGraph)(currentGraph); } } } function loadGraphData(session) { var queryData; if(!!session) { queryData = { action: 'banner_stats', banner: '<?=$banner['ID']?>', loading_session: session, sessid: BX.bitrix_sessid() }; } else { BX('stats_loading_button').disabled = true; BX('stats_wait').style.display = 'inline-block'; BX('stats_wait').innerHTML = '<?=Loc::getMessage('SEO_YANDEX_STATS_WAIT')?>'; queryData = { action: 'banner_stats', banner: '<?=$banner['ID']?>', type: document.forms.form1.period_sel.value, date_from: document.forms.form1.date_from.value, date_to: document.forms.form1.date_to.value, sessid: BX.bitrix_sessid() }; } BX.ajax.loadJSON('/bitrix/tools/seo_yandex_direct.php', queryData, function(res) { if (!!res.session) { BX.defer(loadGraphData)(res.session); BX('stats_wait').innerHTML = '<?=Loc::getMessage('SEO_YANDEX_STATS_WAIT')?>: ' + Math.floor(100-(res.left/res.amount)*100) + '%'; } else if(!!res.data) { BX('stats_loading_button').disabled = false; BX('stats_wait').style.display = 'none'; setData(res.data); if(typeof res.order_sum != 'undefined' && BX('banner_profit')) { BX('banner_profit').innerHTML = res.order_sum_format; } if(!!res.error && res.error.code == '<?=Engine\YandexDirect::ERROR_NO_STATS?>') { res.error = null; } } if(!!res.error && (!!res.error.message || !!res.error.code)) { BX('stats_loading_button').disabled = false; BX('stats_wait').style.display = 'none'; alert(res.error.message||res.error.code); setData([]); } }); } var yandexGraphs = { sum: [ getGraph('yandex_sum', 'SUM', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SUM')?>'), getGraph('yandex_sum_search', 'SUM_SEARCH', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SUM_SEARCH')?>'), getGraph('yandex_sum_context', 'SUM_CONTEXT', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SUM_CONTEXT')?>'), ], shows: [ getGraph('yandex_show', 'SHOWS', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SHOWS')?>'), getGraph('yandex_shows_search', 'SHOWS_SEARCH', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SHOWS_SEARCH')?>'), getGraph('yandex_show_context', 'SHOWS_CONTEXT', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_SHOWS_CONTEXT')?>'), ], clicks: [ getGraph('yandex_clicks', 'CLICKS', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_CLICKS')?>'), getGraph('yandex_clicks_search', 'CLICKS_SEARCH', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_CLICKS_SEARCH')?>'), getGraph('yandex_clicks_context', 'CLICKS_CONTEXT', '<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_TITLE_CLICKS_CONTEXT')?>'), ] }; var yandexAxis = { sum: { id: "Sum", title: "<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_AXIS_SUM')?>, <?=$currency?>" }, shows: { id: "Shows", title: "<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_AXIS_SHOWS')?>" }, clicks: { id: "Clicks", title: "<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_AXIS_CLICKS')?>" } }; window.yandexChart = null; window.showStats = function(){ window.yandexChart = AmCharts.makeChart("statschart", { "type": "serial", "theme": "light", "pathToImages": "http://cdn.amcharts.com/lib/3/images/", "zoomOutText": "<?=Loc::getMessage('SEO_YANDEX_STATS_GRAPH_SHOW_ALL')?>", "categoryField": "date", "dataDateFormat": "<?=FORMAT_DATE?>", "autoMarginOffset": 40, "marginRight": 60, "marginTop": 60, "fontSize": 13, "numberFormatter": { "decimalSeparator": ".", "thousandsSeparator": " ", "precision": 2 }, "categoryAxis": { "parseDates": true, "labelFunction": function(val, date) { return BX.date.format( BX.date.convertBitrixFormat('<?=FORMAT_DATE?>'), date ); } }, "chartCursor": { categoryBalloonFunction: function(date) { return BX.date.format( BX.date.convertBitrixFormat('<?=FORMAT_DATE?>'), date ); } }, "trendLines": [], "legend": { //"switchable": false }, "graphs": yandexGraphs[currentGraph], "guides": [], "valueAxes": [ yandexAxis[currentGraph] ], "allLabels": [], "balloon": {}, "titles": [], "dataProvider": <?=Main\Web\Json::encode($graphData)?> }); <? if($bLoadStats): ?> loadGraphData(); <? endif; ?> window.showStats = BX.DoNothing; }; <? if($tabControl->selectedTab == "edit_stats"): ?> showStats(); <? endif; ?> </script> <? endif; ?> </td> </tr> <? } $tabControl->EndTab(); if(!$bReadOnly) { $tabControl->Buttons(array( "back_url" => $back_url ? $back_url : "seo_search_yandex_direct_banner.php?lang=".LANGUAGE_ID, )); } $tabControl->End(); if(!$bReadOnly): ?> <?=bitrix_sessid_post();?> <? if($back_url!=''): ?> <input type="hidden" name="back_url" value="<?echo HtmlFilter::encode($back_url)?>"> <? endif; ?> <input type="hidden" name="campaign" value="<?=$campaignId?>"> <input type="hidden" name="element" value="<?=$elementId?>"> <input type="hidden" name="ID" value="<?=$ID?>"> <? endif; ?> </form> <? if($ID > 0): ?> <script> BX.ready(function(){ BX.onCustomEvent("OnSeoYandexDirectLinksChange", [BX('adv_link_list')]); }); </script> <? endif; require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin.php");