Yealink T46G - externes Telefonbuch mit Fritzbox und NAS

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
Mit dem folgenden PHP-Code, abegelegt auf meiner Synology (geht auch auf QNAP u.a.), schaffe ich es, das externe Telefonbuch eines Yealink T46G (und sicher auch vieler anderer ähnlicher Geräte) mit dem der Fritzbox zu "füttern". Besonders hervozuheben ist die Tatsache, dass Yealink-Telefone eine beliebige URL als Quelle erlauben, so auch ein PHP-File, welches die angeforderte XML-Struktur erst im Moment des Abrufes on-the-fly erstellt.

Es ist also kein Export der Telefonbuch-Daten notwendig!

Bei den zuvor von mir genutzen Grandstream-Telefonen ist der Dateiname am Ende der URL dagegen fest vorgegeben (insbes. die Endung .xml), was zusätzliche Tricksereien mit httaccess und url-rewrite erforderlich machte ... Ich dachte mir, das Skript finden vlt. einige hier nützlich, es hat bestimmt noch Verbesserungspotential, aber erstmal läuft es. Läuft bei mir mit Fritzbox 7362 SL unter FritzOS 07.01
 

Anhänge

Zuletzt bearbeitet:
  • Like
Reaktionen: Werner_1959

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Wie genau wird das nun auf der Synology und im T46G implementiert?

Ich habe in der Fritzbox mehrere Telefonbücher (privat/geschäftlich/usw.), davon eines, welches mit meinen Google-Kontakten synchronisiert wird. Wo bestimme ich in dem php-Code, auf welches der Telefonbücher zugegriffen werden soll?
 

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
Hallo!

Die Auswahl des Telefonbuches erfolgt über seine ID, die von 0 bis n gehen kann, je nachdem, wie viele Telefonbücher du in der Fritzbox hast. Das wird in meinem Code in der Zeile 113 gemacht, hier ein Code-Ausschnitt:

...
$fb = new fb_soap ('passwd','192.168.200.1','username'); //<--- fb_soap kann mit 1,2 oder 3 Argumenten initiiert werden
$phonebook = $fb-> getFBphonebook(0); //<--- hier wird der Index des Telefonbuches eingestellt, bei mir 0
...

Auf der Synology (und im Prinzip identisch auch auf QNAP) müssen der Webserver samt PHP installiert und aktiviert sein ("Webstation"), so dass man eben Webseiten mit PHP vom NAS abrufen kann. Meist wird dazu automatisch ein Verzeichnis "web" angelegt, welches gleichbedeutend mit dem document root-Ordner des Webservers ist. Meine Synology hat z.B. die IP-Adresse 192.168.200.8 und im Web-Verzeichnis "web" gibts den Ordner "ptx", der enthält das Skript. Also lautet die im Yealink einzutragende bzw. im Browser zu testende URL: http://192.168.200.8/ptx/phone.php

Hat man andere Web-Anwendungen auf dem NAS installiert (z.B. PHP-Myadmin, Joomla oder gar ein ERP-System), kann das web-Verzeichnis bereits recht voll und damit unüberscihtlich sein, hier muss man dann auf mögliche Namenskonflikte achten. Aber der Ordner fürs Skript kann im Prinzip beliebig heissen. Auf Groß/Kleinschreibung ist immer zu achten, auch in der URL, denn der Webserver und PHP arbeiten case-sensitiv.

Ob es funktioniert, sieht man bereits daran, dass bei einem Aufruf der Adresse im Browser eine lange Liste mit den Kontaktdaten zu sehen ist. Beim Ansehen des HTML-Sourcecodes erblickt man eine einzige lange Zeile, zusätzlich mit den XML-Tags ...

Im Yealink geht man unter dem Reiter "Verzeichnis" auf den Unterpunkt "remotes Telefonbuch" (s. Bild 1), der Rest ist eigentlich selbsterklärend. In den (bei mir leeren) anderen Zeilen könnte man Links auf Varianten des Skripts für andere Telefonbücher hinterlegen, oder man baut noch die Auswertung von zus. URL-Parametern in das Skript ein ... kann ich demnächst ja mal tun.

Mit der Option "Suche nach ein/ausgehendem Anruf" wird eingestellt, ob z.B. bei eingehendem Anruf die zugehörigen Daten aus dem Telefonbuch im Display angezeigt werden sollen. Mit der Option "Update-Zeituntervall" legt man in Sekunden fest, in welchem Zeitintervall das Telefon die Datei neu vom Skript laden soll, um Änderungen am Telefonbuch zu aktualiseren.

Zum Schluss muss man noch die Reihenfolge der Anzeige und die Unterscheidung zwischen lokalem und remotem Telefonbuch für die Anzeige am Yealink einrichten. Dazu geht man auf den Unterpunkt "Einstellung", s. Bild 2.

Auf dem Yealink selbst findet man die Telefonbücher dann im Startscreen, bei mir mit dem 2. Taster von Links unter dem Display (in den Standardeinstellungen). Etwas lästig finde ich die zweite Auswahlebene, so dass man unter "Externes Telefonbuch" nochmals OK (Mitteltaste im Cursorkreuz) drücken muss. Dann erst erscheinen das oder die konkreten Telefonbücher ...
 

Anhänge

Zuletzt bearbeitet:
  • Like
Reaktionen: Werner_1959

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Mein Zugang zur Fritzbox läuft über Benutzernamen und Passwort. Wo genau im folgenden Abschnitt (oder woanders auch noch?) muss ich den Benutzernamen und das Passwort der Fritzbox eingeben? Ich nehme an, dass Benutzername und Passwort der Synology hier nicht gebraucht wird, da das ja lokal läuft.

Was genau bedeutet das "esssb" in "$fb = new fb_soap ('esssb','192.168.200.1');"?

Code:
class fb_soap
{
    private $ip;
    private $user;
    private $password;

    public function __construct($password = false, $ip = 'fritz.box', $user = 'dslf-config')
    {
        $this->ip       = $ip;
        $this->user     = $user;
        $this->password = $password;
    }

    public function getSOAPclient()
    {  
            $client = new \SoapClient(
                null,
                array(
                    'location'   => "http://".$this->ip.":49000/upnp/control/x_contact",
                    'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
                    'noroot'     => true,
                    'login'      => $this->user,
                    'password'   => $this->password,
                    'trace'      => true,
                    'exceptions' => true
                )
            );
        return $client;
    }

    public function getFBphonebook ($Phonebook)
    {
   
        $client = $this->getSoapClient();
        $result = $client->GetPhonebook(new \SoapParam($Phonebook,"NewPhonebookID"));
        return file_get_contents($result['NewPhonebookURL']);
    }
}

$fb = new fb_soap ('esssb','192.168.200.1');
$phonebook = $fb-> getFBphonebook(0);
 

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
der Zugang zur Fritzbox steht in der Zeile mit

$fb = new fb_soap ('esssb','192.168.200.1');

Das "esssb" ist mein Passwort, was ich vergessen habe zu entfernen, was aber nicht schlimm ist, weil nur intern. Wie ich schon in meiner vorherigen Antwort schrieb, kann der Konstruktor in 3 Varianten aufgerufen werden. Wenn du Benutzer und Passwort hast, musst du das so schreiben:

$fb = new fb_soap('password','IP oder Hostname der FB','username');

Aufgerufen wird das Ganze dann (ohne dein Zutun) über die Zeile

public function __construct($password = false, $ip = 'fritz.box', $user = 'dslf-config')

, wobei fehlende Parameter durch Default-Werte ersetzt werden. Allerdings darf es dabei keine Lücke geben, so dass du alle 3 Parameter setzen musst, wenn du einen User benötigst, weil der den letzten Parameter in der Liste belegt.

Zugangsdaten zur Synology werden nicht benötigt, weil der Order "web" in der Synology per Default für den virtuellen Nutzer "web" lesend freigegeben ist. Für den mittleren Parameter kannst du "fritz.box" einsetzen (sofern du deine Fritzbox nicht umbenannt hast) oder deren IP-Adresse. Die lautet meist (nicht immer) 192.168.178.1.
 
Zuletzt bearbeitet:

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Ich habe somit folgendes eingetragen (wobei bei mir jeweils die hier zutreffenden Werte für Passwort etc. eingetragen sind):

public function __construct($password = true, $ip = 'ip_meiner_fritzbox', $user = 'mein_username')
und
$fb = new fb_soap ('mein_passwort','ip_meiner_fritzbox','mein_username');

Alles andere habe ich unverändert gelassen. Es kommt jedoch HTTP ERROR 500, wenn ich die Seite über den Browser aufrufe. Ebenso, wenn ich die erste Zeile (public function __construct) unverändert lasse.

Auf der Synology hatte ich vorher den Webserver nicht installiert und beim Installieren vorsichtshalber alle im Paket-Manager verfügbaren Apache-Versionen und alle verfügbaren php-Versionen installiert.
 

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
Error 500 deutet auf ein Rechte-Problem im Webserver hin, wahrscheinlich im Zusammenmhang mit PHP. Probier mal die beiden angehängten Dateien (aus dem ZIP) im Web-Ordner der Synology abzulegen und per Browser aufzurufen, um das Problem weiter einzuengen. Berichte mal bitte ob und wie es geht. Tut mir leid, wenn ich da nicht sofort helfen kann. Ich habe das mal vor langer langer Zeit eingestellt und erinnere mich nicht mehr an Details ...

Schau mal auf das Bild. Öffne den Web-Ordner mit Filestation und sieh mal unter "Sicherheit" nach, ob das bei dir auch so aussieht. Es muss den Beutzer "http" geben und die gleichnamige Gruppe. Beide müssen im Ordner "web" mindestens lesen dürfen.
 

Anhänge

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
So wie auf dem Bild sehen die Rechte im Filemanager bei mir auch aus. Es werden eine Gruppe und ein User namens http angezeigt, die beide Leserechte haben.

Gehe ich auf "Systemsteuerung -> Gruppe" finde ich die Gruppe namens http. Gehe ich allerdings auf "Systemsteuerung -> Benutzer", so sehe ich dort keinen Benutzer "http"!

Die beiden Testdateien funktionieren einwandfrei.

Das mit den Rechten war meiner Erinnerung nach eher 401 oder 403. Wie auch immer, auch die unveränderte Datei aus dem ersten ZIP-Paket, also völlig unbearbeitet von mir, erbrachte den Fehler 500. Fehler 500 deutet meiner Erinnerung nach auf einen Programmfehler hin. Das kann - da das Programm bei dir ja funktioniert - hier z. B. bedeuten, dass die Fritzbox (bei mir Fritzbox 7590, OS 7.12) einen Müll (oder gar nichts) zurückgegeben hat, mit dem das Script nichts anfangen kann.

Was hat eigentlich die Zeile "'uri' => "urn:dslforum-org:service:X_AVM-DE_OnTel:1"," für eine Funktion? Die dort eingetragenen Werte sagen mir absolut nichts.

-- Zusammenführung Doppelpost by stoney

Ich habe mal ein wenig rumexperimentiert und zwei Blöcke eingefügt. Im nachfolgenden Codeausschnitt siehst du Block1, Mittelteil (das sind zwei Zeilen von dir), Block 2:

Code:
echo "1 " . $client;
echo "<br>";
echo "2 " . $ip;
echo "<br>";
echo "3 Hello";

$fb = new fb_soap ('emma&1996','192.168.0.40','Werner1959');
$phonebook = $fb-> getFBphonebook(0);

echo "<br>";
echo "4 " . $client;
echo "<br>";
echo "5 " . $ip;
echo "<br>";
echo "6 Hello2";
exit;
Ausgegeben wird vom Block 1 nur 1, 2 und 3 Hello. Die Inhalte der Variablen $clint und $ip werden nicht ausgegeben. Block 2 wird überhaupt nicht ausgegeben.

Wenn ich Block 1 komplett lösche (bzw. mit /* Block1 */ - temporär - rauskommentiere), kommt wieder der Fehler 500.

Das ist m. E. ein Klassiker: Das php-Script hat nichts, was es ausgeben kann, was meiner Erinnerung nach immer einen Fehler 500 produziert. Das dürfte bedeuten, dass der Zugriff auf die Fritzbox nicht funktioniert und somit nichts zum ausgeben vorhanden ist.
 
Zuletzt bearbeitet von einem Moderator:

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
a) Welche FritzOS-Version läuft auf deiner FB?

b) Wenn es ein PHP-Fehler ist (und die Fehlerausgabe bei dir aktiviert ist), sollte eine Zeilennummer mistsamt Fehlertyp von PHP ausgegeben werden, nicht nur der 500er HTTP-Error.


Da fällt mir nochwas ein: Hast du in der Fritzbox den UpnP-Programmzugriff aktiviert? Sonst geht wohl SOAP nicht. Findest du unter Heimnetz/Netzwerk/Netzwerkeinstellungen die Optionen (etwa mittig): Zugriff f. Anwendungen zulassen und Status per UpnP ...
 
Zuletzt bearbeitet:

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
a) Bei mir läuft auf der besagten FB 7590 Fritz OS 7.12, also die neueste.

b) Eine Zeilennummer wird bei mir nicht ausgegeben, bzw. ich überprüfe das nochmal. Welche php-Version hast Du auf deiner Synology installiert? Welche Apache-Version hast Du auf deiner Synology installiert? Ich werde dann genau das gleiche installieren, alle anderen Versionen deinstallieren und dann neu testen.

c) UpnP: muss ich überprüfen. Ich komme darauf zurück, wenn ich wieder am Gerät bin.
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,756
Punkte für Reaktionen
242
Punkte
63
Moinsen


War neugierig und hab das PHP mal bei mir gecheckt ;)

1. Unter Debian wurde noch benötigt: apt -y install php-soap
Davor hatte ich diesen Fehler in...
/var/log/apache2/error.log
Code:
[Tue Nov 12 18:01:57.455791 2019] [php7:error] [pid 4530] [client 192.168.188.21:43864] PHP Fatal error:  Uncaught Error: Class 'SoapClient' not found in /UNIONFS/var/www/html/phonebook.php:88\nStack trace:\n#0 /UNIONFS/var/www/html/phonebook.php(106): fb_soap->getSOAPclient()\n#1 /UNIONFS/var/www/html/phonebook.php(113): fb_soap->getFBphonebook(0)\n#2 {main}\n  thrown in /UNIONFS/var/www/html/phonebook.php on line 88
Im ersten Telefonbuch muss mindestens ein Eintrag zu sehen sein, die versteckten HD Kurzwahlen reichen nicht aus, dann klappt es...
Bildschirmfoto vom 2019-11-12 18-21-34.png
...aber trotzdem sieht das nicht nach "wohlgeformten XML" aus.

Da lässt sich noch was "aufpimpen" :cool:
In PHP werden die korrekten HTML Header mit der Funktion header() erzeugt.
...wie hier...
Bildschirmfoto vom 2019-11-12 18-32-05.png
...das ergibt dann...
Bildschirmfoto vom 2019-11-12 18-32-28.png
...brauchbares XML.

Übrigens
Die Ähnlichkeit des erzeugten XML mit SNOM/Cisco Telefonbüchern, macht das PHP auch für diese Geräte interessant.
Siehe zum Beispiel hier...
http://docs.snom.io/xml_minibrowser/

Nochwas...
Die uml() Funktion funktioniert hier nicht, die Umlaute werden aber ohne uml() korrekt dargestellt.
Deswegen habe ich diese Funktion in einen Dummy verwandelt...
PHP:
function uml($string) {
    return $string;                             
}
Beispielausgabe...
Bildschirmfoto vom 2019-11-12 20-44-21.png
 
Zuletzt bearbeitet:

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Nochmals zu b)
Es wird keine Zeilennummer ausgegeben. Der Chrome-Browser meldet nur:
"Diese Seite funktioniert nicht
192.168.0.24 kann diese Anfrage momentan nicht verarbeiten.
HTTP ERROR 500"


