Placeholder über Taglib füllen

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Placeholder über Taglib füllen

Beitrag von dave » 12.07.2012, 10:36:13

Hallöli,

Simple Frage, habe bisher keine Lösung dafür gefunden:

Wie kann ich einen Placeholder in einem Template aus einer Taglib mit einem Wert befüllen?

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

Re: Placeholder über Taglib füllen

Beitrag von Megger » 12.07.2012, 11:43:46

Da musst du meiner Meinung nach über getChildren() bzw. getParent() gehen! Da eine TagLib ja nicht direkt dem Template zugeordnet ist
Oder aber du greifst auf ein Document Objekt zu wenn du eins innerhalb der TagLib lädst!

Die Logik zum setzen eines PlaceHolders müsstest du allerdings selber implementieren
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
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von dave » 12.07.2012, 12:46:32

Ich habe da ein bisschen was durcheinander gebracht :roll: Daher hat sich das Thema auch shcon wieder erledigt ^^

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von jwlighting » 12.07.2012, 13:46:49

Daher hat sich das Thema auch shcon wieder erledigt
Ich würde das jetzt trotzdem gerne mal wissen ;)
Wie kann ich einen Placeholder in einem Template aus einer Taglib mit einem Wert befüllen?
Du meinst, wie du mit einer Taglib in einem Template (<html:template />) einen Placeholder im Template befüllen kannst, oder?

Ist den die befüllende Taglib genauso wie der zu befüllende Placeholder ein Kind des Templates? Dann könnte man ja über den Weg $this->__Parent->__Children[??] gehen.

LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: Placeholder über Taglib füllen

Beitrag von dave » 13.07.2012, 10:03:30

Eine Taglib soll doch die Funktionen, die durch die Taglib erledigt werden sollen, automatisch generieren. Daher sind Platzhalter unnötig. In allen Taglibs zu den Form-Elementen gibt es auch keien Templates, bei denen Platzhalter definiert sind. Daher ist das für meine Taglib mit dem MultiFileUplaod auch Schwachsinn ;)

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von jwlighting » 13.07.2012, 12:53:53

Eine Taglib soll doch die Funktionen, die durch die Taglib erledigt werden sollen, automatisch generieren. Daher sind Platzhalter unnötig.
Mir geht es da weniger um den konkreten Fall sondern um das allgemeine Verständnis, wie man Zugriff auf andere Zweige und Blätter im Seitenbaum bekommt.

Nehmen wir beispielsweise mal an, ich habe zwei Taglibs in verschiedenen Templates, die miteinander kommunizieren müssen. Wie kann ich auf die jeweils andere Taglib zugreifen und beispielsweise Eigenschaften schreiben oder lesen.?

LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: Placeholder über Taglib füllen

Beitrag von Megger » 13.07.2012, 13:36:59

Das hast du schon richtig erkannt, die folgst dem Pfad mit getParent() und getChildren() bis du da bist wo du hinwillst! Ist allerdings sehr umständlich in meinen Augen!
Da ist es einfacher eine Klasse per Singleton zu holen und dann mit getAttribute() und setAttribute() zu arbeiten! Da bist du flexibler, besonders wenn sich die Position deiner Taglib einmal ändert, müsstest du bei erster Lösung wieder am Quellcode etwas umschreiben, der zweiten Lösung ist es egal wo die Taglibs liegen!
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: 4525
Registriert: 04.11.2007, 16:13:53

Re: Placeholder über Taglib füllen

Beitrag von dr.e. » 13.07.2012, 14:02:32

Wie kann ich einen Placeholder in einem Template aus einer Taglib mit einem Wert befüllen?
Template:

Code: Alles auswählen

<html:placeholder name="one"/>
<html:placeholder name="two"/>
<core:addtaglib
      namespace="..."
      prefix="foo"
      class="bar"
      />
<foo:bar value="123"/>
Taglib:

Code: Alles auswählen

class foo_taglib_bar extends Document {
   public function onAfterAppend() {

      $value = $this->getAttribute('value');

      $parent = &$this->getParentObject();
      $placeHolders = $parent->getChildren();

      foreach ($placeHolders as $objectId => $DUMMY) {
         if ($placeHolders[$objectId] instanceof html_taglib_placeholder) {
            $placeHolders[$objectId]->setContent($value);
         }
      }

   }
} 
Effektiv nutzt du einfach die Möglichkeit, dass jedes Template und jeder Tag im DOM-Baum repräsentiert ist und über die Methoden getParentObject() und getChildren() traversiert werden kann.

OT: in der Doku von 1.16 habe ich bereits ein ähnliches Beispiel eingebaut.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von jwlighting » 13.07.2012, 16:11:41

Danke Christian, ist ja noch einfacher, als ich dachte ;) Damit hat sich mein Verständnis auch wieder erhöht. Ich sehe das jetzt richtig, dass jedes Template und jede Taglib ein eigenes Objekt im Baum ist, richtig? Wie komme ich den im Controller aufs Template oder aus dem Template auf einen Controller?

LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: Placeholder über Taglib füllen

Beitrag von dr.e. » 13.07.2012, 17:46:03

Hi Jan,

dass es nicht einfach ist, hast du behauptet! :D
Ich sehe das jetzt richtig, dass jedes Template und jede Taglib ein eigenes Objekt im Baum ist, richtig?

Jep, der Page-Controller baut wirklich einen durchgehenden DOM-Baum aus allen Elementen aus.
Wie komme ich den im Controller aufs Template oder aus dem Template auf einen Controller?
Wenn du obiges Template nimmst, kannst du die Platzhalter wie folgt füllen (analog zur Logik des Tags):

Code: Alles auswählen

class FooBarController extends base_controller {
   public function transformContent() {
      $document = &$this->getDocument();

      $value = '123'; // wherever value comes from...

      $parent = &$document->getParentObject();
      $placeHolders = $parent->getChildren();

      foreach ($placeHolders as $objectId => $DUMMY) {
         if ($placeHolders[$objectId] instanceof html_taglib_placeholder) {
            $placeHolders[$objectId]->setContent($value);
         }
      }

   }
} 
Der einzige Unterschied ist, dass du im Controller mit getDocument() auf den aktuellen Knoten für den der Controller zuständig ist zugreifst.
Viele Grüße,
Christian

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

Re: Placeholder über Taglib füllen

Beitrag von Megger » 13.07.2012, 18:23:38

Das Beispiel ist ja noch einfach, aber wenn es über mehrere Ebenen geht, dann wird es schon schwieriger!
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
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von jwlighting » 13.07.2012, 19:29:36

Das Beispiel ist ja noch einfach, aber wenn es über mehrere Ebenen geht, dann wird es schon schwieriger!
Das sollen andere Frameworks erst einmal nachmachen ;)

Was wir nochmal brauchen könnten, auch allgemein für XML Dokumente, wäre so etwas wie Smarty bei jQuery, damit man einfach auf Elemente und deren Inhalte zugreifen kann.

Vielen Dank nochmal Christian, für die einfachen Erklärungen.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: Placeholder über Taglib füllen

Beitrag von Megger » 13.07.2012, 20:05:35

Ja da hast du Recht, dass es bei anderen Frameworks vielleicht nicht möglich ist! Ich wollte damit eigentlich nur sagen, dass es ab einer bestimmten Komplexität nicht mehr gut ist auf diese Weise im Dokumentenbaum Dinge zu ändern! Besonders da du dir nicht sicher sein kannst ob ein Document an anderer Stelle vielleicht bereits fertig transformiert ist und dadurch deine Änderungen gar nichts mehr bringen

Code: Alles auswählen

$parentObject = $this->getParentObject();
$parentParentObject = $parentObject->getParentObject();
$parentParentParentObject = $parentParentObject->getParentObject();
$parentParentParentChildrenList = $parentParentParentObject->getChildren();
foreach ($parentParentParentChildrenList as $parentParentParentChildrenObject) {
    if ($parentParentParentChildrenObject instanceof html_taglib_placeholder) {
        $parentParentParentChildrenObject->setContent($value);
    } else {
        $parentParentChildrenList = $parentParentParentChildrenObject->getChildren();
        foreach ($parentParentChildrenList as $parentParentChildrenObject) {
            ...
        }
    }
}
 
Verstehst du nun was ich meine?
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
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Placeholder über Taglib füllen

Beitrag von jwlighting » 13.07.2012, 21:04:07

Besonders da du dir nicht sicher sein kannst ob ein Document an anderer Stelle vielleicht bereits fertig transformiert ist und dadurch deine Änderungen gar nichts mehr bringen
Stop mal - wenn ich so etwas in "onAfterAppend()" mache, dann ist noch gar nichts transformiert - oder etwa nicht? ;)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: Placeholder über Taglib füllen

Beitrag von Megger » 13.07.2012, 21:17:39

Da hast du natürlich recht
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