php.de

Zurück   php.de > php.de Intern > Beitragsarchiv > Adventskalender 2008

 
 
LinkBack Themen-Optionen
Alt 15.12.2008, 00:01   #1 (permalink)
Adventskalenderöffner
 
Benutzerbild von Nikolaus 2.0
 
Registriert seit: 27.11.2008
Beiträge: 48
Nikolaus 2.0 befindet sich auf einem aufstrebenden Ast
Standard 1111: AJAX meets PHP (indirectly)

1111:
AJAX ist mittlerweile aus dem Web nicht mehr wegzudenken. Nahezu jede Webzwonullige Seite benutzt AJAX. Hier soll es jedoch nicht um Fluch und Segen dieser Technologie gehen, sondern schlicht und einfach um die Verarbeitung eines AJAX-Requests.

Wie erkennt man einen AJAX-Request? Die häufigste Variante ist die, eine spezielle PHP-Datei für die Verarbeitung eines AJAX-Requests zu erstellen, die dann vom Browser (via AJAX) aufgerufen wird. Dies führt jedoch oft zu redundantem Code und das wollen wir nicht.
Es muss also eine Lösung her, AJAX-Requests zu erkennen und die Ausgabe entsprechend anzupassen, ohne den eigentlichen Inhalt der PHP-Datei kopieren und ändern zu müssen.

1. Die Klassen
Um dies zu realisieren, benötigt man Klassen für die Annahme eines Requests und für die Ausgabe. Da mehrere dieser Klassen existieren können, werden sie gegen ein Interface implementiert.
Die Standardklassen sind auf einen ganz normalen HTTP-Request ausgelegt:
PHP-Code:
interface Request
{
    public function 
getParam($name);
}

interface 
Response
{
    public function 
write($output);
    public function 
flush();
}


class 
HTTPRequest implements Request
{
    public function 
getParam($name)
    {
        return isset(
$_REQUEST[$name]) ? $_REQUEST[$name] : null;
    }
}

