Der SEF-Mechanismus in Joomla 1.5
Inhalt
Einführung
Joomla 1.5
Überblick
Verarbeitung eines Requests
Response
Eigene Komponenten mit Routing
Abschluss
2
Einführung
• SEF = Search Engine Friendly
• Suchmaschinenoptimierung
• „Schönere“ URLs
• Alternative zu Parameterlisten
3
Vergleich
• URL ohne SEF:
• example.tld/index.php?id=5&test=Hallo
• URL mit SEF:
• example.tld/articles/Hallo
• example.tld/index.php/articles/Hallo
4
Joomla 1.5
Am 22. Januar 2008 erste Stable-Version
Vollständig Objektorientiert entwickelt
Keine Abhängigkeit mehr zu Mambo
Oftmals Sicherheitsprobleme durchDrittkomponenten
5
Einstellungen
SEF-URLs => example.com/foo/bar
Suffix => example.com/foo/bar.html
mod_rewrite => SchreibtServerintern die Request-URLs um.
6
Seitenaufruf
Erstellen der Application:
$mainframe =&
JFactory::getApplication(‘site’);
-> Liefert JSite-Object.
Aufruf des Routings:
$mainframe->route();
-> route() ist in JApplication implementiert.
7
Routing 1
Abarbeitung in JApplication::route() :
$uri = clone(JURI::getInstance());
$router =& $this->getRouter();
$result = $router->parse($uri);
JRequest::set($result,’get’,false);
- Kopieren der Request-URI
- Router-Objekt holen.
- URI parsen
- Ergebniswerte in $_GET speichern.
8
JSite::&getRouter()
Implementierung:
$config =& JFactory::getConfig();
$options[‘mode’] =
$config->getValue(‘config.sef’);
$router= &parent::getRouter(‘site’, $options);
return $router;
Beschreibung:
- Konfiguration für SEF Laden
- Weiter reichen an parent9
JApplication::&getRouter()
JApplication::&getRouter($name, $options)
[..]
jimport(‘joomla.application.router’);
$router =& JRouter::getInstance($name,
$options);
[..]
return $router;
- Importiere Joomlas Routerklasse
- Reiche Instanz von JRouter zurück. (JRouterSite-Objekt)
10
JRouter::getInstance()
JRouter::getInstance($client, $options):
[..]
$classname = ‘JRouter’.ucfirst($client);
$instance = new $classname($options);
[..]
- Instanzieren der Klasse JRouterSite
11
JApplication::route()
Abarbeitung in JApplication::route() :
$uri = close(JURI::getInstance());
$router =& $this->getRouter();
$result = $router->parse($uri);
JRequest::set($result,’get’,false);
- $router ist nun vom Typ “JRouterSite”
- Übergabe von $uri an parse($uri)
12
JRouterSite::parse()
Implementierung JRouterSite::parse($uri):
[..]
// Set the route
$uri->setPath(trim($path, ‘/‘));
$vars += parent::parse($uri);
return $vars;
• In $uri bereinigten $path setzen.
• Vaterklasse mit dem Rest der $uri betrauen.
13
JRouter::parse()
$vars = array();
$vars = $this->_processParseRules($uri);
if($this->_mode == JROUTER_MODE_RAW) {
$vars += $this->_parseRawRoute($uri);
}
if($this->_mode == JROUTER_MODE_SEF) {
$vars += $this->_parseSefRoute($uri);
}
• Abhängig vom Modus wird die Methode zum parsen der URI ausgewählt.
14
_parseSefRoute($uri)
• Implementiert in JRouterSite (includes/router.php)
• Sucht anhand der URI die richtige Komponente heraus.
• Jedes Menu-Item hat ein Alias.
• Aus dem Alias eines Items und denen der Vateritems setzt sich die SEF-URI zusammen.
• Sucht im Verzeichnis der Komponente nach einer „router.php“ und inkludiert diese falls vorhanden.
• Liefert Ergebnis des Komponenten spezifischen Routings zurück.
15
Response
• Der umgekehrte Weg:
• SEF-Plugin in Joomla überschreibt onAfterRender()-Event
• Nutzt JResponse::getBody() um den Content zu bekommen.
• Sucht in allen Links nach „index.php“ und wendet darauf die Komponenten spezifischen SEF-Methoden an.
• Tauscht die im Body befindlichen Links durch die SEF-Links aus.
16
Eigene Komponenten mitRouting
• Ganz normal entwickeln und parametrisierte URIs ausgeben.
• router.php anlegen
• 2 Funktionen implementieren:
• <name>ParseRoute($segments)
• <name>BuildRoute(&$query)
• Wobei „name“ der hintere Teil aus dem Ordnernamen der Komponente ist: z.B:com_test => name = „Test“.
17
Eigene Komponenten mitRouting 2
• TestParseRoute($segments):
• $segments ist gesäuberter Teil der URI. D.h. ohne den für die Auflösung zur Komponente nötigen Teil.
• Methode liefert Assoziatives Array zurück mit den Bestandteilen die sonst in $_GET stehen würden.
18
Eigene Komponenten mitRouting 3
• TestBuildRoute(&$query):
• &$query ist die parametrisierte URI
• Methode liefert ein Array mit Segmenten zurück die danach durch „/„ getrennt die neue URI bilden.
19
Abschluss
• Implementierung im Framework recht aufwändig.
• Vorteilhaft für eigene Kompontente, da durch zwei Funktionen SEF-Fähigkeit hergestellt werden kann.
• Warum SEF-Plugin?
• Schlecht bis garnicht Dokumentiert.
20
Fragen?
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf." - Konrad Zuse
21