[3.0.2] Taglib im Taglib

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

[3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 03.11.2015, 14:10:23

Hallo,
leider ist es mir grad nicht möglich im Issue Einträge zu erstellen ich hänge immer bei der Auswahl des Projekts fest.

Ich habe heute mal testen wollen wie es sich verhält mit den verschachtelten Taglibs.

Eingebunden:
<core:addtaglib class="APF\tools\link\taglib\HtmlLinkTag" name="a" prefix="html"/>
<core:addtaglib class="GWPORTAL\pres\taglib\PortalMediaImageTag" prefix="gw" name="image"/>

Aufgerufen:
<html:a target="_blank" href="pres/images/game/pic1.png"><gw:image namespace="GWPORTAL\pres\images\game" width="150px" filename="pic1.png">Bild</gw:image></html:a>

Ausgabe:
<a target="_blank" href="pres/images/game/pic1.png"><node-000000000000000000000000055></node-000000000000000000000000055></a>

Ändere ich den html:a zum reinen a wird das Bild angezeigt. Sollte es nicht auch so funktionieren oder habe ich da was falsch verstanden.

mfg Christian Merz

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0.2] Taglib im Taglib

Beitrag von dave » 03.11.2015, 15:57:42

Gibt es eine Unterstützung für verschachtelte Taglibs? Davon wusste ich bisher noch nichts.

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 03.11.2015, 16:11:41

Wenn ich das richtige sehe stehts hier mit drin:
http://adventure-php-framework.org/Seit ... APF-Parser
Registrierte XML-Tags lassen sich in allen Ebenen unter Verwendung des definierten Präfix und Namens wiederverwenden. Der Parser ordnet diese entsprechend der Positionierung im Template im APF-DOM-Baum an.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0.2] Taglib im Taglib

Beitrag von dave » 03.11.2015, 17:11:30

dave hat geschrieben:Gibt es eine Unterstützung für verschachtelte Taglibs? Davon wusste ich bisher noch nichts.
Was zum Teufel habe ich da eigentlich gepostet? Sorry, bin zur Zeit in Nachtschicht unterwegs und zu dem Zeitpunkt halb erwacht :?

Die Taglib GWPORTAL\pres\taglib\PortalMediaImageTag ist eine von dir selbst geschriebene, richtig? Vllt. nen Fehler: Schau mal hier, evtl. bringt dich das weiter: viewtopic.php?f=5&t=191#p1241

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 04.11.2015, 09:56:42

So ohne zu schauen kann ich nur sagen das meine Taglib von der Standard MediaTag erbt. Und sie ist ja selber das Kind in dem HtmlLinkTag aber vielleicht fehlt dort die Bearbeitung der Kinder wobei ich ja einen halb geänderten Tag auslese..... ich werd das mal debugen und prüfen... Und sie funktioniert ja wenn sie kein Kind Objekt mehr ist.

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

Re: [3.0.2] Taglib im Taglib

Beitrag von dr.e. » 04.11.2015, 17:42:30

Hi,

schau dir mal MediaInclusionTag::onParseTime() an. Dort wird kein $this->extractTagLibTags() aufgerufen und damit auch keine Kinder verarbeitet. Vermutlich ist in deinem Tag ein Überschreiben der onParseTime() notwendig.
Viele Grüße,
Christian

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 05.11.2015, 11:02:44

Sowohl PortalMediaImageTag als auch HtmlLinkTag beinhalten die Funktion $this->extractTagLibTag() in der Funktion onParseTime().

Nochmal PortalMediaImageTag ist im Baum das KIND Objekt von HtmlLinkTag nicht anders herrum dies würde gar keinen sinn ergeben.

Code: Alles auswählen

<core:addtaglib class="APF\tools\link\taglib\HtmlLinkTag" name="a" prefix="html"/>
<core:addtaglib class="GWPORTAL\pres\taglib\PortalMediaImageTag" prefix="gw" name="image"/>
<html:a target="_blank" href="pres/images/game/pic1.png"><gw:image namespace="GWPORTAL\pres\images\game" width="150px" filename="pic1.png">Bild</gw:image></html:a>
wird zu:

