Добавление кастомных полей модуля extensions
В этой статье подробно рассмотрен процесс добавления кастомных полей в модуле Extensions на примере FreePBX версии 16.0.33. Шаг за шагом описывается, как найти и изменить исходный код для отображения новых полей, обеспечить их сохранение и корректное отображение при редактировании внутренних номеров. Статья будет полезна администраторам IP-телефонии, желающим расширить функциональность FreePBX и адаптировать систему под специфические требования.
Настройка проводится на примере одной из последних версий FreePBX 16.0.33, на остальных могут быть незначительные отличия.
Итак, начнём с поиска. Искать мы будем место в исходном коде модулей, которое отвечает за построение страницы, отображающей параметры внутреннего номера. Для этого откроем саму страницу.
- Для этого нам необходимо залогиниться во FreePBX и перейти во вкладку:
Applications -> Extensions
- После этого выберем один из существующих номеров или создадим новый – формы практически не будут иметь отличий.
Предположим, чтобы далеко не пришлось потом листать, мы хотим добавить поле на вкладке General, в первом блоке Edit Extension. Нам нужно выяснить, где находится исходный код построения этой страницы и конкретно этого блока. Для этого воспользуемся старым, проверенным способом.
- Подключаемся к серверу по SSH и переходим в корневую директорию FreePBX.
# cd /var/www/html/admin/modules/
- Открываем режим разработчика на странице FreepPBX – обычно, для этого достаточно нажать F12. После этого исследуем элемент поля ввода на странице. Берём несколько ключевых слов, как показано на скрине ниже:
- После этого формируем следующую команду и выполняем её в консоли:
# fgrep "Display Name" ./* -r | grep name | grep text
Таким образом, мы сможем найти в каком файле создаётся элемент, который мы ищем. Вывод получится примерно следующим:
Как видим, получилось не так уж и много. Особенно если учесть, что модуль UCP нам сейчас не нужен. Остаётся только один возможный вариант, а именно файл: functions.inc.php.
Давайте откроем его на редактирование и взглянем на строчку, которая нам попалась в выдаче поиска. Полный путь к файлу будет иметь вид:
/var/www/html/admin/modules/core/functions.inc.php
Здесь мы вновь находим интересующую нас строчку. Она выглядит так:
$currentcomponent->addguielem($section, new gui_textbox('name', $name, _("Display Name"), _("The CallerID name for calls from this user will be set to this name. Only enter the name, NOT the number."), '(typeof isCorrectLengthExtensions != "undefined") ? !isCorrectLengthExtensions() || !isUnicodeLetter || isWhitespace() : !isUnicodeLetter() || isWhitespace()', $msgInvalidDispName, false), 3, null, $category);
Давайте предположим, что это строка и добавляет, нужный нам, текстовый элемент на страницу. На это прямо указывает название функции addguielem. Если перевести дословно: «добавить элемент пользовательского интерфейса».
Попробуем сделать копию этой строки и изменить её под себя. Так же не забываем выставить маркеры начала и конца правок:
// change begin
$currentcomponent->addguielem($section, new gui_textbox('cf1', $cf1, _("Custom filed 1"), _("You can write custom text")), 3, null, $category);
$currentcomponent->addguielem($section, new gui_textbox('cf2', $cf2, _("Custom field 2"), _("You can write custom text")), 3, null, $category);
// change end
Возвращаемся на страницу FreePBX и обновляем её через CRTL+R.
Видим, что новые поля успешно добавлены. Более того, они имеют заголовки, подсказки при наведении, а так же доступны как в SIP так и в PJSIP!
Но это ещё не всё. Мы добавили форму, однако ей ещё нужны обработчики: на получение и отображение информации, на отправку и сохранение. Отправка будет работать «из коробки», поскольку поле находится внутри формы отправляемых данных на сервер. В этом можно убедиться, открыв в браузере режим разработчика, вкладку Network. После чего заполним новые поля произвольным текстом и нажмём «Submit».
Если в панели разработчика выделить событие отправки данных – мы увидим, что среди прочих переменных отправились и наши новые поля.
Вернёмся к файлу, в котором мы добавили наши кастомные поля. В ней, в начале функции есть строки вида:
$display = isset($_REQUEST['display'])?$_REQUEST['display']:null;
Что может означать, что переменные для отображения извлекаются из параметров, пришедших на сервер в запросе. Давайте проверим, что из них нам доступно? Для этого вставим строчку вывода всех аргументов на страницу:
// Init vars from $_REQUEST[]
// change begin
echo "<pre>".print_r($_REQUEST, true)."</pre>";
// change end
Примерное положение в коде:
Возвращаемся на страницу, выполняем сохранение произвольного текста повторно и наблюдаем изменения:
Отлично. Исходя из этих данных, можно аналогично штатным переменным добавить собственные. Редактируем недавний код и приводим к следующему виду:
// Init vars from $_REQUEST[]
// change begin
// echo "<pre>".print_r($_REQUEST, true)."</pre>";
$cf1 = isset($_REQUEST['cf1']) ? $_REQUEST['cf1'] : null;
$cf2 = isset($_REQUEST['cf2']) ? $_REQUEST['cf2'] : null;
// change end
Как видим, после этого при нажатии «Submit» наши поля сохраняют значения. Что и требовалось? Не совсем. Поскольку, при обновлении страницы или нажатии «Applay» поля очистятся.
Происходит это из-за того, что набор передаваемых данных в этих случаях сокращается до следующих:
И заполнить кастомные поля уже нет данных. Нужно найти функционал позволяющий подтягивать данные всегда. Но предварительно информацию нужно передать на сервер и где-то сохранить. После недолгих поисков, всё в том же файле находим функцию core_users_configprocess(), в которой будут ключевые слова: action, edit, add, user. В зависимости от параметра данная фунция вызывает другие на удаление, добавление, редактирование. Однако она вызывает следующие функции:
- core_users_add
- core_users_edit
Поскольку это функции ядра искать их следует в файле:
/var/www/html/admin/modules/core/Core.class.php
Находим функцию: public function addUser(), а в ней фрагмент ответственный за сохранение данных. Например, параметр который, предположительно, сохраняется в AstDB:
$astman->database_put("AMPUSER",$extension."/cwtone",isset($settings['cwtone']) ? $settings['cwtone'] : '');
Скопируем код и перепишем его под себя, с пометками о редактировании:
// change begin
$astman->database_put("AMPUSER",$extension."/cf1",isset($settings['cf1']) ? $settings['cf1'] : '');
$astman->database_put("AMPUSER",$extension."/cf2",isset($settings['cf2']) ? $settings['cf2'] : '');
// change end
Ниже на скриншоте можно увидеть примерное место вставки:
Вернёмся на страницу FreePBX выполним сохранение произвольного текста, после чего в консоли SSH проверим наличие полей соответствующих нашим.
Как видно из скриншота, данные успешно сохранились. В качестве эксперемента можно выполнить сохранение ещё несколько раз – всегда данные будут успешно добавляться.
# asterisk –rx ‘database show AMPUSER/<peer_num>’ | grep custom
Сохранения и обновления данных в хранилище мы добились. Но они всё ещё не отображаются в наших полях FreePBX после сохранения. В файле functions.inc.php перед генерацией страницы вызывается функция getUser(). Предположим, что она собирает и предоставляет данные для предварительного заполнения полей.
Находим функцию getUser() всё в том же Core.class.php. И поступаем точно так же, как в прошлом шаге: находим аналог нужной нам команды. Пусть это будет:
$results['rvolume'] = strtolower($astman->database_get("AMPUSER",$extension."/rvolume"));
Редактируем под себя и вставляем маркеры правок:
// change begin
$results['cf1'] = $astman->database_get("AMPUSER",$extension."/cf1");
$results['cf2'] = $astman->database_get("AMPUSER",$extension."/cf2");
// change end
Ориентируемся на скриншот:
Теперь при добавлении, редактировании и очистке полей, они всегда будут сохраняться в AstDB, а также отображаться при повторном открытии страницы редактирования внутреннего номера.
Сделано это с целью уведомить администратора, о возможном зловредном коде. Однако в этот раз уведомление вызвано нашими действиями и переживать не стоит.
Таким образом, было продемонстрировано на примере внутреннего номера, как добавить во FreePBX кастомное поле, сделать его хранимым и редактируемым. Аналогично можно добавлять элементы интерфейса, и не только текстовый, в абсолютно любые другие модули.
Остались вопросы?
Я - Кондрашин Игорь, менеджер компании 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.