Определить тип страницы и страницу

11

У меня есть новая работа, где я сейчас строго работаю над Magento. У меня нет опыта работы с 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 , CATEGORY и PRODUCT разрешены те же настройки, что и на странице панели администратора, за исключением того, что они позволяют вам устанавливать значение STATIC BLOCKдля каждого элемента и отменять настройки по умолчанию, которые были у нас в настройках администратора выше ,


Пока что у нас есть админская сторона расширения. У нас есть все вкладки администратора для каждого раздела ... продукт, категория, CMS и страница конфигурации.

Следующим шагом будет добавление к тому же расширению и Static Blockвставка на страницу. Это Static Blockбудет нести ответственность за ... Отображение правильных Static Blockна каждой странице на основе настроек, которые были установлены в вышеупомянутых областях .....

  • Определение страницы, на которой мы находимся, и тип страницы (cms, продукт, дом, категория)
  • Затем он должен будет прочитать все пользовательские настройки, которые были установлены в вышеупомянутых областях.
  • Если будет определено, что мы находимся на Categoryстранице, нам нужно будет получить фактическую конкретную категорию, в которой мы находимся. Например Category 3. Затем мы увидим, есть ли конкретные настройки для этой конкретной категории. Если он говорит, что Enabledмы будем искать, который Static Blockсохранен для этой категории и показать его в нашей главной Static Blockна странице!
  • Если указанная выше конкретная категория установлена ​​как Disabledнаша, Modal Windowмы посмотрим выше в более глобальных настройках для модального режима и посмотрим, включен ли модальный режим для всех категорий. Если да, то мы увидим, какие из Static Blockних будут показаны для всех категорий.
  • В дополнение ко всему этому, он будет выполнять этот процесс для каждого из основных типов страниц (продукт, категории, cms, дом, корзина)
  • Мы также должны проверить, пуста ли корзина для покупок. Если не пусто ... тогда мы должны принять это во внимание выше, когда wqe проверяет, что Static Blockпоказывать для этой страницы, так как каждый параметр позволяет установить a Static Blockдля пустой корзины и 1 для не пустой корзины! (Я знаю, что это очень сложное и трудоемкое мероприятие, но мы в основном занимаемся вопросами администрирования. Просто нужно выполнить ту часть, которая учитывает все это при определении того, что Static Blockпоказывать на какой конкретной странице.

Поэтому, чтобы направить меня в правильном направлении, у меня есть пара небольших вопросов ...

  • Как я могу внутри своего Static Blockкода (часть PHP) определить, какой ТИП СТРАНИЦЫ я нахожусь. Как я уже упоминал , что я должен знать , если я на .... HOME PAGE , CMS PAGE , КАТЕГОРИЯ PAGE , страница продукта или КОРЗИНА PAGE ?
  • Помимо ТИПА СТРАНИЦЫ мне нужно получить реальную страницу. Поэтому, если я нахожусь на Product id 1234, то мне нужно иметь возможность получить настройку (статический блок, установленный для этой страницы) для этой конкретной страницы.

Я знаю, что это был длинный и, возможно, запутанный пост. Если вы сделали это далеко, спасибо, что нашли время, чтобы прочитать это =)

Если вы можете помочь с моим вопросом, каждый маленький кусочек приблизит меня к конечной цели


Ниже приведена блок-схема того, как мой модуль должен работать, чтобы определить, какой статический блок нужно вставить на страницу.

введите описание изображения здесь

JasonDavis
источник
2
Вы понимаете, что вы эффективно воссоздали функциональность, которая существует в Mage_Widgetмодуле, верно?
отметки
То же самое сказал @benmarks. ИМО вам будет лучше, если вы воспользуетесь виджетами и уйдете оттуда.
Давидгер
@benmarks Глядя на блок-схему, которую я добавил к моему вопросу, не могли бы вы сказать, что она все еще достижима на 100% с помощью Mage_Widget? Мне нужно разобраться и с этим
JasonDavis
Нет. Базовые блоки виджетов не понимают комбинации, подобные тем, которые указаны на вашем графике. Вы будете хотеть некоторую блочную логику для этого.
отметки

Ответы:

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 для отображения на основе этого.

РЕДАКТИРОВАТЬ : исправлено, Mage::app()->getRequest()->getFullActionName()чтобы быть, Mage::app()->getFrontController()->getAction()->getFullActionName()как указано @Joseph в комментариях. Спасибо!

Vinai
источник
Большое вам спасибо, это поможет мне начать!
JasonDavis
1
Просто чтобы заметить: использование Mage::app()->getRequest()->getFullActionName()в шаблоне корзины приводит к фатальной ошибке или, по крайней мере, для меня на 1.7.0.2. $this->getAction()->getFullActionName()работал отлично!
Джозеф Лиди
Да, вы на правильном пути. Виноват! Спасибо!
Vinai
FYI, Mage :: getSingleton ('cms / page') -> getId () дает нулевое значение в событии controller_action_predispatch.
MagePsycho
7

Много подходов, которые вы могли бы предпринять. Я бы порекомендовал добавить свой блок через <default>дескриптор обновления макета, который сделает его доступным на всех страницах. В _prepareLayout()методе вашего блока вы можете определить область, получив текущее полное имя действия из объекта запроса ( $this->getRequest()->getFullActionName()) и используя его для определения контекста.

Товары и категории будут зарегистрированы в реестре. Ваш блок может также посмотреть на маркеры обновления макета, которые будут включать идентификаторы идентификатора продукта или категории.

benmarks
источник
3

Чтобы обнаружить домашнюю страницу, вам нужно использовать строку идентификатора (например, «home») для сопоставления со значением конфигурации, а не числовой идентификатор:

if ($ page-> getIdentifier () == Mage :: getStoreConfig ('web / default / cms_home_page')) {
    // Домашняя страница
}

Вот некоторые другие:

$ fullActionName = Mage :: 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, 'customer_address_')
 || 0 === strpos ($ fullActionName, 'wishlist_')
 || 0 === strpos ($ fullActionName, 'newsletter_manage_')
 || 0 === strpos ($ fullActionName, 'review_customer_')
 || 0 === strpos ($ fullActionName, 'sales_order_')
) {
    // Страница учетной записи клиента (возможно, есть и другие)
}

Спасибо всем за полезную информацию!

kirkmadera
источник