Code: Alles auswählen

<a target="_blank" href="pres/images/game/pic1.png"><node-000000000000000000000000055></node-000000000000000000000000055></a>
PS: Im PortalMediaImageTag würde tehoretisch der ExtraxtTagLibTags befehl nur dann sinn machen wenn ich für den ALT Text diesen aus einer Sprach Datei laden also einen TagLib wieder dadrunter sich befindet .

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 05.11.2015, 11:44:25

Hab da grad mal nen Debug laufen:

In knownTags ist der Taglib bekannt.

Code: Alles auswählen

$prefix = "<gw";
$tags[0] = array(p => "gw, n => "image", s => 0, e => 97);
$selfClosing = false;
$token = "gw:image"
$class = "GWPORTAL\pres\taglib\PortalMediaImageTag"
Attribute alle erkannt (namespace,filename,width und den content)

Hm ok bis hierher wäre klar gewesen da sonst ein exception geschmissen worden wäre...... ich such mal wo das ganze nun umgeschrieben werden soll hilft mir ja auch den parser besser zu verstehen.

[Edit]
Als kleinen Test wollte ich nun einfach den media link statt eines Bildes ausgeben also die Standard Funktion von der die PortalMediaImageTag erbt. ebenso wird nichts angezeigt.

[Edit]
Also die tranform Funktion von meiner Taglib wird nichtmal aufgerufen.

[Edit]
Hab nun viel wieder gelernt zB mit PHPStorm direkt zu debuggen ohne browser *freu*.
Habe nun herrausgefunden das im Document:1071 das transform aufgerufen werden soll. Jedoch wird hier die <node-000000000000000000000000054 /> ganz klar übersprungen und alle anderen besagten tags.

Im Children Cache stehen aber alle Kinder korrekt drin da ist ein HtmlLinkTag mit einem Kind PortalMediaImageTag.
Muss zugeben soviel mir das debuggen spass macht stehe ich nun vor einem rätsel.

[EDIT]
Mir ist grad der dumme Gedanke gekommen das die Verschachtelung zu lang sein könnte. nur so als einwurf.

[Edit]
So ich komme zu dem schluss das es am HtmlLinkTag liegt da er zwar den Content mit der node schreibt aber dies nicht wieder transformiert. Ich werde nun nur noch schauen was andere TagLibs machen, ich entschuldige mich für das ganze Editieren aber Fehlersuche macht irgendwie spass.

[Letzter Edit beste Lösung kommt nun von Euch]
So habe nun die Funktion $this->transformChildrenAndPreserveContent() dem HtmlLinktag spendiert und ihn eingabaut.

Code: Alles auswählen

protected function transformChildrenAndPreserveContent() {
      $content = $this->getContent();
      foreach ($this->children as $objectId => $DUMMY) {
         $content = str_replace(
            '<' . $objectId . ' />', $this->children[$objectId]->transform(), $content
         );
      }

      return $content;
   }

Code: Alles auswählen

$content = $this->transformChildrenAndPreserveContent();
      return '<a ' . $this->getAttributesAsString($this->getAttributes(), $this->attributeWhiteList) . '>' . $content . '</a>';
Und nun läuft alles wie erwartet.

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

Re: [3.0.2] Taglib im Taglib

Beitrag von dr.e. » 05.11.2015, 13:44:43

Sehr gute Analyse! :) Wenn du Kinder verarbeiten möchtest, dann ist auch eine Transformation derselben notwendig (siehe transformChildrenAndPreserveContent()).

Freut mich, dass es für dich nun funktioniert!
Viele Grüße,
Christian

GeneralCrime
Beiträge: 67
Registriert: 14.12.2011, 07:13:16

Re: [3.0.2] Taglib im Taglib

Beitrag von GeneralCrime » 05.11.2015, 14:38:43

Hab nun eine Taglib "HtmChildrenLinkTag" bei meinen extensions erstellt welche die funktion aufruft und vom eigentlichen HtmlLinkTag erbt.
Dank des neuen Parsers brauchte ich ja nur eine addtaglib anpassen.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast