Das PHP-CMS/Framework
Silverstripe bringt viele schöne Funktionen mit, um die fertige Seite zu optimieren. Eine davon ist combine_files(), die CSS bzw. Javascript-Dateien zusammenfasst und komprimiert. Ein paar Stolpersteine gibt es dabei aber zu beachten.
Erstens: combine_files() funktioniert ist im Entwicklungsmodus automatisch deaktiviert. Also in der mysite/_config.php die Zeile Director::set_environment_type() entweder auf test oder live stellen.
Zweitens: Silverstripe bzw. der Webserver soll das Verzeichnis themes/mytheme/css/ beschreiben können (wenn dort das komprimierte CSS-File abgelegt werden soll).
Der Rest ist eigentlich ganz einfach. In Page_Controller::Init() habe ich folgendes hinzugefügt:
$currentTheme = SSViewer::current_theme();
Requirements::clear('thickbox/javascript/jquery.thickbox.js');
Requirements::combine_files('javascript/jquery.stuff.js',
array(
'mysite/javascript/jquery-1.3.2.min.js',
'mysite/javascript/jquery.tooltip.js',
'mysite/javascript/jquery.cycle.all.pack.js',
'mysite/javascript/stuff.js',
'thickbox/javascript/jquery.thickbox.js'
));
Requirements::combine_files('themes/'.$currentTheme.'/css/cssmin.css',
array(
'themes/'.$currentTheme.'/css/layout.css',
'themes/'.$currentTheme.'/css/typography.css',
'themes/'.$currentTheme.'/css/form.css',
'thickbox/css/thickbox.css'
));
Da ich Silverstripes Thickbox Modul verwende, und dort gleich die thickbox.js eingebunden wird, musste ich mit Requirements::clear() diese Vorgabe erst mal löschen, weil sonst, wenn combine_files() nicht funktioniert das JS in der verkehrten Reihenfolge geladen wird.
Anschließend die komprimierten Dateien definieren und fertig.
Und der Head-Bereich der themes/mytheme/Page.ss sieht folgendermaßen aus:
<% require javascript(mysite/javascript/jquery-1.3.2.min.js) %>
<% require javascript(mysite/javascript/jquery.tooltip.js) %>
<% require javascript(thickbox/javascript/jquery.thickbox.js) %>
<% require javascript(mysite/javascript/jquery.cycle.all.pack.js) %>
<% require javascript(mysite/javascript/forumk.js) %>
</head>
Natürlich muss man den ganzen Javascriptkram nicht im Template definieren, sollte man aber... Silverstripe ist schlau genug, doppelte Requirements nicht doppelt einzubinden.
Im auf blackcandy basierenden Template habe ich ausserdem den Verweis auf das mitgelieferte jQuery entfernt, da ich das ganze Javascript über combine_files() selbst kontrolliere. Für einfache Seiten ist das komplett ausreichend.
Alles in allem eine einfache Möglichkeit, die Webseite noch schneller ausliefern zu lassen. Well done, Silverstripe!
Silverstripe versucht, das Javascript möglichst spät im HTML unterzubringen. In der Regel ist es am Ende vom <body>. Wenn man jedoch aus welchem Grund auch immer im HTML eine <script> Anweisung hat, wird an dieser Stelle auch das restliche Javascript ausgegeben. Das kann teilweise zu Fehlverhalten führen...