Встраивание постоянной формы входа в систему Zend - PullRequest
3 голосов
/ 12 января 2010

Я видел, что этот вопрос уже задавался, но ни один из ответов на самом деле не превращался в гель для меня, поэтому я снова спрашиваю: я хочу встроить постоянную форму входа (которая изменится на панель навигации при входе в систему) в панель заголовка для сайта. По сути, я хочу иметь возможность вводить некоторую логику контроллера в макет.

После долгих исследований я вижу несколько способов, которые могли бы достичь этого - ни один из которых не кажется идеально подходящим.

View Helpers кажутся подходящими для добавления набора методов к объекту Zend_View - но я не хочу писать условный код в layout.phtml для запуска метода. Помощники действий помогли бы мне удалить эту функциональность и вызвать ее из контроллера - но это, кажется, пользуется плохой популярностью с нескольких сторон. Затем есть плагины, которые могут хорошо подходить для цикла диспетчеризации / аутентификации.

Итак, я надеялся, что кто-нибудь сможет предложить мне несколько советов о том, какой путь лучше всего соответствует моим требованиям. Любая помощь с благодарностью.

1 Ответ

1 голос
/ 14 апреля 2010

Для тех из вас, кто сталкивался с проблемой similair, вот как я решил эту проблему (кстати, я использую раскладку)

Я зарегистрировал помощника вида в Bootstrap:

protected function _initHelpers(){
    //has to come after view resource has been created
    $view = $this->getResource('view');
    // prefix refers to the folder name and the prefix for the class 
    $view->addHelperPath(APPLICATION_PATH.'/views/helpers/PREFIX','PREFIX');
    return $view;
}

Вот код помощника вида - фактическая логика аутентификации скрыта в коде модели. Это немного неуклюже, но работает

class SB_UserLoginPanel extends Zend_View_Helper_Abstract {

public function __construct() {
    $this->user = new SB_Entity_Users();
$this->userAccount = new SB_Model_UserAccount();
    $this->request = Zend_Controller_Front::getInstance()->getRequest();
    $this->form = $this->makeLoginForm();
    $this->message='';
}

//check login
public function userLoginPanel() {
    if(isset($_POST['loginpanel']['login'])) {
        $this->processLogin();
    }
    if(isset($_POST['loginpanel']['logout'])) {
        $this->processLogout();
    }
    $auth = Zend_Auth::getInstance();
    if ($auth->hasIdentity()) {
        $this->loginPanel = $this->getUserNav();
    } else {
        $this->loginPanel = $this->getLoginForm();
        $this->loginPanel .= $this->getMessages();
    }
    return $this->loginPanel;
}

private function processLogin() {
    if($this->form->isValid($_POST)){
        $logindata = $this->request->getPost('loginpanel');
        if($this->user->login($logindata['email'],$logindata['password'])) {
            Zend_Session::rememberMe();
            $redirect = new Zend_Controller_Action_Helper_Redirector();
            $redirect->goToUrl('/account/');
            return $this->getUserNav();
        }else {
            $this->message = '<p id="account_error">Account not authorised</p>';
        }
    }else {
        $this->form->getMessages();
    }
}


private function processLogout() {
    if(isset($_POST['loginpanel']['logout'])) {
        $this->user->logout();
        $request_data = Zend_Controller_Front::getInstance()->getRequest()->getParams();
        if($request_data['controller']=='notallowed') {
            $redirect = new Zend_Controller_Action_Helper_Redirector();
            $redirect->goToUrl('/');
        }
    }
}

private function makeLoginForm() {
}

private function getLoginForm(){
    return $this->form;
}

private function getMessages(){
    return $this->message;
}

private function getUserNav(){        
//return partial/render
}

}

Затем я вызываю это из соответствующей части разметки в файле layout.phtml.

<?php echo $this->doctype(); ?>
<head>
<?php
echo $this->headLink() ."\n";
echo $this->headScript() ."\n";
echo $this->headMeta() ."\n";
?>
<title><?php echo $this->escape($this->title) ."\n"; ?></title>
</head>
<div id="masthead">
   <div id="userLoginPanel">
      <?php echo $this->userLoginPanel(); ?>
   </div>
</div>
<!--rest of layout-->

В принципе, этот должен быть помощником действий, но после прочтения некоторых менее благоприятных статей о Zend Action Helper - я выбрал этот метод, который добился цели.

Надеюсь, это поможет!

...