List TagLib

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Antworten
APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

List TagLib

Beitrag von APFelsahne » 03.04.2010, 16:35:29

Hi!

Mein Problem war, dass ich in einem Model dynamisch eine Liste (HTML-Liste) in einem Documentcontroller erstellen wollte mit beliebiger/variable Größe(Anzahl an Elementen). Da mir jetzt keine einfache Lösung einfiel, das System des Formular-Taglibs aber gefällt, hab ich analog zu dessen Struktur ein Listen-Taglib erstellt.
Im Anhang hab ich meine Files mal gezippt hochgeladen. Zum verwenden dann einfach unter /tools/ ablegen.
EDIT: Zur Verfügung stehen zur Zeit geordnete (ol) und ungeordnete (ul) Liste. Aufrufe sind 'list:orderedlist' und 'list:unorderedlist'

Getestet habe ich es auf APF 1.11.
In 1.12 dürfte es erstmal nicht funktionieren wg den set-Methoden(Context, Language...)

Freue mich über Kritik, oder evtl. bessere Lösungen ;)

Anwendungsbeispiel (vereinfacht):

Code: Alles auswählen

import('tools::list::taglib','html_taglib_list');

...
$this->__list = new html_taglib_list();
$this->__list->addList( 'list:unorderedlist' , array( 'id' => 'rsslist' ) );
$list = $this->__list->getListById( 'rsslist' );

// --- $lstFeeds ein array mit bestimmter größe
foreach( $lstFeeds as $f)
{
   $list->addElement( $f , "list_css_class" );
}

return $this->__list->transform();


Grüße!
Dateianhänge
list.zip
(5.02 KiB) 66-mal heruntergeladen
Grüße, Florian
BildAPF-Extension wsCatalyst

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

Re: List TagLib

Beitrag von dr.e. » 05.04.2010, 18:39:52

Hallo APFelsahne,

schön, dass du dich an die Erweiterung/Anreicherung des APF gemacht hast. Sofern du den Code "spendieren" möchtest, kannst du diesen auch gerne im APF-SVN unter dem "extensions"-Namespace verwalten lassen. Mehr zu diesem Konzept findest du im Wiki unter Extensions.
Freue mich über Kritik, oder evtl. bessere Lösungen ;)
Die erste Frage, die mir ein fällt ist: Warum hat die mitgelieferte Taglib <html:iterator /> ausgereicht? Bei dieser Taglib wurde explizit darauf geachtet, die Repräsentation (unordered/ordered, ...) in das Template auszulagern um so den flexiblen Einsatz zu erleichtern.

Ansonsten habe ich mir mal die Implementierung angesehen und folgende Anmerkungen loszuwerden:
  • In der transform()-Methode von list_taglib_orderedlist und list_taglib_unorderedlist würde ich direkt auf der Variable $this->__Content arbeiten und keine weitere Variable mehr "aufmachen". Das kostet nur mehr Speicher.
  • list_taglib_orderedlist und list_taglib_unorderedlist unterscheiden sich nur durch das "ol" und das "ul". Den Code von transform() kann man also in eine eigene Funktion in AbstractTaglibList auslagern und nur noch das HTML-Tag definieren. Z.B. so:

    Code: Alles auswählen

    abstract class AbstractTaglibList extends list_control {  
       abstract function getListIdentifier();
       public function transform() {
          $list = (string)'';
    
            if(count($this->__Children) > 0)
            {
                $list .= '<'.$this->getListIdentifier().' '.$this->__getAttributesAsString($this->__Attributes).'>';
                foreach($this->__Children as $objectId => $DUMMY)
                {
                $this->__Content = str_replace('<'.$objectId.' />',$this->__Children[$objectId]->transform(),$this->__Content);
             }
    
             $list .= $this->__Content;
                $list .= '</'.$this->getListIdentifier().'>';
          }
          return $list;
    
       }
    }
    class list_taglib_unorderedlist extends AbstractTaglibList {
       protected function getListIdentifier(){
          return 'ul';
       }
    }
  • Ich würde in html_taglib_list::addList() nicht nach if($objectId !== null) prüfen, sondern die Exception fangen. Das ist Code-technisch sauberer.
Ansonsten gefällt mir der Ansatz. Nachteil ist lediglich, dass man der Liste nicht beliebige Formatierungen mitgeben kann wie beim Iterator-Tag. Sofern das für deinen Anwendungsfall reicht - perfekt!
Viele Grüße,
Christian

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: List TagLib

Beitrag von APFelsahne » 06.04.2010, 08:16:16

Guten Morgen!

Vielen Dank für dein Feedback!

Den Iterator-Taglib hab ich wohl überlesen, bin noch etwas neu mit dem APF unterwegs :mrgreen: brauchte aber grad unbedingt eine funktionierende Lösung, deswegen die Mühe.
Deine Kritik werde ich auf alle Fälle umsetzen und natürlich würde ich mich freuen, den Code zu spendieren :)

Eine Nachfrage:
"Nachteil ist lediglich, dass man der Liste nicht beliebige Formatierungen mitgeben kann wie beim Iterator-Tag".
Was genau meinst du mit beliebige Formatierung? Die HTML-Formatierung?


Grüße!

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

Re: List TagLib

Beitrag von dr.e. » 06.04.2010, 09:31:05