class 
HTTPResponse implements Response
{
    private 
$output '';
    
    public function 
write($output)
    {
        
$this->output .= $output;
    }
    
    public function 
flush()
    {
        print 
$this->output;
    }

Den konkreten Inhalt dieser Klassen spare ich mir und schreibe nur die wichtigsten Methoden auf.
Wenn das Skript nun ausgeführt wird, werden jeweils Instanzen der Klassen angelegt:
PHP-Code:
$request  = new HttpRequest();
$response = new HttpResponse();

// eigentliches Skript
$param $request->getParam('foobar');
$response->write('You entered: ' htmlspecialchars($param));
$response->flush(); 
Als nächstes sollen die Klassen für den AJAX-Request angelegt werden:
PHP-Code:
class AjaxRequest implements Request
{
    public function 
getParam($name)
    {
        return isset(
$_REQUEST[$name]) ? $_REQUEST[$name] : null;
    }
}

class 
AjaxResponse implements Response
{
    private 
$output = array();
    
    public function 
write($output)
    {
        
$this->output[] = $output;
    }
    
    public function 
flush()
    {
        
$procOutput '{';
        
$first true;
        foreach (
$this->output as $key => $value) {
            if (
true !== $first) {
                
$procOutput .= ', ';
            }
            
$first false;
            
$procOutput .= "'" $key "' : '" addslashes($value) . "'";
        }
        
$procOutput .= '}';
        print 
$procOutput;
    }

Diese tut genau das Gleiche, nur wird die Antwort diesmal in einen JSON-String verpackt.
Um jetzt statt der normalen HTTP-Verarbeitung die AJAX-Verarbeitung einzuschalten, müssen nur die beiden Instanziierungen geändert werden, der Rest des Skripts bleibt unverändert:
PHP-Code:
$request  = new AjaxRequest();
$response = new AjaxResponse(); 
Doch wie erkennt man nun, dass man die AJAX-Klassen benutzen muss?

2. Erkennung eines AJAX-Requests
Ein AJAX-Request ist in erster Linie ein HTTP-Request und sieht deshalb im Regelfall genauso aus und ist nicht von einem „normalen“ Request zu unterscheiden. Die Anforderung einer AJAX-Verarbeitung muss also schon auf Benutzerseite erfolgen. Das ist aber auch gar nicht schlimm, da die Benutzerseite ja eh entscheidet, ob sie die Daten jetzt per AJAX holen will oder nicht. Um PHP mittzuteilen, dass es sich um einen AJAX-Request handelt, kann man mehrere Dinge tun:
  • Senden eines GET-Parameters:
    Es ist möglich, einen GET-Parameter an den URL anzuhängen, anhand dessen ein AJAX-Request dann identifiziert werden kann:
    Code:
    http://www.example.com/index.php?ajax=true

    -
  • Ändern des User-Agents:
    Beim AJAX-Request kann der User-Agent erweitert werden:
    Code:
    ajaxObject.setRequestHeader('User-Agent', navigator.userAgent + ' Ajax');
    Das Problem hierbei ist, dass User, die Ajax im normalen User-Agent haben, immer nur AJAX-Antworten bekommen. Das Risiko ist zwar mehr als gering, aber es besteht. Außerdem wollen viele nicht, dass ihr User-Agent geändert wird und die Log-Files freuen sich auch über Einträge „neuer“ Browser.

    -
  • Senden eines zusätzlichen Headers:
    Dies halte ich für die beste Variante neben dem Senden eines GET-Parameters. Dabei wird ein zusätzlicher (nicht-standardisierter) HTTP-Header an den Server gesendet:
    Code:
    ajaxObject.setRequestHeader('X-Ajax-Request', 1);
    Das X am Anfang sollte man auf jeden Fall benutzen, da hierdurch proprietäre Header gekennzeichnet werden.
    In PHP lässt sich dieser Header dann über das $_SERVER-Array abfragen:
    PHP-Code:
    $isAjax = (bool)$_SERVER['HTTP_X_AJAX_REQUEST']; 
    Wenn PHP als Apache-Modul läuft, kann auch die Funktion apache_request_headers() genutzt werden.
Nikolaus 2.0 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.12.2008, 00:04   #2 (permalink)
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 319
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

zum thema ajax und php fällt mir noch xajax ein.

Ich hab es lieben gelernt

xajax PHP Class Library - The easiest way to develop asynchronous Ajax applications with PHP
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline  
Alt 15.12.2008, 00:07   #3 (permalink)
Supermoderator
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 6.591
PHP-Kenntnisse:
Fortgeschritten
Manko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer AnblickManko10 ist ein wunderbarer Anblick
Standard

Kannte ich nocht gar nicht, macht aber zunächst einmal einen guten Eindruck.
Vielen Dank für die Ergänzung!
__________________
Rettungsplan Deepwater Disaster:
Pumpt das Öl ins Meer, läuft doch alles wie geschmiert! ― Gebt euch betroffen, wir sind ja alle Opfer! ― Last but not least Plan B: versucht Plan A nochmal!
Manko10 ist offline  
Alt 15.12.2008, 00:15   #4 (permalink)
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 319
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

Gibt auch verschiedene Plugins zu der Bibliothek, am erwähnenstwertesten ist das Plugin modal Window:

[url=http://www.xajaxproject.de/2007/12/19/modal-window-plugin/]offizielle deutsche XAJAX Projektseite
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline  
Alt 15.12.2008, 00:18   #5 (permalink)
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 319
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

ups, bearbeiten geht hier wohl nicht, hier der Fehlerfreie Post:

aus meinen Bookmarks, einmal ein CodeIgniter Setup für Xajax:

Wiki | CodeIgniter

und einmal das Plugin modal Window das meiner Ansicht nach sehr erwähnenswert ist:

offizielle deutsche XAJAX Projektseite � modal Window Plugin

Nichts zu danken, ich ergänze wo ich kann
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline  
Alt 15.12.2008, 11:00   #6 (permalink)
Erfahrener Benutzer
 
Benutzerbild von tomtaz
 
Registriert seit: 17.06.2008
Beiträge: 1.757
PHP-Kenntnisse:
Fortgeschritten
tomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig nett
tomtaz eine Nachricht über ICQ schicken tomtaz eine Nachricht über Skype™ schicken
Standard

Wieder mal sehr interresant. Mit dem zusätzlichen Header kannte ich noch nicht, und dass es dann auch noch in $_SERVER steht ist mir ganz neu...

*gleichmeineAjaxKlasseerweitern*
__________________
Mfg Tomtaz
"Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."
tomtaz ist offline  
 


Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Encoding PHP - AJAX iXtends PHP Tipps 2008 12 10.11.2008 09:36
Ajax Formular problem mit eingabe themonk JavaScript, Ajax und mehr 2 01.11.2008 20:25
Umlaute und Ajax themonk JavaScript, Ajax und mehr 5 12.10.2008 18:30
Probleme mit Sonderzeichen bei Ajax (prototype)... go1denboy JavaScript, Ajax und mehr 1 31.08.2008 18:44
AJAX Standardscript dowelman JavaScript, Ajax und mehr 39 23.08.2008 21:37
[Erledigt] Wann lohnt sich AJAX Mikay Kun Off-Topic Diskussionen 6 23.07.2008 17:55
AJAX auf entfernte Datei GSJLink HTML, Usability und Barrierefreiheit 5 02.03.2008 11:29
AJAX: Session-Inhalt an PHP Curanai HTML, Usability und Barrierefreiheit 2 05.11.2007 15:45
AJAX open mit POST und GET DonTermi HTML, Usability und Barrierefreiheit 5 04.10.2007 18:22
Fileupload via AJAX GSJLink HTML, Usability und Barrierefreiheit 11 07.09.2007 15:44
Ajax bild.php aktualisieren M3g4Star HTML, Usability und Barrierefreiheit 3 09.03.2007 17:14
innerHTML funktioniert nicht bei AJAX request Plague HTML, Usability und Barrierefreiheit 1 21.12.2006 14:30
Ajax und Sonderzeichen? GSJLink HTML, Usability und Barrierefreiheit 1 11.11.2006 14:36
AJAX: Newsflash: How to? SvenLittkowski HTML, Usability und Barrierefreiheit 11 26.09.2006 23:14
AJAX - Pro <-> Kontra Diskussion El Barto HTML, Usability und Barrierefreiheit 16 17.09.2005 20:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
ajax flush, ajax header senden, flush php ajax, xajax setting ändern, php ajax und flush(), ajax php modal, ajax flush php, \$.ajax\ flush(), xajax plugin erstellen, live ajax request, ajax request flush(); php, php isajax, modal window in php, modalwindow xajax, php ajax request erkennen header, php output rest-request, ajax adventskalender, xajax header senden, ajax php, xajax flush

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum