В данной статье рассмотрены варианты применения скидок после успешного прохождения опроса с помощью модуля 1С-Битрикс Опросы, а также опроса сервиса marquiz.ру:
Внимание! В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения рекомендуется обратиться к разработчикам.
Мы также можем в этом помощь, но за отдельное вознаграждение. Обратиться за помощью можно в наш чат в правом нижнем углу нашего сайта (в рабочее время отвечаем достаточно оперативно). Но оставляем за собой право отказать в доработке без объяснения причин.
Для реализации скидки с помощью правил потребуется наш модуль - Произвольное PHP условие правил работы с корзиной. Свои (кастомные) условия в скидках.
I. Для модуля 1С-Битрикс. Опросы.
AddEventHandler("vote", "onAfterVoting", Array("CDev", "onAfterVotingHandler"));
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("");
}
}
}
(Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getCookie("SCODER_VOTE_SUCCESS") == "Y")
II. Для квиза marquiz.ру (через Webhooks).
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
);
Предлагаем обрабатывать эти данные с помощью обработчика событий 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С-Битрикс.
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;
}
}
Разумеется, логику можно развивать. Например, предоставлять разные скидки или подарки в зависимости от квиза или вариантов ответов на вопросы...