Vinzenz Mai: PHP Befehle und Funktionen in den Tabellen verwenden

Beitrag lesen

Hallo Malcolm,

Dann gehe ich mal ins Detail, von dem, was ich möchte, (Generell geht es um ein kleines CMS für mich).

Ich habe Zwei Funktionen, die eine baut aus ein Paar Werten rund 20 Zeilen HTML für das einblenden eines Videos zusammen:
myVideo("VideoId","200","180","player","intro-1.flv","intro-new.jpg");
ergibt: 20 Zeilen HTML, <embed> und ein wenig Javascript

Die zweite Funktion baut aus den angegebenen Werten eine Bildbox zusammen
myPics("ALT-Text", "Beschreibung", "/images/bild.jpg", "/images/thumbs/bild.jpg");
ergibt: <div><p> mit Text in </p> <img />

Muss ich das jetzt alles in der Datenbank hart kodieren?

Nein. Der Kram hat in der Datenbank überhaupt nichts verloren. Das ist Präsentation. Das bleibt in Funktionen/Methoden.

Also: beschäftige dich zuallererst mit dem Schichtenmodell (http://de.wikipedia.org/wiki/Schichtenmodell). Das, was ich bemängele ist die fehlende Abstraktion zwischen Datenhaltungs- und Verarbeitungsschicht, evtl. mischst du auch noch ein bißchen Präsentationsschicht rein.

Normalisiert habe ich schon, mir geht es nur um die Funktionen.

Wie soll ich's erklären? Wo fange ich an? Vielleicht ein Beispiel, das dem ähnelt, was Deine Funktionen andeuten.

In einem Projekt benötige ich

- eine (paginierte) Galerie mit Bildern und Detailangaben zu jedem Bild.
   Code:

  
        # Erzeuge eine neue Galerie ohne Einschränkungen  
        $gallery    = new PictureList();  
        # Erzeuge HTML-Code für die Paginierung, wenn erforderlich  
        $pagination = $gallery -> getPagination();  
        # Erzeuge den HTML-Code für die Galerie  
        $pictures   = $gallery  -> getPictureList();  

- die Möglichkeit, die Anzeige mit Suchkriterien in den Detailangaben
   einzuschränken.
   Code:

  
        # Erzeuge eine neue Galerie mit einem Einschränkungskriterium  
        $gallery    = new PictureList($search);  
        # Erzeuge HTML-Code für die Paginierung, wenn erforderlich  
        $pagination = $gallery -> getPagination();  
        # Erzeuge den HTML-Code für die Galerie  
        $pictures   = $gallery -> getPictureList();  

- ein Zufallsbild mit Detailangaben zum Bild.
   Code:

  
        # Erzeuge eine neue Galerie mit einem Zufallsbild  
        $gallery  = new PictureList(NULL, true);  
        # Bei einem Einzelbild ist keine Paginierung erforderlich  
        # Erzeuge den HTML-Code für das Zufallsbild  
        $pictures = $gallery -> getPictureList();  

Huch! Wo sehe ich, dass ich eine Datenbank benutze? Gar nicht! Dabei ist es doch der Fall, aber an dieser Stelle ist das völlig irrelevant.

Die zugrundeliegenden Daten ziehe ich mir mit einem cleveren SQL-Statement aus diversen Tabellen meiner Datenbank, die ich sowieso auch noch für ganz andere Zwecke benötige. Dieses Statement wird von einer Methode gemäß den Anforderungen zusammengebaut. Eine Methode einer anderen Klasse nimmt dieses Statement entgegen und liefert das Abfrageergebnis als hübsches Array zurück. Irgendwelches HTML, CSS, Javascript oder gar PHP ist in keiner der Tabellen zu finden - und auch nicht im Abfrageergebnis.

Eine weitere baut ähnlich Deiner myPics-Funktion aus diesem Array ein einzelnes Bild/Beschreibungsobjekt zusammen, eine weitere sorgt nötigenfalls dafür diese in eine Liste zu packen und die Paginierung zu erstellen mit dem ein oder anderen Effekt, den die modernen Javascript-Frameworks bieten, mit Nutzung der Google-Maps-API ... Dazu laden diese Methoden diverse Templates und ersetzen darin (mit str_replace()) Platzhalter durch Werte, die mittels der Verarbeitungslogik der Methoden gewonnen werden. HTML findet sich ausschließlich in den Template-Dateien, die somit auch ohne Ersetzungen schon funktionsfähig sind.

Diese Methoden interessieren sich jedoch überhaupt nicht dafür, woher dieses Array kommt, es könnte genausogut hartcodiert sein, aus einer CSV- oder einer XML-Datei stammen. Das ist für die weitere Verarbeitung völlig unwichtig.

Füge ich den Daten - auf welchem Weg auch immer - einen neuen Datensatz hinzu, so werden diese Daten genau dort angezeigt, wo sie hingehören, ohne dass ich irgendwelche Änderungen in meinem Code vornehmen müsste.

Zusammenfassend:
Deine Funktion myPics() wird idealerweise genauso aussehen wie vorher, nur werden die Daten für die Funktionsparameter (direkt oder indirekt) aus einer Datenbankabfrage stammen. Wie dies konkret aussieht, das kannst nur Du wissen, da nur Du die Logik Deiner Anwendung kennst.

Freundliche Grüße

Vinzenz