Was das UPnP betrifft:
Unter "Heimnetz->Netzwerk->Netzwerkeinstellungen->Heimnetzfreigaben" sind sowohl "Zugriff für Anwendungen zulassen" als auch "Statusinformationen über UPnP übertragen" aktiviert.
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,756
Punkte für Reaktionen
242
Punkte
63
@Werner_1959 - Hast du keine Apache Logs?
Normalerweise: /var/log/apache2/error.log

Und etwas deutlicher zur Konfiguration...
FRITZ!BOX 7590 mit Benutzername und Passwort
public function __construct($password = 'benutzerpasswort', $ip = 'fritz.box', $user = 'benutzername')
...
$fb = new fb_soap ('benutzerpasswort','fritz.box');
...so funktionierts bei mir ;)
 
Zuletzt bearbeitet:

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Wie komme ich über die normale Weboberfläche der Synology an dieses Log-Verzeichnis?
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,756
Punkte für Reaktionen
242
Punkte
63
Ohne Konsolenzugriff wirds wohl nichts.
Kein SSH Zugang?

Ansonsten kann das PHP auch auf Fehlerausgabe getrimmt werden.
Moment muss mal kramen...
...
Also ganz Oben ins Skript, direkt unter dem <?php machste mal...
PHP:
<?php
// Melde alle PHP Fehler
error_reporting(-1);
Quelle:
https://www.php.net/manual/de/function.error-reporting.php

@qualidat & @Werner_1959
Ich mag Skripten und Webserver :cool:
Wie wärs wenn wir das zusammen aufpimpen?
Für die Ausgabe auf einen Webbrowser bedarf es nur ein wenig XSLT/XSL/XPath.
Wie? - Noch nie gehört?
Guckstdu...
/test.xsl
HTML:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="/">
<html>
<head><title>FRITZ!BOX PHONEBOOK</title></head>                    
<body style="background-color:black;color:green;">
<!--FRITZ!BOX PHONEBOOK-->          
<xsl:for-each select="/IPPhoneDirectory/DirectoryEntry">                                        
<xsl:element name="article"><xsl:value-of select="Name" separator=""/></xsl:element>               
<xsl:element name="article"><xsl:value-of select="Telephone" separator=""/></xsl:element>
</xsl:for-each>                                                                                 
</body>                                                                                         
</html>                                                                                         
</xsl:template>
</xsl:stylesheet>
...nennt sich auch: Stylesheet
Im Kopf der XML angegeben...
PHP:
header('Content-Type: text/xml');                                             
echo('<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/test.xsl"?>    
<IPPhoneDirectory>                                                                 
');                                                        
                                                                                             
for ($i=0; $i<count($records);$i++)         
{                                         
    $rec=$records[$i];                                 
    $nam=get_name($rec);                                                           
    $cnt=get_anz($rec);                                    
                                                                                             
    if ($nam>'' and $cnt>0 )                                                  
    {                                     
        for($k=1;$k<=$cnt; $k++)                       
        {                                                                          
            $part=get_part($rec,$k);                       
            $typ=get_typ($part);                                                             
                                                                              
            if($typ>':' and $typ!='INT' and $typ!='MEM')
            {                                    
echo('<DirectoryEntry>                            
<Name>'.substr($nam,0,32)." [".get_typ($part).']</Name>
<Telephone>'.get_num($part).'</Telephone>                                                    
</DirectoryEntry>');                                                          
            }                                         
        }                                              
    }                                                                              
}                                                          
echo('                                                                                       
</IPPhoneDirectory>                                                           
');
...ergibt das...
Bildschirmfoto vom 2019-11-12 23-41-07.png
...diese Anzeige.
:cool: ( Extra simpel gehalten )
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Werner_1959

qualidat

Neuer User
Mitglied seit
25 Apr 2011
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
Ich würde Werner ja gerne helfen, aber da das Skript bei mir funktioniert (sonst hätte ich es niemals veröffentlichert), weiss ich nicht, wo ich ansetzen soll.

Das XML ist explizit den Vorgaben von Yealink angepasst, auch wenn es etwas rudimentär aussieht.

Zusätzliche XML-Libraries für PHP, die es zweifellos gibt, wollte ich ganz bewusst nicht verwenden, damit das Skript auf keinerlei Importe angewiesen ist, deshalb das händische Parsing. Auch wollte ich zusätzliche Installationen und Konfigurationen aller Art soweit als irgend möglich vermeiden, weil das viele eben nicht können.

Die Umlaut-Umcodierung war bei mir notwendig, damit die Umlaute korrekt auf einem Grandstream GXP2020 dargestellt werden, vlt. ist das Yealink da ja flexibler, mir ist keine Fehldarstellung aufgefallen, deshalb habe ich daran nichts geändert.

Das Anzeigen der Daten im Browser habe ich Werner nur als Kontrollfunktion empfohlen, für eine konkrete Verwendung sehe ich da momentan nicht viel Sinn drin, deshalb ist da auch keinerlei HTML oder gar CSS eingebaut. Im Gegenteil, dann verstünde das Yealink Fon die Daten nicht mehr.

Natürlich könnte man auf Basis dieses Zugriffs eine eigene FB-Telefonbuch-Webanwendung entwickeln, möglicherweise sogar mit Erfassungs-, Korrektur- und Rückschreibe-Möglichkeit. Allerdings: Das hat ja die Fritzbox bereits eingebaut ... ?

Ach so ... : Ich verwende auf der Synology Apache 2.2 und PHP 7.0. Auf meiner FB 7362 läuft FritzOs 7.12
 
  • Like
Reaktionen: Werner_1959

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,756
Punkte für Reaktionen
242
Punkte
63
Moinsen


Was genau bedeutet das "esssb" in "$fb = new fb_soap ('esssb','192.168.200.1');"?
Gar nichts ;)
Die Klasse fb_soap() wertet das überhaupt nicht aus.
Kannste also ändern in: $fb = new fb_soap ();
...dann verwirrt es nicht mehr so ;)

Die Zuweisung machste am Besten komplett hier...
public function __construct($password = 'benutzerpasswort', $ip = 'fritz.box', $user = 'benutzername')


Das Anzeigen der Daten im Browser habe ich Werner nur als Kontrollfunktion empfohlen, für eine konkrete Verwendung sehe ich da momentan nicht viel Sinn drin, deshalb ist da auch keinerlei HTML oder gar CSS eingebaut. Im Gegenteil, dann verstünde das Yealink Fon die Daten nicht mehr.
Das PHP liefert immer die XML Elemente aus.
Die Transformation mittels XSL Stylesheet findet im Webbrowser statt.
Also nicht Serverseitig.
Ich weiss leider nicht inwieweit Grandstream und Yealink XML Deklarationen ignorieren, wenn sie sie nicht kennen/verarbeiten.
SNOM und Cisco Geräte stören sich jedenfalls nicht an den zusätzlichen Headern wie...
HTML:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../fbphb.xsl"?>
Das Stylesheet hab ich um Ausgaben in "text/text" und "text/html" erweitert.
( Verbirgt sich hinter den Buttons: Name + Nummer )
Dafür hab ich in der PHP den header() noch auf diese Art erweitert...
header('content-type: '.htmlspecialchars($_GET['typ']));
...und mittels XSL Stylesheet in eine HTML-Tabelle transformiert...
Bildschirmfoto vom 2019-11-14 11-25-29.png
Aufruf ohne URL Argument "typ" transformiert XML > HTML mittels XSL Stylesheet

Bildschirmfoto vom 2019-11-14 11-28-04.png
Aufruf mit Argument: phonebook.php?typ=text/text
( Keine Transformation )
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Werner_1959

Werner_1959

Mitglied
Mitglied seit
9 Sep 2016
Beiträge
304
Punkte für Reaktionen
5
Punkte
18
Ich probiere das gelegentlich nochmal weiter, wenn ich wieder mehr Zeit habe. Mit Konsole und SSH hab ich nichts am Hut.
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
233,332
Beiträge
2,032,893
Mitglieder
351,897
Neuestes Mitglied
MaxMust23