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);
: 머리글과 바닥 글에 변수를 할당 할 수
{include file=header.tpl }
HTML for each template
{include file=footer.tpl }
참고 그냥 당신이하고자 일반 템플릿과 같이 포함되어 있습니다. 따라서 헤더에 변수 {$username}
이있는 경우 응용 프로그램 메뉴 출력에 지정하면 설정됩니다. 이 같은 것은 아마 당신이 원하는 것일 것입니다 : {if $username} {$username} {else} Log-In{/if}
마찬가지로 나는 의견을 다소 다르게 디자인 할 것입니다. 나는 OO가 "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);
멋진 템플릿은 위의 예와 동일하게 보입니다.
처음에는 극복해야 할 작은 건축 융기가있는 것 같습니다. 이러한 논리 (사용자가 로그인 한 경우 등)는 템플릿에서 수행하면 안됩니다. 하지만 일부 컨트롤러 나 다른 비즈니스 논리 장소에서. 그 중 하나를 사용하고 있습니까? 프레임 워크를 사용하고 있습니까? 또는 당신 자신? 그렇다면 어쩌면 그 정보를 알려줄 수 있습니까? – berkes
나만의 즉흥적 템플릿을 사용하고 있습니다. 몇 가지 유틸리티를 사용하여 클래스를 확장하는 각 페이지마다 얇은 최상위 컨트롤러가 있습니다. 각 컨트롤러는 비즈니스 로직을 수행하는 해당 모델 클래스를 인스턴스화합니다. 나는 Smarty를 사용하여 페이지를 렌더링합니다. 인쇄 논리가 어디로 가야할지 모르겠습니다. –