페이지 유형 및 페이지 결정


11

나는 매일 매일 마 젠토에서 엄격하게 일하는 새로운 직업을 가지고 있습니다. 나는 Magento에 대한 사전 경험이 없으므로 지금까지 가장 적은 말을하는 것은 도전이었습니다!

우리가 만들고있는 확장을 간단히 설명하겠습니다.

팝업 / 모달 창을 표시 할 수 있습니다. 모달의 HTML 콘텐츠는에 저장됩니다
Static Block


관리자 페이지

관리자 패널 아래에 새 탭으로 구성 그래서 System/Confuration/새 탭

관리자 패널을 사용하면 새 탭 페이지 의 드롭 다운 목록에서 Static Block이러한 섹션에 사용할 기본값 을 선택할 수 있습니다.

HOME PAGE또는 HOME PAGE w/Items in Shopping Cart
ALL CATEGORY PAGES또는 ALL CATEGORY PAGES w/Items in Shopping Cart
ALL PRODUCTS PAGES또는 ALL PRODUCTS PAGES w/Items in Shopping Cart
ALL CMS PAGES또는 ALL CMS PAGES w/Items in Shopping Cart
SHOPPING CART PAGE또는 SHOPPING CART PAGE w/Items in Shopping Cart


기본 오버라이드

다음으로 실제 CMS , CATEGORYPRODUCT 페이지는 STATIC BLOCK항목별로 설정하고 위의 관리자 설정에서 기본 설정을 무시할 수 있다는 점을 제외하고는 관리자 페이지와 동일한 설정을 모두 허용합니다. .


지금까지 확장의 관리자 쪽이 완료되었습니다. 제품, 카테고리, CMS 및 구성 페이지의 각 섹션에 대한 모든 관리 탭이 있습니다.

다음 단계는 같은 확장에 추가 Static Block하고 페이지에 삽입하는 것입니다. 이 Static Block용 올바른보기 책임이 Static Block위에서 언급 한 지역에 설정 한 설정에 따라 각 페이지에 .....

  • 현재 페이지페이지 유형 결정 (cms, 제품, 홈, 카테고리)
  • 그런 다음 위에서 언급 한 영역에서 설정 한 모든 사용자 정의 설정을 읽어야합니다.
  • 그것이 우리가 Category페이지 에 있다고 판단되면 , 우리는 우리가 속한 실제 specifiv 카테고리를 가져와야합니다. 예를 들어 Category 3. 그런 다음 해당 특정 범주에 대한 특정 설정이 있는지 확인합니다. 만약 그렇다면 Enabled우리는 그 Static Block카테고리에 대해 어느 것이 저장되어 있는지 찾아서 Static Block페이지 의 메인 에 표시 할 것입니다 !
  • 위의 특정 카테고리가 Disabled우리에 대해 설정된 Modal Window경우 모달에 대한 더 많은 전역 설정을 살펴보고 모달이 모든 카테고리에 대해 활성화되어 있는지 확인합니다. 그렇다면 Static Block모든 카테고리에 표시되도록 설정되어있는 것을 볼 수 있습니다.
  • 이 외에도 모든 기본 페이지 유형 (제품, 카테고리, cms, 홈, 장바구니)에 대해이 프로세스를 수행합니다.
  • 또한 장바구니가 비어 있는지 확인해야합니다. 비어 있지 않다면 ... wqe가 Static Block각 페이지 Static Block에 빈 카트에 대해 설정하고 빈 카트에 대해서는 1을 설정할 수 있으므로 wqe가 해당 페이지에 표시 할 페이지를 확인할 때 위의 사항을 고려해야합니다 ! (이것은 엄청나게 큰 사업이라는 것을 알고 있지만 우리는 대부분 관리자 쪽을 수행했습니다. Static Block어떤 페이지에 어떤 페이지를 표시 할지 결정하기 위해 모든 사람들을 고려하는 부분을 수행하면 됩니다.

올바른 방향으로 안내하기 위해 몇 가지 작은 질문이 있습니다.

  • Static Block코드 (PHP 부분) 내 에서 페이지의 TYPE을 어떻게 결정할 수 있습니까 ? 내가 언급 한 것처럼 내가 켜져 있는지 알아야합니다 .... HOME PAGE , CMS PAGE , CATEGORY PAGE , PRODUCT PAGE 또는 SHOPPING CART PAGE ?
  • 페이지 유형 외에도 실제 페이지를 가져와야합니다. 따라서 제품 ID 1234 를 사용하는 경우 해당 특정 페이지에 대한 설정 (해당 페이지의 정적 블록 세트)을 얻을 수 있어야합니다.

나는 이것이 길고 혼란스러운 게시물이라는 것을 알고 있습니다. 지금까지 작성했다면 시간을내어 읽어 주셔서 감사합니다 =)

내 질문에 도움이 될 수 있다면, 작은 덩어리 하나 하나가 최종 목표에 더 가까워 질 것입니다


아래는 페이지에 삽입 할 정적 블록을 결정하기 위해 모듈이 어떻게 작동해야하는지에 대한 흐름도입니다.

여기에 이미지 설명을 입력하십시오


2
Mage_Widget모듈에 존재하는 기능을 효과적으로 재생성했음을 알고 있습니까?
benmarks

@benmarks가 말한 것을 Ditto. IMO 당신은 위젯을 활용하려고 노력하는 것이 좋습니다.
davidalger

@benmarks 질문에 추가 한 순서도를 보면 여전히 100 % 달성 할 수 있다고 말할 수 Mage_Widget있습니까? 나뿐만 아니라 그 조사에 필요
JasonDavis

아니요. 핵심 위젯 블록은 차트에 표시된 것과 같은 조합을 이해하지 못합니다. 이를 위해 몇 가지 블록 로직을 원할 것입니다.
benmarks

답변:


12

@benmarks가 답변 한 것 외에도 :

다음은 언급 한 조건 중 일부를 확인하는 작은 코드입니다.

// Check if it's a CMS page:
$page = Mage::getSingleton('cms/page');
if ($page->getId()) {
    // The current page is a CMS page

    if ($page->getIdentifier() == Mage::getStoreConfig('web/default/cms_home_page')) {
        // The current page is the CMS home page
    }
}

$product = Mage::registry('current_product');
$category = Mage::registry('current_category');
if ($product && $product->getId()) {
    // The current page is a product page.
    // If you only want the main product detail page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_product_view'
    // Be aware that a current_product and a current_category can be set at the same time.
    // In that case the visitor is viewing a product in a category.
} elseif ($category && $category->getId()) {
    // The current page is a category page
    // If you only want the category list page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_category_view'
}

// Check for cart page
if (Mage::app()->getFrontController()->getAction()->getFullActionName() == 'checkout_cart_index') {
    // The current page is the cart
}

카트가 비어 있는지 또는 사용하지 않는지 확인하려면

$isEmpty = Mage::getSingleton('checkout/session')->getQuote()->getItemsCount() > 0

또한 CMS 블록 에서 현재 페이지를 확인할 수 있는지 물었습니다 .
이는 좋은 접근 방식이 아닐 수 있습니다 (첫 페이지에서 CMS 블록 사용의 목적을 상실하는 사용자 지정 블록을 포함해야 함).
대신 현재 페이지를 먼저 확인한 다음이를 기반으로 표시 할 CMS 블록을 선택하는 것이 좋습니다.

편집 : 의견에 @Joseph가 언급 한 것처럼 수정 Mage::app()->getRequest()->getFullActionName()되었습니다 Mage::app()->getFrontController()->getAction()->getFullActionName(). 감사!


정말 감사합니다. 시작하는 데 도움이 될 것입니다.
JasonDavis

1
참고 : Mage::app()->getRequest()->getFullActionName()카트 템플릿을 사용 하면 치명적인 오류가 발생하거나 적어도 1.7.0.2에서 나에게 실패했습니다. $this->getAction()->getFullActionName()완벽하게 일했다!
Joseph Leedy

어, 그래, 당신은 궤도에 있습니다. 내 잘못이야! 감사!
Vinai

참고로, Mage :: getSingleton ( 'cms / page')-> getId ()는 controller_action_predispatch 이벤트에서 null 값을 제공합니다.
MagePsycho

7

당신이 취할 수있는 많은 접근 방식. <default>모든 페이지에서 사용할 수 있도록 레이아웃 업데이트 핸들을 통해 블록을 추가하는 것이 좋습니다 . 블록의 _prepareLayout()메소드에서 요청 오브젝트 ( $this->getRequest()->getFullActionName()) 에서 현재 전체 조치 이름을 가져오고 이를 사용하여 컨텍스트를 판별하여 범위를 판별 할 수 있습니다 .

제품 및 카테고리가 레지스트리에 등록됩니다. 블록은 레이아웃 업데이트 핸들을 볼 수 있으며 여기에는 제품 ID 또는 카테고리 ID 핸들이 포함됩니다.


3

홈 페이지를 감지하려면 숫자 ID가 아닌 구성 값과 일치시키기 위해 식별자 문자열 (예 : "home")을 사용해야합니다.

if ($ page-> getIdentifier () == Mage :: getStoreConfig ( 'web / default / cms_home_page')) {
    // 홈페이지
}

여기 다른 것들이 있습니다 :

$ fullActionName = 마법사 :: app ()-> getFrontController ()-> getAction ()-> getFullActionName ();
if ( 'checkout_onepage_index'== $ fullActionName) {
    // 체크 아웃
}

if ( 'checkout_onepage_success'== $ fullActionName) {
    // 결제 성공
}

if ( 'customer_account_login'== $ fullActionName) {
    // 로그인
}

if ( 'customer_account_logoutSuccess'== $ fullActionName) {
    // 로그 아웃 성공
}

if ( 'customer_account_create'== $ fullActionName) {
    // 고객 계정 생성
}
if (0 === strpos ($ fullActionName, 'catalogsearch_')) {
    // 검색
}

if (0 === strpos ($ fullActionName, 'customer_account_')
 || 0 === strpos ($ fullActionName, '고객 _ 주소 _')
 || 0 === strpos ($ fullActionName, 'wishlist_')
 || 0 === strpos ($ fullActionName, 'newsletter_manage_')
 || 0 === strpos ($ fullActionName, 'review_customer_')
 || 0 === strpos ($ fullActionName, 'sales_order_')
) {
    // 고객 계정 페이지 (아마도 다른 사람이있을 수 있음)
}

유용한 정보를 주셔서 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.