Web-интерфейс для управления маршрутизацией по регионам
Ранее мы рассмотрели, как подготовить таблицу для маршрутизации по регионам, а также разобрались с тем, как правильно смаршрутизировать вызовы в зависимости от региона. В целом, функционал такой маршрутизации уже готов, однако для его правки нужно постоянно подключаться к базе. Такой подход неудобен, поэтому в данной статье рассмотрим, как сделать небольшой web-интерфейс для настройки региональной логики. […]
Ранее мы рассмотрели, как подготовить таблицу для маршрутизации по регионам, а также разобрались с тем, как правильно смаршрутизировать вызовы в зависимости от региона. В целом, функционал такой маршрутизации уже готов, однако для его правки нужно постоянно подключаться к базе. Такой подход неудобен, поэтому в данной статье рассмотрим, как сделать небольшой web-интерфейс для настройки региональной логики.
Файлы с исходным кодом будут выложены в конце статьи.
Задача
Необходимо создать небольшой интерфейс для управления настройками маршрутизации по регионам. В нём должно присутствовать отображение полной таблицы с маршрутизацией, поиск по ней, а также возможность редактирования, удаления и добавления настроек маршрутизации.
Реализация
Для начала пропишем подключение к базе данных. Это делаем в скрипте routes.php.
$dsn = 'mysql:host=localhost; dbname=asteriskcdrdb';
$user = 'freepbxuser';
$pass = 'freepbxpassword';
try {
$dbh = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
die ('При подключении к базе данных возникла ошибка.' . $e->getMessage());
}
Общие настройки
Для отображения данных создадим таблицу в отдельном файле regrout.php. Также для функционала поиска, редактирования, удаления и добавления нам понадобятся input для каждого параметра таблицы.
Ниже приведён фрагмент кода 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.
Далее внизу файла прописываем эти функции:
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. Получим результат поиска.
Рис. 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’ов.
Функция удаления
Осталось реализовать только функцию удаления. Для этого, по аналогии с предыдущими функциями проверим, была ли нажата кнопка удаления, а затем вызовем функцию 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-интерфейса с базовым функционалом для управления маршрутизацией по регионам завершена.
Здесь можете скачать исходные файлы (ссылка на исходники).
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.