Anzeige

[AJAX] Komplette Seite als Resultat

[AJAX] Komplette Seite als Resultat | PSD-Tutorials.de

Erstellt von K-Dawg, 12.05.2011.

  1. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    Hi,

    ich hab mit Ajax nicht so viel Erfahrung, aber ich komme direkt zur Sache.

    Ich habe vor in einem <div> Informationen per Ajax zu laden.

    Also kurze Beschreibung.
    Als Beispiel:
    Auf einer Seite solle eine Art News sein. Die News wird komplett aus der DB geladen und gekürzt auf einer Übersicht angezeigt. Um die ganze News sehen zu können wird per klick auf einem Link die ganze Seite neu geladen und die News im Detail angezeigt.

    So weit so gut. Funktioniert.

    Dies sollte auch das Standardverhalten sein wenn kein JS aktiviert ist.

    Sollte JS aktiviert sein, sollte per klick auf dem gleichen Link, die News im Detail geladen werden (per ajax) und in dem Div zu dem die News gehört ersetzt werden.

    Soweit funktioniert das mit jQuery auch. Das Problem welches ich dabei habe ist jedoch, in dem <div> wird die komplette Seite geladen.

    Kurze Einführung in die Problematik.

    der Link zu Newsdetail sieht in etwa so aus:
    PHP:
    1. <a href="news-detail-34.html"></a>
    Mit diesem Link kann wie gesagt ohne JS auf die Detail geladen werden.

    Als Ergebnis bekomme dann im Endeffekt so was wie:
    PHP:
    1. <html>
    2.  <head>
    3.  <title>Ajax</title>
    4.  </head>
    5.  <body>
    6.   <div id="news">
    7.   {inhalt der news}
    8.   </div>
    9.  </body>
    10. </html>
    Damit habe ich also die komplette Seite nochmals in der Seite jedoch im News <div>.

    Wie kann ich die Abfrage beibehalten, jedoch das Resultat von Ajax auf die benötigten Informationen reduzieren?

    Zur Info.
    Der Link mit news-detail-34.html ist ein url_rewrite angabe und wird auf index.php?module=news&action=details&id=34 weiter geleitet.

    Der Grund ist damit ich nicht noch eine Datei erstellen muss um redundanten Code bzw. mehrere Dateien bearbeiten brauche.

    Gruß
     
    #1      
  2. mfgleo

    mfgleo Nicht mehr ganz neu hier

    Dabei seit:
    10.06.2008
    Beiträge:
    50
    Geschlecht:
    männlich
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Könntest Du bitte noch den Teil des AJAX-Aufrufs und deines PHP-Scripts posten, damit man sieht, wie Du die Infos anforderst bzw. zurück gibst.

    Ist diese Seite mit dem Problem öffentlich erreichbar?
     
    #2      
  3. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Nein Online ist nichts zu meinem Problem zu sehen. Aber letztendlich kannst du dir das so vorstellen, dass zb in diesem Bereich statt meines Posts die ganze PSD Seite geladen werden würde zusätzlich zum schon vorhandene Layout.

    Der PHP Code der mit diesem Link aufgerufen wird sieht in etwa so aus:
    PHP:
    1.  
    2. index.php?module=news&action=detail&id=34
    3. <?php
    4.  
    5. include_once('tpl/tpl_top.php'); // Ladet HTML bis zum content <div>
    6.  
    7. [...] // Fallunterscheidung welches Modul geladen werden soll. Nicht sehr relevant hier da  folgender Code ausgeführt wird
    8.  
    9. if((isset($_GET['action']) && $_GET['action'] == 'detail') && isset($_GET['id'])) { // wird im PHP Script den Aufruf des Links wiedergeben
    10.     $id = $_GET['id'];
    11.     $data = $news->getDetails($id);  // ist eine PHP Klasse welches die Daten aus der DB holt und zurückgibt
    12.  
    13.     include 'news/details.phtml'; // Template für Darstellung der Daten wird geladen
    14. }
    15.  
    16. include_once('tpl/tpl_bottom.php'); // ladet HTML angefangen vom content schließen <div> bis zu </html>
    17.  
    Das jetzt im Groben wie es vereinfacht vom PHP aussehen würde.

    Fallunterscheidung ist nicht relevant da der darauf folgende Code vom Fallunterscheidung geladen und ausgeführt wird.
     
    #3      
  4. mfgleo

    mfgleo Nicht mehr ganz neu hier

    Dabei seit:
    10.06.2008
    Beiträge:
    50
    Geschlecht:
    männlich
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Meiner Meinung nach liegt das Problem darin, das Du eine komplette Seite zusammenbaust und diese zurück gibst. Du müsstest, wenn Du AJAX verwendest, nur den Teil zurück liefern, den Du neu laden möchtest.

    Ablauflogik:
    1. per Ajax ein PHP-Script aufrufen das Dir die Details liefert (Übergabeparameter: ID des Newseintrags)
    2. das PHP-Script liefert Dir die Details als echo zurück (im echo befinden sich die html-Tags usw.)
    3. das Ajax-Script ersetzt Dir den Inhalt von <dir id="news">

    Achtung: In der Rückgabe von PHP-Script dürfen die Umlaute nur in der Form &uuml;, usw. enthalten sein, sonst ist die Rückgabe fehlerhaft oder wird gar nicht erst angezeigt.
     
    #4      
  5. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Genau. Das ist was passiert. Mir ist dies bewusst und den Lösungsvorschlag von dir habe ich auch schon gemacht, jedoch ist das zu aufwändig und inakzeptabel wenn ich da etwas am Script ändere. Dann muss ich dies 2x erledigen und vor allem, beim aufzurufenden PHP script muss ich auch alle Includes, Berechtigungen (authorization), pfade usw einfügen bzw. anpassen.

    Ich wollte diesen extra Aufwand ja verhindern. und vor allem wollte ich somit die Pfade vom Server bzw. Scripts nicht unbedingt preisgeben.

    Gibt es da keine Möglichkeit den zurückgelieferten Datensatz vom Ajax auf das wesentliche zu bereinigen bzw. bereinigen und als Json zurückgeben?

    Ich habe den gleichen "Problem" in einem ZendFramework Video gesehen der genau das gleiche tut und auch den gleichen Fehler bekommt, dieser wird jedoch mit dem ZendFramework bereinigt und als Json zurückgegeben.
    ich dachte mir, wenn das damit geht muss es doch eine nicht ZendFramework Möglichkeit geben dies zu bewerkstelligen. Dazu reicht aber meine Ajax Erfahrung nicht aus.

    Gruß
     
    #5      
  6. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Bitte zeig mal den AJAX-Aufruf.


    Duddle
     
    #6      
  7. mfgleo

    mfgleo Nicht mehr ganz neu hier

    Dabei seit:
    10.06.2008
    Beiträge:
    50
    Geschlecht:
    männlich
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Ganz ehrlich, ich würde solch ein Vorgehen, wie in diesem Video, mit einer 6 benoten. Das ist das schlechteste was man überhaupt machen kann. Das wäre so, als würde ich ein ganzes Rind kaufen und dann schlachten, nur weil ich ein Rinderfilet haben will.

    Du muss eigentlich in dem AJAX-Script so etwas wie www.meine-seite.de/detail/35 oder detail.php?id=35 aufrufen. In dieser PHP-Datei liest Du die entsprechenden Daten aus der Datenbank. Die müssen dann entsprechend formatiert und per echo zurückgegeben werden. In meinen Augen ist dies der einfachste Weg. Keiner sieht was Du in diesem Script machst, geschweige den, welche Dateien und Serverpfade Du verwendest.
     
    #7      
  8. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Ich denke du meinst den JavaScript code bzw. jQuery Code.

    Also das sieht folgendermaßen aus:
    PHP:
    1. $(function() {
    2.     function ajaxify(file, div) {
    3.         $.ajax({
    4.             url: file,
    5.             type: "POST",
    6.             data: "format=json",
    7.             async: false,
    8.             success: function(response){
    9.                 $(div).html(response);
    10.             }
    11.         });
    12.     }
    13.  
    14.     $("div.newsBox a").click(function() {
    15.         ajaxify($(this).attr('href'), $(this).parent());
    16.         return false;
    17.     });
    18. });
    Gruß

    edit:
    @mfgleo
    Sorry hab dein Beitrag übersehen.

    Dies ist das Video mit Lösung per ZendFramework.
    http://www.youtube.com/watch?v=Xrw8TP62-XU

    Anfangs hat der Tutorialersteller das gleiche Problem und bekommt die komplette Seite geladen. Er benutzt ein ZendFramwork Modul um dies zu beheben.

    Da das ZendFramework auch PHP ist, dachte ich mir es gäbe vielleicht einen weg dies auch so zu machen wie der, nur eben ohne ZendFramework.

    Wäre schön wenn es eine Lösung gäbe ohne extra Dateien erstellen zu müssen. Notfalls muss ich in den sauren Apfel beißen oder irgendwann doch auf ZF umsteigen.

    Gruß
     
    Zuletzt bearbeitet: 12.05.2011
    #8      
  9. Chriss1987

    Chriss1987 me.drinkCoffee();

    Dabei seit:
    26.03.2006
    Beiträge:
    378
    Geschlecht:
    männlich
    Ort:
    Kirchhundem
    Kameratyp:
    Canon EOS 400D
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Hi,

    was du auch machen könntest, wäre im AJAX-Request die URI mit einem weiteren Parameter versehen, der im ausgebenden Script ausgewertet wird und im Bedarfsfall das Template unterdrückt.

    Zu finden ist das z.B. bei CMSMS, da kann ein Parameter übergeben werden, der das Template unterdrückt. Natürlich musst du da auch die Dateien anpacken und verändern, müsstest du aber so oder so, egal, ob es eine Lösung per ZF o.ä. gäbe.

    HTH
    Schöne Grüße aus dem Sauerland!
    Chriss
     
    #9      
  10. mfgleo

    mfgleo Nicht mehr ganz neu hier

    Dabei seit:
    10.06.2008
    Beiträge:
    50
    Geschlecht:
    männlich
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Da stimme ich Chriss1987 zu, dies könntest Du auch tun.

    Es ist aber wirklich zu überlegen, ob der Aufwand sich lohnt bei jedem generierten Code (Template) dieser Parameter abzufragen.

    Wie groß ist eigentlich jetzt diese index.php Datei?
     
    #10      
  11. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    @Chriss1987
    Thx für den Hinweis. Werde ich recherchieren müssen.

    @mfgleo
    Die index hat inklusive Kommentare 31 Zeilen. Ich muss aber dazu sagen, dass ich das Routing und Strapping ala ZF nicht hin bekomme und ein sehr primitives View Controller nutze.... und zwar einfache Includes. Jedoch kann ich nicht alle Inclues für Templates Ausgrenzen da die Modulscripte im Haupttemplate per OOP includet werden.

    Werde mit meiner Entwicklung auf dem jetzigen Stand wohl nicht über spezielle Ajax Scripts herumkommen.

    Ne Frage nebenbei. Hat einer von euch ne Idee (Tutorial) wie ich ein Viewcontroller per OOP schreiben kann ohne einen einizigen Include für Templates nutzen zu müssen...ähnlich wie es beim ZF funktioniert?

    Gruß
     
    #11      
  12. Duddle

    Duddle Posting-Frequenz: 14µHz

    Dabei seit:
    03.02.2006
    Beiträge:
    3.864
    Geschlecht:
    männlich
    Ort:
    Dresden
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    Du kannst mit load() ein Fragment im Zieldokument ansprechen. Dann würdest du z.B. so was machen können:
    PHP:
    1.  
    2. $("#newscontainer").load(file+" #news");
    3.  
    Ich weiß aber nicht, ob man das mit POST kombinieren kann.


    Duddle
     
    #12      
  13. K-Dawg

    K-Dawg ********

    1
    Dabei seit:
    01.11.2004
    Beiträge:
    1.793
    [AJAX] Komplette Seite als Resultat
    AW: [AJAX] Komplette Seite als Resultat

    @Duddle
    Thx, werde ich mal rein schauen. Habe das jetzt wie oben gelöst zumal es mehrere Divs mit gleicher class gibt und ich noch nicht ganz in jQuery durchblicke.

    @all
    Danke für eure nette Hilfe. Habe das jetzt so gelöst wie mfgleo erwähnt hatte und den Weg den ich kenne, nur nicht ganz meine Vorstellungen entsprochen hatte.

    Jedenfalls habe ich daran etwas gearbeitet und bin zu einem zufriedenstellende Ergebnis gekommen. Anstatt alles jetzt im Prinzip in einem Schritt zu erledigen muss ich zwar 3 gehen, diese fallen jedoch nicht so sehr in Gewicht.

    Kurze Erklärung wie ich das jetzt mache.
    Im Prinzip schon wie oben erklärt.

    Ich hab meine HTML Ausgabe:
    PHP:
    1. <html>
    2.  <head>
    3.  <title>Ajax</title>
    4.  </head>
    5.  <body>
    6.   <div id="newsBox">
    7.   {inhalt der news 1}
    8.   </div>
    9.  
    10.   <div id="newsBox">
    11.   {inhalt der news 2}
    12.   </div>
    13.  
    14.   <div id="newsBox">
    15.   {inhalt der news 34}
    16.   </div>
    17.  </body>
    18. </html>
    Dann den Ajax Code:
    PHP:
    1. $(function() {
    2.     function newsDetails(id, div) {
    3.         $.ajax({
    4.             url: 'ajax/news/details/' + id,
    5.             type: "get",
    6.             data: "format=html",
    7.             async: false,
    8.             success: function(response){
    9.                 $(div).html(response);
    10.             }
    11.         });
    12.     };
    13.  
    14.     $("div.newsBox h3 a").click(function() {
    15.         newsDetails($(this).attr('name'), $(this).parent().parent());
    16.         return false;
    17.     });
    18. });
    Da ich mit dem attr('name) auf den name Attribute vom anchor zugreife sieht mein Link so aus:
    PHP:
    1. <a href="news-detail-34.html" name="34" title="Titel von der News"></a>
    Dieser Link passt sich natürlich der jeweilige News an.

    Somit habe ich was ich wollte zudem SEO- und vor allem Benutzerfreundlich und Barriere frei.

    Bei aktiviertem JS läuft das wie es soll und der relevante newsBox wird ausgetauscht, wenn JS aber deaktiviert ist, läuft das Standard weiter ohne Einschränkung, nur eben komplette Seite neu laden halt.

    Gruß und danke für die Anregungen.
     
    #13      
x
×
×