transform() von eigenem taglib nicht ausgeführt

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

transform() von eigenem taglib nicht ausgeführt

Beitrag von Screeze » 09.09.2009, 11:40:04

Ich bin auf ein eigenartiges verhalten gestoßen, bei dem ich mir nicht sicher bin ob es korrekt ist:


es gibt 2 taglibs:
smenu
sitem.

normalerweiße ist ein sitem NUR in einem smenu gebraucht.
also (vereinfacht):

Code: Alles auswählen

<smenu ...>
    <sitem ...> ... </sitem>
</smenu>
Bei dieser Struktur wird die transform()-methode von sitem NIEMALS aufgerufen. ein exit() was testweise direkt in die transform()-methode geschrieben wird, hat keinerlei wirkung.

wenn man das sitem aber getrennt von smenu:

Code: Alles auswählen

<smenu ...>
...
</smenu>
<sitem ...> ... </sitem>
einsetzt, wird auch die transform() methode des sitem aufgerufen. ein exit darin zeigt volle wirkung.


Ist das verhalten normal? Müsste ich in smenu noch etwas tun was ich vergessen habe? (sitem wurde in $this->__TagLibs[] hinzugefügt im konstruktor)

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von Megger » 09.09.2009, 11:53:35

Man kann sich dabei ganz gut an Select und Option in einer Form orientieren.

Da wird es so gemacht, dass zuerst nur Platzhalter eingefügt werden und beim transform wird dann der Platzhalter mit dem Ergebnis von transform ersetzt.

Du fügst aber wahrscheinlich gar keine items dynamisch hinzu oder?

Aber muss man nicht noch irgendwo ExtractTagLibs aufrufen? Schau dir einfach mal form_taglib_select.php und select_taglib_option.php an.

Edit:
http://adventurephpfra.svn.sourceforge. ... iew=markup
Zeile 66
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

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von Screeze » 09.09.2009, 11:56:37

in der onParseTime von smenu wird natürlich noch

Code: Alles auswählen

$this->__extractTagLibTags();
        $this->__extractDocumentController();
aufgerufen, sonst würde ja auch die onParseTime methode von sitem nicht aufgerufen werden.

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von Megger » 09.09.2009, 12:13:28

Ok vergiss meinen Beitrag einfach wieder :p Ich habe keine Ahnung, da ich deinen Quellcode auch nicht kenne
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

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von dr.e. » 09.09.2009, 20:19:08

Hi Screeze,
Ist das verhalten normal? Müsste ich in smenu noch etwas tun was ich vergessen habe? (sitem wurde in $this->__TagLibs[] hinzugefügt im konstruktor)
Ich denke es liegt daran, dass du die innere Taglib nicht im "richtigen" Konstruktor hinzugefügt hast. :) Postest du bitte mal die beiden Klassen?
Viele Grüße,
Christian

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von Screeze » 09.09.2009, 20:48:07

sitem:

Code: Alles auswählen

<?php
import('mytools::screezeSimpleMenu::biz','screezeSimpleMenu');
class screeze_taglib_sitem extends Document {
    function screeze_taglib_sitem() {
    }
    function onParseTime(){
        $sSM = &$this->__getServiceObject('mytools::screezeSimpleMenu::biz','screezeSimpleMenu');
        $sSM->addnode($this->getAttribute('url'), $this->getAttribute('param'), $this->__Content, $this->__getAttributesAsString($this->__Attributes, array("url", "param")));
    }
    function transform(){
        //@TODO: Hier wird nichts ausgeführt?
    }
}
?>
smenu:

Code: Alles auswählen

<?php
import('mytools::screezeSimpleMenu::biz','screezeSimpleMenu');
import('mytools::screezeSimpleMenu::pres::taglib','screeze_taglib_sitem');
/**
 * Taglib for adding simple Menus.
 */
class screeze_taglib_smenu extends Document {
    
    function screeze_taglib_smenu() {
        $this->__TagLibs[] = new TagLib('mytools::screezeSimpleMenu::pres::taglib', 'screeze', 'sitem');
    }

    function onParseTime(){
        // template=""
        $template = $this->getAttribute('template');
        if($template === null){
           trigger_error('[screeze_taglib_smenu::onParseTime()] The attribute "template" is empty or not present. Please provide the path to the template within this attribute!');
           return null;
        }
        $this->__extractTagLibTags();
        $this->__extractDocumentController();

    }
    function transform(){
        $sSM = &$this->__getServiceObject('mytools::screezeSimpleMenu::biz','screezeSimpleMenu');
        return $sSM->getMenu();
    }
}
?>

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von dr.e. » 09.09.2009, 21:50:04

Hallo Screeze,

da jede Taglib selbst für die Transformation zuständig ist, musst du in der Taglib screeze_taglib_smenu auch für die Transformation der Kind-Taglibs sorgen. In der Klasse Document bzw. core_taglib_importdesign wird das für dich erledigt, diese Funktion überschreibst du jedoch. Möchtest du dass die Transformations-Methode ausgeführt wird, musst du etwas in der Art

Code: Alles auswählen

foreach($this->__Children as $objectId => $DUMMY){
   ... $this->__Children[$objectId]->transform();
}
Für den PageController gilt im Allgemeinen, dass dieser nur den Rahmen absteckt, die Funktion selbst steckt in den Taglibs. Diese sind damitr auch für das Handling ihrer Kinder selbst verantwortlich.
Viele Grüße,
Christian


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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von Screeze » 09.09.2009, 23:29:03

vergessen:
ein hinweis in der doku wäre sinnvoll, beim eigenen taglib erstellen bereich.

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

Re: transform() von eigenem taglib nicht ausgeführt

Beitrag von dr.e. » 10.09.2009, 08:30:12

Hallo Screeze,

nehme ich mit auf und melde mich, wenn dieser Hinweis eingebaut ist. Du kannst auf der Seite auch gerne selbst Kommentare hinzufügen.

Edit:
Ich habe nun zur Dokumentation unter http://adventure-php-framework.org/Seit ... n-Methoden entsprechend Hinweise ergänzt, die auf diesen Umstand hinweisen. Ich hoffe, damit ist das Verhalten transparenter. :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast