- Модуль: seo
- Путь к файлу: ~/bitrix/modules/seo/lib/engine/yandexdirect.php
- Класс: BitrixSeoEngineYandexDirect
- Вызов: YandexDirect::updateCampaignManual
public function updateCampaignManual($campaignId = NULL)
{
$newCampaigns = array();
$res = array(
'added' => 0,
'updated' => 0,
'error' => 0,
);
$keys = array();
if (!is_array($campaignId) && $campaignId > 0)
{
$campaignId = array($campaignId);
}
$campaignList = array();
if (is_array($campaignId) && count($campaignId) > 0)
{
// get just current campaigns by ID
$dbRes = YandexCampaignTable::getList(array(
'filter' => array(
'=ID' => $campaignId,
'=ENGINE_ID' => $this->getId(),
),
'select' => array('XML_ID'),
));
while ($campaign = $dbRes->fetch())
{
$keys[] = $campaign['XML_ID'];
}
if (count($keys) > 0)
$campaignList = $this->getCampaign($keys);
}
else
{
// get ALL campaigns, if IDs not set
$campaignList = $this->getCampaignList();
}
$campaignListSorted = array();
$campaignListToDelete = array();
foreach ($campaignList as $campaignInfo)
{
$campaignListSorted[$campaignInfo['CampaignID']] = $campaignInfo;
}
$filter = array('=ENGINE_ID' => $this->getId());
// get filtered items only if we update only selected campaigns. Else - get ALL from table
if(is_array($campaignId) && count($campaignId) > 0 && count($campaignListSorted) > 0)
$filter['=XML_ID'] = array_keys($campaignListSorted);
$dbCampaigns = YandexCampaignTable::getList(array('filter' => $filter));
YandexCampaignTable::setSkipRemoteUpdate(true);
// UPDATE existing in table campaigns
while ($campaign = $dbCampaigns->fetch())
{
if (isset($campaignListSorted[$campaign['XML_ID']]))
{
$result = YandexCampaignTable::update(
$campaign['ID'], array(
"SETTINGS" => $campaignListSorted[$campaign['XML_ID']],
)
);
unset($campaignListSorted[$campaign['XML_ID']]);
if ($result->isSuccess())
{
$res['updated']++;
}
else
{
$res['error']++;
}
}
// collect campaigns, then not exist in YD, but exist in table
else
{
$campaignListToDelete[$campaign['ID']] = $campaign['ID'];
}
}
// REMOVE from table deleted campaigns
if (count($campaignListToDelete) > 0)
{
foreach ($campaignListToDelete as $campaignId)
{
$resultDelete = YandexCampaignTable::delete($campaignId);
// todo: skipRempoteUpdate in campaign table or in banner table? o_O
YandexCampaignTable::setSkipRemoteUpdate(true);
}
}
// ADD in table new campaignt from YD
foreach ($campaignListSorted as $campaignId => $campaignInfo)
{
$result = YandexCampaignTable::add(array(
"SETTINGS" => $campaignInfo,
));
if ($result->isSuccess())
{
$newCampaigns[] = $result->getId();
$res['added']++;
}
else
{
$res['error']++;
}
}
YandexCampaignTable::setSkipRemoteUpdate(false);
if (count($newCampaigns) > 0)
{
set_time_limit(300);
$res['new'] = $newCampaigns;
$res['banner'] = array();
$cnt = ceil(count($newCampaigns) / static::MAX_CAMPAIGNS_BANNER_UPDATE);
for ($i = 0; $i < $cnt; $i++)
{
$res['banner'] = array_merge(
$res['banner'],
$this->updateBannersManual(
array_slice(
$newCampaigns,
$i * static::MAX_CAMPAIGNS_BANNER_UPDATE,
static::MAX_CAMPAIGNS_BANNER_UPDATE
)
)
);
}
}
return $res;
}