wie läuft das mit der Page Klasse ?

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

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

Beitrag von Megger » 03.02.2010, 11:59:24

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.
Es gibt das generic:importdesign, welches mit dem Frontcontroller arbeitet. Das habe ich bei meiner Seite auch so gemacht, ich kann namespace und templatename anpassen und je nach Situation verschiedene Templates anzeigen. Wenn ich zuhause bin und es nicht vergesse, kann ich dir mal zeigen wie ich das gemacht habe. Ansonsten musst du mal auf der APF Seite nach "generic" suchen, da dürftest du fündig werden.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

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

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

Beitrag von Snoun » 06.02.2010, 02:07:01

Gut, soweit klappt es.. zumindest bis jetzt ;)
Nun habe ich jedoch folgendes vor:
Nehmen wir mal an, ich habe einen User auf der Seite. Die Seite besitzt eine "Sidebar" wo das Userpanel bzw. die Loginbox erscheinen soll.
Wie realisiere ich das mit dem APF ambesten?
Persönlich würde ich ja sagen, das ich auf eine variable reagiere zb $logged_id und im template dann abfragen würde:

Code: Alles auswählen

if $logged_in -> <core:importdesign ... template="userpanel" />
else -> core:importdesign ... template="loginbox" />
Jedoch hat das template ja keine vergleichsmechanismen zur verfügung, oder?

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

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

Beitrag von Screeze » 06.02.2010, 12:51:52

du legst einfach 2 templates in der templatedatei an. Eines für das panel, und 1 für das andere.
Im controller machst du dann die unterscheidung, und bindest dann das jeweilige template ein.

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

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

Beitrag von dr.e. » 07.02.2010, 10:44:00

Hallo Snoun,

die Alternative zu Screeze's Vorschlag wäre, ein Model zu erstellen, das weiß, welches Template an dieser Stelle in der Seite eingebunden werden soll und nutzt das <generic:importdesign />-Tag. Das Model kannst du z.B. in einer Front-Controller-Action erzeugen und befüllen, z.B. je nach dem welche Seite gerade gefragt ist oder ob es einen eingeloggten Benutzer gibt.

Für den Anfang ist sicher Screeze's Variante die einfachste und schnellste.
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 » 08.02.2010, 20:36:31

Nächstes Thema :shock:
Ich bin gerade dran eine (wie ich finde) einfache Taglib zu schreiben.
Ziel ist es, ich habe zwei paramtert: checkvar und resultvar
in Checkvar soll nun ein Platzhalter rein den ich vom Controller aus definiere und resultvar beinhaltet das ergebnis. Sprich eine einfache IF Struktur in form eines TagLibs

Nun ist die Frage: Ist es möglich einem parameter im Taglib durch einen Platzhalter zu befüllen?
und noch eine Frage:

Code: Alles auswählen

<check:if checkvar='<html:placeholder name="Testen" />' resultvar="richtig">
Dann führe aus was hier drin steht
</check:if>
Wie kann ich es anstellen, das der bereich der zwischen den beiden Tags steht nur dann ausgeführt wird wenn die bedingung von oben erfüllt ist?

Code: Alles auswählen

class check_taglib_if extends Document {

    function check_taglib_if () {
        parent::Document();
    }

    function transform(){
        $checkparam = $this->__Attributes['checkvar'];
        $resultparam = $this->__Attributes['resultvar'];
        $run = $this->__Attributes['run'];

//        $this->__extractTagLibTags();
//        $this->__extractDocumentController();

        if($checkparam == $resultparam) {
            return $run;
        } 
    }
}
habe ich jetzt mal so "spontan" versucht... es geht auch soweit, jedoch nur wenn ich der Tag noch ein zusätzlichen Parameter angebe welcher run heißt wo drin steht was gemacht werden soll wenn true
und leider geht es auch nicht mit den Platzhalter im moment :(

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

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

Beitrag von dr.e. » 08.02.2010, 21:25:33

Hallo Snoun,

wie du sicher bemerk hast, wird mit dem APF-Release keine if-Taglib ausgeliefert. Grund hier für ist, dass es meiner Meinung nach nicht gut ist, allzuviel Logik in die Präsentation / in den View zu stecken, denn sonst sinkt die Wiederverwendbarkeit drastisch. Beim APF ist das mit den Taglibs noch einigermaßen handhabbar, denn diese sind eine allgemeingültige Form einer GUI-Komponente. Nichtsdestotrotz, sollte die Logik besser im Controller oder einer allgemeingültigen Taglib aufgehoben sein. Aber: möglich ist es mit dem APF definitiv soetwas umzusetzen, die Frage ist nur, was du erreichen willst.
Ziel ist es, ich habe zwei paramtert: checkvar und resultvar
in Checkvar soll nun ein Platzhalter rein den ich vom Controller aus definiere und resultvar beinhaltet das ergebnis. Sprich eine einfache IF Struktur in form eines TagLibs
So wie ich dein Beispiel verstehe, möchtest du einen Inhalt ausgeben, sofern eine Bedingung erfüllt ist. Das kannst du - da du ja ohnehin den Controller schon im Spiel hast (Platzhalter!) - einfach per <html:template /> oder einer anderen, vorhandenen Taglib erreichen, die das "TransformOnPlace"-Feature unterstützt. Das Template stellt sich nur dann dar, wo es definiert ist, wenn du im Controller ein

Code: Alles auswählen

$node->transformOnPlace()
aufrufst, wobei $node z.B. durch

Code: Alles auswählen

$node = &$this->__getTemplate('MyTemplate');
befüllt worden sein kann. Den obigen Aufruf kannst du dann in einer Bedingung packen - fertig ist das IF.
Nun ist die Frage: Ist es möglich einem parameter im Taglib durch einen Platzhalter zu befüllen?
Nein, das ist nicht möglich, denn eine Tag-Definition ist etwas in sich geschlossenes. Was du jedoch tun kannst, ist die Instanz des Tags im Controller zu beziehen und dort z.B. per

Code: Alles auswählen

$tag->setAttribute('checkvar','my value');
das Attribut checkvar zu füllen.
Wie kann ich es anstellen, das der bereich der zwischen den beiden Tags steht nur dann ausgeführt wird wenn die bedingung von oben erfüllt ist?
Hierzu ist wichtig, dass du überlegst, was ausgeführt werden soll. Sind es komplexe Inhalte (=weitere Module oder ganze Template-Inhalte), macht es durchaus Sinn, z.B. <core:importdesign /> zu nutzen, das per URL steuerbar ist oder eine Taglib zu schreiben, die basierend auf <core:importdesign /> Templates über definierte Bedingungen einbindet. Hier könnte für dich auch der <generic:importdesign />-Tag nützlich sein.

Sofern es sich "nur" um einfache Inhalte handelt kannst du das so bewerkstelligen:

Template:

Code: Alles auswählen

<check:if expected="foo" id="check1">
   Dieser Text wird ausgegeben, wenn das Attribut "given" gleich dem Wert des Attributs "expected" ist.
</check:if>
Controller:

Code: Alles auswählen

class example_controller extends baseController {
   public function transformContent(){
      $check = &$this->getCheck('check1');
      $check->setAttribute('given','foo');
   }
   private function &getCheck($id){
      $children = &$this->__Document->getByReference('Children');
      foreach($children as $objectId => $DUMMY){
         if(get_class($children[$objectId]) === 'check_taglib_if' 
                 && $children[$objectId]->getAttribute('id') === $id){
            return $children[$objectId];
         }
      }
      $null = null;
      return $null;
   }
}
Taglib:

Code: Alles auswählen

class check_taglib_if extends Document {
   public function check_taglib_if(){
      parent::Document();
   }
   
   public function transform(){
      $expected = $this->getAttribute('expected');
      $given = $this->getAttribute('given'); 
      if($expected === $given){
         return $this->__Content;
      }
      return (string)'';
   }
}
Sofern du die Bedingung nun an ein anderes Datum knüpfen willst, kannst du in der Taglib beispielsweise eine Model-Klasse beziehen und diese nach einem Wert fragen.

Ich hoffen, damit kommst du einen Schritt weiter. :)
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 » 08.02.2010, 21:31:22

