[Gelöst] XML Directory

Mach das taktisch/strategisch...

Einmal alles in UNIX/ANSI testen.
Einmal alles in UNIX/UTF-8 ohne BOM.

...wie schon geschrieben, der Code geht so, ohne Änderung.
Wenns dann immer noch hakt, kann es eigentlich nur noch am PHP
(irgendeine Einstellung in der php.ini) liegen, schätze ich.
 
Keine Ahnung ob das klappt.

Wenn ich z.B. die index.php als Unix und ANSI/ASCII abspeichere und dann im Firefox auf "Seiteninformation anzeigen" gehe wird mir genau das gleiche angezeigt, wie wenn ich die Datei als Unix und UTF-8 abspeichere.

Kodierung ist in beiden Fällen UTF-8.

Funktionieren tut es aber nicht.
 
Zuletzt bearbeitet:
Moin

Das mit der Kodierung ist knifflig und vielleicht auch nicht das Problem.
Wir/Du müssen das aber mit Sicherheit ausschliessen können.

Schau dir mal die index.php im Windows Notepad (Texteditor) an.
Dann bekommst du auch mal den Unterschied zwischen Unix/ANSI
und wie Windows das sieht, mit.
...nicht gerade flüssig lesbar, nicht wahr?

Im Prinzip kann Apache/PHP aber mit so einen Einzeiler schon was anfangen.

Ein BOM kannst du daran erkennen, dass am Anfang der ersten Zeile unlesbarer Code steht.
...deswegen kommen Interpreter damit nicht klar

Was die php.ini angeht.
Such in der mal nach dieser Direktive...
php.ini
Code:
; This directive determines whether or not PHP will recognize code between
; <? and ?> tags as PHP source which should be processed as such. It's been
; recommended for several years that you not use the short tag "short cut" and
; instead to use the full <?php and ?> tag combination. With the wide spread use
; of XML and use of these tags by other languages, the server can become easily
; confused and end up parsing the wrong code in the wrong context. But because
; this short cut has been a feature for such a long time, it's currently still
; supported for backwards compatibility, but we recommend you don't use them.
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/short-open-tag
[COLOR=#ff0000][B]short_open_tag = Off[/B][/COLOR]
; XAMPP for Linux is currently old fashioned
[COLOR=#ff0000][B]short_open_tag = On[/B][/COLOR]
(sieht widersprüchlich aus, aber der zuletzt definierte gilt. Also: On)
...vielleicht liegt es auch daran.

Am End liegt es also am Skripter (Verantwortung) und seinem Stil wie kompatibel seine Skripte mit "normalen" Systemen sind/laufen.

Also: Strenge Einstellungen erlauben den Shorttag nicht.
Abhilfe: Alle vorkommen von <? ändern in: <?PHP oder <?php
Groß oder klein "sollte" dabei völlig egal sein.
...mit der suchen/ersetzen Funktion ist das ja auch kein Problem.
 
Zuletzt bearbeitet:
Ja, mit dem Editor ist es sehr unübersichtlich.
 
:groesste:

LÄUFT!!!!!
 
Pfff, endlich. :D
...das war mal eine schwere Geburt.

Ich tipp mal darauf dass du alle <? in <?php geändert hast.
...oder warum läufts auf einmal?
 
genau, habe alle <? in <?php geändert
 
Ja, das ist verzwickt, nicht wahr?

Da html5 UTF-8 kodiert ist, nimm als Webbrowserstandard: Unicode
...nicht mehr Westlich.

Du kannst auch mal testen ob alles OK ist wenn dein Benutzer als Sprache "english" benutzt.

Auch das funktioniert. Sprich, Umlaute werden im Browser richtig dargestellt. Im Telefon ist dadurch die Menüführung auf Englisch.

EDIT:
Dann habe ich einfach in der en.inc.php die deutschen Begriffe eingefügt, so dass ich dadurch wieder eine deutsche Menüführung habe.
 
Zuletzt bearbeitet:
MIB!

Machst du Kuddelmuddell?

So meinte ich das...
xdir_user_lang_01.png
...die Eingabemasken funktionieren doch jetzt, oder immer noch nicht?
xdir_user_lang_02.png
Erst nach ausloggen/einloggen wird die Sprache (im Webinterface) umgestellt.
Solltest doch nur testen, was du letztendlch benutzt ist natürlich dein Bier.

xdir_snom_01.png
(Nicht wundern, ich bastel die ganze Zeit an der Optik) :grin:
 
Zuletzt bearbeitet:
Bei mir hat das dazu geführt, dass das Telefon auf Englisch war.

Habe nun einen zweiten Benutzer hinzugefügt, dann umgestellt, dann war der Text im Browser auf Englisch.
 
Auch die XML fürs Telefon sind davon betroffen und benutzen die Sprache des Benutzers dem das Telefon zugewiesen wurde.
...von daher ganz normal und auch so gewollt.

Letztendlich ist das Webfrontend nur zur Konfiguration und zum Befüllen da.
Ein englischsprechender/verstehender Telefonbenutzer bekommt dann eine dementsprechende Menüführung.

Ich denke dein Problem mit "XML Directory" ist jetzt auch soweit gelöst, richtig?

Dann kannst du deinen ersten Post #1 bearbeiten, Erweitert klicken und das Suffix [Gelöst] setzen.
...vielleicht lockt das Interessierte an. :mrgreen:

Trotzdem können wir hier durchaus (trotz Gelöst) weiter machen wie bisher.

Vielleicht auch im ersten Post deine "XML Directory" Installation als ZIP Archiv anbieten?
...für Cisco Benutzer die das mal testen möchten.
 
Zuletzt bearbeitet:
Ja, mein eigentliches Problem ist gelöst.

Ich wollte Dir dafür recht herzlich danken, dass Du damit das ganze verlängerte Wochenende verbracht hast.

Insofern könnte man daran denken, die bereits erwähnte Funktion "Name statt Nummer" anzugehen. Vielleicht gibt es hierfür noch andere Interessierte.

Jedoch habe ich keinen Asterisk-Server und auch keine Ahnung davon, wie man so etwas einrichtet und ob mir das nicht zu kompliziert ist.

Post #1 aktualisiert

Danke Dir nochmals
 
Zuletzt bearbeitet:
Nun, ich habe kein Cisco IP-Telefon.

Mit einem SNOM wäre das mal wieder relativ easy zu Bewerkstelligen.
Denn so eine Action URL kann auch bei einem Ereignis abgefeuert werden.
In diesem Fall: Bei einen eingehenden Anruf.

Die PHP kann dann direkt die directory.php Funktion für die Suche, oder eine Ähnliche, die dann den Namen (XML) aufs Display zaubert.

Das geht dann ganz ohne Asterisk, theoretisch, denn dieses Skript hat ja noch Keiner geschrieben.
...bzw. directory.php müsste entsprechend erweitert werden.

Gibt es was vergleichbares bei den Ciscos?

PS: Was ich interessant fände in diesem Zusammenhang :D
Ein Telefonbuchlernmodus
Soll heissen: Jeder Anruf wird Mithilfe (oder auch ohne) einer Onlinerückwärtssuche ins Telefonbuch eingetragen.
...denn rauslöschen ist nicht so mühsam wie eintragen. :mrgreen:
 
Zuletzt bearbeitet:
In dem Original-Archiv gibt es die

get_callername.php

PHP:
#!/usr/bin/php -q
<?php

  // Konfigurations Array - Anpassen an dein System
  $sql_data = array(
    database_server => 'localhost',
    database        => 'xml_directory',
    database_user   => 'xml_user',
    database_pawd   => 'xml123'
  );

  // $CALLERID bei Aufruf aus der extensions.conf übergeben
  $caller_num = $argv[1];
  if ($caller_num == "0CID withheld") $caller_num = "inkognito";
  $caller_num = strtok($caller_num, "\"");

  if(is_numeric($caller_num))
  {
    // das SELECT zusammenbauen
    $query  = "select * from directory_entries, directory_numbers ";
    $query .= "where directory_entries.entry_id = directory_numbers.entry_id ";
    $query .= "and number = '$caller_num'";

    // zur Datenbank verbinden
    connect_db($sql_data);

    // query an die Datenbank
    $result = safe_query($query);

    if (mysql_num_rows($result) == 0)
    {
      // wurde kein passender Name in der Datenbank gefunden setze den Namen auf "Kein Name"
      $CIDname = "Kein Name";
    }
    else
    {
      // den ersten Treffer in der DB als Name einsetzen
      $row = mysql_fetch_array($result, MYSQL_ASSOC);
      $CIDname = $row['name'] . " " .  $row['lastname'];
      mysql_free_result($result);
    }
  }

  // die neue CallerID setzen
  echo "SET CALLERID \"$CIDname\"<$caller_num>\n";

function connect_db($sql_data)
{
  $noconnect = "Die Verbindung konnte nicht aufgebaut werden";
  $notfound = "Konnte Datenbank nicht selektieren";
  mysql_connect($sql_data['database_server'], $sql_data['database_user'], $sql_data['database_pawd']) or die($noconnect);
  mysql_select_db($sql_data['database']) or die ($notfound);
}


function safe_query($query)
{
  global $query_debug;
  if (empty($query)) { return FALSE; }
  if (!empty($query_debug)) { print "<pre>$query</pre>\n"; }
  $result = mysql_query($query)
  or die("ack! query failed: "
  ."<li>errorno=".mysql_errno()
  ."<li>error=".mysql_error()
  ."<li>query=".$query
  );
  return $result;
}

?>

die man nach /var/lib/asterisk/agi-bin kopieren und ausführbar machen soll ("chmod +x get_callername.php")

Insofern denke ich, dass es nur über Asterisk geht?
 
Richtig.
Diese PHP wird mit der Telefonnummer als Argument für die Suche gefüttert.
Dann wird in der Tabelle directory_entries danach gesucht.
Anschliessend wird der gefundene Name, oder "Kein Name" in $result zurückgeliefert.

Diese PHP* ist dazu gedacht in einer Shell oder aus einem Shellskript heraus zu Laufen.
Deswegen hat die auch ein SHEBANG in der ersten Zeile.

Allerdings bedarf es für Asterisk die richtige Umsetzung, im passenden Context/Extension.
...gibt es dafür auch ein Beispiel?

So eine (ähnliche) Funktion, inklusive XML für das Cisco, befindet sich in: xml/directory.php
Code:
http://localhost/directory/xml/directory.php?name=Telefonname&action=do_search
...liefert das gesamte Telefonbuch.
Code:
http://localhost/directory/xml/directory.php?name=Telefonname&action=do_search&firstname=koy
...zeigt nur den Eintrag mit Vornamen: koy

* Das geht auch in MS Windows, wenn php.exe an Bord.
(Direkter Aufruf scheitert das SHEBANG gilt dann als Info wo php.exe ist)

Erstmal das PHP [p]reparieren...
get_callername.php
PHP:
#!C:\xampp\php\php.exe -q
<?php
error_reporting(0);
  // Konfigurations Array - Anpassen an dein System
  $sql_data = array(
    database_server => 'localhost',
    database        => 'xml_directory',
    database_user   => 'admin',
    database_pawd   => 'admin'
  );

  // $CALLERID bei Aufruf aus der extensions.conf übergeben
  $caller_num = $argv[1];
  if ($caller_num == "0CID withheld") $caller_num = "inkognito";
  $caller_num = strtok($caller_num, "\"");

  if(is_numeric($caller_num))
  {
    // das SELECT zusammenbauen
    $query  = "select * from directory_entries, directory_numbers ";
    $query .= "where directory_entries.entry_id = directory_numbers.entry_id ";
    $query .= "and number = '$caller_num'";

    // zur Datenbank verbinden
    connect_db($sql_data);

    // query an die Datenbank
    $result = safe_query($query);

    if (mysql_num_rows($result) == 0)
    {
      // wurde kein passender Name in der Datenbank gefunden setze den Namen auf "Kein Name"
      $CIDname = "Kein Name";
    }
    else
    {
      // den ersten Treffer in der DB als Name einsetzen
      $row = mysql_fetch_array($result, MYSQL_ASSOC);
      $CIDname = $row['name'] . " " .  $row['lastname'];
      mysql_free_result($result);
    }
  }

  // die neue CallerID setzen
  echo "SET CALLERID \"$CIDname\"<$caller_num>\n";

function connect_db($sql_data)
{
  $noconnect = "Die Verbindung konnte nicht aufgebaut werden";
  $notfound = "Konnte Datenbank nicht selektieren";
  mysql_connect($sql_data['database_server'], $sql_data['database_user'], $sql_data['database_pawd']) or die($noconnect);
  mysql_select_db($sql_data['database']) or die ($notfound);
}


function safe_query($query)
{
  global $query_debug;
  if (empty($query)) { return FALSE; }
  if (!empty($query_debug)) { print "<pre>$query</pre>\n"; }
  $result = mysql_query($query)
  or die("ack! query failed: "
  ."<li>errorno=".mysql_errno()
  ."<li>error=".mysql_error()
  ."<li>query=".$query
  );
  return $result;
}

?>
Jetzt müssen wir es noch chmodden....
...nee spass. ;)

Jetzt müssen wir es nur noch in der cmd.exe ausführen...
Code:
cd C:\xampp\htdocs\directory\agi
C:\xampp\htdocs\directory\agi>C:\xampp\php\php.exe -q get_callername.php 1
SET CALLERID "Kein Name"<1>
C:\xampp\htdocs\directory\agi>C:\xampp\php\php.exe -q get_callername.php 100
SET CALLERID "Asterisk Zeit"<100>
 
Zuletzt bearbeitet:
PS: Was ich interessant fände in diesem Zusammenhang :D
Ein Telefonbuchlernmodus
Soll heissen: Jeder Anruf wird Mithilfe (oder auch ohne) einer Onlinerückwärtssuche ins Telefonbuch eingetragen.
...denn rauslöschen ist nicht so mühsam wie eintragen. :mrgreen:

Gute Idee. Man müsste dann aber, sowohl Nummer als auch Namen/Vorname eintragen lassen, da man wohl keine Nummer eintragen lassen kann, ohne einen Namen zu haben, oder? Ich habe auch bemerkt, dass man ohne einen Vorname keine Nummer eintragen lassen kann. Und wird dann jede fremde Nummer eingetragen, oder soll man das noch beeinflussen können?


Allerdings bedarf es für Asterisk die richtige Umsetzung, im passenden Context/Extension.
...gibt es dafür auch ein Beispiel?

Ich habe dazu leider nichts gefunden.

Aber hier gibt es ein Tutorial, welches die generelle Einrichtung von Asterisk zeigt.
 
Mehrfacheinträge verhindern (Logik)
Als Name eignet sich die Nummer,
als Nachname das Datum,
dann würd ich Doppelteintragungen verhindern,
indem diese einfach überschrieben, updated, werden.
...genauso plump geht das mit den Erkannten. ;)

Beispiel: 20x angerufen worden von 1234567, aber nur ein Eintrag mit letzten Anrufdatum/Zeit

Naja, Zuverlässigkeit, was die API Server und Trefferquoten angeht, vorrausgesetzt,
dann bräucht es schon geeignete Bedingungen, obs dann rein kann/soll...
und und und
...einfach ist das nicht.

Asterisk
Yup, und wenn das alles soweit verstanden ist, kann eigentlich gleich losgegoogelt werden...
asterisk set callerid
1. Treffer Asterisk Buch in deutsch beschreibt das mit Beispielen. ;)
...ist also ganz einfach.
 
Zuletzt bearbeitet:
Na dann kann ja nichts mehr schief gehen :)
 
:shock: Doch, das kann es immer. :mrgreen:

Asterisk könnte zum Beispiel verlangen das ich alles in <?ast...?> eintaggen soll.
...ohne es mir mitzuteilen.
:rolleyes:
 
Zuletzt bearbeitet:
Bin nicht sicher, wegen der Tags :) Aber ohne mir mitzuteilen: Was er bei mir nicht will, ist: chmod +x get_callername.php

Es heißt immer: no such command 'chmod'

Ich hoffe, dass ich ansonsten Asterisk richtig eingerichtet habe.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.