Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/sender/lib/integration/seo/ads/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/sender/lib/integration/seo/ads/messagebase.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage sender
 * @copyright 2001-2012 Bitrix
 */

namespace Bitrix\Sender\Integration\Seo\Ads;

use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Result;
use Bitrix\Sender\Entity;
use Bitrix\Sender\Message;
use Bitrix\Sender\Message\iLookalikeAds;
use Bitrix\Seo\Retargeting;

Loc::loadMessages(__FILE__);

/**
 * Class MessageBase
 * @package Bitrix\Sender\Integration\Seo\Ads
 */
abstract class MessageBase implements Message\iBase, Message\iAds
{
	const CODE = self::CODE_UNDEFINED;
	const CODE_ADS_VK = 'ads_vk';
	const CODE_ADS_FB = 'ads_fb';
	const CODE_ADS_YA = 'ads_ya';
	const CODE_ADS_GA = 'ads_ga';
	const CODE_ADS_LOOKALIKE_FB = 'ads_lookalike_fb';
	const CODE_ADS_LOOKALIKE_VK = 'ads_lookalike_vk';
	const CODE_ADS_LOOKALIKE_YANDEX = 'ads_lookalike_yandex';

	/** @var Message\Configuration $config\ \ uration Configuration. */
	protected $configuration;

	/**
	 * MessageBase constructor.
	 */
	public function __construct()
	{
		$this->configuration = new Message\Configuration();
	}

	/**
	 * Get name.
	 * @return string
	 */
	public function getName()
	{
		return Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_NAME_'.mb_strtoupper($this->getCode()));
	}

	public function getCode()
	{
		return static::CODE;
	}

	public function getSupportedTransports()
	{
		return array(static::CODE);
	}

	protected function getAdsType()
	{
		$map = Service::getTypeMap();
		return $map[$this->getCode()];
	}

	protected function setConfigurationOptions()
	{
		$this->configuration->setArrayOptions(array(
			array(
				'type' => 'string',
				'code' => 'CLIENT_ID',
				'name' => Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_CLIENT_ID'),
				'required' => true,
			),
			array(
				'type' => 'string',
				'code' => 'ACCOUNT_ID',
				'name' => Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_ACCOUNT_ID'),
				'required' => false,
			),
			array(
				'type' => 'string',
				'code' => 'AUDIENCE_ID',
				'name' => (($this->getCode() === self::CODE_ADS_VK)
					? Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_USER_LIST_ID')
					: Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_AUDIENCE_ID')),
				'required' => false,
			),
			array(
				'type' => 'string',
				'code' => 'AUDIENCE_EMAIL_ID',
				'name' => Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_AUDIENCE_EMAIL_ID'),
				'required' => false,
			),
			array(
				'type' => 'string',
				'code' => 'AUDIENCE_PHONE_ID',
				'name' => Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_AUDIENCE_PHONE_ID'),
				'required' => false,
			),
			array(
				'type' => 'integer',
				'code' => 'AUTO_REMOVE_DAY_NUMBER',
				'name' => Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_CONFIG_AUTO_REMOVE_DAY_NUMBER'),
				'required' => false,
			),
		));
	}

	/**
	 * Load configuration.
	 *
	 * @param integer|null $id ID.
	 *
	 * @return Message\Configuration
	 */
	public function loadConfiguration($id = null)
	{
		if (!$this->configuration->hasOptions())
		{
			$this->setConfigurationOptions();
		}

		Entity\Message::create()
			->setCode($this->getCode())
			->loadConfiguration($id, $this->configuration);


		$self = $this;
		$configuration = $this->configuration;
		$this->configuration->setView(
			function () use ($self, $configuration)
			{
				if ($configuration->get('AUDIENCE_EMAIL_ID') || $configuration->get('AUDIENCE_PHONE_ID'))
				{
					$audienceId = array(
						Retargeting\Audience::ENUM_CONTACT_TYPE_EMAIL => $configuration->get('AUDIENCE_EMAIL_ID'),
						Retargeting\Audience::ENUM_CONTACT_TYPE_PHONE => $configuration->get('AUDIENCE_PHONE_ID'),
					);
				}
				else
				{
					$audienceId = $configuration->get('AUDIENCE_ID');
				}


				$containerNodeId = 'seo-ads-' . $configuration->getId();
				ob_start();
				$provider = Service::getAdsProvider($self->getAdsType(), $configuration->getOption('CLIENT_ID')->getValue());

				$audienceSize =  $self->getConfigurationOptionValue($configuration, 'AUDIENCE_SIZE');
				$audienceRegion =  $self->getConfigurationOptionValue($configuration, 'AUDIENCE_REGION');
				$autoRemoveDays = $self->getConfigurationOptionValue($configuration, 'AUTO_REMOVE_DAY_NUMBER');
				$audienceLookalike = $self->getConfigurationOptionValue($configuration, 'AUDIENCE_LOOKALIKE');
				$geoDistribution = $self->getConfigurationOptionValue($configuration, 'GEO_DISTRIBUTION');
				$deviceDistribution = $self->getConfigurationOptionValue($configuration, 'DEVICE_DISTRIBUTION');

				$audienceLookalikeMode = $provider['IS_SUPPORT_LOOKALIKE_AUDIENCE'] && ($this instanceof iLookalikeAds);

				$GLOBALS['APPLICATION']->IncludeComponent(
					'bitrix:seo.ads.retargeting',
					'',
					array(
						'INPUT_NAME_PREFIX' => 'CONFIGURATION_',
						'CONTAINER_NODE_ID' => $containerNodeId,
						'PROVIDER' => $provider,
						'ACCOUNT_ID' => $configuration->getOption('ACCOUNT_ID')->getValue(),
						'CLIENT_ID' => $configuration->getOption('CLIENT_ID')->getValue(),
						'AUDIENCE_ID' => $audienceId,
						'AUDIENCE_SIZE' => $audienceSize,
						'AUDIENCE_REGION' => $audienceRegion,
						'AUDIENCE_LOOKALIKE_MODE' => $audienceLookalikeMode,
						'AUTO_REMOVE_DAY_NUMBER' => $autoRemoveDays,
						'AUDIENCE_LOOKALIKE' => $audienceLookalike,
						'GEO_DISTRIBUTION' => $geoDistribution,
						'DEVICE_DISTRIBUTION' => $deviceDistribution,
						'JS_DESTROY_EVENT_NAME' => '',
						'TITLE_NODE_SELECTOR' => '[data-role="letter-title"]',
						'HAS_ACCESS' => true, // TODO: check SENDER-module permissions
						'MESSAGE_CODE' => $self::CODE,
					)
				);

				$result = ob_get_clean();
				$result .= "<div id=\"$containerNodeId\"></div>";
				return $result;
			}
		);

		return $this->configuration;
	}

	private function getConfigurationOptionValue(Message\Configuration $configuration, string $optionName)
	{
		return $configuration->getOption($optionName)
			? $configuration->getOption($optionName)->getValue()
			: null
		;
	}

	/**
	 * Save configuration.
	 *
	 * @param Message\Configuration $configuration Configuration.
	 * @return Result
	 */
	public function saveConfiguration(Message\Configuration $configuration)
	{
		$config = $configuration;
		$clientId = $config->getOption('CLIENT_ID')->getValue();
		if (!$clientId)
		{
			$result = new Result();
			$result->addError(new Error(Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_ERROR_NO_CLIENT')));

			return $result;
		}
		$provider = Service::getAdsProvider($this->getAdsType(), $clientId);

		if (
			!$provider['IS_SUPPORT_LOOKALIKE_AUDIENCE'] &&
			!$config->getOption('AUDIENCE_ID')->getValue() &&
			!$config->getOption('AUDIENCE_EMAIL_ID')->getValue() &&
			!$config->getOption('AUDIENCE_PHONE_ID')->getValue()
		)
		{
			$result = new Result();
			$result->addError(new Error(Loc::getMessage('SENDER_INTEGRATION_SEO_MESSAGE_ERROR_NO_AUDIENCE')));

			return $result;
		}

		return Entity\Message::create()
			->setCode($this->getCode())
			->saveConfiguration($this->configuration);
	}

	/**
	 * Remove configuration.
	 *
	 * @param integer $id ID.
	 * @return bool
	 */
	public function removeConfiguration($id)
	{
		$result = Entity\Message::removeById($id);
		return $result->isSuccess();
	}

	/**
	 * Copy configuration.
	 *
	 * @param integer|string|null $id ID.
	 * @return Result|null
	 */
	public function copyConfiguration($id)
	{
		return Entity\Message::create()
			->setCode($this->getCode())
			->copyConfiguration($id);
	}
}