Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Tutorial: Teil 4 - Wir implementieren einen Layouter

Diskussion: Tutorial: Teil 4 - Wir implementieren einen Layouter im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallo, nachdem im Teil 3 dieser Tutorialserie die Frage aufkam, wie man nach dem MVC-Prinzip dynamische Tables usw. ausgibt, ...

Antwort
Alt 15.04.08, 14:39   #1 (permalink)
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Talking Tutorial: Teil 4 - Wir implementieren einen Layouter

Anzeige

Hallo,

nachdem im Teil 3 dieser Tutorialserie die Frage aufkam, wie man nach dem MVC-Prinzip dynamische Tables usw. ausgibt, hab ich mir gedacht, "Da muss ich mal ein weiteres Tutorial drüber schreiben".

Wer nicht weiß was MVC ist oder was es bedeutet, der kann sich das ganze mal auf Wikipedia anschauen.

Bei unserem kleinen Framework wäre dann das Template = View, die Action = Controller und z.B. die DBMapper (zu denen kommen wir in einem weiteren Tutorial) = Model. Um jetzt z.B. die Daten aus einer Datenbank als Tabelle ins Template zu bekommen, greifen wir auf Layouter zurück.

Aber was genau macht der Layouter?
Der Layouter nimmt die Daten, die z.B. aus einer DB kommen, entgegen und rendert nun z.B. eine Tabelle daraus und übergibt diese ans Template.

Was brauchen wir also alles?
Wir brauchen eine neue Klasse, diese nennen wir TestLayouter.class.php und legen Sie ins Core Verzeichnis.

Hier mal der Source der Klasse, ich hab die Klasse so einfach wie möglich gehalten. Es werden also keine Requestdaten oder so verarbeitet.

TestLayouter.class.php

PHP-Code:


class TestLayouter {
    
    
// Hier werden die Daten (Dataset, Array, ...) gespeichert
    
private $data;
    
    
// Der Tabelle geben wir natürlich eine ID, so hat man es später
    // beim einbau einer Paginierung einfacher
    
private $id;
    
    
// Hier werden die Outputdaten gespeichert
    
private $buffer;
    
    
/**
     * Der Konstruktor, wurde keine Id übergeben, so wird eine Exception
     * ausgelöst. Da es vorkommen kann, dass eine Tabelle noch keine Daten
     * hat, wird hier keine Exception ausgelöst.
     */
    
public function __construct($data$id) {    
    
$this->data $data;
    if (empty(
$id)) {
        throw new 
Exception('Keine Id übergeben!');
    }
    
$this->id $id;
    }
    
    
/**
     * Die toString Methode wird aufgerufen, wenn man das Objekt mit
     * z.B. echo new TestLayouter($data, 'test'); aufruft.
     * In dieser Methode wird die Tabelle erzeugt.
     */
    
public function __toString() {
    if (empty(
$this->data)) {
        return 
"<p>Keine Daten zum Anzeigen gefunden!</p>";
    }
    
$this->openTable();
    
$rowCnt sizeof($this->data);
    for (
$row 0$row $rowCnt$row++) {
        
$this->openRow();
        
$columnCnt sizeof($this->data[$row]);
        for (
$col 0$col $columnCnt$col++) {
        
$this->writeColumn($this->data[$row][$col]);
        }
        
$this->closeRow();
    }
    
$this->closeTable();
    
    return 
$this->buffer;    
    }    
    
    
/**
     * Wir öffnen die Table und setzen die ID
     */
    
private function openTable() {
    
$this->buffer "<table id='" $this->id "'>\n";
    }
    
    
/**
     * Zum öffnen einer Zeile(Row)
     */
    
private function openRow() {
    
$this->buffer .= "\t<tr>\n";
    }
    
    
/**
     * Zum schreiben einer Spalte(Column)
     */
    
private function writeColumn($value) {
    
$this->buffer .= "\t\t<td>" $value "</td>\n";
    }
    
    
/**
     * Schließt die Zeile
     */
    
private function closeRow() {
    
$this->buffer .= "\t</tr>\n";
    }
    
    
/**
     * Schließt die Table
     */
    
private function closeTable() {
    
$this->buffer .= "</table>\n";
    }
    

Ok, das war die TestLayouter-Klasse, kommen wir nun zur benutzung der Klasse.
Dazu brauchen wir folgende Dateien aus dem letzten Tutorial:
Main.class.php
Main.tpl.php

Wir öffnen die Main.class.php, und erweitern die Klasse so, dass Sie danach folgendermaßen ausschaut.

PHP-Code:


class Main extends Action {

    public function 
__toString() {
        return 
'Die Main Action';
    }

    public function 
run() {
        
AutoLoader::loadPackage('core\TestLayouter.class.php');
        
$tpl = new Template();
        
        
$text 'Dies ist ein Text der dem Template übergeben wurde!';
        
        
$tpl->assign('text'$text);
        
        
$data null;
                
// Hier wird nur schnell zu Testzwecken das Array mit 10x10 Spalten befüllt
        
for ($i 0$i 10$i++) {
            for (
$j 0$j 10$j++) {
                
$data[$i][] = ($i+1) * ($j+1);
            }
        }
                
// Hier übergeben wir eine Instanz des Layouters an das Template
        
$tpl->assign('table', new TestLayouter($data'test'));
        
$tpl->display('main.Main');
    }    

Gut gut, jetzt haben wir zwar den Layouter in die Action eingebaut, aber ausgegeben wird deshalb auch noch nichts.
Deshalb öffnen wir nun das Template und erweitern es um ein einfaches echo $this->get('table');

Das Template sieht dann folgendermaßen aus:
PHP-Code:

<?php
$this
->includeAction('main.IncMainHeader');
?>

<h1>Dies ist unser erstes Template!</h1>

<p>
Hier wird dann ein Text angezeigt!
<br />
<?php echo $this->get('text'); ?>
</p>
<br />

<?php
// Hier wird die Tabelle ausgegeben.
echo $this->get('table');
?>

<?php
$this
->includeAction('main.IncMainFooter');
?>
Und das wars dann auch schon wieder, nun können wir dynamisch generierte Daten im Template ausgegeben.

Ich hoffe Ihr seit auch beim nächsten Mal wieder dabei, wenn es heißt "Wir bauen uns ein Framework, und PHP ist geil!".
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 03.06.08, 12:37   #2 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

auch wenns etwas spät kommt, da ich das hier irgendwie aus den augen verloren hatte.
aber ist es nicht an sich sinvoller, das in die template klasse mit einzubauen?

ich hab mir dort ne methode reingebaut, die ähnlich wie dein layouter arbeitet und sich im endeffekt nur $tpl->assigntable($name,$id,$data); schimpft und per $this->getTable($name) abgerufen wird.

ich versteh bei deiner sache nicht so ganz die notwendigkeit einer neuen klasse! grade da sich das ganze nur auf ne tabelle bezieht, was machst du wenn du zb listen noch häufig brauchst, oder dynamisch generierte links etc... ?

ansonsten find ich den trick mit der __toString methode klasse!
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 03.06.08, 22:55   #3 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
aber ist es nicht an sich sinvoller, das in die template klasse mit einzubauen?
Nein, den was machst Du wenn Du noch vier weitere Layouter hast? Alle in die Template-Klasse mit aufnehmen? Man sollte immer darauf achten, so wenig Klassen-Kopplungen wie möglich zu haben, und zu dem ist die Template-Klasse für sowas nicht zuständig.

Zitat:
ich versteh bei deiner sache nicht so ganz die notwendigkeit einer neuen klasse! grade da sich das ganze nur auf ne tabelle bezieht, was machst du wenn du zb listen noch häufig brauchst, oder dynamisch generierte links etc... ?
Tja, und was machst Du, wenn die Tabelle z.B. nur eine Zelle, Navigation und Header haben sollte, oder Sortierbar usw. sein soll, und das andere mal nicht? Willst Du dann jedes mal die Template-Klasse ändern oder erweitern? Häufig gebrauchte Listen, oder dynamisch generierte Links stellen ja so auch kein Problem dar.

So einen Layouter kann man sehr abstrakt halten, und Ihn dann einfach weiter spezifizieren. Somit kann man sehr einfach jeden Tabellen-Typ darstellen, und auf jedes Problem individuell reagieren.

Ich benutze zu den TableLayouter noch eine Table Klasse, diese Klasse bereitet mir die Daten aus einer DB auf und der Layouter verarbeitet diese dann.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 03.06.08, 23:45   #4 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

das bedeutet im "schlimmsten" fall baust du dir für jedes anwendungsszenario von vielgebruachen sachen (listen, tabllen, strange wiederkehrende verschalteltung von div elementen... etc. ne layout klasse und erweiterst die dann bis ins detail?

das is beeindruckend, aber lohnt sich das wirklich?
ich selbst hab bis jetzt nur ein projekt was man wirklich als solches betiteln kann, aber ich seh bei deinen sachen teils nicht so richtig den sinn, das so extrem aufzusplitten. kannst du mir die hindergründe da mal kurz darlegen, was nun wirklich der vorteil von vielen kleinen sachen gegenüber einer "dicken" ultimativen template klasse ist?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
Alt 04.06.08, 11:11   #5 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
das bedeutet im "schlimmsten" fall baust du dir für jedes anwendungsszenario von vielgebruachen sachen (listen, tabllen, strange wiederkehrende verschalteltung von div elementen... etc. ne layout klasse und erweiterst die dann bis ins detail?
Nö nö, Du hast mich falsch verstanden, ich klone die Layouter nicht, das mach ich mit Vererbung/Ableitung.

Ich habe z.B. einen HTMLTableLayouter dieser Layouter beinhaltet alles was ich für eine Tabelle mit Header und Navigation brauche. Jetzt brauch ich aber z.B. eine Tabelle die nur eine Zeile ausgibt, aber alle Daten der aktuellen Row darin anzeigt, in Deinem Fall müsste ich jetzt hergehen und eine neue Funktion in der Template-Klasse implementieren die genau sowas macht. Ich gehe jetzt aber her und erweitere die Klasse durch Vererbung/Ableitung und überschreiben der betroffenen Methoden. Somit bekomme ich alle Features der Parent-Klasse, und kann meine neue Klasse konkretisieren, und muss mich nicht nochmal um z.B. die Navigation kümmern.

Zitat:
das is beeindruckend, aber lohnt sich das wirklich?
Danke, und ja es lohnt sich, ich kann so sachen viel schneller entwickeln.

Zitat:
kannst du mir die hindergründe da mal kurz darlegen, was nun wirklich der vorteil von vielen kleinen sachen gegenüber einer "dicken" ultimativen template klasse ist?
Gleich mal vorweg, es gibt keine "Ultimative Template Klasse", und wie schon geschrieben, die Template Klasse ist nicht dafür zuständig Tabellen zu bauen. Somit wird das MVC Prinzip gebrochen. Wenn Du alles in die Template Klasse steckst, wirst Du irgendwann den Überblick verlieren. Vorallem wirst Du nicht immer alles gebrauchen was in Deiner Klasse steckt, aber Du wirst immer alle Methoden in Deiner Instanz haben , welche irgendwann sehr viel speicher belegt.

Ich könnte Dir jetzt noch einige Gründe nennen warum man nicht alles in eine Klasse packen soll, aber das würde den Rahmen sprengen.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 27.09.09, 19:54   #6 (permalink)
 
Registriert seit: 26.09.09
doc.D Leistung: Facit NTK
Likes: 0
Hehe

der thread is zwar schon einbisschen alt aber ich muss sagen SUPER !!!!! Tutorial, durch die Kommetare auch super erklärt

lg
doc.D ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Tutorial: Teil 4 - Wir implementieren einen Layouter
Themen-Optionen
Ansicht

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

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mit batch nur einen Teil umbennen D31~$0u1 Code Kitchen 8 09.09.08 18:39
Tutorial - Teil 3 - Die Template Engine BasicAvid (Web-) Design und webbasierte Sprachen 21 09.04.08 23:41
(Open) SSH Dll, zum implementieren in Programm IsNull Code Kitchen 3 15.10.07 21:58
history implementieren in eigener C-Shell kito Code Kitchen 9 25.05.05 16:23


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61