May 05 2006
View Layout i Agavi
Filed under Agavi,Framework,MVC,PHP by Łukasz Dywicki
Zainspirowany ideą Layotów w M4 postanowiłem stworzyć małą wtyczkę do agavi, która umożliwi mi korzystanie z tego rozwiązania. Jest ona bardzo prosta i ułatwia masową zmianę szablonu głównego oraz slotów (o slotach jeszcze będę pisał).
Oto moje rozwiązanie:
-
<?php
-
-
class ViewLayout {
-
-
static public function set($layout, View $view) {
-
$config = self::getConfig($layout);
-
-
if(isset($config['decorator']['directory'])) {
-
$view->setDecoratorDirectory($config['decorator']['directory']);
-
$view->setDecoratorTemplate($config['decorator']['template']);
-
}
-
if($config['database'] == true) {
-
Propel::init(PropelDatabase::getDefaultConfigPath());
-
}
-
if(isset($config['slots']) && sizeof($config['slots'])> 0) {
-
try {
-
$view->setSlots($config['slots']);
-
} catch(AgaviException $e) {
-
$view->clearSlots();
-
}
-
}
-
}
-
-
static protected function getConfig($layout) {
-
$filename = realpath(dirname(__FILE__)) .'/'. $layout .'.layout.ini';
-
if($filename = ConfigCache::checkConfig($filename)) {
-
return include($filename);
-
}
-
return array();
-
}
-
}
-
?>
Instalacja:
Stworzyć w katalogu lib katalog layout a w nim plik ViewLayout.class.php. Jego zawartość jest wyżej.
1. Dodać w autoload.ini:
-
ViewLayout = "%AG_LIB_DIR%/layout/ViewLayout.class.php"
2. Dodac w config_handlers.ini linijki:
-
[*layout.ini]
-
class = ReturnArrayConfigHandler
3. Stworzyć plik konfiguracyjny (np. frontend.layout.ini) w tym samym katalogu co plik z klasą. Przykładowy plik:
-
;ścieżki dla dekoratora (opcjonalnie)
-
decorator.template = frontend.tpl
-
decorator.directory = %AG_TEMPLATE_DIR%
-
-
; czy inicjować sesję propela (opcjonalnie)
-
database = true
-
-
; uwaga, składnia zgodna z metodą setSlots
-
; klasy View, poprawna notacja
-
; slots..module_name =
-
; slots..action_name =
-
slots.slot_last_article.module_name = Default
-
slots.slot_last_article.action_name = LastArticle
-
-
slots.slot_last_articles.module_name = Default
-
slots.slot_last_articles.action_name = LastArticles
4. Użycie w klasie widoku:
-
<?php
-
ViewLayout::set('frontend', $this);
-
?>
Myślę, że mechanizm jest na tyle prosty, że można go rozszeżać do własnych potrzeb. Dla każdego layoutu powinien istnieć plik konfiguracyjny /lib/layout/.layout.ini. W następnej części postaram się opisać filtr umożliwiający request-mapping.