Простой вариант вывода внутренних номеров и имен абонентов с функцией поиска и сортировки. Ниже я предоставлю пример PHP-скрипта, который подключается к базе данных, извлекает необходимые данные и отображает их в виде адресной книги.

1. Получение учетных данных для подключения к базе данных

FreePBX хранит свои данные в базе данных MySQL (MariaDB). Учетные данные для подключения к базе данных хранятся в файле /etc/freepbx.conf. Обычно этот файл содержит информацию в следующем формате:

<?php
// …
$amp_conf[‘AMPDBUSER’] = ‘freepbxuser’;
$amp_conf[‘AMPDBPASS’] = ‘yourpassword’;
$amp_conf[‘AMPDBHOST’] = ‘localhost’;
$amp_conf[‘AMPDBNAME’] = ‘asterisk’;
$amp_conf[‘AMPDBENGINE’] = ‘mysql’;
// …
?>

2. Создаем файл конфигурации с данными для подключения к БД.

Создаем по пути /etc/asterisk/db_config.php файл с данными для подключения:

<?php
$dbhost = ‘localhost’;
$dbuser = ‘freepbxuser’;
$dbpass = ‘ваш_пароль’;
$dbname = ‘asterisk’;
?>

3. Создание файла php-скрипта phonebook.php

Создайте PHP-файл на вашем сервере. Например, /var/www/html/phonebook.php

<?php
// Отключаем отображение ошибок в продакшен-среде
ini_set(‘display_errors’, 0);
error_reporting(E_ALL);
ini_set(‘log_errors’, 1);
ini_set(‘error_log’, ‘/var/log/php_errors.log’);

// Подключаем файл конфигурации с параметрами подключения к БД
require_once ‘/etc/asterisk/db_config.php’;

// Подключение к базе данных
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
error_log(«Ошибка подключения к MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_error);
echo «Извините, возникла проблема с подключением к базе данных.»;
exit;
}

// Устанавливаем кодировку
$mysqli->set_charset(«utf8»);

// Получаем значение поиска и сортировки из GET-параметров
$search = $_GET[‘search’] ?? »;
$sort = $_GET[‘sort’] ?? ‘extension’;
$order = $_GET[‘order’] ?? ‘asc’;

// Допустимые поля для сортировки и порядок
$allowedSortFields = [‘extension’, ‘name’];
$allowedOrder = [‘asc’, ‘desc’];

// Валидация параметров сортировки
if (!in_array($sort, $allowedSortFields)) {
$sort = ‘extension’;
}
if (!in_array($order, $allowedOrder)) {
$order = ‘asc’;
}

// Инициализируем массив для хранения результатов
$extensions = [];

// Подготавливаем SQL-запрос с учетом поиска и сортировки
if ($search) {
// Используем подготовленные выражения для предотвращения SQL-инъекций
$stmt = $mysqli->prepare(«SELECT extension, name FROM users WHERE extension LIKE CONCAT(‘%’, ?, ‘%’) OR name LIKE CONCAT(‘%’, ?, ‘%’) ORDER BY $sort $order»);
$stmt->bind_param(‘ss’, $search, $search);
} else {
$stmt = $mysqli->prepare(«SELECT extension, name FROM users ORDER BY $sort $order»);
}

// Выполняем запрос
if ($stmt->execute()) {
$result = $stmt->get_result();
$extensions = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
} else {
error_log(«Ошибка выполнения запроса: (» . $stmt->errno . «) » . $stmt->error);
echo «Извините, возникла проблема при получении данных.»;
exit;
}

$mysqli->close();
?>
<!DOCTYPE html>
<html>
<head>
<title>Адресная книга</title>
<meta charset=»UTF-8″>
<!— Подключаем Bootstrap CSS —>
<link rel=»stylesheet» href=»https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css»>
</head>
<body>
<div class=»container mt-5″>
<!— Центрируем заголовок с помощью класса text-center —>
<h1 class=»mb-4 text-center»>Адресная книга</h1>

<!— Форма поиска —>
<form method=»GET» class=»form-inline mb-4 justify-content-center»>
<input type=»text» name=»search» class=»form-control mr-2″ placeholder=»Поиск…» value=»<?php echo htmlspecialchars($search); ?>»>
<button type=»submit» class=»btn btn-primary»>Найти</button>
<?php if ($search || $sort !== ‘extension’ || $order !== ‘asc’): ?>
<a href=»?» class=»btn btn-secondary ml-2″>Сбросить</a>
<?php endif; ?>
<!— Скрытые поля для сохранения параметров сортировки при поиске —>
<input type=»hidden» name=»sort» value=»<?php echo htmlspecialchars($sort); ?>»>
<input type=»hidden» name=»order» value=»<?php echo htmlspecialchars($order); ?>»>
</form>

<?php if (!empty($extensions)): ?>
<table class=»table table-striped table-bordered»>
<thead class=»thead-dark»>
<tr>
<?php
// Функция для генерации URL с новыми параметрами сортировки
function sortUrl($field, $currentSort, $currentOrder) {
$order = ‘asc’;
if ($currentSort === $field && $currentOrder === ‘asc’) {
$order = ‘desc’;
}
$params = $_GET;
$params[‘sort’] = $field;
$params[‘order’] = $order;
return ‘?’ . http_build_query($params);
}
?>

<th>
<a href=»<?php echo sortUrl(‘extension’, $sort, $order); ?>» class=»text-white»>
Номер
<?php if ($sort === ‘extension’): ?>
<?php if ($order === ‘asc’): ?>

<?php else: ?>

<?php endif; ?>
<?php endif; ?>
</a>
</th>
<th>
<a href=»<?php echo sortUrl(‘name’, $sort, $order); ?>» class=»text-white»>
Имя
<?php if ($sort === ‘name’): ?>
<?php if ($order === ‘asc’): ?>

<?php else: ?>

<?php endif; ?>
<?php endif; ?>
</a>
</th>
</tr>
</thead>
<tbody>
<?php foreach ($extensions as $ext): ?>
<tr>
<td><?php echo htmlspecialchars($ext[‘extension’]); ?></td>
<td><?php echo htmlspecialchars($ext[‘name’]); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<div class=»alert alert-warning» role=»alert»>
<?php if ($search): ?>
По вашему запросу «<strong><?php echo htmlspecialchars($search); ?></strong>» ничего не найдено.
<?php else: ?>
Данные не найдены.
<?php endif; ?>
</div>
<?php endif; ?>
</div>

<!— Подвал с копирайтом —>
<footer class=»text-center mt-5 mb-3″>
<p>&copy; <?php echo date(«Y»); ?> <a href=»https://it-crowd.by» target=»_blank»>it-crowd.by</a></p>
</footer>

<!— Подключаем Bootstrap JS и зависимости —>
<script src=»https://code.jquery.com/jquery-3.5.1.slim.min.js»></script>
<script src=»https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.min.js»></script>
</body>
</html>

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

Адресная книга для FreePBX