Дмитрий Кайдаш
17.10.2024
483

Добавление кастомных полей модуля extensions

В этой статье подробно рассмотрен процесс добавления кастомных полей в модуле Extensions на примере FreePBX версии 16.0.33. Шаг за шагом описывается, как найти и изменить исходный код для отображения новых полей, обеспечить их сохранение и корректное отображение при редактировании внутренних номеров. Статья будет полезна администраторам IP-телефонии, желающим расширить функциональность FreePBX и адаптировать систему под специфические требования.

Настройка проводится на примере одной из последних версий FreePBX 16.0.33, на остальных могут быть незначительные отличия.

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

  • Для этого нам необходимо залогиниться во FreePBX и перейти во вкладку:

Applications -> Extensions

  • После этого выберем один из существующих номеров или создадим новый – формы практически не будут иметь отличий.
Рисунок 1 — Целевой блок

Предположим, чтобы далеко не пришлось потом листать, мы хотим добавить поле на вкладке General, в первом блоке Edit Extension. Нам нужно выяснить, где находится исходный код построения этой страницы и конкретно этого блока. Для этого воспользуемся старым, проверенным способом.

  • Подключаемся к серверу по SSH и переходим в корневую директорию FreePBX.
# cd /var/www/html/admin/modules/
  • Открываем режим разработчика на странице FreepPBX – обычно, для этого достаточно нажать F12. После этого исследуем элемент поля ввода на странице. Берём несколько ключевых слов, как показано на скрине ниже:
Рисунок 2 — Ключевые теги для поиска
  • После этого формируем следующую команду и выполняем её в консоли:
# fgrep "Display Name" ./* -r | grep name | grep text

Таким образом, мы сможем найти в каком файле создаётся элемент, который мы ищем. Вывод получится примерно следующим:

Результат поиска
Рисунок 3 — Результат поиска

Как видим, получилось не так уж и много. Особенно если учесть, что модуль 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.

Новые поля на странице
Рисунок 4 — Новые поля на странице

Видим, что новые поля успешно добавлены. Более того, они имеют заголовки, подсказки при наведении, а так же доступны как в SIP так и в PJSIP!

Но это ещё не всё. Мы добавили форму, однако ей ещё нужны обработчики: на получение и отображение информации, на отправку и сохранение. Отправка будет работать «из коробки», поскольку поле находится внутри формы отправляемых данных на сервер. В этом можно убедиться, открыв в браузере режим разработчика, вкладку Network. После чего заполним новые поля произвольным текстом и нажмём «Submit».

Если в панели разработчика выделить событие отправки данных – мы увидим, что среди прочих переменных отправились и наши новые поля.

Отправка параметров на сервер
Рисунок 5 — Отправка параметров на сервер

Вернёмся к файлу, в котором мы добавили наши кастомные поля. В ней, в начале функции есть строки вида:

$display = isset($_REQUEST['display'])?$_REQUEST['display']:null;

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

// Init vars from $_REQUEST[]
// change begin
echo "<pre>".print_r($_REQUEST, true)."</pre>";
// change end

Примерное положение в коде:

Вставка дампа переменных
Рисунок 6 — Вставка дампа переменных

Возвращаемся на страницу, выполняем сохранение произвольного текста повторно и наблюдаем изменения:

Вывод параметров отправленных на сервер
Рисунок 7 — Вывод параметров отправленных на сервер

Отлично. Исходя из этих данных, можно аналогично штатным переменным добавить собственные. Редактируем недавний код и приводим к следующему виду:

// 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» поля очистятся.

Применение настроек с перезагрузкой страницы
Рисунок 8 — Применение настроек с перезагрузкой страницы

Происходит это из-за того, что набор передаваемых данных в этих случаях сокращается до следующих:

Данные при обновлении страницы
Рисунок 9 — Данные при обновлении страницы

И заполнить кастомные поля уже нет данных. Нужно найти функционал позволяющий подтягивать данные всегда. Но предварительно информацию нужно передать на сервер и где-то сохранить. После недолгих поисков, всё в том же файле находим функцию 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

Ниже на скриншоте можно увидеть примерное место вставки:

Фрагмент сохранения данных
Рисунок 10 — Фрагмент сохранения данных

Вернёмся на страницу FreePBX выполним сохранение произвольного текста, после чего в консоли SSH проверим наличие полей соответствующих нашим.

Данные из кастомных полей в AstDB
Рисунок 11 — Данные из кастомных полей в AstDB

Как видно из скриншота, данные успешно сохранились. В качестве эксперемента можно выполнить сохранение ещё несколько раз – всегда данные будут успешно добавляться.

Внимание! ra – это alias, полностью команда будет иметь вид, который показан ниже:
# 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

Ориентируемся на скриншот:

Фрагмент получения данных
Рисунок 12 — Фрагмент получения данных

Теперь при добавлении, редактировании и очистке полей, они всегда будут сохраняться в AstDB, а также отображаться при повторном открытии страницы редактирования внутреннего номера.

Заполненные кастомные поля
Рисунок 13 — Заполненные кастомные поля
Возможна так же ручная редакция напрямую через AstDB. Изменения там повлекут изменения в отображении на странице FreePBX. Возможно после редактирования появится предупреждение во FreePBX, о том, что был изменён ключевой файл:
Предупреждение
Рисунок 14 — Предупреждение

Сделано это с целью уведомить администратора, о возможном зловредном коде. Однако в этот раз уведомление вызвано нашими действиями и переживать не стоит.

Таким образом, было продемонстрировано на примере внутреннего номера, как добавить во FreePBX кастомное поле, сделать его хранимым и редактируемым. Аналогично можно добавлять элементы интерфейса, и не только текстовый, в абсолютно любые другие модули.

Книга 101 функция Asterisk
Познакомьтесь с возможностями 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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.