SAPID INFO

Интеграция форм getcourse на сайт

Есть страница с большим количеством кнопок, с которых появляется popup. Создание по 1 форме на каждую кнопку не целесообразно уже потому, что разработчики getcourse влепили много лишнего и грузится даже 1 форма крайне медленно. Итого задача – создать 1 форму и менять в ней информацию о том, по какой кнопке произошел клик. Перепробовано много вариантов, поскольку стандартный вариант “виджета через который встраивается форма” открывается в iframe – передать в него данные сложно. У меня не получилось.

Начал работать вариант, когда я воспользовался file_get_contents и “на ходу” немного изменил код. Конечно, можно было еще обрезать лишнее, но я не стал тратить на это время. Код получился вот такой:

$url = "http://XXX.getcourse.ru/pl/lite/widget/widget?&id=WIDGETID";
$content = file_get_contents($url);
$from = array( 'src="/pl', 'src="/public', 'href="/pl', 'action="/pl' );
$to   = array( 'src="https://XXX.getcourse.ru/pl', 'src="https://XXX.getcourse.ru/public', 'href="http://XXX.getcourse.ru/pl', 'action="http://XXX.getcourse.ru/pl' );
echo $clear_src = str_replace($from, $to, $content);

Фактически – просто сделал, чтобы все ссылки работали и поставил правильную action. Примечательно, что если обращение идет с адреса вида “http://site.ru/page.php” – то появляются какие-то ошибки, но стоит сделать адрес вида “http://site.ru/page/” – и всё работает.

Итак, выше работающий код. Но я его не использую. Почему?

Сначала у меня сложилось впечатление, что подключаемые многочисленные скрипты собирают важную статистическую информацию. Потом я понял что (1) практически не собирают и (2) с использованием file_get_contents и вовсе бессмысленны. Потому вместо того чтобы пихать на страницу тяжелый виджет, я вставил свою легкую форму.

Есть еще один момент важный – в процессе отправки на обработку данных указанным выше способом вы попадете на страницу прописанную в action, на которой будет строка типа такой:

{"success":true, "data":{"parts":[], "preParts":[], "redirectUrl":"http://site.ru/", "formProcessed":true, "breakedOn":null,"noRedirect":false, "refreshPage":false, "dealId":"1111111111", "confirmMessage":null, "confirmCancelRedirectUrl":null}, "message":null}

По задумке кодеров getcourse она парсится и обрабатывается скриптами в iframe, но мой метод видимо нарушает работу каких-то скриптов, потому переадресация со страницы с непонятной для среднестатистического человека строчкой не производится.

Как я уже сказал выше, код file_get_contents я сейчас не использую. Я просто добавил в обработчик эмулятор post указав в нем адрес с action. Получилось примерно следующее:

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://om.getcourse.ru/pl/lite/block-public/process?id=3077862");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "formParams[email][email protected]&formParams[full_name]=NAME&formParams[phone]=135489432153&formParams[deal][additional][Дополнительная информация]=MORE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);

curl_close ($ch);

echo $server_output;

Если Вы всё-таки решите использовать первый блок кода выше – Вам вероятно понадобится и этот кусочек для установки в ссылки, по которым появляется popup:

onclick="document.getElementsByName('formParams[deal][additional][Дополнительная информация]')[0].value = 'Первый экран, кнопка `Забронировать место`';"

Как Вы поняли, здесь мы по клику отправляем в поле с некрасивым названием информацию о месторасположении кнопки. Возможность дать Id полю разработчики getcourse не предусмотрели, а Class у всех полей один и тот же (если Вы через панельку задаете класс – он присваивается обёртке, а не полю). Задавать через класс[*] я не посчитал правильным, т.к. количество полей может изменится и всё нарушится.


Комментарии к статье
Автор блога sapid.info, Ноябрь 26, 2017 в 2:21 пп:

Возникла еще идея (нет времени проверить потому пишу здесь заметку):
Присваивание через js в основном документе значения cookie для домена, который в iframe; последующее считывание данных через js в iframe с обращением по имени. Даже если не сработает в данном случае – есть вероятность что это будет происходить из-за того что при выполнении кода в iframe все cookie чистятся точно так же, как чистятся все “неугодные” параметры при попытке передачи их в url в обращении при генерации iframe.

Добавьте свой комментарий - оставьте след в блоге!