wie läuft das mit der Page Klasse ?

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 23.01.2010, 23:35:04

Ist es möglich, im Template eine art Fallunterscheidung einzubauen? Ich habe z.B. sowas in der art vor:
Meine Navbar hat eine "aktiv"-Leiste unter dem Menüpunkt wo man gerade surft. Nun hab ich mir gedacht, ich frag im Template einfach ab welcher parameter gesetzt wurde als view, und wenn es das entsprechende Template ist soll er dort die css klasse auf "visitsite" o.ä. ändern.
Fallunterscheidungen in templates sind - meines wissens - nicht möglich. Die unterscheidung sollte im controller des templates stattfinden soweit ich weis, aber villeicht kann Christian hier ja ergänzen.
Da fällt mir gerade noch etwas ein, ist es möglich bzw. wie ist es möglich auf dem "Haupt"-Template Platzhalter zu setzen... Das, wenn ich auf den "richtigen" Server gehen sollte, nur den pfad zum css verzeichnis in der index datei oder sonstwo ändern muss und nicht im HTML stelbst bei jeder seite :)
Ich bin mir nicht sicher was du meinst.
im haupttemplate, also der .html datei, kannst du jedenfalls keinen platzhalter setzen. Ich vermute jedoch du meintest etwas anderes.
Verstehe ich das richtig, dass du die URL der aktuellen Seite an einer beliebigen Steller der Applikation kennen möchtest?
In diesem Fall wäre die Registry denke ich dein Freund: http://adventure-php-framework.org/Seit ... z-Registry
Dann kannst du z.b. in der index.php oder im controller des haupttemplates einen wert dort speichern, und später abfragen.
Einige Werte sind bereits enthalten, z.B.
* URLRewriting (Konfiguration des URL-Rewriting)
* URLBasePath (Pfad zur aktuellen Anwendung)
* Environment (Umgebungsvariable für die Konfiguration)
* LogDir (Pfad zum Log-Verzeichnis)
* LibPath (Pfad zu den Quellcode-Dateien)
* CurrentRequestURL (Vollständige Request-URL)
Ich hoffe ich konnte helfen, ansonsten sag bescheid.
Ralf

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 23.01.2010, 23:55:56

Ich bin mir nicht sicher was du meinst.
Im Prinzip hast du schon erkannt was ich meinte :) Ich habe halt eine "Gerüst" datei sozusagen, wo ich die ganzen bereiche anordne sprich Header, Footer, Content, Navi usw. und das ist sozusagen meine Datei wo ich die css dateien, js etc angebe die ich öfters / immer nutze.
Diese speicher ich nun in einem extra ordner, und möchte im template dann nicht unbedingt ../../.../.../../ usw sondern halt eine URL die ich per Placeholder reinpacke.

Nun habe ich mich gerade nochmal an die Liste gesetzt. Im Prinzip funktioniert es ja, naja zumindest mehr oder weniger ;)

Code: Alles auswählen

    function transformContent() {
        $this->setPlaceHolder('List', $this->__buildList());
    }

    function __buildList() {
        $SQL = $this->__getServiceObject('core::database', 'MySQLHandler');

        $Template__ListNew = &$this->__getTemplate('ListNew');
        $selectevents = 'SELECT * FROM events';
        $resultlist = $SQL->executeTextStatement($selectevents);
        $output = '';
        while($zwischenschritt = $SQL->fetchData($resultlist)) {
            $output .= $zwischenschritt['name'];
        }
//        var_dump($output);
        $Template__ListNew->setPlaceHolder('Item_Name', $output['name']);
        return $Template__ListNew->transformTemplate();

    }

Code: Alles auswählen

        <html:placeholder name="List" />        
        <table>
            <html:template name="ListNew">
            <tr>
                <td><template:placeholder name="Item_Name" /></td>
            </tr>
            </html:template>
        </table>
Jedoch, packt er mir durch das output .= ... in der buildlist methode alles zusammen in einen string... so hab ich am ende statt einer Liste nur einen langen zusammengeklebten text. Wie krieg ich die Datensätze "einzeln" ins template?
Noch eine Frage dazu: wozu ist

Code: Alles auswählen

<html:placeholder name="List" />  
notwendig - denn ohne wird gar nix von der Liste angezeigt ?

Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 24.01.2010, 00:12:37

Diese speicher ich nun in einem extra ordner, und möchte im template dann nicht unbedingt ../../.../.../../ usw sondern halt eine URL die ich per Placeholder reinpacke.
Dann wäre die registry richtig denke ich.

Nun habe ich mich gerade nochmal an die Liste gesetzt.
Was für eine Liste denn genau?
Noch eine Frage dazu: wozu ist

Code: Alles auswählen
<html:placeholder name="List" />

notwendig - denn ohne wird gar nix von der Liste angezeigt ?
Du hast beim ausgeben der templates mehrere möglickeiten:
Derzeit machst du das wie folgt:

Code: Alles auswählen

return $Template__ListNew->transformTemplate();
Du transformierst das Template, und bekommst das fertige template als String zurück, welches du dann an die funktion davor gibst, welche es in den platzhalter einfügt.

Einfacher ginge es, wenn du hier einfach transformOnPlace benutzt.

Code: Alles auswählen

$Template__ListNew->transformOnPlace();
Somit fällt dein platzhalter komplett weg, das template wird an ort und stelle der definition ausgegeben. Da dein platzhalter sowieso direkt davor steht, also das was du möchtest. wenn du das template z.b. innerhalb eines andren templates haben möchtest, dann kannst du das mit deinem derzeitigen Weg machen.

Was genau bezweckst du mit dieser Liste denn?
Möchtest du mehrere datensätze abfragen, und dann für jeden datensatz z.b. eine Spalte in der Tabelle einfügen?

Dann würde ich nochmal auf den Iterator taglib hinweisen. http://adventure-php-framework.org/Seit ... le-TagLibs

Falls das korrekt ist, und du ein beispiel benötigst, sag bescheid dann schreib ich morgen früh schnell eins. Ansonsten beschreib nochmal dein Vorhaben genauer bitte.

Ralf

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 24.01.2010, 00:29:14

Ich habe eine Tabelle in der Datenbank namens "events". In dieser sind dann Die Spalten id (nicht zur ausgabe gedacht), name (ausgabe), description (ausgabe)
(Später wird die Abfrage dann noch erweitert auf die letzten 5 id's)
Damit will ich erreichen, das ich auf der Startseite ein Bereich habe in dem ich die letzten 5 Events anzeigen lassen kann.

Ausschauen solls dann ungefähr so:

Code: Alles auswählen

<table>
<tr>
<td>NameEvent1</td>
<td>DescriptionEvent1</td>
</tr>
<tr>
<td>NameEvent2</td>
...

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: wie läuft das mit der Page Klasse ?

Beitrag von dr.e. » 24.01.2010, 00:55:33

Hallo Snoun,
Ist es möglich, im Template eine art Fallunterscheidung einzubauen? Ich habe z.B. sowas in der art vor:
Meine Navbar hat eine "aktiv"-Leiste unter dem Menüpunkt wo man gerade surft. Nun hab ich mir gedacht, ich frag im Template einfach ab welcher parameter gesetzt wurde als view, und wenn es das entsprechende Template ist soll er dort die css klasse auf "visitsite" o.ä. ändern.
Grundsätzlich ist mit dem APF alles möglich. Das ist kein Werbe-Slogan, sondern Konzept. Im Rahmen von Document-Controllern und eigenen Taglibs lässt sich alles umsetzen. Bestes Beispiel ist meiner Ansicht nach die Formular-Unterstützung, die dir die Möglichkeit gibt, ein Formular mit allem Drum&Dran in einem Template zu definieren.

In der neuen APF-Webseite ist die Navigation so aufgebaut, dass du eine Liste von Top-Menü-Punkten hast und im Model immer die aktuell gewählte ID steht. Bei der Generierung per Document-Controller frage ich dann ab, ob der aktuell ausgegebene auch der gerade aktive ist und markiere ihn mit einer CSS-Klasse. Die reine Definition eines Navi-Punktes kannst du beispielsweise als Template (<html:template />-Tag) abfassen oder den Code im Controller direkt generieren. Den Controller der (bald relaunchten Seite) findest du unter http://adventurephpfra.svn.sourceforge. ... iew=markup.
Ansonsten kann ich gerade nur nochmal ein Lob aussprechen, nachdem ich anfangs ziemlich skeptisch war ob das APF wirklich "nützlich" ist sind inzwischen alle Zweifel beseitigt. Nicht nur wegen dem tollem Framework (was wirklich toll ist), sondern auch wegen dem Klasse support hier im Forum :)
Vielen Dank! Es ist schön, dass meine/unsere Intension des Frameworks auch so ankommen. :)
Werde am Montag mal im Meeting das APF vorschlagen, suchen im moment eh etwas "neues" :)
Sehr gerne. Sofern Bedarf an Schulung oder Coaching im Team besteht, einfach melden, ich kann euch im Team gerne einen Tag oder auch mehrere Tage für die Entwicklung fit machen. Vielleicht habt ihr auch Interesse an einer APF User conference.
edit:
Da fällt mir gerade noch etwas ein, ist es möglich bzw. wie ist es möglich auf dem "Haupt"-Template Platzhalter zu setzen... Das, wenn ich auf den "richtigen" Server gehen sollte, nur den pfad zum css verzeichnis in der index datei oder sonstwo ändern muss und nicht im HTML stelbst bei jeder seite :)
Das würde ich als Taglib ausführen. Die Definition des Templates kann dann z.B. so aussehen:

Code: Alles auswählen

<html>
<head>
...
<css:path file="my.css" />
<js:path file="my.js" />
...
Die Taglib gibt dann in der Methode transform() den korrekten Pfad je Server aus. Hinweise zur Erstellung von Taglibs findest du hier. Die Konfiguration kannst du entweder über explizite Konfigurations-Dateien (je Umgebung, das kann das APF out-of-the-box) oder die Registry erledigen.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: wie läuft das mit der Page Klasse ?

Beitrag von dr.e. » 24.01.2010, 00:59:58

Snoun hat geschrieben:Ich habe eine Tabelle in der Datenbank namens "events". In dieser sind dann Die Spalten id (nicht zur ausgabe gedacht), name (ausgabe), description (ausgabe)
(Später wird die Abfrage dann noch erweitert auf die letzten 5 id's)
Damit will ich erreichen, das ich auf der Startseite ein Bereich habe in dem ich die letzten 5 Events anzeigen lassen kann.

Ausschauen solls dann ungefähr so:

Code: Alles auswählen

<table>
<tr>
<td>NameEvent1</td>
<td>DescriptionEvent1</td>
</tr>
<tr>
<td>NameEvent2</td>
...
Ich würde hier - wie Ralf schon sagte - wirklich den Iterator-Tag nehmen. Dieser gibt dir die Liste nach deiner Definition komplett aus und du musst dich im Controller nur noch um die Daten-Beschaffung kümmern. Das hast du ja aigentlich schon festig (siehe oben). Dann die Daten einfach in den Iterator-Tag geben, ein Template definieren und transformOnPlace() aufrufen.

Wenn du nicht weiter kommst, poste mal den Code, dann können wir dir sicher weiterhelfen.

Cheers,
Christian
Viele Grüße,
Christian

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 24.01.2010, 02:04:23

Controller:

Code: Alles auswählen

<?php
import('core::database','MySQLHandler');
import('tools::html::taglib::documentcontroller','iteratorBaseController');
class listnew_controller extends iteratorBaseController {
    function listnew_controller() {

    }

    function transformContent() {
        $SQL = $this->__getServiceObject('core::database', 'MySQLHandler');

        $selectevents = 'SELECT * FROM events';
        $query =$SQL->executeTextStatement($selectevents);
        
        $Iterator = &$this->__getIterator('Liste');
        
        while($result = $SQL->fetchData($query)){
            $Iterator->fillDataContainer($result);
        }

        $Iterator->transformOnPlace();

    }
}
?>
template:

Code: Alles auswählen

<@controller
    namespace="sites::event::controller"
    file="listnew_controller"
    class="listnew_controller"
@>
<core:addtaglib
    namespace="tools::html::taglib"
    prefix="html"
    class="iterator"
    />
<div class="cbox wheadline wpadding">
    <h1>Neuste Events</h1>
    <p>
    <html:iterator name="Liste">
        <iterator:item>
            <item:placeholder name="name" />
        </iterator:item>
    </html:iterator>
    </p>
    <div class="cfoot"></div>
</div>
Datenbankfelder die angezeigt werden sollen: name & description

Errors:
[html_taglib_iterator::transformIterator()] Given list entry is not an array or object ()! The data container must contain a list of associative arrays or objects!
Undefined offset: 2
[html_taglib_iterator::transformIterator()] Given list entry is not an array or object ()! The data container must contain a list of associative arrays or objects!
Undefined offset: 1
Anzeige: Negativ

habe es in der Datenbankwhile schleife schon mit $data .= $result etc probiert, jedoch pappt er mir dann nen string zusammen womit ich ja nicht wirklich was anfrangen kann.
Die Platzhalter variante mit dem Iterator hab ich auch (versucht) jedoch ging dann gar nichts mehr :geek:

Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 24.01.2010, 11:21:14

ich glaube das hier:

Code: Alles auswählen

while($result = $SQL->fetchData($query)){
            $Iterator->fillDataContainer($result);
        }
sollte eher so lauten:

Code: Alles auswählen

$iteratorContainer = array();
while($result = $SQL->fetchData($query)){
           $iteratorContainer[] = $result;
        }
 $Iterator->fillDataContainer($iteratorContainer);
Ausserdem würde ich den html code in den iterator taglib integrieren, und nicht frei im raum stehen lassen:

Code: Alles auswählen

<@controller
    namespace="sites::event::controller"
    file="listnew_controller"
    class="listnew_controller"
@>
<core:addtaglib
    namespace="tools::html::taglib"
    prefix="html"
    class="iterator"
    />
<html:iterator name="Liste">
  <div class="cbox wheadline wpadding">
    <h1>Neuste Events</h1>
    <p>
        <iterator:item>
            <item:placeholder name="name" />
        </iterator:item>
    </p>
    <div class="cfoot"></div>
  </div>
 </html:iterator>

Die description kannst du dann einfach mit einem weiteren placeholder wie den name abrufen.

Probier es mal so aus.

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 24.01.2010, 12:19:28

Probier es mal so aus.
Ich liebe euch :mrgreen:
Vielen Dank für eure geduld :)

Ich melde mich bei der nächsten Frage wieder ;P

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 24.01.2010, 13:09:58

ooookay, hat wohl doch nicht so lang gedauert wie ich gedacht hab bis das nächste problem auftritt :(
Es geht um die importdesign funktionalität.

Ich habe ein Haupttemplate, (apps/sites/main/templates/main.html) dieses enhält nun das Grundgerüst der seite (Header, Footer etc)
in diesem lade ich

Code: Alles auswählen

        <core:importdesign
            namespace="sites::main::templates"
            template="content"
            />
Dies soll immer geladen werden beim seitenaufruf (das macht es auch)
content.html:

Code: Alles auswählen

<core:importdesign
    namespace="sites::event::templates"
    template="[view=events]"
    />
<core:importdesign
    namespace="sites::main::templates"
    template="[view=home]"
    />
hier kommen dann die ganzen Sektions"übersichtsseiten" rein.

das home template ist das Template was standardmäßig geladen werden soll wenn KEIN parameter view in der url vorhanden ist UND wenn der parameter view=home ist.
ist der parameter view = events soll dieses template geladen werden:

Code: Alles auswählen

<core:importdesign
    namespace="sites::event::templates"
    template="[a=detail]"
    incparam="a"
    />
welches sich in sites::event::templates/events.html befindet. Hier "route" ich dann weiter, ist ein parameter a vorhanden und dieser steht auf detail soll das Template detail aus sites::event::templates geladen werden. ist kein a vorhanden, soll eine standardseite geladen werden welche ich später mal home oder sonst wie nenne.
Jedoch funktioniert dies nicht so ganz wie ich es gedacht habe. Das ganze jedoch inkludiert einfach "alles" so hab ich zb auf der normalen startseite die detailansicht, die listenansicht usw obwohl dort nur eine bestimmte seite angezeigt werden soll :(

Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 24.01.2010, 13:16:07

Ok mal sehen...

Code: Alles auswählen

<core:importdesign
    namespace="sites::event::templates"
    template="[view=events]"
    />
<core:importdesign
    namespace="sites::main::templates"
    template="[view=home]"
    />
Es macht wenig sinn 2 importdesigns auf ein und denselben parameter zu laden.
Der 1. importdesign checkt auf den parameter, wenn keiner gesetzt wird, läd es das events template.
Der 2. importdesign checkt ebenfalls auf den parameter, wenn keiner gesetzt wird läd es das home template.
würdest du jetzt view=irgendwas setzen in der URL, würde jedes importdesign dieses template einmal laden und aufrufen.

Was du brauchst ist einfach nur:

Code: Alles auswählen

<core:importdesign
    namespace="sites::main::templates"
    template="[view=home]"
    />
Dieser importdesign checkt den parameter, wenn keiner vorhanden ist ruft er das home template auf. Sollte einer vorhanden sein, ruft er das template mit dem name auf, welches in view steht. Du musst also nicht für jedes template das du geladen haben möchtest je nach parameter ein importdesign definieren, sondern 1 pro parametername (in diesem fall view).

edit: ich sehe grade dass du im namespace einen unterschied hast bei den templates. ich glaube das ist so nicht vorgesehen gewesen, aber ich kann mich irren. Sollte das mit dem importdesign tag nicht möglich sein, könntest du entweder diesen erweitern, oder im controller die unterscheidung machen.

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 24.01.2010, 13:35:07

gut, jedoch habe ich halt die event Templates nicht im sites::main::templates sondern in sites::event::templates... damit ich das ganze besser getrennt habe, also müsste ich irgendwie das "main" im namespace ersetzen können damit es aus dem jeweiligen bereich das Template lädt... oder bleibt mir bei diesem problem nur die möglichkeit einer eigenen Taglib?

Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 24.01.2010, 13:43:34

Ich denke da wirst du eine eigene taglib schreiben müssen. wenn du diese jedoch von der derzeitigen importdesign-taglib ableitest, ist das nicht allzuviel arbeit.

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 02.02.2010, 23:22:57

Da bin ich wieder ;)

Wie kann ich denn im Controller auf eine id o.ä. in einer url reagieren? => zb wenn ich eine News anzeigen möchte domain.de/news/show/1
brauch ich halt die id (1) im Controller um die Datenbank abfrage zu starten :)

Leider hätte ich da noch eine frage zu meinem "lieblings"-Thema der Datenbank verbindung, ich krieg nun zwar eine hin und kann auch Inhalt abfragen... Jedoch schaff ich dies nur per reines SQL, möchte ich den O/R Mapper nutzen, kommt einfach gar nichts... weder fehler, noch inhalt oder sonstwas... ich weiß auch ehrlichgesagt gar nicht so richtig wie ich den nun anwerfe und sage das er mir genau eine bestimmte Tabelle ausgeben soll usw.
Da wäre es sehr schön wenn mir jemand nochmal das Thema in den Kopf hämmern könnte :)

edit: kann es sein das die Neue Seite keine Erklärung zum OR Mapper hat?

Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 02.02.2010, 23:53:47

hi,
Wie kann ich denn im Controller auf eine id o.ä. in einer url reagieren? => zb wenn ich eine News anzeigen möchte domain.de/news/show/1
brauch ich halt die id (1) im Controller um die Datenbank abfrage zu starten :)
was du suchst ist der RequestHandler:
http://adventure-php-framework.org/Seit ... estHandler

Code: Alles auswählen

$value = RequestHandler::getValue('show'); 
vorher per import() einbinden, steht auf der doku seite beschrieben.
Leider hätte ich da noch eine frage zu meinem "lieblings"-Thema der Datenbank verbindung, ich krieg nun zwar eine hin und kann auch Inhalt abfragen... Jedoch schaff ich dies nur per reines SQL, möchte ich den O/R Mapper nutzen, kommt einfach gar nichts... weder fehler, noch inhalt oder sonstwas... ich weiß auch ehrlichgesagt gar nicht so richtig wie ich den nun anwerfe und sage das er mir genau eine bestimmte Tabelle ausgeben soll usw.
Da wäre es sehr schön wenn mir jemand nochmal das Thema in den Kopf hämmern könnte :)

edit: kann es sein das die Neue Seite keine Erklärung zum OR Mapper hat?
Hier ist die doku dazu:
http://adventure-php-framework.org/Seit ... -OR-Mapper

findest du auf dokumentation->komponenten dokumentation -> (ganz unten) Generischer OR mapper. Da sind auch noch ein paar weitere seiten verlinkt, aber mit der genannten solltest du zurechtkommen für den anfang denke ich.

Hast du den mapper konfiguriert?
Schau mal in der doku nach, falls du nicht klarkommst sag bescheid, hab leider grad keine Zeit mehr, antworte dann Morgen.

Grüsse,
Ralf

Antworten