Unterstützung " und ' als Attribut-Abgrenzung

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 01.10.2012, 18:22:31

Wir wollen halt die Besten bleiben ;) :ugeek:

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 02.10.2012, 23:07:10

Absolut! (leider gibt es hier kein Party-Smily wie bei Skype ;()
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 03.10.2012, 13:56:05

So, ich habs tatsächlich ohne Performance-Verlust hinbekommen. D.h., wer die Funktion nicht nutzt, hat nix verloren.

Die Klasse html_taglib_placeholder ist unverändert, ich habe nur eine neue Methode zu base_controller hinzugefügt, die "sehr stark" auf setPlaceholder() aufbaut ;)

Code: Alles auswählen

/**
    *
    * Replaces string-placeholders in content of html:placeholder-tag.
    * An example of a string placeholder with key "url" is "{URL}"
    * String placeholders are always written in capital letters!
    *
    * @param string $name Placeholder name
    * @param string $key Key-name of string placeholder
    * @param string $value Value, the string placeholder is replaced with
    * @throws InvalidArgumentException
    *
    * @author Jan Wiese <jan.wiese@adventure-php-framework.org>
    * @version
    * Version 0.1, 03.10.2012<br />
    */
   protected function setStringPlaceholder($name, $key, $value) {

      $placeHolderCount = 0;

      $children = &$this->__Document->getChildren();
      if (count($children) > 0) {

         foreach ($children as $objectId => $DUMMY) {

            if ($children[$objectId] instanceof html_taglib_placeholder) {

               if ($children[$objectId]->getAttribute('name') == $name) {

                  $content = $children[$objectId]->getContent();
                  $replacedString = '{' . strtoupper($key) . '}';

                  $children[$objectId]->setContent(
                     str_replace($replacedString, $value, $content)
                  );

                  $placeHolderCount++;
               }
            }
         }
      }
      else {
         throw new InvalidArgumentException('[' . get_class($this) . '::setStringPlaceHolder()] No placeholder object with name "'
         . $name . '" composed in current document for document controller "' . get_class($this)
         . '"! Perhaps tag library html:placeholder is not loaded in current template!', E_USER_ERROR);
      }

      // warn, if no place holder is found
      if ($placeHolderCount < 1) {
         throw new InvalidArgumentException('[' . get_class($this) . '::setStringPlaceHolder()] There are no place holders '
         . 'found for name "' . $name . '" in document controller "' . get_class($this) . '"!', E_USER_WARNING);
      }
   }
 
Darin lese ich einfach den aktuellen Content des Tags, suche nach dem Replacement-String (Key in großen Buchstaben umgeben von geschweiften Klammern, z.B. "{URL}"), und ersetze ihn durch den angegebenen Wert.
Damit ließen sich sogar innerhalb des Controllers noch string-Placeholder einsetzen, z.B. so:

Code: Alles auswählen

$this->setPlaceholder('bla', 'Ich bin {BLUBBER}');

// ...

$this->setStringPlaceholder('bla', 'blubber', 'APF-Fan!');
 
Mit dem Ergebnis:
Ich bin APF-Fan!
Ansonsten sieht die Verwendung so aus:

Code: Alles auswählen

<html:placeholder name="bla">Ich bin {BLUBBER}</html:placeholder>
Und Innerhalb des Placeholders lassen sich HTML-Tags beliebig verwenden, ohne die IDE durcheinander zu bringen ;)

Wenn euch das soweit zufrieden stellt, sollte man noch über eine Exception für den Fall, dass der Key nicht gefunden wird, nachdenken und analog zu setPlaceholder() Convinience-Methoden bauen.

LG :)
Jan

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 03.10.2012, 14:42:08

Hallo Jan,

vielen Dank für deine Arbeit. Hast du mal drüber nachgedacht, die Erstzungsfunktion in die html_taglib_placeholder zu ziehen, damit diese auch von Tags und nicht nur von Controllern genutzt werden kann?
Key in großen Buchstaben umgeben von geschweiften Klammern, z.B. "{URL}")
Das würde ich nicht einschränken. Es reicht doch, wenn das Pattern \{([A-Za-z0-9]+)\} erfüllt ist. Richtig?
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 03.10.2012, 16:42:23

Hast du mal drüber nachgedacht, die Erstzungsfunktion in die html_taglib_placeholder zu ziehen, damit diese auch von Tags und nicht nur von Controllern genutzt werden kann?
Ich könnte die eigentliche Ersetzung in der Taglib implementieren. Der Rest drum herum ist ja eh nur Placeholder finden und Fehlerbehandlung - das braucht man ja nicht, wenn man das Taglib-Objekt eh schon "hat".

Wäre dann sowas hier, und würde in der gleichnamigen Methode von base_controller einfach verwendet:

Code: Alles auswählen

// in html_taglib_placeholder
public function setStringPlaceholder($key, $value){
   $content = $this->getContent();
   $replacedString = '{' . strtoupper($key) . '}';

   $this->setContent(
      str_replace($replacedString, $value, $content)
   );
}
 
Das würde ich nicht einschränken. Es reicht doch, wenn das Pattern \{([A-Za-z0-9]+)\} erfüllt ist. Richtig?
Ich hab auch kein Problem mit Sonderzeichen. ;) Mir ging es bei der Überlegung Großbuchstaben vorzuschreiben einfach darum, dass man die Platzhalter-Strings so im Template sofort sieht und sie sich von normalem Text, der auch in geschweiften Klammern steht, etwas mehr unterscheiden.
vielen Dank für deine Arbeit.
Gerne. Das war mir schon zu leicht... :roll:

LG :)
Jan

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 03.10.2012, 17:16:28

Wäre dann sowas hier, und würde in der gleichnamigen Methode von base_controller einfach verwendet:
Gefällt mir. Dann könnte man noch im base_controller noch eine Methode getPlaceHolder($name) extrahieren und in setPlaceHolder() und setStringPlaceHolder() nutzen. Für letzteres wäre das dann im Wesentlichen ein

Code: Alles auswählen

$this->getPlaceHolder($name)->setStringPlaceHolder($name, $value); 
Wobei ich mich noch nicht ganz mit dem Namen setStringPlaceHolder anfreunden kann, da du ja schon im Kontext eines Platzhalters bist. Vielleicht können wir da irgendwas besseres finden... :)
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 03.10.2012, 19:32:52

Wobei ich mich noch nicht ganz mit dem Namen setStringPlaceHolder anfreunden kann, da du ja schon im Kontext eines Platzhalters bist. Vielleicht können wir da irgendwas besseres finden...
Da haben wir was gemein. Vielleicht setStringReplacement() - aber damit bin ich auch ned recht zufrieden. Irgendwie fällt mir da grad nix Gescheites ein. :?
Dann könnte man noch im base_controller noch eine Methode getPlaceHolder($name) extrahieren und in setPlaceHolder() und setStringPlaceHolder() nutzen.
Das funktioniert nicht ganz. Denn im derzeitigen Code ersetzt du alle (-> auch mehrere (!)) Platzhalter mit einem Namen. Du kannst aber nur ein Objekt zurückgeben, d.h., mann müsste sich entweder ein HilfsObjekt ala PlaceholderList bauen, oder es darf pro Name nur noch ein Placeholder geben.
Ansonsten finde ich die Idee, das "Placeholder finden" (und die dazu gehörende Fehlerbehandlung) auszulagern, richtig gut.

Die Großbuchstaben gehen jetzt klar? ;)

LG :)
Jan

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 03.10.2012, 21:57:37

Hi Jan,
Das funktioniert nicht ganz. Denn im derzeitigen Code ersetzt du alle (-> auch mehrere (!)) Platzhalter mit einem Namen.
Stimmt, hatte ich übersehen. Dann vielleicht doch jeweils eine eigene Methode für die beiden Anwendungsfälle oder auch eine Methode, die eben eine Liste von Platzhaltern an Hand des Namens zurückgibt. Hierzu kannst du beispielsweise die getChildNodes() der Klasse Document nutzen, die in Version 1.16 hinzugekommen ist.
Die Großbuchstaben gehen jetzt klar? ;)
Ich plädiere für große und kleine Zeichen. :)
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 25.12.2012, 13:39:10

Push 8-)

Wie siehts aus mit dem Thema - können wir das abschliessen und uns auf eine Implementierung einigen?

LG :)

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 25.12.2012, 18:10:03

Das Thema können wir gerne für 1.17 angehen. Magst du einen Vorschlag machen?
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 25.12.2012, 22:15:11

Die Implementierung hatte ich weiter oben schon mal gepostet.

Wenn ich das nach dem überfliegen richtig extrahiert habe, fehlten uns noch folgende Punkte:
  1. Key aus Großbuchstaben: Meinetwegen kann der Key auch aus beliebigen Zeichen bestehen, auch wenn ich ausschließlich Großbuchstaben nach wie vor schöner fände ;)
  2. Name der Methode: Ich hatte setStringReplacement() und setStringPlaceholder() vorgeschlagen, beides fanden wir beide noch nicht perfekt ;)
LG :)

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 30.12.2012, 00:28:49

Hi,

sorry für die späte Reaktion.

