Bestimmen Sie den Seitentyp und die Seite

11

Ich habe einen neuen Job, bei dem ich jetzt jeden Tag ausschließlich an Magento arbeite. Ich habe noch keine Erfahrung mit Magento, daher war es bisher eine Herausforderung, um es gelinde auszudrücken!

Lassen Sie mich kurz die Erweiterung erklären, die wir bauen.

Dadurch können wir ein Popup / Modal-Fenster anzeigen. Die modale HTML - Inhalt wird in speichernden
einemStatic Block


ADMINISTRATOR SEITE

Das Admin-Panel besteht also aus einem neuen Tab unter System/Confuration/ NEW TAB

Im Admin-Bereich können Sie in einer Dropdown-Liste auf dieser NEUEN TAB-SEITE die Standardeinstellung auswählenStatic Block für diese Abschnitte ...

HOME PAGEoder HOME PAGE w/Items in Shopping Cart
ALL CATEGORY PAGESoder ALL CATEGORY PAGES w/Items in Shopping Cart
ALL PRODUCTS PAGESoder ALL PRODUCTS PAGES w/Items in Shopping Cart
ALL CMS PAGESoder ALL CMS PAGES w/Items in Shopping Cart
SHOPPING CART PAGEoder SHOPPING CART PAGE w/Items in Shopping Cart


STANDARD ÜBERFAHRT

Als nächstes erlauben die tatsächlichen CMS- , KATEGORIE- und PRODUKT- Seiten alle die gleichen Einstellungen wie auf der Admin-Panel-Seite, außer dass Sie STATIC BLOCKeine pro Element festlegen und die Standardeinstellung, die wir in den obigen Admin-Einstellungen hatten, überschreiben können .


Bisher haben wir die Admin-Seite der Erweiterung erledigt. Wir haben alle Admin-Registerkarten für jeden Abschnitt ... Produkt-, Kategorie-, CMS- und Konfigurationsseite.

Der nächste Schritt besteht darin, dieselbe Erweiterung hinzuzufügen und eine Static BlockEinfügung in die Seite vorzunehmen . Dies Static Blockist verantwortlich für ... Anzeigen der korrekten Static Blockauf jeder Seite basierend auf den Einstellungen, die in den oben genannten Bereichen festgelegt wurden .....

  • Bestimmen der Seite, auf der wir uns befinden, und des Seitentyps (cm, Produkt, Startseite , Kategorie)
  • Es muss dann alle benutzerdefinierten Einstellungen lesen, die in den oben genannten Bereichen festgelegt wurden.
  • Wenn festgestellt wird, dass wir uns auf einer CategorySeite befinden, müssen wir die tatsächliche spezifische Kategorie ermitteln, in der wir uns befinden. Zum Beispiel Category 3. Wir werden dann sehen, ob es eine bestimmte Einstellung für diese bestimmte Kategorie gibt. Wenn es heißt, werden Enabledwir dann suchen, was Static Blockfür diese Kategorie gespeichert ist und es in unserem Hauptteil Static Blockauf der Seite anzeigen!
  • Wenn die oben genannte spezifische Kategorie wie Disabledfür unsere festgelegt Modal Windowist, werden wir in den globaleren Einstellungen für das Modal weiter oben nachsehen, ob ein Modal für alle Kategorien aktiviert ist. Wenn ja, dann werden wir sehen, welcheStatic Block Einstellung für alle Kategorien festgelegt ist.
  • Darüber hinaus wird dieser Vorgang für jeden der Hauptseitentypen (Produkt, Kategorien, CMS, Startseite, Warenkorb) ausgeführt.
  • Wir müssen auch prüfen, ob der Warenkorb leer ist oder nicht. WENN nicht leer ... dann müssen wir dies oben berücksichtigen, wenn wir prüfen, welche Static Blockfür diese Seite angezeigt werden sollen , da jede Einstellung die Einstellung von a Static Blockfür leeren Wagen und 1 für nicht leeren Wagen ermöglicht! (Ich weiß, dass dies ein gewaltiges, hartes und großes Unterfangen ist, aber wir haben die Administrationsseite meistens erledigt. Wir müssen nur den Teil erledigen, der all diese Faktoren berücksichtigt, um zu bestimmen, welche Static Blockauf welcher bestimmten Seite angezeigt werden sollen.

Um mich in die richtige Richtung zu bringen, habe ich ein paar kleinere Fragen ...

  • Wie kann ich in meinem Static BlockCode (dem PHP-Teil) bestimmen, auf welchem ​​SEITENTYP ich mich befinde? Wie ich bereits erwähnt habe, muss ich wissen, ob ich auf ... HOME PAGE , einer CMS PAGE , einer CATEGORY PAGE , einer PRODUCT PAGE oder der SHOPPING CART PAGE bin .
  • Zusätzlich zum SEITENTYP muss ich die aktuelle Seite erhalten. Wenn ich also die Produkt-ID 1234 habe, muss ich in der Lage sein, die Einstellung (statischer Block für diese Seite festgelegt) für diese bestimmte Seite abzurufen.

Ich weiß, dass dies ein langer und möglicherweise verwirrender Beitrag war. Wenn Sie es bis hierher geschafft haben, danke, dass Sie sich die Zeit genommen haben, dies zu lesen =)

Wenn Sie mir bei meiner Frage helfen können, bringt mich jedes kleine Stück näher an das Endziel


Unten sehen Sie ein Flussdiagramm, das ich erstellt habe, wie mein Modul funktionieren muss, um zu bestimmen, welcher statische Block in die Seite eingefügt werden soll

Geben Sie hier die Bildbeschreibung ein

JasonDavis
quelle
2
Sie erkennen, dass Sie die im Mage_WidgetModul vorhandenen Funktionen effektiv neu erstellt haben , oder?
Benmarks
Das Gleiche gilt für @benmarks. IMO ist es besser, wenn Sie versuchen, Widgets zu nutzen und von dort aus fortzufahren.
Davidalger
@benmarks Wenn Sie sich das Flussdiagramm ansehen, das ich meiner Frage hinzugefügt habe, würden Sie sagen, dass es mit dem noch zu 100% erreichbar ist Mage_Widget? Ich muss mich auch darum kümmern
JasonDavis
Nein. Kern-Widget-Blöcke verstehen keine Kombinationen wie die in Ihrem Diagramm angegebenen. Sie werden dafür eine Blocklogik wollen.
Benmarks

Antworten:

12

Zusätzlich zu den Antworten von @benmarks :

Hier ist ein kleiner Code, um einige der von Ihnen genannten Bedingungen zu überprüfen:

// 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
}

Um zu überprüfen, ob der Wagen leer ist oder nicht

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

Sie haben auch gefragt, ob Sie die aktuelle Seite in einem CMS-Block überprüfen können .
Dies ist wahrscheinlich kein guter Ansatz (Sie müssten benutzerdefinierte Blöcke einfügen, wodurch der Zweck der Verwendung von CMS-Blöcken auf der ersten Seite zunichte gemacht würde).
Stattdessen ist es besser, zuerst die aktuelle Seite zu überprüfen und dann den CMS-Block auszuwählen, der darauf basierend angezeigt werden soll.

BEARBEITEN : behoben Mage::app()->getRequest()->getFullActionName(), Mage::app()->getFrontController()->getAction()->getFullActionName()wie von @Joseph in den Kommentaren erwähnt. Vielen Dank!

Vinai
quelle
Vielen Dank, das wird mir wirklich helfen, loszulegen!
JasonDavis
1
Nur zur Anmerkung: Die Verwendung Mage::app()->getRequest()->getFullActionName()in einer Warenkorbvorlage führt zu einem schwerwiegenden Fehler, oder zumindest bei mir am 1.7.0.2. $this->getAction()->getFullActionName()hat perfekt funktioniert!
Joseph Leedy
Äh, ja, du bist auf dem richtigen Weg. Mein Fehler! Vielen Dank!
Vinai
Zu Ihrer Information, Mage :: getSingleton ('cms / page') -> getId () gibt im Ereignis controller_action_predispatch den Wert null an.
MagePsycho
7

Viele Ansätze, die Sie verfolgen könnten. Ich würde empfehlen, Ihren Block über das <default>Layout-Update-Handle hinzuzufügen , damit er auf allen Seiten verfügbar ist. In der _prepareLayout()Methode Ihres Blocks können Sie den Bereich bestimmen, indem Sie den aktuellen vollständigen Aktionsnamen vom Anforderungsobjekt ( $this->getRequest()->getFullActionName()) abrufen und diesen verwenden, um den Kontext zu bestimmen.

Produkte und Kategorien werden in der Registrierung registriert. Ihr Block könnte sich auch die Handles für die Layoutaktualisierung ansehen, die Handles für Produkt-IDs oder Kategorie-IDs enthalten.

Benmarks
quelle
3

Um die Homepage zu erkennen, müssen Sie die Bezeichnerzeichenfolge (z. B. "home") verwenden, um sie mit dem Konfigurationswert und nicht mit der numerischen ID abzugleichen:

if ($ page-> getIdentifier () == Mage :: getStoreConfig ('web / default / cms_home_page')) {
    // Startseite
}}

Hier sind einige andere:

$ fullActionName = Mage :: app () -> getFrontController () -> getAction () -> getFullActionName ();
if ('checkout_onepage_index' == $ fullActionName) {
    // Auschecken
}}

if ('checkout_onepage_success' == $ fullActionName) {
    // Checkout-Erfolg
}}

if ('customer_account_login' == $ fullActionName) {
    // Anmeldung
}}

if ('customer_account_logoutSuccess' == $ fullActionName) {
    // Abmeldeerfolg
}}

if ('customer_account_create' == $ fullActionName) {
    // Kundenkonto erstellen
}}
if (0 === strpos ($ fullActionName, 'catalogogsearch_')) {
    // Suche
}}

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_')
) {
    // Kundenkontoseite (es gibt wahrscheinlich andere)
}}

Vielen Dank für die hilfreichen Infos an alle!

Kirkmadera
quelle