Интеграция форм 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="http://XXX.getcourse.ru/pl', 'src="http://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@EXAMPLE.COM&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 у всех полей один и тот же (если Вы через панельку задаете класс — он присваивается обёртке, а не полю). Задавать через класс[*] я не посчитал правильным, т.к. количество полей может изменится и всё нарушится.