• Модуль: 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;
}