2012-06-04 3 views
1

CakePHP/MVC의 요점을 완전히 놓치지 않았는지 확인하기 위해 약간의 피드백이 필요합니다.CakePHP를 처음 사용합니다. 이 사이트 메뉴는 현명하고 전통적인 것입니까?

저는 CakePHP에 mini-cms를 디자인하고 있습니다. 본질적으로 사진 앨범입니다. 나는 모든 페이지에 표준 보일러 판 드롭 다운 메뉴가있는 것을보고있다. 당연히 메뉴는 사용자가 앨범을 삭제하고 추가 할 때 동적이어야합니다.

내 목표

: (. 그것은 렌더링하기 전에 컨트롤러는 뷰 클래스에 설정된 변수를 추진 한 대신 컨트롤러에 다시 호출 견해, 즉) View::actionRequest()의 반대 방향으로 이동 무언가를 구축 나의 이해는 View::requestAction()을 것입니다 매우 우아하지 않고 아주 느립니다.

이것은 메뉴 키워드가 들어있는 표의 모델입니다. 나는 사방을 원하기 때문에 app/Model/ModelItem.php

class MenuItem extends AppModel { 
    public function buildMainMenu() { 
     return $this->find('all'); 
    } 
} 

, 나는 AppController

class AppController extends Controller { 
    public function beforeFilter() { 
     $this->loadModel('MenuItem'); 
     $this->set('mainMenuItems',$this->MenuItem->buildMainMenu()); 
    } 
} 

에 전화를 넣어 그리고 이것은 CSS 내 기본 레이아웃의 상단에 싣는다 요소입니다 - 요소 파일을 : app/View/Element/navigation.ctp - 레이아웃 : app/View/Element/Layout/default.ctp

<ul id="navigation"> 
    <?php 
    foreach($mainMenuItems as $item) { 
     echo "<li>".$item['MenuItem']['name']."</li>"; 
    } 
    ?> 
</ul> 

나는 위스콘신 결국 테이블에있는 모든 항목의 멋진, 총알 목록. 이걸 완전 망쳐 놓은거야? 내가 잘못 했니? 나는 모른다.

답변

4

나는 당신의 접근 방식에 아무런 이상이 보이지 않습니다. 여기에 몇 가지 메모는하지만 완전히 선택 사항 :

  • 내가 beforeFilter()에서 beforeRender()에 메뉴 가져 오는 코드를 이동할 것입니다. 초기에 그렇게 할 이유가 없기 때문에 메뉴가 필요하기 전에 예외가 발생하거나 사용자를 다른 페이지로 리디렉션 할 수 있습니다. 또한 요청에 대한 자세한 정보가 있으므로 메뉴의 현재 페이지/항목/사용자를 강조 표시 할 수 있습니다.
  • 엘리먼트 렌더링 코드를 MenuHelper로 이동하면 정리 클리너가 만들어집니다 (예 : 레이아웃에서 $this->Menu->render()). 또한 HtmlHelper를 사용하여 케이크를 통해 항목을 렌더링하고 케이크가 마크 업 정확성을 처리하도록 할 수 있습니다.
  • 렌더링을 도우미로 옮기는 경우 모든 일에 대해 일종의 캐싱 체계를 구현하여 필요한 경우 작업 속도를 높입니다. 캐싱이 가능한지 여부 또는 컨트롤러 또는 도우미에서 수행해야하는지 여부는 전적으로 귀하와 귀하의 앱에 달려 있습니다. :)

전체적인 조언은 다음과 같은 기능을 분리하려고 시도한 것입니다. 앱의 나머지 부분. 읽고, 유지하고, 수정하는 것이 더 쉽습니다.

+0

beforeRender() 이동에 +1 (beforeFilter에서보기로 항목을 전달해서는 안 됨) – mark

0

내가 요소로 그것을 소포 및 데이터를 가져 오기 위해 요청 조치를 사용하십시오 때 레이아웃 /보기에서 출력 할 메뉴 :

/응용 프로그램 /보기/요소/main_menu.CTP : 당신이 메뉴를 필요로하지 않는 뷰/레이아웃 (예 : 아약스)가있는 경우는 폐기물을 못해,

echo $this->Element('main_menu'); 

이 방법 :

$mainMenuItems = $this->requestAction('/menu_items/buildMainMenu'); 

<ul id="navigation"> 
    <?php 
    foreach($mainMenuItems as $item) { 
     echo "<li>".$item['MenuItem']['name']."</li>"; 
    } 
    ?> 
</ul> 

와 함께 레이아웃 /보기에 포함 데이터베이스 쿼리