403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/sale.facebook.conversion/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/sale.facebook.conversion/class.php
<?php

use Bitrix\Main\DI\ServiceLocator;
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\Errorable;
use Bitrix\Main\ErrorableImplementation;
use Bitrix\Main\ErrorCollection;
use Bitrix\Sale\Internals\FacebookConversion;
use Bitrix\Sale\Internals\FacebookConversionParamsTable;
use Bitrix\Main\Loader;
use Bitrix\Sale\ShopSitesController;
use Bitrix\Seo\BusinessSuite\Service;
use Bitrix\Seo\Conversion\Facebook;
use Bitrix\Sale\Internals\Analytics;

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
{
	die();
}

class SaleFacebookConversion extends CBitrixComponent implements Controllerable, Errorable
{
	use ErrorableImplementation;

	private $eventName;

	public function __construct($component = null)
	{
		parent::__construct($component);
		$this->errorCollection = new ErrorCollection();
	}

	public function executeComponent()
	{
		$this->setEventName($this->arParams['eventName']);
		if ($this->checkComponent())
		{
			global $APPLICATION;
			$APPLICATION->SetTitle(GetMessage('FACEBOOK_CONVERSION_TITLE'));
			$this->fillResult();
			$this->includeComponentTemplate();
		}

		$this->showErrors();
	}

	private function checkComponent(): bool
	{
		return $this->checkEventName() && $this->checkModules() && $this->checkPermissions();
	}

	private function showErrors(): void
	{
		foreach ($this->getErrors() as $error)
		{
			ShowError($error);
		}
	}

	private function checkEventName(): bool
	{
		if (!in_array($this->getEventName(), $this->getAllowedEventNames(), true))
		{
			$this->errorCollection[] = new \Bitrix\Main\Error(GetMessage('FACEBOOK_CONVERSION_ERROR_EVENT_NAME'));

			return false;
		}

		return true;
	}

	private function getAllowedEventNames(): array
	{
		return [
			Facebook\Event::EVENT_ADD_TO_CART,
			Facebook\Event::EVENT_INITIATE_CHECKOUT,
			Facebook\Event::EVENT_ADD_PAYMENT,
			Facebook\Event::EVENT_DONATE,
			Facebook\Event::EVENT_CONTACT,
		];
	}

	private function checkModules(): bool
	{
		if (!Loader::includeModule('sale'))
		{
			$this->errorCollection[] = new \Bitrix\Main\Error(GetMessage('FACEBOOK_CONVERSION_ERROR_MODULE_SALE'));

			return false;
		}

		if (!Loader::includeModule('seo'))
		{
			$this->errorCollection[] = new \Bitrix\Main\Error(GetMessage('FACEBOOK_CONVERSION_ERROR_MODULE_SEO'));

			return false;
		}

		return true;
	}

	private function checkPermissions(): bool
	{
		if (!CurrentUser::get()->isAdmin())
		{
			$this->errorCollection[] = new \Bitrix\Main\Error(GetMessage('FACEBOOK_CONVERSION_ERROR_ACCESS_DENIED'));

			return false;
		}

		return true;
	}

	private function fillResult(): void
	{
		$this->arResult['eventName'] = $this->getEventName();
		$this->arResult['facebookBusinessParams'] = $this->getFacebookBusinessParams();
		$this->arResult['shops'] = $this->getShopsConversionData();
		$this->arResult['conversionDataLabelsText'] = $this->getConversionDataLabelsText();
		$this->arResult['title'] = $this->getTitle();
	}

	private function setEventName(string $eventName): void
	{
		$this->eventName = $eventName;
	}

	private function getEventName(): ?string
	{
		return $this->eventName;
	}

	private function getFacebookBusinessParams(): array
	{
		/** @var Service $service */
		if ($service = ServiceLocator::getInstance()->get('seo.business.service'))
		{
			$installed = $service::getAuthAdapter($service::FACEBOOK_TYPE)->hasAuth();
			$profile = $installed ? $service->getAccount($service::FACEBOOK_TYPE)->getProfile() : null;
			$profileParams = null;
			if ($profile)
			{
				$profileParams = [
					'name' => $profile->getName(),
					'id' => $profile->getId(),
					'link' => $profile->getLink(),
					'picture' => $profile->getPicture(),
					'type' => $profile->getType(),
				];
			}

			return [
				'available' => true,
				'auth' => $installed,
				'profile' => $profileParams
			];
		}

		return [
			'available' => false,
			'auth' => false,
			'profile' => null
		];
	}