In 1.16/1.17 gibt es den html_taglib_getstring/LanguageLabelTag Tag. Dieser kennt schon eine Ersetzung von Platzhaltern. Hier heißt die Methode setPlaceHolder(). Sollen wir das hier auch so nennen? Dann hätten wir ein

Code: Alles auswählen

$this->getPlaceHolder($name)->setPlaceHolder($name, $value); 
Magst du die Implementierung im 1.17er Branch vornehmen?
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 30.12.2012, 13:26:25

Dieser kennt schon eine Ersetzung von Platzhaltern. Hier heißt die Methode setPlaceHolder(). Sollen wir das hier auch so nennen?
Macht Sinn, oder? Meinetwegen gerne ;) Nur ist die Unterscheidung zwischen BaseDocumentController::setPlaceholder() und PlaceholderTag::setPlaceHolder() rein von der Bennenung etwas irritierend.
Magst du die Implementierung im 1.17er Branch vornehmen?
Wenn mein SVN mal funktionieren würde ... ;)

Das soll dann eine Methode in PlaceholderTag sein, richtig? BaseDocumentController bekommt diese Methode dann nicht, richtig? Im Template müsste das demnach so aussehen:

Code: Alles auswählen

<html:placeholder name="xyz">Ich bin ein Text mit einem fehlenden Wort {aBc}.</html:placeholder>
Oder formuliert: Der String-Placeholder muss immer im Inhalt eines Placeholder-Tags stehen.
Wollen wir vom Controller nicht ersetze String-Placeholder einfach ausgeben oder mit nichts (leerem String) ersetzen? Wäre für ersteres.

LG :)

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

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von dr.e. » 31.12.2012, 12:38:04

Hi Jan,
Nur ist die Unterscheidung zwischen BaseDocumentController::setPlaceholder() und PlaceholderTag::setPlaceHolder() rein von der Bennenung etwas irritierend.
Guter Einwand. Entweder die Doku der Methode gibt das her oder wir nennen es tatsächlich nach deinem Vorschlag setStringPlaceHolder(). Ein Anderer Vorschlag wäre noch PlaceHolderTag::addStringReplacement().
Wenn mein SVN mal funktionieren würde ... ;)
Dann bietet sich jetzt die ultimative Gelegenheit das mal einzurichten. ;) Ist auch nicht schwer. Schau mal unter http://wiki.adventure-php-framework.org ... ortoiseSVN bzw. unter http://wiki.adventure-php-framework.org ... Repository dort findest du einige Hilfen für die Einrichtung.
Oder formuliert: Der String-Placeholder muss immer im Inhalt eines Placeholder-Tags stehen.
Grundsätzlich ja. Nur muss der Tag in seiner Definition nicht unbedingt mit einem Content ausgestattet sein. Ist er das, geht der Sinn des Platzhalter-Tags etwas verloren. :)
Wollen wir vom Controller nicht ersetze String-Placeholder einfach ausgeben oder mit nichts (leerem String) ersetzen? Wäre für ersteres.
Das Framework kann bis zu einem gewissen Grad den Anwender vor Dummheiten bewahren, jedoch nicht von allen. Da du nicht wissen kannst, welche Inhalte der Platzhalter ausgeben soll, halte ich es eher für gefährlich, nicht ersetzte Platzhalter automatisch zu entfernen. Die Antwort ist daher: einfach als Text behandeln und mit ausgeben.
Viele Grüße,
Christian

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

Re: Unterstützung " und ' als Attribut-Abgrenzung

Beitrag von jwlighting » 31.12.2012, 13:30:40

Entweder die Doku der Methode gibt das her oder wir nennen es tatsächlich nach deinem Vorschlag setStringPlaceHolder(). Ein Anderer Vorschlag wäre noch PlaceHolderTag::addStringReplacement().
Da wäre ich dann eher für setStringPlaceHolder(). addStringReplacement() klingt durch das "add" für mich sehr nach dem hinzufügen von etwas, was hinterher ausgetauscht wird ;)
Dann bietet sich jetzt die ultimative Gelegenheit das mal einzurichten.
Nervt dich, oder? Mich auch. Ich habe immer noch ein Linux und auch eine Software (kdesvn, RapidSVN), nur funktionierts leider nicht wie es soll. Wir wollten das ja mal per Skype klären.
Das Framework kann bis zu einem gewissen Grad den Anwender vor Dummheiten bewahren, jedoch nicht von allen. Da du nicht wissen kannst, welche Inhalte der Platzhalter ausgeben soll, halte ich es eher für gefährlich, nicht ersetzte Platzhalter automatisch zu entfernen. Die Antwort ist daher: einfach als Text behandeln und mit ausgeben.
Sehe ich auch so ;)

LG :)
Jan

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

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast