2010-07-25 6 views
2

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

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

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

  • имя пользователя, если вход в
  • «логин» строку, если не вошли в

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

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

SmartyApp::PrintHeader(); 

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

SmartyApp::PrintFooter(); 
+2

Похоже, что у вас есть небольшой архитектурный удар, который нужно преодолеть первым. Такая логика - выявление, если пользователи зарегистрированы и т. Д. - не следует делать в шаблоне. Но скорее в каком-то контроллере или другом бизнес-логическом месте. Вы используете это? Вы используете фреймворк? Или ваш собственный? Если да, может быть, вы можете дать некоторую информацию об этом? – berkes

+0

Я использую свой собственный импровизированный шаблон. У меня есть тонкий контроллер верхнего уровня для каждой страницы, который расширяет класс с помощью нескольких утилит. Каждый контроллер создает экземпляр соответствующего класса модели, который выполняет бизнес-логику. Я использую Smarty для рендеринга страниц. Я не уверен, куда должна идти логика печати. –

ответ

0

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

$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"} 
+0

это нормально, но я не знаю, зарегистрирован ли я до 500 строк в коде. Это означает, что я должен был бы похоронить мой «выходной заголовок» в глубине кода проверки пользователя, перед экраном «входа в систему» ​​ –

+0

Возможно ли выводить заголовок «не вошел в систему», а затем очистить его, если не соответствующая версия ? –

+1

@TMP - это похоже на обходной путь к архитектурной проблеме. Вы должны рассмотреть возможность пересмотра своего решения таким образом, чтобы вся бизнес-логика выполнялась * до * до любого вывода. – karim79

0

Пункт 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 шаблона:

{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); 

В Smarty шаблоны будут выглядеть так же, как пример, который я дал выше.

Смежные вопросы