Seitenparameter 'pagepart' ersetzen/Fallback

Anmerkungen, Fragen und Hinweise zur Konfiguration dürfen in diesem Forum gepostet werden. // Notes, questions, and hints on the configuration can be posted here.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4537
Registriert: 04.11.2007, 16:13:53

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 29.08.2010, 12:36:42

Hallo Jan,

die Umsetzung gefällt mir. :geek: Sie nutzt konsequent die bereits vorhandene Funktionalität und erweitert diese exakt um das Benötigte.

Um das in das APF-Release aufnehmen zu können, sollten wir jedoch den Namespace-Kenner noch etwas anpassen. Ich schlage vor, das im Package tools::html::taglib aufzunehmen und das Tag-Präfix html zu verwenden. Damit würde die Klasse html_taglib_fallbackimport heißen und per

Code: Alles auswählen

<core:addtaglib namespace="tools::html::taglib" prefix="html" class="fallbackimport" />
eingebunden werden können. Einverstanden?
Viele Grüße,
Christian

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 29.08.2010, 20:28:24

Damit würde die Klasse html_taglib_fallbackimport heißen [...]. Einverstanden?
Wenn du es partu aus dem core raus halten willst - gerne! 8-)

Die Ignoriermöglichkeit eines Fallbackinclude Fehlers kommt raus? Manchmal wäre das sicher eine praktische Sache, aber wie gesagt nicht unbedingt ganz sauber.

LG :)
Jan

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

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 29.08.2010, 21:08:23

Hallo Jan,

ich würde das gerne für das APF anbieten, jedoch ist das Verhalten nicht unbedingt im Core des Frameworks relevant (Fehler sollten ja nur während der Entwicklung auftreten). Der Code im Code ist ja dazu gedacht, beim Erstellen einer Webseite/Applikation eingesetzt werden zu müssen, die Tools können eingesetzt werden um beispielsweise die Entwicklung zu erleichtern. Ich denke deshalb ist es dort sehr gut aufgehoben. Und sieh's mal so: der tools-Namespace wird ja mit dem APF-Release direkt ausgeliefert. :D
Die Ignoriermöglichkeit eines Fallbackinclude Fehlers kommt raus? Manchmal wäre das sicher eine praktische Sache, aber wie gesagt nicht unbedingt ganz sauber.
Unsauber finde ich das nicht. Ich würde eher einen Text statt des zu inkludierenden Views ausgeben, der den Fehler beschreibt. Das hilft im Fall der Fälle mehr als keine Reaktion. Auf dem Live-System ist das natürlich etwas hinderlich, denn dort sollte kein Fehler-Text stehen, sondern ein deterministisches Verhalten wie das Anzeigen der Startseite bei Fehlern erfolgen (siehe Diskussion zu den Exception-Handlern). Man könnte daher a) an dieser Stelle einfach die Exception nicht catchen oder b) einen vernünftigen Text anzeigen.
Viele Grüße,
Christian

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 02.09.2010, 16:06:20

Schon gut. Kommt in den tools-Namespace! Eigentlich wollte ich darüber diskutieren. verstehe das bitte nicht falsch... :shock:
Man könnte daher a) an dieser Stelle einfach die Exception nicht catchen oder b) einen vernünftigen Text anzeigen.
Dann würde ich die Exception durchlassen.
Fehler sollten ja nur während der Entwicklung auftreten
Fehler, ja. Manch fehlendes Template muss aber nicht ein Fehler darstellen, sondern kann auch so gedacht sein. Möchte man bspw. an einer Stelle im Layout die Möglichkeit haben, für diesen Wert des incparam xyz einen anderen Inhalts als den Defaultinhalt einzubinden, ist das genau die Funktionalität eines Fallbacks. Zumindest wäre es in meinen Augen Quatsch, den Defaultinhalt für alle annehmbaren incparam xyz Werte zu kopieren...

LG :)

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

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 03.09.2010, 15:27:33

So, die ganze Sache habe ich jetzt angepasst. Außerdem ist mir beim Testen aufgefallen, dass ein einfacher Parameter fallback nur für den alternativen Templatenamen eine praktische Sache wäre.
Das spart Schreibarbeit.

Hier nun das vorläufige Endergebnis.

Code: Alles auswählen

<?php

	/**
    * @package tools:html:taglib
    * @class html_taglib_fallbackimport
    *
    * This class mainly implements the functionality of the core::importdesign tag. It generates a sub node
    * from the template specified by the tag's attributes within the current APF DOM tree. Each
    * importdesign tag can compose further tags. Additionally you can catch inclusion errors e.g.
    * from missing templates, and include a fallbacktemplate instead
    *
    * @author jw-lighting <jw-lighting@ewetel.net>
    * @version
    * Version 0.1, 28.08.2010<br />
    */
class html_taglib_fallbackimport extends core_taglib_importdesign {

	
	/**
    * @public
    *
    * Implements the onParseTime() method from the Document class. Includes the desired template
    * as a new DOM node into the current APF DOM tree.
    *
    * @author jw-lighting, Christian Achatz
    * @version
    * Version 0.1, 16.07.2010, Christian Achatz (See more here: http://forum.adventure-php-framework.org/de/viewtopic.php?f=3&t=359#p3075)<br />
    * Version 0.2, 28.08.2010, jw-lighting (Added functionallity and improved the code of v0.1 to this class)<br />
    * Version 0.3, 02.09.2010, jw-lighting (Added short-scripting support with the fallback attribute)<br />
    */
    public function onParseTime() {
	  try {
      	
         parent::onParseTime();
         
        // end try
      } catch (IncludeException $ie){
      	
      	 if($this->getAttribute('fallback') != null){
      	 	$this->setAttribute('template',$this->getAttribute('fallback'));
      	  // end if
      	 }
      	 else{
         	$this->setAttribute('namespace',$this->getAttribute('fallbackNamespace'));
         	$this->setAttribute('template',$this->getAttribute('fallbackTemplate'));
          // end else
      	 }
         
      	 if(!empty($this->getAttribute('fallbackIncparam'))){
         	
         	$this->setAttribute('incparam',$this->getAttribute('fallbackIncparam'));
         	
           // end if
         }
         
         // it can be nessecary to send an 404-HTTP Error, check it here
         $send404Header = $this->getAttribute('send404Header');
         if($send404Header !== null && $send404Header != 'false'){
         	
         	import('tools::http', 'HeaderManager');
         	$HM = new HeaderManager();
         	$HM->send('X-APF-Error: Template not found', true, 404);
         	
           // end if
         }
         
         // try to load the fallback template now
         try{
         	
         	parent::onParseTime();
         	
           // end try
         } catch(IncludeException $ie){
         	
         	// if the template is not nessecary needed, give the last chance to ignore the failure here
         	$fallbackFailureIgnore = $this->getAttribute('fallbackFailureIgnore');
         	if($fallbackFailureIgnore !== null && in_array($fallbackFailureIgnore, array('true', 'yes')) ){
         		
         		$this->__Content = "";
         		
         	  // end if
         	}
         	
         	
         	throw $ie;
         	
           // end catch
         }
         
        // end catch
      }
      
     // end function
   }

}

?>

Wo schreibe ich die Doku rein? Ins Wiki oder hier im board unter Dokumentation um es dann gemeinsam zu optimieren. Wie lang sollte die Doku sein?

LG :)
Jan

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

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 03.09.2010, 18:01:06

Hallo Jan,

danke für das Update. Da ich die Doku auch in die offizielle Seite übernehmen möchte, kannst du diese einfach im Wiki unter http://wiki.adventure-php-framework.org/de/Tools verlinken. Die Doku sollte die Tag-Signatur und eine Beschreibung der Attribute umfassen. Wenn du möchtest auch noch ein Anwendungs-Beispiel und etwas Prosa drumherum.

Ich übernehme das dann für 1.13 in die Doku - vermutlich mit einem Verweis, damit die Doku nicht doppelt vorhanden ist - und in den aktuellen Code-Zweig.

Vielen Dank für deine Arbeit!
Viele Grüße,
Christian

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 03.09.2010, 19:30:33

Man sollte sich nicht drauf verlassen, das Code gleich funktioniert, nur weil die IDE nicht meckert. Ich bin gerade am Herz und Nieren prüfen, da kommen noch ein paar Debuggings.
Hoffe, du hast noch nichts eingearbeitet.

Käferfreies Update folgt ;)

LG :)

EDIT: So, hier ist es nun.
Ich hatte HeaderManager nicht statisch benutzt, wodurch das Script bei der Ausführung abbrach. Ausserdem habe ich die Möglichkeit einer (optionalen) Fehlernachricht anstelle von "nichts" eingebaut, für den Fall, dass ein Fehlerhafter Fallback-Include ignoriert werden soll (Keine Exception geworfen werden soll).

Code: Alles auswählen

<?php

	/**
    * @package tools:html:taglib
    * @class html_taglib_fallbackimport
    *
    * This class mainly implements the functionality of the core::importdesign tag. It generates a sub node
    * from the template specified by the tag's attributes within the current APF DOM tree. Each
    * importdesign tag can compose further tags. Additionally you can catch inclusion errors e.g.
    * from missing templates, and include a fallbacktemplate instead
    *
    * @author jw-lighting <jw-lighting@ewetel.net>
    * @version
    * Version 0.1, 28.08.2010<br />
    */
class html_taglib_fallbackimport extends core_taglib_importdesign {

	
	/**
    * @public
    *
    * Implements the onParseTime() method from the Document class. Includes the desired template
    * as a new DOM node into the current APF DOM tree.
    *
    * @author jw-lighting, Christian Achatz
    * @version
    * Version 0.1, 16.07.2010, Christian Achatz (See more here: http://forum.adventure-php-framework.org/de/viewtopic.php?f=3&t=359#p3075)<br />
    * Version 0.2, 28.08.2010, jw-lighting (Added functionallity and improved the code of v0.1 to this class)<br />
    * Version 0.3, 02.09.2010, jw-lighting (Added short-scripting support with the fallback attribute)<br />
    * Version 0.4, 03.09.2010, jw-lighting (Removed Bug: empty() can not use function return values, used temporary variables instead) <br />
    * 									   (Removed Bug: The class HeaderManager is designed for static use) <br />
    * 									   (Improved functionality: Added parameter 'errormsg' for failed fallback-templates include) <br />
    */
    public function onParseTime() {
	  try {
      	
         parent::onParseTime();
         
        // end try
      } catch (IncludeException $ie){
      	
      	 $fallback = $this->getAttribute('fallback');
      	 if(!empty($fallback)){
      	 	$this->setAttribute('template',$this->getAttribute('fallback'));
      	  // end if
      	 }
      	 else{
      	 	$fallbackNamespace = $this->getAttribute('fallbackNamespace');
      	 	if(!empty($fallbackNamespace)){
         		$this->setAttribute('namespace',$fallbackNamespace);
         	 // end if
      	 	}
      	 	
         	$this->setAttribute('template',$this->getAttribute('fallbackTemplate'));
          // end else
      	 }
         
      	 $fallbackIncparam = $this->getAttribute('fallbackIncparam');
      	 if(!empty($fallbackIncparam)){
         	
         	$this->setAttribute('incparam',$this->getAttribute('fallbackIncparam'));
         	
           // end if
         }
         
         // it can be nessecary to send an 404-HTTP Error, check it here
         $send404Header = $this->getAttribute('send404Header');
         if($send404Header != null && $send404Header != 'false'){
         	
         	import('tools::http', 'HeaderManager');
         	HeaderManager::send('X-APF-Error: Template not found', true, 404);
         	
           // end if
         }
         
         // try to load the fallback template now
         try{
         	
         	parent::onParseTime();
         	
           // end try
         } catch(IncludeException $ie){
         	
         	// if the template is not nessecary needed, give the last chance to ignore the failure here
         	$fallbackFailureIgnore = $this->getAttribute('fallbackFailureIgnore');
         	if($fallbackFailureIgnore != null && in_array($fallbackFailureIgnore, array('true', 'yes')) ){
         		
         		$this->__Content = $this->getAttribute('errormsg');
         		
         	  // end if
         	}
         	
         	
         	throw $ie;
         	
           // end catch
         }
         
        // end catch
      }
      
     // end function
   }

}

?>
Da ich die Doku auch in die offizielle Seite übernehmen möchte, kannst du diese einfach im Wiki unter http://wiki.adventure-php-framework.org/Tools verlinken.
Also hier reinschreiben und im Wiki verlinken, oder im Wiki schreiben und auf der offiziellen Homepage verlinken?

LG :)

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

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 04.09.2010, 10:07:45

Hallo Jan,
Man sollte sich nicht drauf verlassen, das Code gleich funktioniert, nur weil die IDE nicht meckert. Ich bin gerade am Herz und Nieren prüfen, da kommen noch ein paar Debuggings.
Das ist wohl wahr! Hatte in den letzten 2 Wochen da einige nette Erfahrungen. :roll:

der Code ist im SVN integriert. Siehe http://adventurephpfra.svn.sourceforge. ... p?view=log.
Also hier reinschreiben und im Wiki verlinken, oder im Wiki schreiben und auf der offiziellen Homepage verlinken?
Ins Wiki schreiben und ich verlinke das dann von der offiziellen Seite.
Viele Grüße,
Christian

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 10.09.2010, 15:44:57


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

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 13.09.2010, 20:51:30

Hi,

die Beschreibung ist super. Damit ist die Integration abgeschlossen. Vielen Dank für dein Engagement! :)
Viele Grüße,
Christian

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von jwlighting » 15.09.2010, 17:39:25

Gerne ;)

LG :)

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

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von Well » 22.11.2010, 18:51:16

Ich weiß nicht, ob ich das Problem richtig erkannt habe, aber auf jeden Fall existiert es:

Dadurch, dass der Tag erst im Template eingebunden wird, wird wohl auch das Childview erst später als beim core:importdesign Tag eingebunden. Das hat zur Folge, dass die transform() Funktion anderer Taglibs vor dem Controller des Childviews aufgerufen werden -> Es ist im Controller des Childviews nicht mehr möglich, bspw. den Titel bei der HtmlHeader-Extension zu beeinflussen.

Gibt's hierfür ein Workaround?

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

Re: Seitenparameter 'pagepart' ersetzen/Fallback

Beitrag von dr.e. » 22.11.2010, 21:13:45

Hallo Well,

das Thema haben wir - soweit ich mich erinnern kann - schon unter de/viewtopic.php?f=11&t=207 diskutiert. Das Timing-Modell des Page-Controller lässt sich jedoch so interpretieren, dass das Transform-Event tatsächlich "zu spät" für dein Vorhaben dran ist, weil du "tiefer" im Baum bist und dieser von der Wurzel ausgehend transformiert wird.

Da vor der Transformation jedoch das onParseTime() und onAfterAppend() genutzt werden kann, kannst du innerhalb deiner eingebundenen Sub-Templates mit einer Taglib die Header-Informationen beeinflussen. Schau dir mal http://wiki.adventure-php-framework.org ... rweiterung an, dort werden sie beschrieben.

Sollte das für deinen Anwendungsfall nicht funktionieren oder zu den Tags Fragen haben, meld dich einfach. Die Doku im Wiki ist noch nicht komplett up2date.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast