Показать форму входа на каждой странице, используя Zend Form - PullRequest
0 голосов
/ 21 февраля 2010

Кажется, я не могу понять, как создать гибкую боковую панель, содержащую форму для входа в систему (Zend_Form) и различные ссылки для отдельных модулей / контроллеров.

Наиболее распространенным решением, по-видимому, является использование:

echo $this->action('login', 'authentication', 'default');

Но, по-видимому, это не лучший путь? Я читал, что это запускает диспетчерскую блокировку и тем самым снижает производительность?

Я думал о том, чтобы спеть View_Helper для боковой панели:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract
{
    public function sidebar()
    {
        $sidebar = $this->view->placeholder('sidebar');
        $sidebar->setPrefix('<div class="sidebar-element">')
                ->setSeparator('</div><div class="sidebar-element">')
                ->setPostfix('</div>');

        $sidebar->append(new Form_Login);
        $sidebar->append(new Model_Category->getList());
        return $sidebar
    }
}

В моем Form_Login у меня установлено действие / auth / login, которое содержит следующий код:

public function loginAction()
{
    $request = $this->getRequest();

    if($request->isPost()) {
        $form = new Form_Login();
        $data = $request->getPost();
        if($form->isValid($data)) {
            $username = $form->getValue('username');
            $password = $form->getValue('password');
            $users = new Model_DbTable_Users();
            $authenticated = $users->login($username, $password);
            if($authenticated) {                    
                    //Succes - show identity instead of loginForm                   
            } else {                                      
                $this->view->loginForm = $form;
                $this->render('/index');
            }
        }
    }
}

Если я введу неправильное имя пользователя / пароль, будет отображено indexAction, которое в настоящее время пусто. Это отлично. Он также отображает мою боковую панель, содержащую форму loginForm, если необходимо, но форма пуста (пользовательский ввод не отображается. Также нет сообщения о том, что форма не была проверена).

Поле username в форме должно отображать ввод, предоставленный пользователем перед отправкой. И сообщение об ошибке должно отображаться.

Любая помощь относительно того, почему это не происходит, очень ценится.

1 Ответ

3 голосов
/ 21 февраля 2010

Вы проводите проверку формы в действии loginAction, и вы сказали, что в настоящее время публикуете действие index, это опечатка?

Кроме того, вы создаете две копии Form_Login. Один раз в действии и один раз в поле зрения помощника. Если вы проверяете один экземпляр в действии, вам нужно отобразить этот же экземпляр формы в помощнике вида. Вы можете либо переместить всю логику проверки в помощник вида, либо разделить экземпляр между помощником вида и действием. Я собираюсь предложить последнее.

Проверьте в вашем помощнике вида, если форма уже существует в реестре. Если это так, просто используйте этот экземпляр. В противном случае вы можете создать новый экземпляр. Вот грубый пример того, что я имею в виду:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract
{
    public function sidebar()
    {
        $sidebar = $this->view->placeholder('sidebar');
        $sidebar->setPrefix('<div class="sidebar-element">')
                ->setSeparator('</div><div class="sidebar-element">')
                ->setPostfix('</div>');

        if(Zend_Registry::isReigistered('loginForm')) {
            $loginForm = Zend_Registry::get('loginForm');
        } else {
            $loginForm = new Form_Login();
        }

        $sidebar->append($loginForm);
        $sidebar->append(new Model_Category->getList());
        return $sidebar
    }
}

public function loginAction()
{
    $form = new Form_Login();
    Zend_Registry::set('loginForm', $form);

    $request = $this->getRequest();

    if($request->isPost()) {        
        $data = $request->getPost();
        if($form->isValid($data)) {
            $username = $form->getValue('username');
            $password = $form->getValue('password');
            $users = new Model_DbTable_Users();
            $authenticated = $users->login($username, $password);
            if($authenticated) {                    
                    //Succes - show identity instead of loginForm                   
            } else {                                      
                $this->view->loginForm = $form;
                $this->render('/index');
            }
        }
    }
}

Edit:

Нет, самопроверка не существует, если экземпляр формы уже существует. Вы должны сделать это самостоятельно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...