screezeHead - dynamisches Einbinden von <head> informationen

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.
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 21.09.2009, 12:50:38

Diese erweiterung baut auf meine zuvor vorgestellte erweiterung screezeGetCssJs auf.

Problematik:
ihr befindet euch in einem xbeliebigem template eurer seite, und stellt fest ihr braucht eine javascript/css datei, die ihr auf dem rest der Seite nicht benötigt.
Jetzt könntet ihr entweder die Datei IMMER einbinden (was aber unnötigen traffic und unnötige ladezeiten verursacht) oder ihr benutzt einen Manager wie screezeHead.
Oder ihr wollt den titel der seite abhängig von der jeweils angezeigten seite setzen. Oder ihr benötigt einen html <meta> refresh, um eure seite verzögert weiterzuleiten (z.b. nach registration). All das unterstützt screezeHead mit einem jeweils passenden Taglib. (nur der refresh kann nur per controller gesetzt werden)

Wie funktionierts? (theorie)
Ihr erstellt ein paar Dateien für screezeHead.
Ihr bindet ein bestimmtes taglib in eurem <head> template ein, welches am ende die informationen dort ausgibt.
Ihr bindet die neuen taglibs in x-beliebigen templates ein, und übergebt ihnen die benötigen informationen.
FERTIG.

Installation:
Unter .../mytools/screezeHead/biz/
Wird ein InfoManager angelegt. Dieser dient zum austausch der Daten zwischen den taglibs/controllern.
infoManager.php:

Code: Alles auswählen

<?php
/**
 *  @namespace mytools::screezeHead::biz
 *  @author Ralf Schubert
 * 
 *  @version 0.1, 20.09.2009
 */
class InfoManager extends coreObject {
    /**
     * Contains title of page.
     * @var string __title
     */
    public $__title = "";

    /**
     * Contains stylesheet files.
     * @var array __stylesheets
     */
    protected $__stylesheets = array();

    /**
     * Contains javascriptfiles
     * @var array __javascripts
     */
    protected $__javascripts = array();

    /**
     * Contains url and time for meta refresh
     * @var array
     */
    protected $__refresh = array();

    /**
     * This functionn adds a stylesheet-file at the end of the list.
     * @param string $namespace Namespace of stylesheet
     * @param string $filename Name of stylesheet (without .css)
     * @return <type>
     */
    public function addCss($namespace, $filename){
        //catch missing attributes
        if(empty($namespace) OR empty($filename)){
            trigger_error('[screezeHead::InfoManager::addCss()] Missing attributes.');
            return false;
        }
        $link = $this->buildFCLink($namespace, $filename, "css");
        if(array_search($link, $this->__stylesheets) === false)
            $this->__stylesheets[] = $link;
            
        return true;
    }

    /**
     * This function adds a javascript-file at the end of the list
     * @param <type> $namespace
     * @param <type> $filename
     * @return <type>
     */
    public function addJs($namespace, $filename){
        //catch missing attributes
        if(empty($namespace) OR empty($filename)){
            trigger_error('[screezeHead::InfoManager::addJS()] Missing attributes.');
            return false;
        }
        $link = $this->buildFCLink($namespace, $filename, "js");
        if(array_search($link, $this->__javascripts) === false)
            $this->__javascripts[] =  $link;
        return true;
    }

    /**
     * Adds a meta refresh to the head.
     * @param string $targetURL
     * @param int $time
     */
    public function addRefresh($targetURL, $time){
        $this->__refresh = array(
                                    "url" => $targetURL,
                                    "time" => $time
                                );
    }
    
    /**
     * Builds a Link for the screezeGetCssJs FC-action
     * @param <type> $namespace
     * @param <type> $filename
     * @param <type> $type
     * @return <type>
     */
    protected function buildFCLink($namespace, $filename, $type){
        $reg = &Singleton::getInstance('Registry');
        $libBasePath = $reg->retrieve('apf::core','LibPath');
        $namespace = str_replace('::','/',$namespace);
        return $_SERVER['SCRIPT_NAME'] . "?mytools_screezeGetCssJs_biz-action:sGCJ=path:" . $namespace . "|type:" . $type . "|file:" . $filename;
    }

    public function getStylesheets(){
        return $this->__stylesheets;
    }
    public function getJavascripts(){
        return $this->__javascripts;
    }
    public function getRefresh(){
        return $this->__refresh;
    }
}
?>
Außerdem 4 taglibs unter .../mytools/screezeHead/pres/taglib/

screezeHead_taglib_addCss.php

Code: Alles auswählen

<?php
import('mytools::screezeHead::biz','InfoManager');
class screezeHead_taglib_addCss extends Document
{
    public function onParseTime() {
        $iM = $this->__getServiceObject('mytools::screezeHead::biz','InfoManager');
        if(!isset($this->__Attributes['namespace']) OR empty($this->__Attributes['namespace']))
            trigger_error('[screezeHead_taglib_addCss::onParseTime()] The attribute "namespace" is empty or not present.');
        if(!isset($this->__Attributes['filename']) OR empty($this->__Attributes['filename']))
            trigger_error('[screezeHead_taglib_addCss::onParseTime()] The attribute "filename" is empty or not present.');
        
        $iM->addCss($this->__Attributes['namespace'], $this->__Attributes['filename']);
    }
}
?>
screezeHead_taglib_addJs.php

Code: Alles auswählen

<?php
import('mytools::screezeHead::biz','InfoManager');
class screezeHead_taglib_addJs extends Document
{
    public function onParseTime() {
        $iM = $this->__getServiceObject('mytools::screezeHead::biz','InfoManager');
        if(!isset($this->__Attributes['namespace']) OR empty($this->__Attributes['namespace']))
            trigger_error('[screezeHead_taglib_addJs::onParseTime()] The attribute "namespace" is empty or not present.');
        if(!isset($this->__Attributes['filename']) OR empty($this->__Attributes['filename']))
            trigger_error('[screezeHead_taglib_addJs::onParseTime()] The attribute "filename" is empty or not present.');

        $iM->addJs($this->__Attributes['namespace'], $this->__Attributes['filename']);
    }
}
?>
screezeHead_taglib_addTitle.php

Code: Alles auswählen

<?php
import('mytools::screezeHead::biz','InfoManager');
class screezeHead_taglib_addTitle extends Document
{
    public function onParseTime() {
        $iM = $this->__getServiceObject('mytools::screezeHead::biz','InfoManager');
        $append = false;
        if(isset($this->__Attributes['append']))
            $append = $this->__Attributes['append'];
        if(!empty($this->__Content)){
            if($append == "true")
                $iM->__title .= $this->__Content;
            else
                $iM->__title = $this->__Content;
        }
    }
    public function transform(){
        return "";
    }
}
?>
screezeHead_taglib_gethead.php

Code: Alles auswählen

<?php
import('mytools::screezeHead::biz','InfoManager');
class screezeHead_taglib_gethead extends Document
{
    
    protected $__stylesheets = array();
    protected $__javascripts = array();
    protected $__title = "";
    protected $__refresh = array();
    
    
    public function transform(){
        $iM = $this->__getServiceObject('mytools::screezeHead::biz','InfoManager');
        $this->__stylesheets = $iM->getStylesheets();
        $this->__javascripts = $iM->getjavascripts();
        $this->__title = $iM->__title;
        $this->__refresh = $iM->getRefresh();
        
        $output = "";
        $output .= "<title>" . $this->__title . "</title>
";
        if(count($this->__refresh) === 2){
            $output .= $this->buildMetaRefresh($this->__refresh['url'], $this->__refresh['time']);
        }
        foreach($this->__stylesheets as $stylesheet){
            $output = $this->buildCssLink($stylesheet) . $output;
        }
        foreach($this->__javascripts as $script){
            $output = $this->buildJsLink($script) . $output;
        }
        return $output;
    }

    protected function buildCssLink($sheet){
        return '<link href="' . $sheet . '" rel="stylesheet" type="text/css">
';
    }

    protected function buildJsLink($script){
        return '<script src="' . $script . '" type="text/javascript"></script>
';
    }
    protected function buildMetaRefresh($url, $time){
        return '<meta http-equiv="refresh" content="' . $time . '; URL=' . $url . '">
';
    }
}
?>
Das wars eigentlich schon.

Anwendung:

Der Infomanager wird grundsätzlich als singleton instanziert, denn er speichert die informationen und stellt sie wieder zur verfügung.
folgendes kann gemanaged werden:
-js dateien
-css dateien
-<title>
-meta refresh.

Diese informationen können ALLE in einem documentcontroller durch instanzieren des InfoManager an diesen übergeben werden.
Und für alle AUßER dem Refresh stehen auch taglibs zur verfügung. (für den refresh kann aufgrund von timing problemen kein taglib erstellt werden, dieser muss im documentcontroller behandelt werden)

Verwendung im Template:
Einbinden der Taglibs funktioniert dann wie folgt:

Code: Alles auswählen

<core:addtaglib namespace="mytools::screezeHead::pres::taglib" prefix="screezeHead" class="gethead" />
<core:addtaglib namespace="mytools::screezeHead::pres::taglib" prefix="screezeHead" class="addCss" />
<core:addtaglib namespace="mytools::screezeHead::pres::taglib" prefix="screezeHead" class="addJs" />
<core:addtaglib namespace="mytools::screezeHead::pres::taglib" prefix="screezeHead" class="addTitle" />
Innerhalb des HEAD bereichs solltet ihr folgenden Taglib benutzen, durch ihn werden die gesammelten Informationen am ende ausgegeben.

Code: Alles auswählen

<screezeHead:gethead />
In einem Template könnt ihr dann z.b. folgende definitionen benutzen:

Code: Alles auswählen

<screezeHead:addJs namespace="sites::GAME_mainpage::pres::frontend::static::js" filename="jquery.min" />
<screezeHead:addCss namespace="sites::GAME_mainpage::pres::frontend::static" filename="mainpage" />
<screezeHead:addTitle append="false">GAME_mainpage</screezeHead:addTitle>
Wichtig dabei, es wird immer der namespace der zu ladenden Datei, und der filename OHNE dateiendung angegeben. Das korrekte einbinden in html syntax wird automatisch erledigt.

Beim addTitle taglib gibt es noch ein attribut "append". sollte hier "true" eingetragen werden, und vorher auf der seite schon ein title definiert sein, wird der neue titel an den alten angehängt.
(wenn man z.b. etwas haben will wie "Irgendeine Seite - Unterseite - 3. Ebene" würde man Unterseite und 3. ebene mit append anhängen.)
Auf false gestellt wird der alte titel überschrieben.

Verwendung im documentcontroller:

Alternativ kann natürlich alles im documentcontroller erledigt werden (bzw. muss beim refresh auch gemacht werden):

Code: Alles auswählen

// InfoManager laden
$iM = $this->__getServiceObject('mytools::screezeHead::biz','InfoManager');
// Einen meta-refresh auf index.php mit einer verzögerung von 5 sekunden definieren.
$iM->addRefresh('index.php', 5);
Für das Setzen eines Titels gibt es keine spezielle funktion, die variable __title ist public und kann per
$iM->__title bearbeitet werden.

Ansonsten stehen die funktionen
addCss($namespace, $filename)
addJs($namespace, $filename)
zur verfügung.

Ich hoffe ich habe nichts vergessen. Bei fragen meldet euch.
Zuletzt geändert von Screeze am 21.09.2009, 20:08:23, insgesamt 1-mal geändert.

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Megger » 21.09.2009, 13:14:21

Für das Setzen eines Titels gibt es keine spezielle funktion, die variable __title ist public und kann per
$iM->__title bearbeitet werden.
Die __ wieder rausnehmen :D

Ansonsten eine gute Idee, auch wenn ich jetzt noch keinen Anwendungsfall von mir kenne wo ich es benötigen würde. Header Bereich und Title usw. sind bei mir eh zentral gelegen und werden nicht von Templates verändert. Titel usw. werden dann im ApplicationModel hinterlegt und angepasst.

Allerdings gefällt mir das einbinden von js und css Dateien :D zumindestens sieht die Syntax besser aus als bei dem anderen Tool. Dies ist sozusagen der grafische Aufbau :D
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: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 21.09.2009, 13:28:39

naja, ich habs in zusammenhang mit meinem formValidator gemerkt.
Ich habe auf der gesamten Hauptseite ein Formular (registrierung) wo ich den validator benötige, und wollte deshalb nicht zentral alles einbinden, sondern nur wenns nötig ist.

Zusätzlich muss natürlich das andere modul installiert sein, screezeHead baut dann die Links im Format von screezeGetCssJs zusammen.

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von dr.e. » 21.09.2009, 20:47:50

Hallo Megger,
[..] auch wenn ich jetzt noch keinen Anwendungsfall von mir kenne wo ich es benötigen würde.
Innerhalb eines CMS werden oft zusätzliche Applikationen/Module eingebaut, die eigene Stylesheets benötigen. So kann die Anwendung komfortabel gekapselt werden. Ich persönlich finde diese Erweiterung großartig! :)
Viele Grüße,
Christian

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 21.09.2009, 21:25:12

ich hab meine applikation jetzt komplett umgebaut, sodass ich (theoretisch (?) hoffe ich (?)) früher oder später doch noch auf url rewriting setzen kann. Jetzt bräuchte ich aber Hilfe meine erweiterungen dementsprechend anzupassen dass es klappt, weil ich aber im moment keine möglichkeit habe das rewriting dann zu testen, wärs nett wenn das einer von euch übernehmen könnte.

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von dr.e. » 21.09.2009, 21:31:20

Hi,

das kann ich gerne machen. Packst du mal ein ZIP-Package zusammen und stellst es hier zum Download, dann schaue ich mir das lokal mal an. Grundsätzlich kannst du dich an den *:mediastream-Tags orientieren, diese unterstützen auch beide URL-Varianten.
Viele Grüße,
Christian

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 21.09.2009, 21:50:07

jep mache ich morgen.
Ich pack auch das getCssJs mit rein, das muss auch angepasst werden.

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Megger » 22.09.2009, 10:53:59

dr.e. hat geschrieben:Hallo Megger,
[..] auch wenn ich jetzt noch keinen Anwendungsfall von mir kenne wo ich es benötigen würde.
Innerhalb eines CMS werden oft zusätzliche Applikationen/Module eingebaut, die eigene Stylesheets benötigen. So kann die Anwendung komfortabel gekapselt werden. Ich persönlich finde diese Erweiterung großartig! :)
Ich denke dass es dafür Anwendungsmöglichkeiten gibt, allerdings meinte ich, dass ich persönlich im Moment damit nichts anfangen kann, zumindestens nichts mit dem Head Bereich. JS und CSS Dateien einzubinden finde ich gut, dass gefällt mir, deswegen werden die beiden Tools auch bei mir Einsatz finden.
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: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 22.09.2009, 15:20:37

Hier ist das zip-paket, einfach in /mytools/ entpacken.
Dateianhänge
mytools.zip
screezeGetCssJs und ScreezeHead
entpacken in .../mytools/
(5.59 KiB) 81-mal heruntergeladen

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von dr.e. » 23.09.2009, 22:24:22

Hi Screeze,

