2010-02-21 3 views
0

유연한 사이드 바 포함 및 로그인 양식 (Zend_Form) 및 다양한 모듈/컨트롤러 관련 링크를 만드는 방법을 알아낼 수 없습니다.젠드 양식을 사용하여 모든 페이지에 로그인 양식 표시

가장 일반적인 솔루션을 사용하고있는 것으로 보인다

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

을하지만 apperently이는 '가장 좋은'방법을 밤은? 나는이 apprently dispatchloop을 트리거하고 성능에 타격을 읽는 읽었어요?

나는 약 사이드 바에 대한 View_Helper 노래를 생각했습니다 내가 행동이 설정이 내 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>'); 

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

을/인증 다음 코드 포함/로그인 : 경우

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'); 
      } 
     } 
    } 
} 

를 I 잘못된 사용자 이름/암호를 제공하면 현재 비어있는 indexAction이 렌더링됩니다. 이건 괜찮아. 또한 필요에 따라 loginForm이 포함 된 사이드 바를 렌더링하지만 양식은 비어 있습니다 (사용자 입력이 표시되지 않으며 양식이 유효성을 검사하지 못했다는 메시지도 표시되지 않음).

양식의 사용자 이름 필드는 사용자가 제출하기 전에 입력 한 내용을 표시해야합니다. 그리고 오류 메시지가 표시되어야합니다.

이것이 왜 잡아 두지 않는지에 대한 도움은 대단히 만족 스럽습니다.

답변

3

loginAction에서 양식 유효성 검증을 수행하고 있으며 현재 색인 작업에 게시 중이라고 오타가 있습니까?

그 외에도 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'); 
      } 
     } 
    } 
} 

편집 :

아니, 폼의 인스턴스가 이미 존재하는 경우 확인 자아가 없다. 당신 스스로해야합니다.

저는 제안 된 방법이보기 도우미를 사용하는 것이 확실합니다. 귀하의 질문에 말했듯이, 작업보기 도우미를 사용하면 성능에 좋지 않은 다른 디스패치 루프가 발생합니다. 모든 논리를보기 도우미에 보관할지 여부에 대한 평결이 무엇인지 알지 못합니다.

관련 문제