	private function getShopsConversionData(): array
	{
		$conversionShops = [];

		$shops = ShopSitesController::getShops();
		$facebookConversionParamsData = $this->getFacebookConversionParamsDataForCurrentEvent();
		foreach ($shops as $shop)
		{
			$currentParamsData = $facebookConversionParamsData[$shop['LID']] ?? null;

			if ($currentParamsData)
			{
				$params = unserialize($currentParamsData['PARAMS'], ['allowed_classes' => false]);
			}
			else
			{
				$params = $this->getDefaultConversionParams();
			}

			$conversionShops[$shop['LID']] = [
				'name' => $shop['NAME'],
				'enabled' => $currentParamsData['ENABLED'] ?? 'N',
				'params' => $params,
			];
		}

		return $conversionShops;
	}

	private function getFacebookConversionParamsDataForCurrentEvent(): array
	{
		$facebookConversionParamsData = [];

		$iterator = FacebookConversionParamsTable::getList([
			'select' => ['LID', 'ENABLED', 'PARAMS'],
			'filter' => [
				'=EVENT_NAME' => $this->getEventName(),
			],
		]);

		while ($currentParams = $iterator->fetch())
		{
			$facebookConversionParamsData[$currentParams['LID']] = [
				'ENABLED' => $currentParams['ENABLED'],
				'PARAMS' => $currentParams['PARAMS'],
			];
		}

		return $facebookConversionParamsData;
	}

	private function getTitle(): string
	{
		$eventName = $this->getEventName();
		switch ($eventName)
		{
			case Facebook\Event::EVENT_ADD_TO_CART:
				return GetMessage('FACEBOOK_CONVERSION_EVENT_TITLE_ADD_TO_CART');
			case Facebook\Event::EVENT_INITIATE_CHECKOUT:
				return GetMessage('FACEBOOK_CONVERSION_EVENT_TITLE_INITIATE_CHECKOUT');
			case Facebook\Event::EVENT_ADD_PAYMENT:
				return GetMessage('FACEBOOK_CONVERSION_EVENT_TITLE_ADD_PAYMENT_INFO');
			case Facebook\Event::EVENT_DONATE:
				return GetMessage('FACEBOOK_CONVERSION_EVENT_TITLE_CUSTOMIZE_PRODUCT');
			case Facebook\Event::EVENT_CONTACT:
				return GetMessage('FACEBOOK_CONVERSION_EVENT_TITLE_CONTACT');
			default:
				return '';
		}
	}

	private function getDefaultConversionParams(): array
	{
		$eventName = $this->getEventName();
		switch ($eventName)
		{
			case Facebook\Event::EVENT_ADD_TO_CART:
				return [
					'id' => 'Y',
					'name' => 'N',
					'group' => 'N',
					'price' => 'N',
					'quantity' => 'N',
				];
			case Facebook\Event::EVENT_INITIATE_CHECKOUT:
				return [
					'ids' => 'Y',
					'productsGroupAndQuantity' => 'N',
					'price' => 'N',
					'quantity' => 'N',
				];
			case Facebook\Event::EVENT_ADD_PAYMENT:
				return [
					'ids' => 'Y',
					'productsGroupAndQuantity' => 'N',
					'price' => 'N',
				];
			case Facebook\Event::EVENT_DONATE:
				return [
					'id' => 'Y',
					'nameAndProperties' => 'N',
				];
			case Facebook\Event::EVENT_CONTACT:
				return [
					'socialNetwork' => 'N',
					'email' => 'N',
				];
			default:
				return [];
		}
	}

	private function getConversionDataLabelsText(): array
	{
		$eventName = $this->getEventName();
		switch ($eventName)
		{
			case Facebook\Event::EVENT_ADD_TO_CART:
				return [
					FacebookConversion::ID => GetMessage('FACEBOOK_CONVERSION_LABEL_SEND_ID'),
					FacebookConversion::NAME => GetMessage('FACEBOOK_CONVERSION_LABEL_ADD_TO_CART_SEND_NAME'),
					FacebookConversion::GROUP => GetMessage('FACEBOOK_CONVERSION_LABEL_ADD_TO_CART_SEND_GROUP'),
					FacebookConversion::PRICE => GetMessage('FACEBOOK_CONVERSION_LABEL_ADD_TO_CART_SEND_PRICE'),
					FacebookConversion::QUANTITY => GetMessage('FACEBOOK_CONVERSION_LABEL_ADD_TO_CART_SEND_QUANTITY'),
				];
			case Facebook\Event::EVENT_INITIATE_CHECKOUT:
				return [
					FacebookConversion::IDS => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_ID'),
					FacebookConversion::PRODUCTS_GROUP_AND_QUANTITY => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_PRODUCTS_GROUP_AND_QUANTITY'),
					FacebookConversion::PRICE => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_ORDER_PRICE'),
					FacebookConversion::QUANTITY => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_ORDER_PRODUCTS_TOTAL_QUANTITY'),
				];
			case Facebook\Event::EVENT_ADD_PAYMENT:
				return [
					FacebookConversion::IDS => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_ID'),
					FacebookConversion::PRODUCTS_GROUP_AND_QUANTITY => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_PRODUCTS_GROUP_AND_QUANTITY'),
					FacebookConversion::PRICE => GetMessage('FACEBOOK_CONVERSION_LABEL_INITIATE_CHECKOUT_SEND_ORDER_PRICE'),
				];
			case Facebook\Event::EVENT_DONATE:
				return [
					FacebookConversion::ID => GetMessage('FACEBOOK_CONVERSION_LABEL_SEND_ID'),
					FacebookConversion::NAME_AND_PROPERTIES => GetMessage('FACEBOOK_CONVERSION_LABEL_CUSTOMIZE_PRODUCT_SEND_NAME_AND_PROPERTIES'),
				];
			case Facebook\Event::EVENT_CONTACT:
				return [
					FacebookConversion::SOCIAL_NETWORK => GetMessage('FACEBOOK_CONVERSION_LABEL_CONTACT_SEND_SOCIAL_NETWORK'),
					FacebookConversion::EMAIL => GetMessage('FACEBOOK_CONVERSION_LABEL_CONTACT_SEND_EMAIL'),
				];
			default:
				return [];
		}
	}

	public function changeParamStateAction(string $eventName, string $shopId, string $paramName, string $state): void
	{
		$this->setEventName($eventName);
		if ($paramName === 'id' || $paramName === 'ids' || !$this->checkComponent())
		{
			return;
		}

		$facebookConversionParams = FacebookConversionParamsTable::getList([
			'select' => ['ID', 'PARAMS'],
			'filter' => [
				'=EVENT_NAME' => $eventName,
				'=LID' => $shopId,
			],
		])->fetch();

		if ($facebookConversionParams)
		{
			$params = unserialize($facebookConversionParams['PARAMS'], ['allowed_classes' => false]);
			$params[$paramName] = $state;
			$serializedParams = serialize($params);
			FacebookConversionParamsTable::update(
				$facebookConversionParams['ID'],
				[
					'PARAMS' => $serializedParams,
				]
			);
		}
	}

	public function changeShopEnabledStateAction(string $eventName, string $shopId, string $enabled): void
	{
		$this->setEventName($eventName);
		if (!$this->checkComponent())
		{
			return;
		}

		$facebookConversionParams = FacebookConversionParamsTable::getList([
			'select' => ['ID'],
			'filter' => [
				'=EVENT_NAME' => $eventName,
				'=LID' => $shopId,
			],
		])->fetch();

		if ($facebookConversionParams)
		{
			FacebookConversionParamsTable::update(
				$facebookConversionParams['ID'],
				[
					'ENABLED' => $enabled,
				]
			);
		}
		else
		{
			FacebookConversionParamsTable::add([
				'EVENT_NAME' => $this->getEventName(),
				'LID' => $shopId,
				'ENABLED' => $enabled,
				'PARAMS' => serialize($this->getDefaultConversionParams()),
			]);
		}

		$name =
			$enabled
				? Analytics\Events\Event::FACEBOOK_CONVERSION_SHOP_EVENT_ENABLED
				: Analytics\Events\Event::FACEBOOK_CONVERSION_SHOP_EVENT_DISABLED
		;
		$analyticsEvent = new Analytics\Events\Event(
			$name,
			[
				'EVENT_NAME' => $this->getEventName(),
			]
		);
		$provider = new Analytics\Events\Provider($analyticsEvent);
		(new Analytics\Storage($provider))->save();

		if ($this->isFacebookConversionEventEnabled($eventName))
		{
			$this->registerEventHandler($eventName);
		}
		else
		{
			$this->unregisterEventHandler($eventName);
		}
	}

	private function isFacebookConversionEventEnabled(string $eventName): bool
	{
		$count = FacebookConversionParamsTable::getCount([
			'=EVENT_NAME' => $eventName,
			'=ENABLED' => 'Y'
		]);

		return $count > 0;
	}

	private function registerEventHandler(string $eventName): void
	{
		switch ($eventName)
		{
			case Facebook\Event::EVENT_ADD_TO_CART:
				$this->registerAddToCartEventHandler();
				break;
			case Facebook\Event::EVENT_INITIATE_CHECKOUT:
				$this->registerInitiateCheckoutEventHandler();
				break;
			case Facebook\Event::EVENT_ADD_PAYMENT:
				$this->registerAddPaymentInfoEventHandler();
				break;
			case Facebook\Event::EVENT_CONTACT:
				$this->registerContactEventHandler();
				break;
		}
	}

	private function unregisterEventHandler(string $eventName): void
	{
		switch ($eventName)
		{
			case Facebook\Event::EVENT_ADD_TO_CART:
				$this->unregisterAddToCartEventHandler();
				break;
			case Facebook\Event::EVENT_INITIATE_CHECKOUT:
				$this->unregisterInitiateCheckoutEventHandler();
				break;
			case Facebook\Event::EVENT_ADD_PAYMENT:
				$this->unregisterAddPaymentInfoEventHandler();
				break;
			case Facebook\Event::EVENT_CONTACT:
				$this->unregisterContactEventHandler();
				break;
		}
	}

	private function registerAddToCartEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandler(
			'sale',
			'OnBasketAdd',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onAddToCartHandler'
		);
	}

	private function unregisterAddToCartEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unregisterEventHandler(
			'sale',
			'OnBasketAdd',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onAddToCartHandler'
		);
	}

	private function registerInitiateCheckoutEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandler(
			'sale',
			'OnSaleComponentOrderCreated',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onOrderCreatedHandler'
		);
	}

	private function unregisterInitiateCheckoutEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unregisterEventHandler(
			'sale',
			'OnSaleComponentOrderCreated',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onOrderCreatedHandler'
		);
	}

	private function registerAddPaymentInfoEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandler(
			'sale',
			'OnSaleOrderSaved',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onOrderSavedHandler'
		);
	}

	private function unregisterAddPaymentInfoEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unregisterEventHandler(
			'sale',
			'OnSaleOrderSaved',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onOrderSavedHandler'
		);
	}

	private function registerContactEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandler(
			'main',
			'onFeedbackFormSubmit',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onFeedbackFormContactHandler'
		);
	}

	private function unregisterContactEventHandler(): void
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unregisterEventHandler(
			'main',
			'onFeedbackFormSubmit',
			'sale',
			'\Bitrix\Sale\Internals\FacebookConversion',
			'onFeedbackFormContactHandler'
		);
	}

	public function logoutAction(): void
	{
		if (!$this->checkModules() || !$this->checkPermissions())
		{
			return;
		}

		($service = ServiceLocator::getInstance()->get('seo.business.service'))
			::getAuthAdapter($service::FACEBOOK_TYPE)->removeAuth();
	}

	public function configureActions(): array
	{
		return [];
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit