Some of posts from this blog has been moved to dywicki.pl. You will be automatically redirected to new blog if you would submit comment.
New posts are published on dywicki.pl, this blog contains old content and it is not continued.

Niektóre posty z tego bloga zostały przeniesione do dywicki.pl. Zostaniesz automatycznie przekierowany jeśli bedzięsz chciał dodać komentarz.
Nowe posty sa publikowane na dywicki.pl, ten blog zawiera stare treści i nie jest kontynuowany.

View Layout i Agavi

Filed under Agavi,Framework,MVC,PHP by

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&#91;'decorator'&#93;&#91;'directory'&#93;)) {
$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.

No responses yet

Leave a Reply