Der Hintergrund für meine Idee für diese IF-Taglib ist der gleiche wie paar posts vorher. Im Speziellen habe ich im moment halt das Problem, das ich nicht weiß wie ich folgendes Realisiere:

User nicht eingelogt -> Loginform zeigen
User eingelogt -> Userpanel zeigen welches dann noch zusätzlich seinen Rechten ensprechend mehr oder weniger links enthält (Admin zb noch nen link zum Adminbereich, Mod zum "Modbereich" usw)

Daher hab ich halt gedacht, wenn ein user eingeloggt ist wird der Platzhalter eingeloggt beschrieben und durch mein Taglib wird dann halt dementsprechend das passende Template eingebunden :)

Aber Trotzdem danke für deine Ausführungen :)

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

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

Beitrag von dr.e. » 08.02.2010, 21:38:59

Hallo Snoun,
User nicht eingelogt -> Loginform zeigen
User eingelogt -> Userpanel zeigen welches dann noch zusätzlich seinen Rechten ensprechend mehr oder weniger links enthält (Admin zb noch nen link zum Adminbereich, Mod zum "Modbereich" usw)
Ok, das hatte ich vielleicht überlesen. Hier würde ich aber keinen Overhead mit einer eigenen Taglib treiben, sondern einfach ein Formular (<html:form />) und ein Template (<html:template />) definieren und im Controller entscheiden, was du darstellst. Beide Tags werden nur dann dargestellt, wenn du im Controller transformOnPlace() aufrufst. Somit hast du im Controller ganz einfach an Hand des Benutzers (falls es denn einen gibt) entscheiden, was dargestellt werden soll.
Daher hab ich halt gedacht, wenn ein user eingeloggt ist wird der Platzhalter eingeloggt beschrieben und durch mein Taglib wird dann halt dementsprechend das passende Template eingebunden :)
Das Verhalten kannst du auch ganz elegant mit der <generic:importdesign />-Taglib lösen. Loggt sich der Benutzer ein, wird im Model ein Schalter auf "loggedIn=true" gesetzt (oder so ähnlich) und dieser entscheidet dann, welches Template geladen wird. Code-technisch muss das von der Taglib verwendete Model einfach zwei Attribute besitzten, in denen Namespace und Name des zu ladenen Template definiert ist und in einer Front-Controller-Action füllst du die Attribute entsprechend. Gibt es einen User in der Session, dann Template A, gibt es keinen, dann Template B.

Für den Anfang würde ich aber mal mit der Controller-Variante beginnen.
Aber Trotzdem danke für deine Ausführungen :)
Immer gerne. Das APF hat hinsichtlich der GUI-Implementierung einige Ansätze, die so noch nicht in den Köpfen der Leute drin sind, von daher ist es klar, dass man sich erst etwas an die Art und Weise gewöhnen muss. Aber keine Angst, das wird! :)
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

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

Beitrag von Megger » 09.02.2010, 10:07:10

Ich habe es bei mir so gelöst, dass ich eine Action habe, die Anhand verschiedener Parameter entscheidet, welche Templates zum Model hinzugefügt werden. Dieses Model ist dann die Grundlage für generic:importdesign (hoffe das ist richtig). Bin damit bis jetzt sehr gut gefahren und kann dynamisch entscheiden was angezeigt wird und was nicht.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast