Verfasste Forenbeiträge
-
AutorBeiträge
-
Hier der Link zum XML Format von Zoiper
https://www.zoiper.com/documentation/XML%20Contact%20Service%20in%20Zoiper%205%20PRO.pdf
und der Code der zoiper_dir.php
(falls jemand den Code verbessern will / kann, einfach machen, ich bin nur Fernmelder mit Upgrade 😉 )<?php
ini_set(‘display_errors’, 0);
ini_set(‘log_errors’, 1);
ini_set(‘error_log’, ‘/tmp/php-Zoiper.log’);
error_reporting(E_ALL);header(“Content-Type: text/xml; charset=utf-8″);
if (ob_get_level()) { ob_end_clean(); }// —- Helpers —-
function x(?string $s): string {
return htmlspecialchars($s ?? ”, ENT_XML1, ‘UTF-8’);
}function mapTypes(string $typeRaw): array {
static $map = [
‘internal’ => [‘Work’, ‘IPPhone’],
‘work’ => [‘Work’, ‘Phone’],
‘cell’ => [‘Work’, ‘Cell’],
‘home’ => [‘Home’, ‘Phone’],
];
$key = strtolower(trim($typeRaw));
return $map[$key] ?? [‘Work’, ‘Phone’];
}// —- DB —-
// Empfehlung: Zugangsdaten per ENV holen
$host = getenv(‘DB_HOST’) ?: ‘localhost’;
$user = getenv(‘DB_USER’) ?: ‘freedirectory’;
$pass = getenv(‘DB_PASS’) ?: ‘1SehrSicheres!PassW0r7’;
$db = getenv(‘DB_NAME’) ?: ‘asterisk’;$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) {
echo ‘<?xml version=”1.0″ encoding=”UTF-8″?><Contacts></Contacts>’;
exit;
}
$mysqli->set_charset(“utf8mb4″);// —- Paging + Search —-
$perPage = 100;
$page = isset($_GET[‘page’]) ? max(1, (int)$_GET[‘page’]) : 1;
$offset = ($page – 1) * $perPage;$search = isset($_GET[‘q’]) ? trim((string)$_GET[‘q’]) : ”;
$like = ‘%’ . $search . ‘%’;// —- Query: Kontakte + Nummern in einem Rutsch —-
// (LEFT JOIN, damit Kontakte ohne Nummern nicht verschwinden, wenn du das willst)
$sql = ”
SELECT
e.id, e.displayname, e.fname, e.lname, e.title, e.company,
n.number, n.extension, n.type
FROM contactmanager_group_entries e
LEFT JOIN contactmanager_entry_numbers n ON n.entryid = e.id
” . ($search !== ” ? “WHERE e.displayname LIKE ? ” : “”) . ”
ORDER BY e.displayname, e.id
LIMIT ?, ?
“;$stmt = $mysqli->prepare($sql);
if (!$stmt) {
echo ‘<?xml version=”1.0″ encoding=”UTF-8″?><Contacts></Contacts>’;
exit;
}if ($search !== ”) {
$stmt->bind_param(“sii”, $like, $offset, $perPage);
} else {
$stmt->bind_param(“ii”, $offset, $perPage);
}$stmt->execute();
$res = $stmt->get_result();// —- XML Output —-
echo ‘<?xml version=”1.0″ encoding=”UTF-8″?>’;
echo ‘<Contacts>’;$lastId = null;
$opened = false;while ($r = $res->fetch_assoc()) {
$contactId = (int)$r[‘id’];// Neuer Contact-Block?
if ($lastId !== $contactId) {
if ($opened) {
echo ‘</Contact>’;
}
$opened = true;
$lastId = $contactId;echo ‘<Contact id=”‘ . $contactId . ‘”>’;
echo ‘<Name>’;
echo ‘<First>’ . x($r[‘fname’]) . ‘</First>’;
echo ‘<Middle>’ . x($r[‘lname’]) . ‘</Middle>’;
echo ‘<Last>’ . x($r[‘title’]) . ‘</Last>’;
echo ‘<Display>’ . x($r[‘displayname’]) . ‘</Display>’;
echo ‘</Name>’;
echo ‘<Info>’;
echo ‘<Company>’ . x($r[‘company’]) . ‘</Company>’;
echo ‘</Info>’;
}// Nummer vorhanden?
if (!empty($r[‘number’])) {
$rawNumber = (string)$r[‘number’];
$ext = (string)($r[‘extension’] ?? ”);
$combined = ($ext !== ”) ? ($rawNumber . $ext) : $rawNumber;[$type1, $type2] = mapTypes((string)($r[‘type’] ?? ”));
echo ‘<Phone>’;
echo ‘<Type>’ . x($type1) . ‘</Type>’;
echo ‘<Type>’ . x($type2) . ‘</Type>’;
echo ‘<Phone>’ . x($combined) . ‘</Phone>’;
echo ‘</Phone>’;
}
}if ($opened) {
echo ‘</Contact>’;
}echo ‘</Contacts>’;
$stmt->close();
$mysqli->close();
exit; -
AutorBeiträge
