2013-03-08 3 views
0

CakePHP 1.3에서 재사용 가능한 콘텐츠 블록을 만드는 최적의 방법에 대해 질문하고 싶습니다.CakePHP의 재사용 가능한 콘텐츠 블록

재사용 할 수있는 콘텐츠 블록에서 페이지를 구성하는 데 사용 된 부분보기를 의미합니다. 예 : 이숍 응용 프로그램에서 미니 카트리지 요약은 재사용 가능한 콘텐츠 블록으로 간주 될 수 있습니다. 이는 각 페이지 머리글에 표시됩니다.

  • 요소 /app/plugins/myeshop/elements/minicart.ctp의 생성이 다시 사용할 수있는 콘텐츠를로드 $this->element('minicart)를 사용

    는 CakePHP는 1.3에서 두 posibilities (모두가 심각한 단점)이있다 예 헤더에.불이익은입니다. 이것은 Cart 엔티티의 사업을 여러 곳으로 부추 깁니다. Minicart는보기가 컨트롤러 /app/plugins/myeshop/controllers/carts_controller.php에 의해 처리되는 장바구니 엔티티의 일부 표현 일뿐입니다. 그렇다면 컨트롤러에서 꺼내고 요소로 유지해야하는 이유는 무엇입니까? 요소는 몇 가지 일반적인 재사용 가능한 콘텐츠를 유지하는 데 유용합니다. 머리글, 꼬리말, interactive_map, ... 응용 프로그램 비즈니스 개체/엔터티와 관련이없는 무언가.

  • 해당 뷰가있는 CartsController :: minicart()를 만들고이 재사용 가능한 콘텐츠를로드하려면 $this->requestAction('/myeshop/carts/minicart')을 사용하십시오. 헤더에.장점은이며 이제는 Cart 엔터티의 모든 비즈니스 및보기가 CartsController에서 처리됩니다. 요소에는 측면 논리 및 측면 뷰가 숨겨져 있지 않습니다. 이 방법의 단점은입니다. requestAction()을 사용하면 많은 시간이 걸립니다.

이 시점에서 나는 requestAction()을 매우 조심스럽게 사용해야한다는 것에 전적으로 동의한다고 말해야합니다. 이를 사용하여 컨트롤러의 일부 프로 시저/버스 로직을 호출하는 것은 잘못된 응용 프로그램 설계입니다. 이러한 종류의 논리는 컨트롤러가 아니라 모델에 배치되어야합니다. 여전히, IMHO, 컨트롤러 동작을 호출하여 부분/재사용 가능 콘텐츠 (보기)을 가져오고 엔티티 비즈니스를 한 곳에서 유지하는 것이 합법적입니다.

CakePHP에 대한 최적의 해결책이 있습니까?

답변

0

나는 요소/requestActions의 경로를가는 것이 좋습니다. CakePHP의를 사용하여 "How using requestAction increased performance on my site"

우리가 구축 한 많은 대형, 높은 트래픽 사이트와 사용 requestActions 모든 것을, 그리고 우리의 사이트는 매우 빠르게로드 :

여기 CakePHP의 마스터 마크 스토리의 뛰어난 기사입니다.

+0

답변 해 주셔서 감사합니다. requestAction()의 결과를 캐싱하기 만해도 요소 사용은 피할 수없는 것처럼 보입니다. – Mojo

0

가능하면 요소로 만듭니다. 귀하의 컨트롤러가 미니 카트의 내용을 계산하고 뷰에 표시 될 것이라고 가정합니다.

그렇다면 요소를 사용하는 것이 좋습니다. 사용자가 명시한대로 추가 HTTP 요청을 확실히 원하지는 않습니다.

그러나 요소는 콘텐츠 만 표시해야하며 비즈니스 논리를 수행해야합니다. 컨트롤러 또는 구성 요소에이를 포함시키고 뷰에 필요한 요소를 설정해야합니다.

특정 페이지에만 필요하면 미니 카트가 포함 된 새로운 layout.ctp 파일을 만든 다음 해당 페이지에서이 레이아웃을 사용할 수 있습니다.

0

모든 페이지에 장바구니의 내용을 표시하는 경우 다음을 수행하는 것이 좋습니다. 사용자가 로그인하지 않은 상태에서 카트를 세션에 기록하고 데이터베이스에 로그인합니다. 사용자가 돌아와 로그인하면 저장된 장바구니에서 세션을 복원합니다.

AppController :: beforeFilter()에서 뷰에 세션 데이터를 읽고 설정하거나 방금 읽은 경우 minicart 요소의 세션 도우미를 사용하여 읽습니다. 이 또는 임의의 추가 db 쿼리를 사용하여 requestAction() 호출을 추가로 수행 할 필요가 없습니다.

이렇게 장바구니를 구현했습니다. 여기에서 살펴볼 수 있습니다. https://github.com/burzum/cart 실용 예제 응용 프로그램도 사용할 수 있습니다. https://github.com/burzum/CartSampleApp

+0

감사합니다 :). 그러나 이솝 카트는 재사용 가능한 콘텐츠 블록의 예일뿐입니다. CakePHP에서 ** 재사용 가능한 콘텐츠 블록을 만드는 법 **을 요청했습니다. 재사용 가능한 컨텐츠/뷰의 다른 예 : 관련 제품, 상위 10 개 제품, 뉴스, 최근 게시물 ... – Mojo

관련 문제