Смысл Smarty в том, что он отделяет логику от дизайна вашей страницы.В вашем случае ваша логика теперь контролирует ваш дизайн, и это не то, для чего предназначен Smarty.Если вы предпочитаете управлять дизайном из приложения, то вам не следует использовать Smarty.
Если вы хотите использовать Smarty, удалите PrintHeader()
и PrintFooter()
, а затем в шаблоне Smarty поместитедизайн, связанный с дисплеем.
Вероятно, самый простой способ сделать это, следуя вашему шаблону, было бы для приложения выбрать соответствующий шаблон и назначить соответствующие переменные.
Application->IsLoggedIn(); // assign some login variables
Application->DoesUserWantsToLogOut(); // probably redirect and logout and never get to display
Application->IfNotLoggedInThenShowChallengeToUser(); // template would be the login template
Application->IfLoggedInThenShowFullMenu(); // fetch and assign a menu to the template
$_smarty->display( Application->template );
Затем в каждомsmarty template:
{include file=header.tpl }
HTML for each template
{include file=footer.tpl }
Обратите внимание, что вы можете назначать переменные заголовку, а нижний колонтитул включает в себя так же, как и обычный шаблон.Так что если у вас есть переменная {$username}
в заголовке.Вы просто назначаете его в выходном меню вашего приложения, и оно будет установлено.Что-то вроде этого, вероятно, то, что вы хотите: {if $username} {$username} {else} Log-In{/if}
Теперь, как мнение, я бы разработал его несколько иначе.Я не думаю, что ОО означает «не использовать заявления if».Я думаю, что-то вроде того, что у меня ниже, яснее:
$app = new App();
if( $app->loggedIn() ) {
if( $app->logout() ) {
$app->redirect('goodbye.php');
}
$smarty->assign( 'menu', $app->menu() );
$smarty->assign( 'user', $app->user() );
$template = 'main.tpl';
}
else {
$template = 'login.tpl';
}
$smarty->display($template);
Шаблоны Smarty будут выглядеть так же, как и в примере, который я привел выше.