Fehlerseite/Startseite bei Importdesign festlegen

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 11.12.2009, 21:33:09

Hallo :)
Ich habe eine Frage zum Taglib: "core:importdesign". Wenn man pagepart festlegt ([pagepart = start]) kann man ja die Seiten über die URL steuern. Doch wenn man eine falsche URL eingibt (z.B. startt oder ähnlichem) und diese Seite existiert nicht, kommt bekanntlich ein Fehler:
Design "startt" not existent in namespace...

Gibt es eine Möglichkeit eine festgelegte Seite anzuzeigen, anstelle die unschöne Error-Nachricht? Bis jetzt hab ich noch nichts gelesen, bzw überlesen.

Ich hätte noch zwei kleinere Fragen:
1. zu Importdesign: Kann die Datei und der Pagepartwert auch unterschiedlich heißen, um eine bestimmte Seite aufzurufen? Ich würde es etwas praktischer finden, die Datei "bestimmteabkürzung_main.html" und den Pagepartwert nur "main" zu benennen. Gibt es da eine Möglichkeit?

2. zum FC-Artikel an Christian: Arbeitest du noch am Artikel über "Model based view design"? Du hast folgendes geschrieben:
Hallo Sebastian,

ich plane hierzu in naher Zukunft noch einen erweiterten Artikel zum Thema Model based view design. (...)
Würde mich über diesen Artikel sehr freuen, da ich dieses Thema noch nicht 100% beherrsche :)

mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von dr.e. » 11.12.2009, 23:37:50

Hi,
Wenn man pagepart festlegt ([pagepart = start]) kann man ja die Seiten über die URL steuern. Doch wenn man eine falsche URL eingibt (z.B. startt oder ähnlichem) und diese Seite existiert nicht, kommt bekanntlich ein Fehler: Design "startt" not existent in namespace...
Korrekt. Das Tag wirft einen Fehler per trigger_error() und dieser wird vom globalen ErrorHandler abgefangen. Dieser stellt eine entsprechende Fehlerseite mit Stacktrace dar.
1. zu Importdesign: Kann die Datei und der Pagepartwert auch unterschiedlich heißen, um eine bestimmte Seite aufzurufen? Ich würde es etwas praktischer finden, die Datei "bestimmteabkürzung_main.html" und den Pagepartwert nur "main" zu benennen. Gibt es da eine Möglichkeit?
Der Bezeichner der Seite kann (nahezu) beliebig ausfallen. Sofern du deine Seite per ?main=bestimmteabkürzung_main adressieren möchtest, kannst du das per

Code: Alles auswählen

<core:importdesign namespace="..." template="[main=start]" incparam="main" />
erreichen. Sofern du eine explizite Abkürzung einführen möchtest, empiehlt es sich, die Taglib zu erweitern und das Parameter-Mapping nachzurüsten.
2. zum FC-Artikel an Christian: Arbeitest du noch am Artikel über "Model based view design"? Du hast folgendes geschrieben:
Hierzu wird es nach dem Release der Version 1.11 noch einen Artikel im Wiki geben. Die Basis der Implementierung ist bereits im Framework enthalten: <fcon:importdesign /> und <generic:importdesign />. Mit diesen beiden kann man bequem per Model definierte Views einbinden um damit eine sehr flexible GUI-Struktur aufbauen zu können. Die Idee ist im Artikel Behind the site in Kapitel 4 ansatzweise aufgegriffen.

Solltest du schon früher mehr Ideen brauchen, lass uns deinen Anwendungsfall einfach im "Entwicklung"-Forum diskutieren. Ich bin sicher, das lässt sich weitestgehend mit Board-Mitteln des APF lösen.
Viele Grüße,
Christian

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 12.12.2009, 00:23:24

Hallo,

erstmal vielen Dank. Wenn du meinst, der Theard passt eher zu Entwicklung, verschieb ihn bitte :) Dann muss ich nicht unnötig einen Neuen eröffnen.

mhh, ich glaub Du hats mich noch nicht richtig verstanden, oder ich hab das "importdesign" noch nicht richtig verstanden. Stell dir folgendes vor:
Der User sieht eine Übersicht mit verschiedenen Links. (Startseite: index.php?pagepart=start, Impressum: index.php?pagepart=impress, usw.) Damit die Links funktionieren, müssten demnach die Dateien start.html und impress.html existieren.
1: Wenn er jetzt den Link so toll findet und ihn irgendwo aufschreibt, um ihn später wieder in die Browserleiste einzutippen, und er verschreibt sich, dann kommt wie oben gesagt diese Fehlermeldung (durch trigger_error). Gibt es nicht eine Möglichkeit, den User praktisch auf eine andere Seite weiterzuleiten, die ihm sagt, dass er die URL falsch geschrieben hat o.ä. Dies würde für den User viel freundlicher wirken, als eine chinesische Seite. :lol: Für den Webmaster sei die Seite warscheinlich sehr hilfreich, für den User aber eben nicht.
2:
Der Bezeichner der Seite kann (nahezu) beliebig ausfallen. Sofern du deine Seite per ?main=bestimmteabkürzung_main adressieren möchtest, kannst du das per

Code: Alles auswählen
<core:importdesign namespace="..." template="[main=start]" incparam="main" />


erreichen. Sofern du eine explizite Abkürzung einführen möchtest, empiehlt es sich, die Taglib zu erweitern und das Parameter-Mapping nachzurüsten.
Da hast du natürlich Recht, aber meine Links sollten in etwa so aussehen:
  • index.php?pagepart=start
  • index.php?pagepart=impress
  • index.php?pagepart=main
Und die Dateien sollten aber eben nicht start.html, impress.html und main.html heißen. Der Sinn ist der, dass ich im Ordner die Dateien mit einer Abkürzung vor dem Namen noch mal besser sotieren kann. Wenn später mehr Templates dazukommen, könnte bald Unordnung herrschen. Es wäre also quasi eine feinere Unterteilung für mich. Hoffendlich verstehst du, was ich meine.
Kannst du bitte die Möglichkeit mit dem Parameter-Mapping nochmal kurz beschreiben? Ich komme grad nicht richtig mit.
Hierzu wird es nach dem Release der Version 1.11 noch einen Artikel im Wiki geben.
Werde mich schonmal freuen. "Behind the site" scheint auch nochmal Klarheit zu geben, ich werde es mir mal genau anschauen.

Schonmal Danke für deine/eure Hilfe :)
mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von dr.e. » 12.12.2009, 13:27:09

Hallo,
1: [..]Gibt es nicht eine Möglichkeit, den User praktisch auf eine andere Seite weiterzuleiten, die ihm sagt, dass er die URL falsch geschrieben hat o.ä. Dies würde für den User viel freundlicher wirken, als eine chinesische Seite. :lol: Für den Webmaster sei die Seite warscheinlich sehr hilfreich, für den User aber eben nicht.
Klar gibt es eine Möglichkeit. Aktuell ist das Verhalten so implementiert, dass eine nicht vorhandene Seite geahndet wird. In der Taglib <doc:createobject /> ist das gewünschte Verhalten so schon umgesetzt. Möchtest du das in der <core:importdesign />-Taglib haben, würde ich diese einfach um das Verhalten erweitern - dealerweise einfach durch Vererbung.
2: [..] Da hast du natürlich Recht, aber meine Links sollten in etwa so aussehen:
  • index.php?pagepart=start
  • index.php?pagepart=impress
  • index.php?pagepart=main
Und die Dateien sollten aber eben nicht start.html, impress.html und main.html heißen. Der Sinn ist der, dass ich im Ordner die Dateien mit einer Abkürzung vor dem Namen noch mal besser sotieren kann. Wenn später mehr Templates dazukommen, könnte bald Unordnung herrschen. Es wäre also quasi eine feinere Unterteilung für mich. Hoffendlich verstehst du, was ich meine. Kannst du bitte die Möglichkeit mit dem Parameter-Mapping nochmal kurz beschreiben? Ich komme grad nicht richtig mit.
Ah, jetzt weiß ich, was du meinst. Du möchtest in der Angabe der Parameter nochmal eine Unterordnung einführen - quasi einen Sub-Namespace. In diesem Fall würde ich auf jeden Fall eine eigene <core:importdesign />-Taglib schreiben, die genau das tut. Idee zur Umsetzung wäre, dass deine Parameter die Form "{Subnamespace}_{Seite}" besitzen. Dieses Format kannst du dann in der Taglib auftrennen und an den Namespace anhängen. Das geht dann in Code ausgedrückt in etwa so:

Code: Alles auswählen

class my_taglib_importdesign extends core_taglib_importdesign {

   public function my_taglib_importdesign(){
      parent::core_taglib_importdesign();
   }
   
   protected function __loadContentFromFile($namespace,$design){

     $subpath = substr($design,0,strpos($design,'_'));
     $design = substr($design,strpos($design,'_') + 1);
     $namespace = $namespace.'::'.$subpath;
     $file = APPS__PATH.'/'.str_replace('::','/',$namespace).'/'.$design.'.html';

     if(!file_exists($file)){
        $this->__Content = 'Standard-Seiten-Inhalt';
     }
     else{
        $this->__Content = file_get_contents($file);
     }
       
   }

}
Woher der Inhalt der Fallback-Seite kommt, kannst du in der Methode
__loadContentFromFile()
entsprechend noch implementieren. Sofern du das in der Taglib-Definition konfigurierbar machen möchtest, führe einfach ein neues Attribut ein, das du dort ausliest.

Ich hoffe, das hilft dir weiter.
Viele Grüße,
Christian

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 13.12.2009, 20:35:26

Hallo.
Ahh, das ist eigendlich das, was ich gesucht habe. doc:createobject ist mir bis jetzt noch gar nicht soo aufgefallen :D Nur scheint mir das doc:createobject zusammen mit dem core/my:importdesign etwas sinnlos. Sie übernehmen in meinen Augen die gleiche Aufgabe. Mit beiden kann man dynamischen Inhalt ausgeben lassen, sie über den Link beeinflussen lassen und eine eigene Error-Nachricht schreiben (c_de_404.html und my:importdesign). Ist jetzt doc:createobject speziell für Mehrsprachigkeit gedacht? Bzw: Wann sollte man doc:createobject benutzen und wann core/my:importdesign? Ich bin grad von den beiden Funktionen etwas verwirrt. :oops:

Mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von dr.e. » 14.12.2009, 08:45:28

Hallo filipre,
Mit beiden kann man dynamischen Inhalt ausgeben lassen, sie über den Link beeinflussen lassen und eine eigene Error-Nachricht schreiben (c_de_404.html und my:importdesign).

Die Funktion scheint zunächst gleich, der Unterschied besteht jedoch darin, dass der Tag <my:importdesign /> die Inhalte unter dem Ordner apps "sucht", <doc:createobject /> hingegen einen frei definierbaren Ordner innerhalb des lokalen Filesystems. Letzterer beachtet zudem noch die aktuell aktive Sprache im DOM-Baum und läd das relevante Dokument. Daher haben beide ihre Daseins-Berechtigung und finden sich deshalb auch im APF-Release wieder.
Ist jetzt doc:createobject speziell für Mehrsprachigkeit gedacht? Bzw: Wann sollte man doc:createobject benutzen und wann core/my:importdesign? Ich bin grad von den beiden Funktionen etwas verwirrt. :oops:
<doc:createobject /> war ursprünglich für die Gestaltung der Inhalte auf adventure-php-framework.org gedacht, da die Inhalte in HTML-Files je Sprache gepflegt werden. Mit diesem Tag kann ich diese ganz einfach in den APF-DOM-Baum einhängen lassen und die Inhalte entsprechend interpretieren (Auslesen von Tags, ...). Der <core:importdesign /> würde an dieser Stelle nur eine Datei abhängig vom Parameter ziehen und damit das Thema Sprachabhängigkeit nicht beachten.

Fazit: Sofern du also die Sprachabhängigkeit in den Templates selbst löst (etwa durch eigene Bereiche für jede Sprache oder ausgelagerte Texte) kannst du ohne weiteres eine eigene Taglib auf Basis von <core:importdesign /> schreiben, sofern du direkte Sprachabhängigkeit beachtet haben und keinen Aufwand investieren möchtest, so ist <doc:createobject /> das richtige für dich.

Ich hoffe, das hilft der Verwirrung etwas entgegen. :)
Viele Grüße,
Christian

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 14.12.2009, 23:09:17

Hallo,

Das erklärt es doch ganz gut. Danke.

So, hier ist jetzt die Klasse:

Code: Alles auswählen

class my_taglib_importdesign extends core_taglib_importdesign {
		
		public function my_taglib_importdesign() {
      		parent::core_taglib_importdesign();
		}
		
		protected function __loadContentFromFile($namespace,$design) {
			
			//$file-Adresse erstellen
			$file = APPS__PATH.'/'.str_replace('::','/',$namespace).'/'.__Language.'_'.$design.'.html';
			
			//$file überprüfen, Fehler: Defaultwert wird geladen
			if(!file_exists($file)) {
				
				//Atribute auslesen (defaultValue)
				$defaultValue = $this->__Attributes['defaultValue'];
				
				//Defaultadresse setzen
				$file = APPS__PATH.'/'.str_replace('::','/',$namespace).'/'.__Language.'_'.$defaultValue.'.html';
         	}
			
			//Content setzen
            $this->__Content = file_get_contents($file);
      	}
	}
Hab die Idee mit der Mehrsprachigkeit aus doc:createobject mal hinein gebracht, ich find das praktischer, als das in einer Config-Datei. Außerdem kann man mit dem zusätzlichen Attribut defaultValue jetzt eine Standart-Seite festlegen, falls die Datei aus der URL nicht existiert. Das Problem mit dem Sub-Namespace hab ich jetzt gelassen, das geht auch ohne.
Hab ich irgendwo ein Fehler gemacht, bzw vergessen?

mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von dr.e. » 15.12.2009, 00:40:15

Hallo filipre,
Hab ich irgendwo ein Fehler gemacht, bzw vergessen?
schaut gut aus. :) Wenn du möchtest, kannst du das als HOWTO auch im Wiki posten.

Viele Grüße,
Christian
Viele Grüße,
Christian

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 17.12.2009, 19:38:13

Hallo.

Halt, hab das "$this->" bei "__Language" vergessen. Sonst kommt nämlich:
Use of undefined constant __Language - assumed '__Language'

Code: Alles auswählen

class my_taglib_importdesign extends core_taglib_importdesign {
		
		public function my_taglib_importdesign() {
      		parent::core_taglib_importdesign();
		}
		
		protected function __loadContentFromFile($namespace,$design) {
			
			//$file-Adresse erstellen
			$file = APPS__PATH.'/'.str_replace('::','/',$namespace).'/'.$this->__Language.'_'.$design.'.html';
			
			//$file überprüfen, Fehler: Defaultwert wird geladen
			if(!file_exists($file)) {
				
				//Atribute auslesen (defaultValue)
				$defaultValue = $this->__Attributes['defaultValue'];
				
				//Defaultadresse setzen
				$file = APPS__PATH.'/'.str_replace('::','/',$namespace).'/'.$this->__Language.'_'.$defaultValue.'.html';
         	}
			
			//Content setzen
            $this->__Content = file_get_contents($file);
      	}
	}
Ohje hab trotzdem noch eine Frage. Ist __Language zum Sprachenändern mit einem Taglib gedacht, oder wie kann man bei __Language den Wert ändern? Für ein Taglib könnte ich mir das so vorstellen: $this->__Language = $this->__Attributes['value']; Oder ist __Language eher für Prozesse intern, und man sollte darauf gar nicht zugreifen? Ich hoffe, du verstehst mich :lol:

mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von Screeze » 17.12.2009, 19:45:00

Ich versuchs mal zu erklären, aber obs 100% richtig wird bin ich nicht sicher:

in $this->__language ist in jedem Objekt die Sprache dieses objekts gespeichert. Wenn das objekt durch das APF initialisiert wurde, wird die Sprache des erstellenden objekts verwendet.
Im normalfall bekommt also jedes Objekt die selbe Sprache zugeteilt.
Solltest du aber ein objekt (z.b. ein taglib) explizit in einer anderen sprache haben wollen, kannst du wenn ich mich nicht irre die sprache dieses Objekts überschreiben. (Anwendungsfall hab ich zwar keinen parat, aber wer weiss)

So in etwa ;)

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 17.12.2009, 23:22:49

ahhh, Danke. Das ergibt schon mehr einen Sinn...
Das heißt, die Sprache hat sich dann nur bei der Klasse my_taglib_setlanguage (die taglib) geändert, aber die Sprache bei my_taglib_importdesign bleibt unverändert. Also muss ich auf das __Language von "Document" zugreifen (parent::__Language? -- hat jedoch nicht geklappt -- Tut mir Leid, ich bin in Vererbung noch nicht 100% vertraut :oops: ).

Aber mir kommt das auch so vor, als gäbe es eine andere Möglichkeit, als es über __Language zu regeln. Aber wenn man jetzt doch die doc:createobject/my:importdesign verwendet, wie soll man sonst die Sprache umstellen?

Ahja:
Wenn du möchtest, kannst du das als HOWTO auch im Wiki posten.
Danke für das Angebot, aber ich glaub ich bin noch zu unerfahren :)

mfg filipre

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

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von dr.e. » 18.12.2009, 12:06:08

Hi filipre,

die Klassen-Variable $this->__Language ist in der Klasse coreObject definiert und kann in jeder weiteren Klasse direkt zugegriffen werden (weil protected). Diese Variable wird vom Page-Controller bei der Erzeugung einer Taglib injiziert und steht dir in jeder Taglib-Instanz zur Verfügung. bei der Initialisierung wird immer die Sprache des Vater-Knotens verwendet, so dass sich diese vom Root-Knoten zu den Blättern "vererbt". Möchtest du die Sprache in einer Taglib explizit ändern, so kannst du einfach im Konstruktor

Code: Alles auswählen

$this->__Language = 'fr';
setzen. Möchtest du die Sprache grundsätzlich ändern (=für alle Knoten), so ist der beste Platz die Bootstrap-Datei (index.php). Dies geht dann wie folgt:

Code: Alles auswählen

$page = new Page();  
$page->set('Language','fr');
$page->loadDesign('sites::helloworld','pres/templates/helloworld');  
echo $page->transform();
Aber mir kommt das auch so vor, als gäbe es eine andere Möglichkeit, als es über __Language zu regeln. Aber wenn man jetzt doch die doc:createobject/my:importdesign verwendet, wie soll man sonst die Sprache umstellen?
Wenn du das explizit über eine Import-Taglib machen möchtest, erweitere diese einfach um ein zusätzliches Attribut und setze in der onParseTime() den Wert in $this->__Language. Also quasi so:

Code: Alles auswählen

public function onParseTime(){

   $lang = $this->getAttribute('lang');
   if($lang !== null){
      $this->__Language = $lang;
   }

   parent::onParseTime();
}
Ich hoffe, das hilft dir weiter. Falls nicht, beschreibe nochmal deinen Anwendungsfall, ich bin mir sicher, wir finden eine saubere Lösung.
Viele Grüße,
Christian

filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Re: Fehlerseite/Startseite bei Importdesign festlegen

Beitrag von filipre » 19.12.2009, 20:12:01

Hallo,

Ich werde das über

Code: Alles auswählen

$page = new Page(); 
$page->set('Language','fr');
$page->loadDesign('sites::helloworld','pres/templates/helloworld'); 
echo $page->transform();
regeln.

Support ist nicht schlecht :)

mfg filipre

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast