Um modular und agil in Kohana zu entwickeln, wurde ein Skript Kollektor notwendig, der aus allen Controllern (Template- oder Standard-Controllern) Skripte (CSS, Javascript) sammeln kann.
Diese Scripte werden dann auf den jeweiligen Mastertemplates wieder an den richtigen Stellen eingebunden.
Dazu habe ich einen neuen Helper unter application/helpers/collector.php eingerichtet.
class Collector_Core
{
/**
* Arrays containing URL's to scripts/styles (fill with standards)
* @var string
*/
static protected $scripts = array();
static protected $styles = array();
/**
* Adds a url to store
* @param string $file the local path to file
* @return void
*/
static public function addJs($file)
{
self::$scripts[] = $file;
}
/**
* Adds a url to store
* @param string $file the local path to file
* @return void
*/
static public function addCss($file)
{
self::$styles[] = $file;
}
/**
* Generates/renders collectors items
* @param boolean $print whether to echo the output or just return rendered string
* @return string the rendered output
*/
static public function renderJs($print = false)
{
$scripts = array_unique(self::$scripts);
$output = html::script($scripts);
if ($print)
{
echo $output;
}
else
{
return $output;
}
}
/**
* Generates/renders collectors items
* @param boolean $print whether to echo the output or just return rendered string
* @param string|array $media type for this style (all, screen, print, media)
* @return string the rendered output
*/
static public function renderCss($print = false, $media = 'all')
{
$styles = array_unique(self::$styles);
$output = html::stylesheet($styles, $media);
if ($print)
{
echo $output;
}
else
{
return $output;
}
}
} // end of Collector_Core
Dieser Helper kann nun aus allen Controllern heraus befüllt werden.
class Welcome_Controller extends Template_Controller
{
/**
* set master template
*/
public $template = 'master_default.tpl';
/**
* default constructor
* @param void
* @return void
*/
public function __construct()
{
// load parent constructor
parent::__construct();
// collect scripts and styles
collector::addCss('/css/fancybox');
collector::addJs('/js/jquery.1.3.2');
collector::addJs('/js/jquery.fancybox');
}
/** more code here */
} // end of Welcome_Controller
Nachdem nun alle relevanten Skripte eingesammelt wurden, kann man diese auf dem Template wieder ausgeben lassen.
<?php collector::renderCss(true, 'all'); ?>
<!-- html code here -->
<?php collector::renderJs(true); ?>
Der Kollektor sorgt dafür das keine doppelten Skripte geladen werden.