TCSE

Отправка телефонов для обратного звонка из DLE-Uniform в CallTouch

Отправка телефонов для обратного звонка из DLE-Uniform в CallTouch

На одном из клиентских проектов возникла потребность в интеграции сервиса обратного звонка (Calltouch Callback) CallTouch.ru в стандартные формы обратной связи используемые на сайте.

Изучаем официальные источники

За основу информация https://support.calltouch.ru/hc/ru/articles/360005891451-Подключение-клиентских-форм-к-обратному-звонку-Calltouch

Далее уже работа на стороне модуля форм обратной связи (ФОС) DLE-Uniform

1. В набор JS файлов модуля добавляем новый скрипт

{THEME}/uniform/js/uniform_ctw.js

в сжатом виде получается так

	<script type="text/javascript" src="/engine/classes/min/index.php?charset=utf-8&f={THEME}/uniform/js/jquery.magnificpopup.min.js,{THEME}/uniform/js/jquery.ladda.min.js,{THEME}/uniform/js/jquery.form.min.js,{THEME}/uniform/js/jquery.maskedinput.min.js,{THEME}/uniform/js/uniform_ctw.js&06"></script>


2. сам скрипт {THEME}/uniform/js/uniform_ctw.js настроен на отслеживание полей: phone, name и calltime
обязательным для правильной работы скрипта является поле phone


3. В ссылку вызова Формы модуля DLE-Uniform необходимо добавить новый параметр

"ctwId": "uniformCallback"


вот сюда

data-uf-settings='{"formConfig": "callback", "ctwId": "uniformCallback"}'


где,

"formConfig": "callback" - название шаблона с формой
"ctwId": "uniformCallback" - ключ связки между виджетом CallTouch и формой на сайте. В данном пример ключ: uniformCallback



целиком код ссылки вызова формы обратного звонка становится

<a href="#" data-uf-open="/engine/ajax/uniform/uniform.php" data-uf-settings='{"formConfig": "callback", "ctwId": "uniformCallback"}'>обратная связь</a>


Собственно на этом все.

Модуль DLE-Uniform можно скачать на сайте разработчика https://pafnuty.name/modules/159-uniform.html

Дополнительный скрипт uniform_ctw.js

/*!
 * DLE UniForm — унверсальные формы для DLE
 *
 * @author     ПафНутиЙ <pafnuty10@gmail.com>
 * @link       http://pafnuty.name/
 * @link       https://twitter.com/pafnuty_name
 */

var doc = $(document);

doc
	// ajax-отправка формы + эффекты
	.on('submit', '[data-uf-form]', function () {
		var $this = $(this),
			laddaLoad,
			options = {
				beforeSubmit: ufStart,
				success: ufDone,
			};

		$this.ajaxSubmit(options);

		return false;
	})
	// Открытие ajax-окна с формой
	.on('click', '[data-uf-open]', function (e) {
		var $this = $(this),
			src = $this.data('ufOpen'),
			data = $this.data('ufSettings');

		var ctwId = data.ctwId || null;

		$.extend(true, $.magnificPopup.defaults, {
			callbacks: {
				open: function () {
					if (ctwId) {
						ctwService.setId(ctwId);
					}
				},
				ajaxContentAdded: function () {
					$("#phone").mask("+7 (999) 999-99-99");
				},
				close: function () {
					ctwService.clearId();
				},
			}
		});

		$.magnificPopup.open({
			items: {
				src: src,
			},
			focus: '.uf-input-first',
			type: 'ajax',
			ajax: {
				settings: {
					data: data
				}
			}
		});
		return false;
	})
	// Убираем класс с из инпута с ошибочным заполнением
	.on('keyup input', '.uf-input-error', function (e) {
		var $this = $(this);
		if (e.type == 'input') {
			doc.off('keyup', '.uf-input-error');
		}
		if ($this.val().length) {
			$this.removeClass('uf-input-error');
		}
	});


/**
 * Обёртка для совместной работы uniform и ctw
 */
var ctwService = {
	/**
	 * Текущий ключ фиджета формы ctw
	 * Задаётся в настройках кнопки формыб в параметре ctwId
	 * data-uf-settings='{"formConfig": "callback", "ctwId": "uniformCallback"}'
	 */
	ctwId: null,

	/**
	 * Проверка на существование ctw
	 */
	checkCtw: function () {
		return !!window.ctw;
	},

	/**
	 * Получаем текущий ключ виджета
	 */
	getId: function () {
		return ctwService.checkCtw() && ctwService.ctwId;
	},

	/**
	 * Устанавливаем ключ виджета для последующего использования
	 */
	setId: function (id) {
		ctwService.ctwId = id;
	},

	/**
	 * Очищаем ранее сохранёный ключ виджета
	 */
	clearId: function () {
		ctwService.ctwId = null;
	},

	/**
	 * Метод для отправки формы обратного звонка в ctw при условии, что ключ формы равен uniformCallback
	 */
	sendUniformCallback: function (formData) {
		var phone;
		var dataArray = [];

		formData.forEach(function (item, index) {

			switch (item.name) {
			case 'phone':
				// Приводим номер телефона в порядок
				var regex = /[\+\-\ \(\)]/g;
				phone = item.value.replace(regex, '');
				break

			case 'name':
			case 'calltime':
				// Добавляем имя и время звонка 
				dataArray.push({
					"name": item.name,
					"value": item.value
				});
				break

			default:
				//
				break
			}

		});

		// Дёргаем сервис ctw
		ctwService.createRequest(phone, dataArray);
	},

	/**
	 * Обёртка вокруг window.ctw.createRequest
	 */
	createRequest: function (phone, dataArray) {
		if (!ctwService.ctwId || !phone || !ctwService.checkCtw()) {
			return;
		}

		window.ctw.createRequest(
			ctwService.ctwId,
			phone,
			dataArray,
			function (success, data) {
				console.log(success, data)
				if (success) {
					console.log('Создана заявка на колбек, идентификатор: ' + data.callbackRequestId)
				}
				else {
					switch (data.type) {
					case "request_throttle_timeout":
					case "request_throttle_count":
						console.log('Достигнут лимит создания заявок, попробуйте позже');
						break;
					case "request_phone_blacklisted":
						console.log('номер телефона находится в черном списке');
						break;
					case "validation_error":
						console.log('были переданы некорректные данные');
						break;
					default:
						console.log('Во время выполнения запроса произошла ошибка: ' + data.type);
					}
				}
			}
		);

	}
}

// Функция, выполняемая перед отправкой формы
function ufStart(formData, jqForm) {
	
	if (ctwService.getId()) {
		// Отправляем данные в ctw если задан ключ
		ctwService.sendUniformCallback(formData);
	}

	laddaLoad = jqForm.find('.ladda-button').ladda();
	laddaLoad.ladda('start');

	return true;
}

// Функция, выполняемая после удачной отправки формы
function ufDone(responseText, statusText, xhr, $form) {

	var $responseText = $(responseText),
		responseResult = ($responseText.is('form')) ? $responseText.html() : responseText;

	if (statusText == 'success') {
		laddaLoad.ladda('stop');
		$form.html(responseResult);
	}
}

jQuery(document).ready(function ($) {
	var $inlineUniform = $('[data-uf-inline]');
	if ($inlineUniform.length) {
		$.each($inlineUniform, function (index, val) {
			var $this = $(this),
				url = $this.data('ufInline'),
				data = $this.data('ufSettings');

			$.ajax({
					url: url,
					data: data,
				})
				.done(function (data) {
					$this.html(data);
				});

		});
	};
});



в виде отдельного файла
[attachment=23:uniform_ctw.js]


Теперь после отправки формы, на email менеджеров сайта прилетает сообщение с параметрами заявки.

А в сервис Calltouch Callback поступает номер телефона на который происходит автоматический дозвон соединяющий менеджера сайта и клиента, который запросил обратный звонок.