Алина Леонова
09.03.2020
4963

Web-интерфейс для управления маршрутизацией по регионам

Ранее мы рассмотрели, как подготовить таблицу для маршрутизации по регионам, а также разобрались с тем, как правильно смаршрутизировать вызовы в зависимости от региона. В целом, функционал такой маршрутизации уже готов, однако для его правки нужно постоянно подключаться к базе. Такой подход неудобен, поэтому в данной статье рассмотрим, как сделать небольшой web-интерфейс для настройки региональной логики. […]

Ранее мы рассмотрели, как подготовить таблицу для маршрутизации по регионам, а также разобрались с тем, как правильно смаршрутизировать вызовы в зависимости от региона. В целом, функционал такой маршрутизации уже готов, однако для его правки нужно постоянно подключаться к базе. Такой подход неудобен, поэтому в данной статье рассмотрим, как сделать небольшой web-интерфейс для настройки региональной логики.

Файлы с исходным кодом будут выложены в конце статьи.

Задача

Необходимо создать небольшой интерфейс для управления настройками маршрутизации по регионам. В нём должно присутствовать отображение полной таблицы с маршрутизацией, поиск по ней, а также возможность редактирования, удаления и добавления настроек маршрутизации.

Реализация

Для начала пропишем подключение к базе данных. Это делаем в скрипте routes.php.

Обратите внимание на то, что нужная таблица лежит в базе asteriskcdrdb. Соответственно у пользователя обязательно должен быть к ней доступ.
$dsn = 'mysql:host=localhost; dbname=asteriskcdrdb';
	$user = 'freepbxuser';
	$pass = 'freepbxpassword';
	try {
		$dbh = new PDO($dsn, $user, $pass);
	} catch (PDOException $e) {
		die ('При подключении к базе данных возникла ошибка.' . $e->getMessage()); 
	}
Логин и пароль для подключения можно найти в конфигурационном файле freepbx.conf (каталог /etc). Если у Вас другой web-интерфейс телефонии, или же его нет – наименование конфигурационного файла будет отличаться.

Общие настройки

Для отображения данных создадим таблицу в отдельном файле regrout.php. Также для функционала поиска, редактирования, удаления и добавления нам понадобятся input для каждого параметра таблицы.

Данный способ реализации подразумевает под собой одинаковые имена всех input и полей таблицы reg_routes. Также таблица в regrout.php должна находиться внутри формы.

Ниже приведён фрагмент кода regrout.php, содержащий основные для нас настройки:

<form acton="routes.php" method="POST">
	<input type="text" size="30" name="region" placeholder="region" value="<?php echo $_POST['region']; ?>">
	<input type="text" size="10" name="district" placeholder="district" value="<?php echo $_POST['district']; ?>">
	<input type="text" size="10" name="key_1" placeholder="type 1" value="<?php echo $_POST['key_1']; ?>">
	<input type="text" size="10" name="key_2" placeholder="type 2" value="<?php echo $_POST['key_2']; ?>">
	<input type="text" size="10" name="key_3" placeholder="type 3" value="<?php echo $_POST['key_3']; ?>">
	<input type="text" size="10" name="key_i" placeholder="invalid" value="<?php echo $_POST['key_i']; ?>">
	<input type="text" size="10" name="key_t" placeholder="timeout" value="<?php echo $_POST['key_t']; ?>">
	<input type="submit" name="search" value="search">
	<input type="submit" name="add" value="add">
	<table>
		<tr>
			<th>region</th>
			<th>district</th>
			<th>type 1</th>
			<th>type 2</th>
			<th>type 3</th>
			<th>invalid</th>
			<th>timeout</th>
			<th> </th>
			<th></th>
		</tr>
		<?php
			echo $display['table'];
		?>
</table>
</form>

Остальная работа будет произведена исключительно в файле routes.php.

В routes.php пропишем:

$table_field = array('region','district','key_1','key_2','key_3','key_i','key_t');
$cond_arr = array();
$cond = ' ';
$display = array();
$display['table'] = ' ';
$res = $dbh->prepare("SELECT * FROM `reg_routes` WHERE 1 $cond");
$res->execute($cond_arr);
$result = $res->fetchall(PDO::FETCH_ASSOC);
foreach ($result as $value) {
	$display['table'] .= "<tr><td>".$value['region']."</td>".
		"<td>".$value['district']."</td>".
		"<td>".$value['key_1']."</td>".
		"<td>".$value['key_2']."</td>".
		"<td>".$value['key_3']."</td>".
		"<td>".$value['key_i']."</td>".
		"<td>".$value['key_t']."</td>".
		"<td><button type='submit' name='edit' value='". $value['region'] ."'>edit</button></td>".
		 "<td><button type='submit' name='delete' value='". $value['region'] ."'>delete</button></td></tr>";
}
require_once "regrout.php";

Подробнее рассмотрим, что указали выше.

В $table_field передаём массив, элементами которого являются поля таблицы reg_routes. Сразу же объявим $cond – строковая переменная; в дальнейшем будет содержать условие поиска, а также $cond_arr – массив placehold’ер’ов.

В $display_table помещаем сформированное тело отображаемой таблицы. Результатом того, что уже прописали на текущий момент, будет следующее:

Общий вывод
Общий вывод

Функция поиска

Теперь приступим к реализации поиска. Сразу необходимо учесть, как именно будем искать. В данном примере поиск реализован по всем полям таблицы.

Как было уже сказано выше, здесь нам понадобятся переменные $cond и $cond_arr.

До объявления функций пропишем следующее:

if (isset($_POST['search'])) {
	$cond_arr = get_condition_array($table_field, "%");
$cond = get_condition($cond_arr);
}

Здесь мы проверяем, нажата ли кнопка поиска и вызываем нужные функции – get_condition_array и get_condition.

В get_condition_array помимо $table_field передаём %, т.к. в примере запрос для поиска содержит like. 

Далее внизу файла прописываем эти функции:

function get_condition($cond_arr) {
	$cond = '';
	foreach ($cond_arr as $key => $value) {
		$cond .= " and $key like :$key";
	}
	return $cond;
}
function get_condition_array($table_field, $delim = '') {
	$cond_arr = array();
	foreach ($table_field as $value) {
		if (!empty($_POST[$value]))
 		$cond_arr[$value] = $delim . $_POST[$value] . $delim;
 	}
	return $cond_arr;
	}

Сначала разберём функцию get_condition_array. В ней проходимся по всем элементам массива $table_field и при введённом в input значении в $cond_arr записываем в качестве ключа имя input, а в качестве значения – значение. На выходе из функции должны вернуть полученный $cond_arr. Он будет передан в функцию get_condition.

В get_condition проходим по всем значениям $cond_arr и на основе их составляем условие поиска. Возвращаем $cond, который будет подставлен в $res. Парсим результат execute и помещаем в массив $result. Получим результат поиска.

Результат поиска по region – Москва
Результат поиска по region – Москва

Рис. 2. Результат поиска по region – Москва

Функция добавления

Сейчас посмотреть логику распределения входящих вызовов мы можем из web-интерфейса, но сама настройка таблицы нам пока недоступна. Рассмотрим функцию добавления новой строки маршрутизации.

После вызова поиска пропишем вызов функции добавления. Для этого:

if (isset($_POST['add'])) {
	if ($_POST['region'] != '' && $_POST['district'] != '') {
		add_routes($dbh);
	}
}

Здесь при нажатой кнопке add проверяем, чтобы поле region и district не были пустыми. Если они не пусты, вызываем функцию add_routes.

function add_routes($dbh) {
	$req = $dbh->prepare("REPLACE INTO reg_routes (region, district, key_1, key_2, key_3, key_i, key_t) VALUES (:region, :district, :key_1, :key_2, :key_3, :key_i, :key_t)");
	$ex_arr = array(
		'region' => $_POST['region'],
		'district' => $_POST['district'],
		'key_1' => $_POST['key_1'],
		'key_2' => $_POST['key_2'],
		'key_3' => $_POST['key_3'],
		'key_i' => $_POST['key_i'],
		'key_t' => $_POST['key_t'],
	);
	$req->execute($ex_arr);
}

Добавление происходит следующим образом: прописываем в $req запрос в базу, по которому будем добавлять новую маршрутизацию в таблицу reg_routes. Значения, добавляемые в таблицу, берём из соответствия элементов массива $ex_arr, где ключ – placehold’ер, а $_POST[‘values‘] – значение, введённое в input web-интерфейса.

Результат добавления новой маршрутизации Самарская область
Результат добавления новой маршрутизации Самарская область

Из скриншота видим, что при добавлении новой маршрутизации input’ы остаются заполненными. После нажатия add в таблицу добавляется новая строка, содержащая также кнопку редактирования и удаления.

Функция редактирования

Теперь сделаем возможность редактирования текущей маршрутизации. В части файла, где вызываем функции, пропишем:

if (isset($_POST['edit'])) {
	edit_routes($dbh);
}

Проверяем, нажата ли кнопка редактирования. Если нажата – вызываем функцию edit_routes.

Перейдём к описанию самой функции edit_routes.

function edit_routes($dbh) {
	$edt = $dbh->prepare("SELECT * FROM `reg_routes` WHERE region = :region");
	$edt->execute(array('region' => $_POST['edit']));
	$edarr = $edt->fetch(PDO::FETCH_ASSOC);
	$_POST['region'] = $edarr['region'];
	$_POST['district'] = $edarr['district'];
	$_POST['key_1'] = $edarr['key_1'];
	$_POST['key_2'] = $edarr['key_2'];
	$_POST['key_3'] = $edarr['key_3'];
	$_POST['key_i'] = $edarr['key_i'];
	$_POST['key_t'] = $edarr['key_t'];
}

В $edt прописываем запрос для редактирования маршрута. В $edarr попадает результат выборки текущих значений редактируемой записи. Добавляем их в значения input’ов.

Для редактирования маршрута нажимаем кнопку add.
Результат редактирования маршрута Санкт-Петербург
Результат редактирования маршрута Санкт-Петербург

Функция удаления

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

if (isset($_POST['delete'])) {
	delete_routes($dbh);
}
Теперь объявим саму функцию:
function delete_routes($dbh) {
	$del = $dbh->prepare("DELETE FROM `reg_routes` WHERE region = :region");
	$del->execute(array('region' => $_POST['delete']));
}

Здесь в $del прописываем запрос для удаления маршрута из базы.

Результат удаления маршрута Омская область
Результат удаления маршрута Омская область

Рис. 5. Результат удаления маршрута Омская область

На этом статья по созданию web-интерфейса с базовым функционалом для управления маршрутизацией по регионам завершена.

Здесь можете скачать исходные файлы (ссылка на исходники).

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.