Start › Foren › VoIP-Telefonie › FreePBX / Asterisk › Zoiper Kontakte per XML abrufen
- Dieses Thema hat 1 Antwort sowie 1 Teilnehmer und wurde zuletzt vor vor 3 Wochen, 6 Tage von
Eric Scheen aktualisiert.
-
AutorBeiträge
-
9. Januar 2026 um 19:01 Uhr #2634
Hallo zusammen,
ich bin hier gelandet aufgrund der Super Videoreihe zum Thema freepbx, welche mir geholfen hat ein paar Problemchen bei der Einrichtung zu lösen.
Vielleicht kann ich ein bißchen was zurückgeben.Ein Problem war die Abfrage der Kontakte von Zoiper Pro über den Kontaktmanager – einen LDAP der aktuell noch im Netz läuft konnte ich recht einfach einbinden, wollte aber auch mal den internen Contact Manager testen.
Im Netz war ad hoc nichts zu finden, aber immerhin ein Dokument wie das XML für Zoiper aussehen soll.
Ich habe mich an der Lösung für die Yealink Telefone orientiert und eine passende Datei für den Zoiper gebastelt die passendes XML erzeugt.Einrichtung im Zoiper ist denkbar einfach – siehe Screenshot.

Die .php stelle ich gerne noch zur Verfügung – wenn ich herausgefunden habe wie man eine Datei anhängen kann.
VG
10. Januar 2026 um 9:47 Uhr #2635Hier 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
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
