Pozwolę sobie przedstawić moje rozwiązanie.
Moja koncepcja była bardzo prosta, mianowicie są elementy strony, które mogą się zmieniać (np. pojawiające się menu dostępne tylko dla zalogowanych osób ). Jako, że korzystam jak narazie tyko ze zwykłego widoku html obsługiwanego przez smarty dodałem tablicę zawierającą pliki do wywołania pod koniec tworzenia strony.
Przykładowy blok:
<?php
class LoginForm
{
function LoginForm( ) { }
function run( ) {
$reg = &Registry::instance( );
$view = &$reg->load( 'view' );
$io = &IO::instance( );
if( $io->getSession( 'user_id' ) > 0 ) { //zalogowany
$model = Init::model( 'user_model' );
$data = $model->getUserById( $io->getSession( 'user_id' ) );
$view->assign( 'username', $data['login'] );
$view->assign( 'login_form', $view->fetch( 'logined.tpl' ) );
} else { //gość
$view->assign( 'login_form', $view->fetch( 'login_form.tpl' ) );
}
}
}
?>
Oczywiście można łatwo dodać kolejne elementy do szablonu i jeśli użytkownik jesst zalogowany wyświetlać.
Klasa widoku:
<?php
class SmartyView {
var $smarty;
var $autoLoadBlocks = array( );
function SmartyView( ) {
$reg = &Registry::instance( );
$config = $reg->load( 'viewconfig' ); // ładuję ustawienia z rejestru
$this->autoLoadBlocks = $config['autoload']; // domyślne bloki
unset( $config['name'], $config['autoload'] );
include_once DOCUMENT_ROOT .'libs/smarty/Smarty.class.php';
$this->smarty = new Smarty; //tworze obiekt
foreach( $config as $key => $value ) { // ustawienia konfiguracyjne
$this->smarty->$key = $value;
}
$reg->save( 'view', $this ); //zapisuje widok w rejestrze
}
function autoLoad( ) {
foreach( $this->autoLoadBlocks as $id => $name ){
$block = Init::block( $name );
if( $action !== false ){
$block->run( );
}
}
}
#inne metody
function assign( $key, $value ) {
$this->smarty->assign( $key, $value );
}
function fetch( $tpl ) {
return $this->smarty->fetch( $tpl );
}
function display( $tpl = null ) {
if( $tpl === null ) {
$this->autoLoad( );
$this->smarty->display( 'home.tpl' );
} else {
if( sizeof( $this->autoLoadBlocks ) > 0 ) { // są jakieś bloki $this->autoLoad( );
}
$this->smarty->display( $tpl );
}
}
}
?>
Wycinek z pliku config.php
<?php
$viewconfig['smarty']['name'] = \"smarty\";
$viewconfig['smarty']['template_dir'] = \"templates/\";
$viewconfig['smarty']['compile_dir'] = \"compiled/\";
$viewconfig['smarty']['config_dir'] = \"tpl/config\";
$viewconfig['smarty']['debugging'] = false;
$viewconfig['smarty']['compile_check'] = true;
//bloki ktore beda automatycznie ladowane
$viewconfig['smarty']['autoload'] =
'Menu', 'News', 'Hello', 'auction_box', 'login_form'
);
?>
W zależności od potrzeb akcja może usuwać lub dodawać nowe elementy blokowe. Jeśli serwis jest pod sporym obciążeniem to wtedy można włączyć buforowanie. Myślę, że takie rozwiązanie jest bardzo elastyczne i umożliwia tworzenie nawet bardzo złożonych bloków.