( jc – 15.04.2010 13:02)
Extension Point ‘PAGE_HEADER’ geschmeidiger nutzen..
Fast jedes Addon bindet CSS Stylesheets ins backend ein, manche auch JS scripts, manche beides.. afair allen gemein ist, dies über den Extension Point PAGE_HEADER abzufrühstücken.. so zumindest die aktuelle best practice. Was dabei auffällt: Jedes Addon strickt dabei sein eigene private callback Funktion um seine benötigten Dateien im page header zu verlinken.. ein Aufwand der eigentlich unnötig ist:
Durch eine generische (im Idealfall per default im Core verfügbare) callback Funktion, welche die an sie übergebenen Parameter – sprich die individuellen <link>,<spript>,.. – verarbeitet und ausgibt, lassen sich solche header links deutlich einfacher und ohne individuelle callbacks erzeugen.
gory details
Laut Doku werden an den EP PAGE_HEADER bzw. über die Funktion rex_register_extension keine Parameter übergeben, aber zumindest für rex_register_extension stimmt das so nicht (mehr?), denn ein Blick in function_rex_extension.inc.php zeigt das rex_register_extension sehr wohl Parameter für die callback Funktion annimmt:
* @param $extension Name des ExtensionPoints
* @param $function Name der Callback-Funktion
* @param [$params] Array von zusätzlichen Parametern
Sprich der Weg für eine generische callback Funktion mit Verarbeitung von Parametern ist frei.
draft für eine statische (core) callback Funktion
Der Idalfall wäre natürlich, daß so eine allgemein callback Funktion direkt per Redaxo core zur Verfügung stünde.. die könnte für den EP PAGE_HEADER z.b. so aussehen:
<?php
function rex_header_add($params) {
if (is_array($params) && count($params)>2) {
foreach($params as $key => $val) {
if($key !== 'subject' && $key !== 'extension_point') {
$params['subject'] .= "\n".$val;
}
}
}
return $params['subject'];
}
?>
Diese Funktion könnte aus einem Addon heraus dann sehr einfach gefüttert werden:
<?php
// BACKEND CSS
////////////////////////////////////////////////////////////////////////////////
$header = array(
' <link rel="stylesheet" type="text/css" href="../files/addons/'.$myself.'/backend.css" media="screen, projection, print" />'
);
if ($REX['REDAXO']) {
rex_register_extension('PAGE_HEADER', 'rex_header_add',$header);
}
?>
Die Funktion als privater callback
So lange eine solche callback Funktion nicht Teil des Redaxo cores ist, kann man die Funktion natürlich privat in Addons nutzen, wobei der Vorteil dann nachwievor der ist, daß die Funktion statisch bleiben kann (und sollte), und lediglich der Parameter für den EP Aufruf an das jeweilige Addon angepaßt werden muß.. in meinen Addons nutze ich dies wie folgt, wobei es unproblematisch ist die Funktion evtl. mehrfach zu includen, da sie einerseits eben generisch und andererseits gegen mehrfaches Deklarieren abgesichert ist, d.h. die individuellen Parameter werden an jene Instanz der callback Funktion vergeben, die als erste deklariert wurde.
Ich verlinke also meine callback Funktion in jedem meiner Addons, und übergebe beim Aufruf von rex_register_extension den statischen Funktionsnamen, und die individuellen Parameter:
<?php
// BACKEND CSS
////////////////////////////////////////////////////////////////////////////////
$header = array(
' <link rel="stylesheet" type="text/css" href="../files/addons/'.$myself.'/backend.css" media="screen, projection, print" />'
);
if ($REX['REDAXO']) {
include_once $myroot.'/functions/function.rexdev_header_add.inc.php';
rex_register_extension('PAGE_HEADER', 'rexdev_header_add',$header);
}
?>
<?php
/**
* Generische Funktion zum Einbinden von CSS, JS, .. ins Redaxo Backend
*
* @param $params Extension-Point Parameter
*
* @author rexdev.de
* @package redaxo4
* @version 0.1
* $Id: function.rexdev_header_add.inc.php 85 2010-04-15 02:47:56Z rexdev $:
*/
if(!function_exists('rexdev_header_add'))
{
function rexdev_header_add($params) {
if (is_array($params) && count($params)>2) {
foreach($params as $key => $val) {
if($key !== 'subject' && $key !== 'extension_point') {
$params['subject'] .= "\n".$val;
}
}
}
return $params['subject'];
}
}
?>