2011-04-14 3 views
0

컨트롤러 플러그인을 사용하여 인증 플러그인을 만들고 있습니다. application.ini 파일 내에서 내비게이션 설정을 정의한 다음, 그와 데이터베이스 사용자 레코드를 사용하여 ACL을 동적으로로드하고 Zend_Navigation에 적용합니다. 이 비트는 성공적으로 메뉴를로드하고 사용자가 볼 수있는 페이지 만 표시하므로 제대로 작동합니다.컨트롤러 플러그인 내에서 Zend_Navigation에서 현재 페이지를 검색하는 방법

그러나 이렇게해도 사용자가 페이지로 직접 이동하지 않습니다. 내가하고 싶은 일은 사용자가 컨트롤러 플러그인 내에서 액세스 권한이없는 페이지로 이동할 때를 식별하여 요청을 인증 페이지로 리디렉션 할 수 있습니다.

Zend_Navigation에서 현재 페이지를 검색하는 함수가 있어야한다고 생각했지만 찾지 못했습니다 ... 존재하지 않습니다.

어쨌든, 이것은 내 전체 컨트롤러 플러그인입니다. 누구나 솔루션을 볼 수 있습니까?

<?php 
class Pog_Model_AuthPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $oRequest) 
    { 
     /** 
     * Load user 
     */ 
     $oAuth = Zend_Auth::getInstance(); 
     $oDbUsers = new Pog_Model_DbTable_Users(); 

     if (!$oAuth->hasIdentity()) 
     { 
      $oUser  = $oDbUsers->createRow(); 
      $oUser->name = "guest"; 
      $oUser->setReadOnly(true); 
     } 
     else 
     { 
      $oUser = $oAuth->getIdentity(); 
      $oUser->setTable($oDbUsers); 
     } 

     /** 
     * Load ACL 
     */  
     $oAcl = new Zend_Acl(); 
     $oAcl->addRole($oUser->name); 


     /** 
     * Add current user privileges 
     */ 
     $oPrivileges = $oUser->getPrivileges(); 
     foreach ($oPrivileges as $oPrivilege) 
     { 
      if (!$oAcl->has($oPrivilege->resource)) 
       $oAcl->addResource($oPrivilege->resource); 

      $oAcl->allow($oUser->name, $oPrivilege->resource, $oPrivilege->privilege); 
     } 


     /** 
     * Load Navigation view helper 
     */ 
     $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
     $oNavigation = $oViewRenderer->view->navigation(); 


     /** 
     * Add remaining Navigation resources 
     */ 
     foreach ($oNavigation->getPages() as $oPage) 
     { 
      if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource())) 
       $oAcl->addResource($oPage->getResource()); 
     } 


     /** 
     * Set ACL and Role 
     */ 
     $oNavigation->setAcl($oAcl)->setRole($oUser->name); 


     /** 
     * Check if use is allowed to be here 
     */ 
     ...MAGIC GOES HERE... 
    } 
} 

답변

4

나는 다음과 같이 현재 탐색 페이지를 얻을 수 있어야한다고 생각 :

 /** 
    * Load Navigation view helper 
    */ 
    $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
    $oNavigation = $oViewRenderer->view->navigation(); 

    /*@var $active array */   
    $active = $oNavigation->findActive($oNavigation->getContainer()); 

    /*@var $activePage Zend_Navigation_Page_Mvc */ 
    $activePage = $active['page']; 

    // example of getting page info   
    var_dump($activePage->getLabel(), $activePage->getController(), $activePage->getAction()); 

희망이 도움이됩니다.

+0

을,하지만 난 응답으로 하늘의 배열을 얻고있다 :

새로운 getPages() foreach 루프는 다음과 같습니다. Controller Plugin에서 실행하는 것과 관련이 있습니까? –

+0

난 그냥보기 스크립트에 몇 가지 테스트 코드를 넣어 위의 작품은 괜찮아요. 컨트롤러 도우미에서 Navigation 도우미가 완전히 설치되지 않았지만 그 다음에는 괜찮습니다 ... 이제 설치가 시작되면 트리거 할 수 있는지 확인하십시오. –

+0

@Valorin. 내 acl 컨트롤러 플러그인의 preDispatch 코드를 테스트했는데 괜찮습니다. 내비게이션을 어떻게 설정합니까? bootstrap.php에서 탐색을 설정합니까? 어쩌면이게 내 경우에는 초기화 된거야? – Marcin

0

Marcin의 솔루션을 어떤 이유로 든 설치에 사용할 수 없기 때문에이 솔루션을 사용했습니다.

저는 좀 더 생각하고 문제에 대한 간단한 해결책을 생각했습니다. 내비게이션 모듈을 사용하여 활성 페이지를 찾는 대신 직접 발견합니다. 나는 이미 페이지를 반복하고 있기 때문에 Controller와 Action을 비교하는 것이 중요합니다.이 두 가지가 모두 일치하면 Active 페이지가 있습니다! 내가 후 나는 무엇을 보이는

$oCurrentPage = null; 
foreach ($oNavigation->getPages() as $oPage) 
{ 
    /** 
    * Check for Current Page 
    */ 
    if ($oPage->getController() == $oRequest->getControllerName() 
     && $oPage->getAction() == $oRequest->getActionName()) 
     $oCurrentPage = $oPage; 


    /** 
    * Add Resource, if missing 
    */ 
    if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource())) 
     $oAcl->addResource($oPage->getResource()); 
}