Określ typ strony i stronę

11

Mam nową pracę, w której teraz codziennie ściśle pracuję nad Magento. Nie mam wcześniejszego doświadczenia z Magento, więc powiedzenie co najmniej było wyzwaniem!

Pozwól, że wyjaśnię krótko rozszerzenie, które budujemy.

Pozwoli nam pokazać okno Popup / Modal. Treść HTML Modala będzie przechowywana w
plikuStatic Block


STRONA ADMINISTRACYJNA

Dlatego panel administracyjny składa się z nowej karty w obszarze System/Confuration/NOWA TAB

Panel administracyjny umożliwia wybranie z rozwijanej listy na tej NOWEJ STRONIE TAB domyślnych ustawień Static Blockdla tych sekcji ...

HOME PAGElub HOME PAGE w/Items in Shopping Cart
ALL CATEGORY PAGESlub ALL CATEGORY PAGES w/Items in Shopping Cart
ALL PRODUCTS PAGESlub ALL PRODUCTS PAGES w/Items in Shopping Cart
ALL CMS PAGESlub ALL CMS PAGES w/Items in Shopping Cart
SHOPPING CART PAGElub SHOPPING CART PAGE w/Items in Shopping Cart


DOMYŚLNE NADMIERNE JAZDY

Następnie rzeczywiste strony CMS , CATEGORY i PRODUCT zezwalają na te same ustawienia, które ma strona panelu administracyjnego, z wyjątkiem tego, że pozwalają na ustawienie STATIC BLOCKposzczególnych elementów i zastąpienie domyślnego ustawienia, które mieliśmy w ustawieniach administratora powyżej .


Do tej pory wykonaliśmy stronę administratora rozszerzenia. Mamy wszystkie karty administracyjne dla każdej sekcji ... produktu, kategorii, CMS i strony konfiguracji.

Następnym krokiem będzie dodanie tego samego rozszerzenia i Static Blockwstawienie na stronie. To Static Blockbędzie odpowiedzialna za ... Pokazano poprawna Static Blockna każdej stronie na podstawie ustawień, które zostały ustawione w wyżej wymienionych obszarach .....

  • Określanie strony, na której jesteśmy, i typu strony (cms, produkt, strona główna, kategoria)
  • Będzie wtedy musiał przeczytać wszystkie ustawienia niestandardowe, które zostały ustawione w wyżej wymienionych obszarach.
  • Jeśli zostanie ustalone, że jesteśmy na Categorystronie, będziemy musieli uzyskać konkretną konkretną kategorię, w której się znajdujemy. Na przykład Category 3. Zobaczymy wtedy, czy istnieje określone ustawienie dla tej konkretnej kategorii. Jeśli Enabledwyświetli się informacja, sprawdzimy, która Static Blockpozycja jest zapisana dla tej kategorii i pokażemy ją w naszej głównej Static Blockna stronie!
  • Jeśli powyższa kategoria specyficzna jest ustawiona jak Disableddla naszej, Modal Windowwówczas spojrzymy wyżej w bardziej globalnych ustawieniach Modala i zobaczymy, czy Modal jest włączony dla wszystkich kategorii. Jeśli tak, zobaczymy, który Static Blockzestaw zostanie wyświetlony we wszystkich kategoriach.
  • Oprócz tego wszystko wykona ten proces dla każdego z głównych typów stron (produkt, kategorie, cms, strona główna, koszyk)
  • Będziemy również musieli sprawdzić, czy koszyk jest pusty, czy nie. JEŻELI nie jest pusty ... wtedy będziemy musieli wziąć to pod uwagę powyżej, gdy wqe sprawdzają, które Static Blockmają być wyświetlane dla tej strony, ponieważ każde ustawienie pozwala Static Blockustawić dla pustego koszyka i 1 dla pustego koszyka! (Wiem, że jest to ogromne trudne i duże przedsięwzięcie, ale wykonujemy głównie stronę administracyjną. Wystarczy wykonać część, która bierze pod uwagę wszystkie te czynniki przy określaniu, które Static Blockz nich pokazać na konkretnej stronie.

Aby skierować mnie w dobrym kierunku, mam kilka mniejszych pytań ...

  • Jak mogę wewnątrz mojego Static Blockkodu (część PHP) określić, jakiego rodzaju STRONĘ używam. Jak wspomniałem muszę wiedzieć, czy jestem na .... STRONA , o CMS STRONY , A strony kategorii , o stronie produktu lub ZAKUPY PAGE CART ?
  • Oprócz TYPU STRONY muszę uzyskać aktualną stronę. Więc jeśli mam numer identyfikacyjny produktu 1234 , muszę mieć możliwość ustawienia (blok statyczny ustawiony dla tej strony) dla tej konkretnej strony.

Wiem, że był to długi i być może mylący post. Jeśli dotarłeś tak daleko, dziękuję za poświęcenie czasu na przeczytanie tego =)

Jeśli możesz mi pomóc z moim pytaniem, każdy mały fragment przybliża mnie do celu końcowego


Poniżej znajduje się schemat przepływu, który stworzyłem, jak mój moduł będzie musiał działać, aby określić, który blok statyczny należy wstawić na stronę

wprowadź opis zdjęcia tutaj

JasonDavis
źródło
2
Zdajesz sobie sprawę, że skutecznie odtworzyłeś funkcjonalność istniejącą w Mage_Widgetmodule, prawda?
zyskuje
To samo, co powiedział @benmarks. IMO lepiej będzie, jeśli spróbujesz skorzystać z widżetów i stamtąd.
davidalger
@benmarks Patrząc na schemat blokowy, który dodałem do mojego pytania, czy powiedziałbyś, że nadal można go osiągnąć w 100% dzięki Mage_Widget? Muszę też na to spojrzeć
JasonDavis,
Nie. Podstawowe bloki widżetów nie rozumieją kombinacji takich jak te wskazane na wykresie. Będziesz potrzebował do tego logiki blokowej.
zyskuje

Odpowiedzi:

12

Oprócz odpowiedzi na @benmarks :

Oto mały kod, aby sprawdzić niektóre z wymienionych warunków:

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

Aby sprawdzić, czy wózek jest pusty, czy nie należy go używać

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

Zapytałeś również, czy możesz sprawdzić bieżącą stronę w bloku CMS.
Prawdopodobnie nie jest to dobre podejście (musiałbyś dołączyć niestandardowe bloki, które nie spełniłyby celu użycia bloków CMS na pierwszej stronie).
Zamiast tego lepiej najpierw sprawdzić bieżącą stronę, a następnie wybrać blok CMS do wyświetlenia na tej podstawie.

EDYCJA : naprawiono Mage::app()->getRequest()->getFullActionName()tak, Mage::app()->getFrontController()->getAction()->getFullActionName()jak wspomniano w @Joseph w komentarzach. Dzięki!

Vinai
źródło
Dziękuję bardzo, to naprawdę pomoże mi zacząć!
JasonDavis,
1
Uwaga: użycie Mage::app()->getRequest()->getFullActionName()szablonu koszyka powoduje błąd krytyczny, a przynajmniej dla mnie w wersji 1.7.0.2. $this->getAction()->getFullActionName()działało idealnie!
Joseph Leedy,
Tak, jesteś na dobrej drodze. Mój błąd! Dzięki!
Vinai,
FYI, Mage :: getSingleton ('cms / page') -> getId () daje wartość zerową w zdarzeniu controller activity_predispatch.
MagePsycho
7

Wiele podejść, które możesz zastosować. Polecam dodanie twojego bloku za pomocą <default>uchwytu aktualizacji układu, dzięki czemu byłby dostępny na wszystkich stronach. W _prepareLayout()metodzie bloku możesz określić zasięg, pobierając bieżącą pełną nazwę akcji z obiektu żądania ( $this->getRequest()->getFullActionName()) i używając go do określenia kontekstu.

Produkty i kategorie zostaną zarejestrowane w rejestrze. Twój blok może również patrzeć na uchwyty aktualizacji układu, które będą zawierać uchwyty identyfikatora produktu lub identyfikatora kategorii.

zalety
źródło
3

Aby wykryć stronę główną, musisz użyć ciągu identyfikatora (np. „Strona główna”) w celu dopasowania do wartości konfiguracji, a nie identyfikatora numerycznego:

if ($ page-> getIdentifier () == Mage :: getStoreConfig ('web / default / cms_home_page')) {
    // Strona główna
}

Oto kilka innych:

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

if ('checkout_onepage_success' == $ fullActionName) {
    // Sukces kasy
}

if ('customer_account_login' == $ fullActionName) {
    // Zaloguj sie
}

if ('customer_account_logoutSuccess' == $ fullActionName) {
    // Wyloguj się
}

if ('customer_account_create' == $ fullActionName) {
    // Utwórz konto klienta
}
if (0 === strpos ($ fullActionName, 'catalogsearch_')) {
    // Szukaj
}

if (0 === strpos ($ fullActionName, 'account_account_')
 || 0 === strpos ($ fullActionName, 'adres_klienta_')
 || 0 === strpos ($ fullActionName, 'wishlist_')
 || 0 === strpos ($ fullActionName, 'newsletter_manage_')
 || 0 === strpos ($ fullActionName, 'review_customer_')
 || 0 === strpos ($ fullActionName, 'sales_order_')
) {
    // Strona konta klienta (prawdopodobnie są inne)
}

Dzięki za pomocne informacje dla wszystkich!

kirkmadera
źródło