Выбрать курс
7  /  8

Скидка на товары после опроса на ЦМС 1С-Битрикс

В данной статье рассмотрены варианты применения скидок после успешного прохождения опроса с помощью модуля 1С-Битрикс Опросы, а также опроса сервиса marquiz.ру:

Внимание! В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения отраженного подхода потребуется помощь программистов.

Мы также можем в этом помощь, но за отдельное вознаграждение. Обратиться за помощью можно в наш чат в правом нижнем углу нашего сайта (в рабочее время отвечаем достаточно оперативно). Но оставляем за собой право отказать в доработке без объяснения причин.

Для реализации скидки с помощью правил потребуется наш модуль - Произвольное PHP условие правил работы с корзиной. Свои (кастомные) условия в скидках.

I. Для модуля 1С-Битрикс. Опросы.

  1. В init.php регистрируем обработчик событий onAfterVoting.:
    AddEventHandler("vote", "onAfterVoting", Array("CDev", "onAfterVotingHandler"));
    
  2. В функции-обработчике событий успешной фиксации голоса прописываем логику. Например, мы записываем в куки, что опрос пройден.:
    class CDev
    {
    	public static function onAfterVotingHandler($voteId, $eventId, $userId)
    	{
    		if ($voteId > 0)
    		{
    			$application = Bitrix\Main\Application::getInstance();
    			$context = $application->getContext();
    			
    			$cookie = new Cookie("SCODER_VOTE_SUCCESS", "Y", time() + 60*60*24);
    			$cookie->setDomain($context->getServer()->getHttpHost());
    			$cookie->setHttpOnly(false);
    			Bitrix\Main\Application::getInstance()->getContext()->getResponse()->addCookie($cookie);
    			$context->getResponse()->flush("");
    		}
    	}
    }
    
  3. В нужном правиле работе с корзиной в PHP условии указать условие проверки куки:
    (Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getCookie("SCODER_VOTE_SUCCESS") == "Y")

II. Для квиза marquiz.ру (через Webhooks).

  1. Передаем дополнительный кастомный параметр в квиз. В нашем случае это FUSER_ID. В обработчике событий OnPageStart размещаем следующий код:
    Bitrix\Main\Page\Asset::getInstance()->addString(
    	'< script type="text/javascript">
    		document.addEventListener("marquizLoaded", function() {
    			Marquiz.addParam("FUSER_ID", "'. \Bitrix\Sale\Fuser::getId(). '");
    		});
    	< /script>',
    	true,
    	\Bitrix\Main\Page\AssetLocation::AFTER_JS_KERNEL
    );
    
  2. Если опрос пройден, и в личном кабинете сервиса у вас настроен вебхук обратно на ваш веб-сайт, то сервис отправляет запрос с данными, подробнее в документации - Как интегрировать квиз через Webhooks.

    Предлагаем обрабатывать эти данные с помощью обработчика событий OnBeforeProlog. Код функции будет выглядеть следующим образом:

    $data = json_decode(file_get_contents('php://input'), true);
    if (is_array($data)
    	&& !empty($data['extra']['FUSER_ID'])
    		&& $data['extra']['FUSER_ID'] > 0
    )
    {
    	$fuser_id = $data['extra']['FUSER_ID'];
    
    	$load = array(
    		"FUSER_ID" => $fuser_id,
    		"DATE_INSERT" => new \Bitrix\Main\Type\DateTime(),
    		"QUIZE_NAME" => $data['quiz']['name'],
    		"QUIZE_ID" => $data['quiz']['id'],
    	);
    	
    	$filter = array(
    		"FUSER_ID" => $fuser_id,
    	);
    	$dbResultList = Scoder\Tools\FusersTable::getList(array(
    		'filter' => $filter,
    		'select' => array("ID","FUSER_ID"),
    	));
    	if ($fields = $dbResultList->Fetch())
    	{
    		$result = Scoder\Tools\FusersTable::update($fields["ID"], $load);
    		// if ($result->isSuccess()){}
    	}
    	else
    	{
    		$result = Scoder\Tools\FusersTable::add($load);
    		//if ($result->isSuccess()){}
    	}
    }
    

    Scoder\Tools\FusersTable - это класс работы с таблицей в базе данных, описанном в произвольном кастомном модуле. Таблица создается следующим образом:

    create table if not exists scoder_tools_marquiz_fusers
    (
    	ID int NOT NULL auto_increment,
    	FUSER_ID int not null,
    	DATE_INSERT datetime not null,
    	QUIZE_NAME varchar(255) not null,
    	QUIZE_ID varchar(255) not null,
    	PRIMARY KEY(ID)
    );
    

    По реализации в виде модуля можете обратиться к нам. Или же, в качестве альтернативы, можете использовать инфоблоки или highload-блоки ЦМС 1С-Битрикс.

  3. В нужном правиле работе с корзиной в PHP условии указать условие функцию CModule::IncludeModule('scoder.tools') && CScoderTools::__sc_vote_success().
    Class CScoderTools
    {	
        public static function __sc_vote_success()
        {
    		$btrue = false;
    		
    		$filter = array(
    			"FUSER_ID" => \Bitrix\Sale\Fuser::getId(),
    		);
    		$dbResultList = Scoder\Tools\FusersTable::getList(array(
    			'filter' => $filter,
    			'select' => array("ID","FUSER_ID"),
    		));
    		if ($fields = $dbResultList->Fetch())
    		{	
    			$btrue = true;
    		}
    		return $btrue;
    	}
    }
    

Разумеется, логику можно развивать. Например, предоставлять разные скидки или подарки в зависимости от квиза или вариантов ответов на вопросы...