Beiträge durchsuchen

Eric Scheen

Verfasste Forenbeiträge

Ansicht von 1 Beitrag (von insgesamt 1)
  • Autor
    Beiträge
  • als Antwort auf: Zoiper Kontakte per XML abrufen #2635
    Eric ScheenEric Scheen
    Teilnehmer

      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;

    Ansicht von 1 Beitrag (von insgesamt 1)