Hallo APFelsahne,
Deine Kritik werde ich auf alle Fälle umsetzen und natürlich würde ich mich freuen, den Code zu spendieren :)
Fein. Wichtig für eine Extension ist hauptsächlich, dass diese unter dem Namespace "extensions" (siehe http://adventurephpfra.svn.sourceforge. ... php5/1.12/) abgelegt sind und einen eindeutigen Sub-Namespace haben (z.B. "genericlist" o.ä.). Sobald du den Code fertig hast, integriere ich ihn in das SVN und du kannst dann die Dokumentation im Wiki unter http://wiki.adventure-php-framework.org/de/Extensions selbst anlegen und pflegen.
Eine Nachfrage:
"Nachteil ist lediglich, dass man der Liste nicht beliebige Formatierungen mitgeben kann wie beim Iterator-Tag".
Was genau meinst du mit beliebige Formatierung? Die HTML-Formatierung?
Ja, ich meinte HTML-Formatierungen. Mit dem Interator-tag kannst du beispielsweise auch Definitions-Listen einfach umsetzen:

Code: Alles auswählen

<html:iterator name="...">
<dl>
   <iterator:item>
   <dt><item:placeholder name="..." /><dt>
   <dd><item:placeholder name="..." /></dd>
   </iterator:item>
</dl>
</html:iterator>
Durch die Möglichkeit, eigene Taglibs hinzuzufügen, kannst du die Ausgabe noch beliebig komplexer gestalten. Es ist beispielsweise möglich, Inhalte mit dem <*:getstring />-Tags sprachabhängig anzuzeigen und damit Sprachversionen sehr einfach umsetzbar zu gestalten. Mit weiteren, eigenen Tags könntest du auch Applikations-spezifische Inhalte ausgeben, ...

Für eine einfache Liste ist deine implementierung aber sicher ausreichend.
Viele Grüße,
Christian

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: List TagLib

Beitrag von APFelsahne » 06.04.2010, 12:00:30

Hi!

Ich hab deine Vorschläge umgesetzt. Zusätzlich habe ich noch kleine Änderungen vorgenommen, da ich noch die Definitionsliste umgesetzt habe. (das war geplant, hatte nichts jetzt mit deinem beispiel mit dem iterator oben zu tun ;) )
Nun gibt es also die Möglichkeit ordered, unordered oder definition zu nutzen. Eine genauere Beschreibung findet sich in der Readme.txt, die beigelegt ist.

Ich hoffe, dass alles soweit in Ordnung ist :)


Grüße!
Dateianhänge
htmllist.zip
(7.52 KiB) 64-mal heruntergeladen
Grüße, Florian
BildAPF-Extension wsCatalyst

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

Re: List TagLib

Beitrag von dr.e. » 06.04.2010, 13:47:45

Hallo Florian,
Ich hoffe, dass alles soweit in Ordnung ist :)
Fast. Hier noch einige Anmerkungen:
  • Bitte die Klassen entsprechend den APF-Standard mit einem @class und einem selbstredenden Kommentar versehen.
  • Klassen in allgemeineren Namespaces sollten nicht von Klassen in spezielleren Namespaces abhängig sein. Im konkreten Fall ist AbstractTaglibList in extensions::htmllist von list_control in extensions::htmllist::taglib abhängig. IMHO sollte daher AbstractTaglibList nach extensions::htmllist::taglib verschoben und/oder der Sub-Namespace taglib entfallen. Vielleicht kann man die beiden Klassen auch zusammenfassen.
  • import()-Statements sollten am Besten vor der Dokumentation der Klasse stehen.
  • Kommentare und Beschreibungen bitte in englischer Sprache formulieren. ;)
  • Typen-Definitionen bei den Methoden bitte entsprechend anpassen. unknown_type ist für die IDEs, die auto complete unterstützen (z.B. Netbeans) nicht hilfreich. Im Prinzip reichen ja Angaben von string, string[] oder auch Document oder die entsprechende Taglib bei konkreten Implementierungen.
Die APF-Lizenz-Header füge ich entsprechend ein, es ist nur wichtig, dass du bei jeder Klasse und jeder Methode dich als Autor nennst, dann ist das hinsichtlich der (L)GPL sauber.
Viele Grüße,
Christian

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: List TagLib

Beitrag von APFelsahne » 07.04.2010, 15:57:10

Hallo Christian!

Alle gute Dinge sind bekanntlich drei ;)
Ich habe deine Vorschläge umgesetzt, die AbstactTaglibList ist nun in list_control integriert.
Habe nun auch alle nötigen Kommentare hinzugefügt und entsprechend die deutschen ins Englische übersetzt.
Die Typ-Definitionen habe ich auch ausgebessert. Die Lizenz-Header sollte nun auch überall drin sein. :D

Grüße!
Dateianhänge
htmllist.zip
(10.31 KiB) 55-mal heruntergeladen
Grüße, Florian
BildAPF-Extension wsCatalyst

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

Re: List TagLib

Beitrag von dr.e. » 07.04.2010, 23:50:48

Hallo Florian,

ich hab den Code in das SVN unter http://adventurephpfra.svn.sourceforge. ... xtensions/ integriert und die Wiki-Seite unter http://wiki.adventure-php-framework.org/de/HtmlList angelegt. Bitte teste den Code noch einmal im Context des 1.12er-Releases, damit wir zum Release sicherstellen können, dass es funktioniert. Die notwendigen Anpassungen habe ich vorgenommen.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast