Шаблон проверки пользователя в PHP с помощью Smarty - PullRequest
2 голосов
/ 25 июля 2010

Я использую PHP и Smarty. У меня есть простое приложение, которое:

  • Показывает заголовок страницы
  • Проверяет, вошел ли пользователь в систему -> проверить сеанс
  • Проверяет, хочет ли пользователь выйти из системы -> затем очистить сеанс
  • При входе в систему отображается меню.
  • Если не залогинен, то запрашивает у пользователя идентификатор / пароль -> установить сеанс
  • Показывает нижний колонтитул страницы

Теперь я хочу добавить в заголовок следующее:

  • имя пользователя при входе в систему
  • строка "login", если вы не авторизованы

Чтобы сделать это, кажется, требуется сложное расположение моей функции PrintHeader. Теперь я не могу напечатать заголовок, пока не узнаю, вошел ли пользователь / только что вошел / вышел из системы, заголовок плюс должен идти перед вызовом пользователя / пароля.

Какой подход я могу использовать здесь? Можно ли буферизовать заголовок «не авторизован», а затем заменить его на заголовок «логин если» если требуется.

SmartyApp::PrintHeader();

Application->IsLoggedIn()
Application->DoesUserWantsToLogOut()
Application->IfNotLoggedInThenShowChallengeToUser()
Application->IfLoggedInThenShowFullMenu()

SmartyApp::PrintFooter();

Ответы [ 2 ]

0 голосов
/ 25 июля 2010

Смысл 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 будут выглядеть так же, как и в примере, который я привел выше.

0 голосов
/ 25 июля 2010

Я думаю, что более удобной моделью будет включение условий в сами шаблоны, а не хранение нескольких шаблонов для каждого возможного результата. Например:

$smarty->assign('user', new User($_SESSION));
$smarty->display('index.tpl');


<!-- header.tpl -->
{if $user->isLogged()}
    <p>Welcome {$username}</p>
{else}
    <p>Please Log In</p>
{/if}


<!-- body.tpl -->
{if $user->isLogged()}
    {include file="menu.tpl"}
{else}
    <p>You must be signed in to view this menu</p>
{/if}

<!-- index.tpl -->
{include file="header.tpl"}
{include file="body.tpl"}
{include file="footer.tpl"}
...