Визначте тип сторінки та сторінку


11

У мене є нова робота, де я суто працюю над Magento щодня. Я не маю попереднього досвіду роботи з Magento, тому сказати, що це було найменше, це був виклик!

Дозвольте коротко пояснити розширення, яке ми будуємо.

Це дозволить нам показати вікно Popup / Modal. Зміст HTML модального буде зберігатися в
аStatic Block


СТОРІНКА АДМІНУ

Отже панель адміністратора складається з нової вкладки в розділі System/Confuration/NEW TAB

Панель адміністратора дозволяє вибрати у випадаючому списку на цій НОВІЙ СТОРІНЦІ ТАБА за замовчуванням 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 , КАТЕГОРІЇ та ПРОДУКТУ дозволяють ті самі налаштування, що й сторінки Панелі адміністратора, за винятком того, що вони дозволяють встановлювати значення STATIC BLOCKза кожним елементом та переоцінювати налаштування за замовчуванням, які були у налаштуваннях адміністратора вище .


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

Наступним кроком буде додавання до того ж розширення та Static Blockвставка на сторінку. Це Static Blockнесе відповідальність за ... Показ правильного Static Blockна кожній сторінці на основі налаштувань, встановлених у вищезгаданих областях .....

  • Визначення сторінки, на якій ми перебуваємо, та типу сторінки (cms, product, home, category)
  • Після цього доведеться прочитати всі власні налаштування, встановлені у вищезгаданих областях.
  • Якщо буде визначено, що ми знаходимося на Categoryсторінці, нам доведеться отримати фактичну категорію speciv, на якій ми перебуваємо. Наприклад Category 3. Потім ми побачимо, чи є конкретна установка для цієї конкретної категорії. Якщо він говорить, Enabledми будемо шукати, що Static Blockзбережено для цієї категорії, і покажемо це в нашому головному Static Blockна сторінці!
  • Якщо вищевказана конкретна категорія встановлена ​​як Disabledнаша, Modal Windowми розглянемо вище в більш глобальних настройках для Modal і побачимо, чи ввімкнено режим Modal для всіх категорій. Якщо так, то ми побачимо, що Static Blockвстановлено для показу для всіх категорій.
  • На додаток до всього цього, він виконає цей процес для кожного з основних типів сторінки (товар, категорії, CMS, домашня сторінка, кошик)
  • Також нам доведеться перевірити, чи кошик порожній чи ні. ЯКЩО не порожній ... тоді нам доведеться це врахувати вище, коли wqe перевіряє, що Static Blockпоказати для цієї сторінки, оскільки кожне налаштування дозволяє встановити a Static Blockдля порожнього кошика та 1 для не порожнього кошика! (Я знаю, що це велике важке і велике починання, але в основному у нас сторона адміністратора. Просто потрібно виконати ту частину, яка враховує всіх тих, хто визначає, Static Blockна якій конкретній сторінці показувати.

Отже, щоб перемогти мене в правильному напрямку, у мене є кілька менших питань ...

  • Як я можу всередині свого Static Blockкоду (частина PHP) визначити, на якому ТИПІ СТОРІНКИ я перебуваю. Як я вже згадував , що я повинен знати , якщо я на .... HOME PAGE , CMS PAGE , КАТЕГОРІЯ PAGE , сторінка продукту або КОШИК PAGE ?
  • Окрім СТРІБНОГО ТИПУ, мені потрібно отримати фактичну сторінку. Отже, якщо я перебуваю на ідентифікаторі продукту 1234, тоді мені потрібно мати можливість встановити налаштування (статичний блок, встановлений для цієї сторінки) для цієї конкретної сторінки.

Я знаю, що це довгий і, можливо, заплутаний пост. Якщо ви зробили це далеко, дякую, що знайшли свій час, щоб прочитати це =)

Якщо ви можете допомогти з моїм питанням, кожен маленький шматок наблизить мене до кінцевої мети


Нижче наведена схема діаграми, яку я склав, як мій модуль повинен працювати, щоб визначити, який статичний блок вставити на сторінку

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


2
Ви розумієте, що ви ефективно відтворили функціонал, який існує в Mage_Widgetмодулі, правда?
орієнтири

Дітто, що сказав @benmarks. ІМО вам буде краще спробувати скористатись віджетами та перейти звідти.
davidalger

@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 для відображення на основі цього.

EDIT : фіксований , Mage::app()->getRequest()->getFullActionName()щоб бути Mage::app()->getFrontController()->getAction()->getFullActionName()як було згадано в @ Джозеф коментарі. Дякую!


Дуже дякую, що це справді допоможе мені почати роботу!
JasonDavis

1
Зауважу лише: використання Mage::app()->getRequest()->getFullActionName()в шаблоні кошика призводить до фатальної помилки або, принаймні, для мене на 1.7.0.2. $this->getAction()->getFullActionName()працював чудово!
Джозеф Леді

Ага, так, ти маєш рацію. Моє ліжко! Дякую!
Вінай

FYI, Mage :: getSingleton ('cms / page') -> getId () надає нульове значення в події контролера Managed_predispatch.
MagePsycho

7

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

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


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, 'список бажань_')
 || 0 === strpos ($ fullActionName, 'newsletter_manage_')
 || 0 === strpos ($ fullActionName, 'review_customer_')
 || 0 === strpos ($ fullActionName, 'sales_order_')
) {
    // Сторінка облікового запису клієнта (можливо, є й інші)
}

Дякуємо за корисну інформацію усім!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.