ich habe mir das Paket nun angesehen und die Funktion gefällt mir. Beim Ausprobieren und Review des Codes sind mir folgende Dinge aufgefallen:
  • In der Beschreibung fehlt eine Beispiel-Konfiguration für die Front-Controller-Action. Das ist für Profis sicher einfach herauszufinden und zu erstellen, es kommt der Erweiterung jedoch zu Gute, wenn so etwas schon mitgeliefert wird.
  • Wenn ich die Erweiterung in das APF aufnehmen wollen würde (ich bin nicht abgeneigt, denn das ist ein sehr nützliches Feature), sollten die Pakete (=Ordner) möglichst "Autoren-frei" gekennzeichnet werden. :) Ich schlage vor, hier /mytools/jscssinclusion zu verwenden und die Dateien alle darunter zu strukturieren. Die Auslieferung der Files ist schließlich notwendig, wenn ich Komponenten unter screezeHead nutze.
  • screezeGetCssJsAction: Hier muss für den UrlRewrite-Fall ein

    Code: Alles auswählen

    $path = str_replace('_','/',strip_tags($this->__Input->getAttribute('path')));
    platziert werden, denn im Rewrite-Fall kann der Namespace nicht durch "/" getrennt werden, denn das ist ein Separator für Parameter.
  • screezeGetCssJsAction: Checks der Art

    Code: Alles auswählen

    !isset($path)
    kannst du auch weglassen, denn die Methode getAttribute() liefert im schlimmsten Fall "null" zurück. Dieses zählt auch als leer.
  • screezeGetCssJsAction:
    @var int TimeToLife
    -> TimeToLive? ;)
  • screezeGetCssJsAction: Soweit ich das RFC2616 kenne, sollte ein "Pragma"-Header kein "public" enthalten. Das ist vielmehr dem "Cache-Control"-Header vorbehalten.
  • TagLibs sollten üblicherweise klein geschrieben werden, da die XML-Tags auch in Kleinbuchstaben definiert werden sollten. Das ist kein Fehler, nur habe ich das beim APF mal als Konvention eingeführt.
  • screezeHead_taglib_addCss: Ich würde hier statt

    Code: Alles auswählen

    $this->__Attributes['namespace']
    besser

    Code: Alles auswählen

    $this->getAttribute('namespace')
    nutzen, dann kannst du dir das isset() wieder sparen. "if"-Statements sollten geklammert notiert werden. ;)
  • Das Hinzufügen einer CSS- oder JS-Datei ist etwas untypisiert implementiert - ein einfaches Array für mehrwertige Daten. Das ist an sich im OO-Sinne nicht ganz korrekt. Hier sollte man für jeden Typ einen eigene Objekt-Prepräsentation schaffen. Z.B. MetaNode oder TitleNode. Diese füllst du dann in der TagLib und fügst diese dem Manager (hier würde ich diesen HtmlHeaderManager nennen) hinzu. Das ist dann sauberer und du könntest die Link-Generierung direkt dort implementieren.
  • Ich habe an einigen Stellen >>"<< statt >>'<< gesehen. Aus Performance-Gründen sollte jedoch nur einfache Quotes verwendet werden.
  • screezeHead_taglib_addCss und screezeHead_taglib_addJs überschreiben die transform()-Methode nicht. Ich würde das auch hier tun, denn in der Klasse Document sind einige Code-Zeilen enthalten, die hier nicht ausgeführt werden müssen. In screezeHead_taglib_addTitle hast du das auch schon korrekt umgesetzt.
  • Damit der InfoManager URLRewrite-fähig wird muss die Methode buildFCLink() wi folgt lauten:

    Code: Alles auswählen

            $reg = &Singleton::getInstance('Registry');
            $urlRewriting = $reg->retrieve('apf::core','URLRewriting');
            $libBasePath = $reg->retrieve('apf::core','LibPath');
            $baseUrl = $reg->retrieve('apf::core','CurrentRequestURL');
            $namespace = str_replace('::','_',$namespace);
            if($urlRewriting === true){
             return $baseUrl. '/~/mytools_screezeGetCssJs_biz-action/sGCJ/path/'.$namespace
                .'/type/'.$type.'/file/'.$filename;
            }
            return $baseUrl.'?mytools_screezeGetCssJs_biz-action:sGCJ=path:'.$namespace
                .'|type:'.$type.'|file:'.$filename;
  • Die TagLib-Klassen sollten in der Klassen-Dokumentation ein Beispiel für die Anwendung und vor allem die Attribute haben. Alternativ kannst du diese auch in einer kurzen Doku beschreiben.
Ich habe an den Code-Dateien einige Änderungen vorgenommen. Damit du diese bei dir übernehmen kannst, habe ich dir das ZIP wieder angehängt.
Dateianhänge
mytools_edit.zip
(10.63 KiB) 74-mal heruntergeladen
Viele Grüße,
Christian

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 24.09.2009, 18:32:44

Hi, doc.
Danke erstmal für die beurteilung und überarbeitung.
In der Beschreibung fehlt eine Beispiel-Konfiguration für die Front-Controller-Action. Das ist für Profis sicher einfach herauszufinden und zu erstellen, es kommt der Erweiterung jedoch zu Gute, wenn so etwas schon mitgeliefert wird.
Die TagLib-Klassen sollten in der Klassen-Dokumentation ein Beispiel für die Anwendung und vor allem die Attribute haben. Alternativ kannst du diese auch in einer kurzen Doku beschreiben.
Wie verpackt man das am sinnvollsten da rein?
Wenn ich die Erweiterung in das APF aufnehmen wollen würde (ich bin nicht abgeneigt, denn das ist ein sehr nützliches Feature), sollten die Pakete (=Ordner) möglichst "Autoren-frei" gekennzeichnet werden. :) Ich schlage vor, hier /mytools/jscssinclusion zu verwenden und die Dateien alle darunter zu strukturieren. Die Auslieferung der Files ist schließlich notwendig, wenn ich Komponenten unter screezeHead nutze.
Jo von der Namensgebung bin ich auch schon wieder abgekommen ;)
JsCssInclusion wäre ein Denkbarer Name, den ich umsetzen werde.
screezeGetCssJsAction: Hier muss für den UrlRewrite-Fall ein[...]
Danke, getan.
kannst du auch weglassen, denn die Methode getAttribute() liefert im schlimmsten Fall "null" zurück. Dieses zählt auch als leer.
Ok, dann wird hier nurnoch auf empty geprüft.
-> TimeToLive? ;)
Aua, ich hab zwar meine 1en in englisch, aber live und life werd ich wohl nie lernen :lol:
screezeGetCssJsAction: Soweit ich das RFC2616 kenne, sollte ein "Pragma"-Header kein "public" enthalten. Das ist vielmehr dem "Cache-Control"-Header vorbehalten.
Hmm eigenartig, problem war dass mein server da immer iwas mitgesendet hatte, was zur verhinderung des cachings geführt hat. ich hab dann kurz im netz geschaut und diese lösung gefunden, welche funktioniert hat...
TagLibs sollten üblicherweise klein geschrieben werden, da die XML-Tags auch in Kleinbuchstaben definiert werden sollten. Das ist kein Fehler, nur habe ich das beim APF mal als Konvention eingeführt.
Also keine großbuchstaben in den tags... Ist zwar schade, da schlechter lesbar, aber ich werds umstellen auf kleinbuchstaben.
screezeHead_taglib_addCss: Ich würde hier statt

Code: Alles auswählen
$this->__Attributes['namespace']

besser

Code: Alles auswählen
$this->getAttribute('namespace')

nutzen, dann kannst du dir das isset() wieder sparen.
Ach mist, ich dachte ich hab das letztin bei allen ausgebessert, hab wohl was übersehen, danke.
"if"-Statements sollten geklammert notiert werden.
Inwiefern?

Code: Alles auswählen

if($this->get('namespace') === null)
            trigger_error('[screezeHead_taglib_addCss::onParseTime()] The attribute "namespace" is empty or not present.');
Ist legitim, und ich hab bisher auch nichts gehört dass es performancetechnische auswirkungen hat. Ich finde es bei einzeiligen bodys grundsätzlich schöner (mit gescheiter Einrückung!!!) auf die klammern zu verzichten, daher habe ich mir das angewöhnt ;)

Angenommen ich trage im taglib ein: 'namespace=""', wäre dann $this->get('namespace') === null? sonst brauch ich hier ne empty prüfung.
Das Hinzufügen einer CSS- oder JS-Datei ist etwas untypisiert implementiert - ein einfaches Array für mehrwertige Daten. Das ist an sich im OO-Sinne nicht ganz korrekt. Hier sollte man für jeden Typ einen eigene Objekt-Prepräsentation schaffen. Z.B. MetaNode oder TitleNode. Diese füllst du dann in der TagLib und fügst diese dem Manager (hier würde ich diesen HtmlHeaderManager nennen) hinzu. Das ist dann sauberer und du könntest die Link-Generierung direkt dort implementieren.
Ok was das angeht hab ich auf die theorie "simpel aber funktionstüchtig" gesetzt ;). Ich neige dazu eher von "schönstem oop" abzusehen, wenn das selbe mit weniger aufwand aber dennoch sauber umsetzbar ist.
Du würdest vorschlagen für jeden anwendungsfall je ein objekt zu erstellen. also MetaNode, TitleNode, JsNode, CssNode. Das wären 4 zusätzliche Klassen. Wenn ich jetzt auchnoch die Linkgenerierung in jedes der 4 objekte implementiere, habe ich mir deutlich mehr arbeit gemacht. (selbiges gilt wenn ich mir erst ein generalNode erstelle, von dem alle nodes erben, dann hätte ich 5 klassen...) Ich bin mir hier auch nicht sicher ob nicht die array methode sogar performancegünstiger ist, weil nicht erst 4 objekte erstellt werden müssen, könnte es mir aber vorstellen.
Was die Namensänderung des Managers angeht, die ist in Planung.
Ich habe an einigen Stellen >>"<< statt >>'<< gesehen. Aus Performance-Gründen sollte jedoch nur einfache Quotes verwendet werden.
Ja ich habs jahrelang mit " gelernt, versuchs mir allerdings schon seit monaten auf ' umzugewöhnen, das is schwerer als man meinen mag :D Ich gehs nochmal durch.
screezeHead_taglib_addCss und screezeHead_taglib_addJs überschreiben die transform()-Methode nicht. Ich würde das auch hier tun, denn in der Klasse Document sind einige Code-Zeilen enthalten, die hier nicht ausgeführt werden müssen. In screezeHead_taglib_addTitle hast du das auch schon korrekt umgesetzt.
ok
Damit der InfoManager URLRewrite-fähig wird muss die Methode buildFCLink() wi folgt lauten: [...]
Danke.

Ich habe an den Code-Dateien einige Änderungen vorgenommen. Damit du diese bei dir übernehmen kannst, habe ich dir das ZIP wieder angehängt.
Danke dir.
Sobald ich mit den änderungen durch bin gibts das neue paket von mir.

Screeze

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von dr.e. » 24.09.2009, 21:02:29

Hi Screeze,

ich denke mit deinem Beitrag schlägst du meinen längsten. ;)
Wie verpackt man das am sinnvollsten da rein?
Ich würde ein README für die Installation beilegen und dort auch die grobe Konfiguration/Verwendung der Tags beschreiben. Die Feinheiten kannst du in den Header der Klassen-Dokumentation packen.
JsCssInclusion wäre ein Denkbarer Name, den ich umsetzen werde.
Hört sich gut an. Würde den Namespace jedoch klein schreiben - ist auch in der Java-Coding-Convention so, die ich gerne zittiere.
Hmm eigenartig, problem war dass mein server da immer iwas mitgesendet hatte, was zur verhinderung des cachings geführt hat. ich hab dann kurz im netz geschaut und diese lösung gefunden, welche funktioniert hat...
Das ist in der Tat komisch. Bei mir hat das Caching auch ohne funktioniert. Ich möchte einfach vermeiden, dass das am RFC vorbei geht, wenn ich es ins APF aufnehmen möchte. Für letzteres würde ich ohnehin vorschlagen, dass wir uns zum Thema Erweiterungen einen Namespace für "3rdparty"-Erweiterungen überlegen. Das kann dann sowas sein wie "additionals" oder so...
Ist legitim, und ich hab bisher auch nichts gehört dass es performancetechnische auswirkungen hat. Ich finde es bei einzeiligen bodys grundsätzlich schöner (mit gescheiter Einrückung!!!) auf die klammern zu verzichten, daher habe ich mir das angewöhnt
Legitim ist das auf Grund der erlaubten Sprach-Konstrukte schon, jedoch entspricht es nicht den Java-Coding-Conventions. :) Ich weiß, Totschlagargument, jedoch ist es optisch besser erkennbar, wo der if-Block zu Ende ist.
Angenommen ich trage im taglib ein: 'namespace=""', wäre dann $this->get('namespace') === null? sonst brauch ich hier ne empty prüfung.
"namespace" ist hier ein Attribut und wird per

Code: Alles auswählen

$this->getAttribute('namespace')
abgefragt. Und ja, du kannst auf null prüfen. empty() wäre nur erforderlich, wenn du auch leere Strings zulassen würdest.
Ok was das angeht hab ich auf die theorie "simpel aber funktionstüchtig" gesetzt ;). Ich neige dazu eher von "schönstem oop" abzusehen, wenn das selbe mit weniger aufwand aber dennoch sauber umsetzbar ist.
Naja "schön" ist die Geschichte mit dem Refresh nicht. :)
Du würdest vorschlagen für jeden anwendungsfall je ein objekt zu erstellen. also MetaNode, TitleNode, JsNode, CssNode. Das wären 4 zusätzliche Klassen. Wenn ich jetzt auchnoch die Linkgenerierung in jedes der 4 objekte implementiere, habe ich mir deutlich mehr arbeit gemacht. (selbiges gilt wenn ich mir erst ein generalNode erstelle, von dem alle nodes erben, dann hätte ich 5 klassen...) Ich bin mir hier auch nicht sicher ob nicht die array methode sogar performancegünstiger ist, weil nicht erst 4 objekte erstellt werden müssen, könnte es mir aber vorstellen.
Mehr Arbeit ist da schon - klar - aber es ist lesbarer. Das Erzeugen von Objekten dieser Größe sollte auch nicht wirklich Performance kosten. Da sind ungünstige DB-Abfragen deutlich problematischer.
Was die Namensänderung des Managers angeht, die ist in Planung.
OK.
Ja ich habs jahrelang mit " gelernt, versuchs mir allerdings schon seit monaten auf ' umzugewöhnen, das is schwerer als man meinen mag :D Ich gehs nochmal durch.
OK. :)
Sobald ich mit den änderungen durch bin gibts das neue paket von mir.
Freu mich drauf.
Viele Grüße,
Christian

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Screeze » 24.09.2009, 21:12:47

ich denke mit deinem Beitrag schlägst du meinen längsten.
hmm :lol:
Würde den Namespace jedoch klein schreiben - ist auch in der Java-Coding-Convention so, die ich gerne zittiere.
na gut ;)
Das ist in der Tat komisch. Bei mir hat das Caching auch ohne funktioniert. Ich möchte einfach vermeiden, dass das am RFC vorbei geht, wenn ich es ins APF aufnehmen möchte.
Ich kanns nochmal testen. evtl. hats auch an was andrem gelegen. Aber was genau is dieses RFC zeug eigentlich??
"namespace" ist hier ein Attribut und wird per

Code: Alles auswählen
$this->getAttribute('namespace')

abgefragt. Und ja, du kannst auf null prüfen. empty() wäre nur erforderlich, wenn du auch leere Strings zulassen würdest.
ähm, täusch ich mich oder hast du dann hier nen fehler in den umbauten gemacht:

Code: Alles auswählen

$namespace = $this->get('namespace');
oder woher holst du hier den namespace?

also gut, angenommen es wird 'abc=""' angegeben.
was enthält

Code: Alles auswählen

$this->getAttribute('abc')
? null, nen leeren string, oder sonstwas?

Code: Alles auswählen

Naja "schön" ist die Geschichte mit dem Refresh nicht.
Ja ok ich werds umsetzen. soll ich dann die generateFCLink in jedem objekt neu definieren oder doch ein generalNode?

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von dr.e. » 24.09.2009, 21:21:39

Hi,
Ich kanns nochmal testen. evtl. hats auch an was andrem gelegen. Aber was genau is dieses RFC zeug eigentlich??
Ein request for comments ist ein Dokument, mit dessen Hilfe die Web-Standards diskutiert werden. Ein RFC beinhaltet daher nach der Verabschiedung die Spezifikation eines Themas. RFC2616 umfasst die Definition des HTTP-Protokolls (siehe http://www.faqs.org/rfcs/rfc2616.html). Wenn du dich mal damit zurecht gefunden hast, sind diese Dokumente überaus hilfreich.
oder woher holst du hier den namespace?
Ja, das ist Blödsinn, es muss wie angedeutet getAttribute() statt get() lauten. Ich habe einige Änderungen nachträglich eingepflegt und nicht mehr getestet (es war schon spät).
? null, nen leeren string, oder sonstwas?
Probier's aus. ;)

Im Code des Page-Controller steht dazu

Code: Alles auswählen

$attributes[trim($key)] = trim($attrValue);
. Es sollte also ein leerer String zurückkommen.
Ja ok ich werds umsetzen. soll ich dann die generateFCLink in jedem objekt neu definieren oder doch ein generalNode?
Nachdem jeder Knoten seine Repräsentation selbst kennen sollte, würde ich das auch dort gekapselt wissen wollen. Damit du das nicht in jeder Implementierung neu implementieren musst, macht es Sinn, das in eine Basis-Klasse zu stecken, die ein Interface implementiert, das die Struktur eines solchen Knotens definiert.
Viele Grüße,
Christian

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

Re: screezeHead - dynamisches Einbinden von <head> informationen

Beitrag von Megger » 25.09.2009, 08:26:56

"if"-Statements sollten geklammert notiert werden.
Inwiefern?

Code: Alles auswählen

if($this->get('namespace') === null)
            trigger_error('[screezeHead_taglib_addCss::onParseTime()] The attribute "namespace" is empty or not present.');
Ist legitim, und ich hab bisher auch nichts gehört dass es performancetechnische auswirkungen hat. Ich finde es bei einzeiligen bodys grundsätzlich schöner (mit gescheiter Einrückung!!!) auf die klammern zu verzichten, daher habe ich mir das angewöhnt
Dazu wollte ich noch etwas sagen:
Solltest du jemals deinen Quellcode anpassen wollen und zu dem trigger_error vielleicht noch etwas hinzufügen, dann ist es ganz schön nervig, da noch Klammern einzufügen.
Hier ist es zwar nur eine Stelle, aber ich kenne Projekte, da ist es durchgehend so gemacht und dass regt einen auf wenn man überall noch etwas ändern muss. Außerdem habe ich schon des öfteren gesehen, dass die Einrückung bei manchen anderen Programmen dann nicht mehr funktioniert und da ist es echt schwer herauszufinden, was nun wo gemacht wird.

Ich freue mich schon auf die überarbeitete Variante.
Ich hoffe ich bekomme am Wochenende mal mein MessageSystem fertiggestellt, sodass ich es auch mal vorstellen kann.
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