Ich habe mich direkt nachdem wir es im IRC besprochen hatten implementiert komme jedoch jetzt erst dazu hier zu posten.
Ich bin mit der Loesung allerdings nicht ganz gluecklich.
Ich poste einfach mal meinen Code:
PHP-Code:
/**
* Get a page layout and return it as database result object.
* This is a copy from PageRegular, see comments in parseFrontendTemplate() below for the reason why this is here.
* @param integer
* @return object
*/
protected function getPageLayout($intId)
{
$objLayout = $this->Database->prepare("SELECT * FROM tl_layout WHERE id=?")
->limit(1)
->execute($intId);
// Fallback layout
if ($objLayout->numRows < 1)
{
$objLayout = $this->Database->prepare("SELECT * FROM tl_layout WHERE fallback=?")
->limit(1)
->execute(1);
}
// Die if there is no layout at all
if ($objLayout->numRows < 1)
{
$this->log('Could not find layout ID "' . $intId . '"', 'PageRegular getPageLayout()', TL_ERROR);
header('HTTP/1.1 501 Not Implemented');
die('No layout specified');
}
return $objLayout;
}
/**
* get called by hook to inject all RSS feeds for the current layout into the template
*/
public function parseFrontendTemplate($strBuffer, $strTemplate) {
if(!isset($GLOBALS['TL_HEAD']['CATALOGFEED'])) {
global $objPage;
// here we are getting dirty, we have to import the page layout as we have no other way to get the layout from it.
// I know it does exist already as we are being called from it but hey, we got no Hook in PageRegular::createStyleSheets
// and therefore have to suffer the hard way... :(
$objLayout=$this->getPageLayout($objPage->layout);
$catalogfeeds = deserialize($objLayout->catalogfeeds);
// Add catalogfeeds
if (is_array($catalogfeeds) && count($catalogfeeds) > 0)
{
$objFeeds = $this->Database->execute("SELECT * FROM tl_catalog_types WHERE id IN(" . implode(',', $catalogfeeds) . ")");
while($objFeeds->next())
{
$base = strlen($objFeeds->feedBase) ? $objFeeds->feedBase : $this->Environment->base;
$GLOBALS['TL_HEAD']['CATALOGFEED']= '<link rel="alternate" href="' . $base . $objFeeds->alias . '.xml" type="application/' . $objFeeds->feedFormat . '+xml" title="' . $objFeeds->description . ' ' . $strTemplate . '" />' . "\n";
}
}
}
// Return buffer no matter if we added something to the global array or not.
// We simply to not want to tamper with it.
return $strBuffer;
}
Auf diese Art und Weise funktioniert es zwar, jedoch durchlaufe ich hierbei fuer jedes Template meine Funktion (habe es per debugging mal getraced, aktuell 16 Aufrufe die unnoetig sind), welche zwar sofort abbricht da mein Eintrag ja schon gesetzt ist aber dennoch aeusserst unschoen.
Was mich hierbei am Meisten stoert ist die Tatsache, dass ich die Routine getPageLayout() in meine Klasse reinkopieren musste und somit abhaengig von der jeweiligen konkreten Implementierung der aktuellen TL Version bin. Zugegeben, daran wird sich vermutlich nicht viel aendern in zukuenftigen Versionen aber dennoch gehoert es meiner Meinung einfach nicht doppelt in den Code sondern nur einmal und dann logischerweise dort wo es hingehoert, in PageRegular.
Meine Loesung wuerde sich durch einen einzelnen Hook in PageRegular::createStyleSheets() massiv vereinfachen lassen, wenn dieser nur mit dem aktuellen layout aufgerufen wuerde.
Wir wuerden dadurch das mehrfache durchlaufen der Routine einsparen und das Duplikat der Routine getPageLayout.
Das Problem steigert sich obendrein noch, sobald man dasselbe Verhalten in einer anderen Erweiterung benoetig, welche ggf. auch noch einen RSS bereitstellen will. Also muss man dorthin ebenfalls wieder die getPageLayout kopieren und die jeweilige Routine wird dann ebenfalls wieder fuer jedes Template durchlaufen obwohl dies nur ein einziges Mal passieren muesste.
Mein Fazit ist also: Es funktioniert, ist jedoch meiner Meinung nach ein Hack und sollte geaendert werden. Auf welchem Bugtracker muss ich aktuell nun einen Request fuer den Hook machen oder ist das sowieso von vornherein zum scheitern verurteilt?
Gruss
Chris
Lesezeichen