TL; DR: czy istnieje sposób na debugowanie ładowania układu? Jak wierzę, układ jednego modułu jest w konflikcie z innym.
Powiązane z poprzednim pytaniem, które zadałem: Jak zrobić układ modułu, aby był wyświetlany na wszystkich motywach
Z powodzeniem załadowałem mój moduł do lokalnego środowiska testowego (zwanego też moim komputerem programistycznym), przetestowałem przełączanie między 3 różnymi motywami i jest w porządku. Następnie zaktualizowałem moduł w testowym lub „przedprodukcyjnym” środowisku, które mamy, gdzie jest wiele różnych modułów, niektóre zastrzeżone przez nas. W tym środowisku moduł nie pokazuje, co jest potrzebne na stronie głównej produktu. Po kilku testach w końcu doszedłem do wniosku, że problemem powinien być proces ładowania układu.
Czy jest więc sposób, w jaki mogę debugować ładowanie układu, jak różne moduły zastępują lub dodają własne bloki? Chodzi mi o to, że uważam, że istnieje co najmniej jeden moduł, który powinien kolidować z moim. Ponieważ mamy tak wiele modułów, szukam innego podejścia niż wyłączanie modułów jeden po drugim i sprawdzanie, który jest problematyczny.
Mój plik config.xml to:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Dts_Banners>
<version>0.1.0</version>
</Dts_Banners>
</modules>
<global>
<blocks>
<banners>
<class>Dts_Banners_Block</class>
</banners>
</blocks>
....
<events>
<controller_action_layout_load_before>
<observers>
<attributesethandle>
<class>Dts_Banners_Model_Observer</class>
<method>addAttributeSetHandle</method>
</attributesethandle>
</observers>
</controller_action_layout_load_before>
</events>
</global>
....
</config>
Plik mojego obserwatora:
<?php
class Dts_Banners_Model_Observer
{
/**
* Checks if the search text on the list of active campaigns (dts_banners_admin table) has some of the comma separated text on the product name
* If text found, add a layout handle PRODUCT_CAMPAIGN_BANNER after PRODUCT_TYPE_<product_type_id> handle
* This handle is handled on the banners.xml layout file that triggers the use of the Front.php frontend block
*
* Event: controller_action_layout_load_before
*
* @param Varien_Event_Observer $observer
*/
public function addAttributeSetHandle(Varien_Event_Observer $observer) {
$product = Mage::registry('current_product');
if (!($product instanceof Mage_Catalog_Model_Product)) return;
....
....
}
To jest mój plik układu:
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<default>
<reference name="content">
<block type="banners/front" name="banners.front" as="banners_front" template="banners/product.phtml" before="-"/>
</reference>
</default>
</layout>
Wcześniej miałem nieco inny, w którym zamiast <default></default>
miałem <Product_Campaign_Banner></Product_Campaign_Banner>
. To też działało.
Mój plik product.phtml:
<div class="visual">
<?php echo $this->showCampaign(); ?>
</div>
product.phtml
Plik nie jest załadowany, a zatem showCampaign
nie jest stracony i nie ma gdzie wszystkie potrzebne HTML jest tworzony.
Odpowiedzi:
Możesz rejestrować skompilowane dyrektywy XML układu, które są używane do generowania bloków. Utwórz obserwatora
controller_action_layout_generate_blocks_before
, a następnie w metodzie obserwatora zaloguj aktualizację XML z transportowanego obiektu układu:Dane wyjściowe będą podobne do:
źródło
controller_action_layout_generate_blocks_before
” - To jest pytanie M1.Możesz pobrać wszystkie uchwyty układu w kontrolerze, wykonując następujące czynności:
Lub w dowolnym miejscu (o ile układ został zainicjowany) przy użyciu tego:
Być może pomoże ci to w debugowaniu.
EDYTOWAĆ
Czy ustawiłeś config.xml, aby określał klasę bloków?
źródło
core/template
? Ma to na celu anulowanie błędów w ustawieniach modułu.Korzystam z PhpStorm z Magicento, więc pomyślałem, że dostosuję @benmarks świetną odpowiedź na moje użycie.
W PhpStorm otwórz
app/code/core/Mage/Core/Controller/Varien/Action.php
i umieść punkt przerwania w metodziegenerateLayoutBlocks()
. Myślę, że chodzi o to, aby wstawić go gdziekolwiek wcześniej$this->getLayout()->generateBlocks();
. Umieściłem go w poprzedniej linii.Po wstawieniu punktu przerwania, oznaczonego czerwoną kropką po lewej stronie numeru linii, możesz kliknąć go prawym przyciskiem myszy, aby dostosować zachowanie. Kliknij „Więcej” u dołu, aby otworzyć wszystkie opcje.
Kiedy to otworzysz, zaznacz pole „Loguj wiadomość do konsoli” (opcjonalnie) i „Loguj wyrażone wyrażenie” (tam, gdzie dzieje się magia). Następnie skopiuj wklej tę adaptację kodu Benmarka do pola tekstowego. Jedyne, co zmieniłem, to wypisywanie
$request
zmiennej jak zaMage::app()->getRequest()
każdym razem i zmieniłem$o
zmienną na$this
(b / c nie jesteśmy tutaj w kontekście obserwatora).Teraz wygląda to tak:
Po uruchomieniu programu (przy użyciu debugera xdebug lub Zend) zatrzymasz się w punkcie przerwania i zobaczysz to w dzienniku:
Wydaje się, że istnieje limit rozmiaru wpisów dziennika, który może być określony przez
idea.cycle.buffer.size
właściwośćidea.properties
pliku PhpStorm, zgodnie z tym . Możesz to zmienić lub po prostu kliknij prawym przyciskiem myszy okno kodu i wybierz z menu rozwijanego opcję „Oceń wyrażenie”, a następnie skopiuj i wklej kod, aby tam wykonać, a otrzymasz pełne wyjście.W wyskakującym okienku „Oceń wyrażenie” możesz kliknąć wynik prawym przyciskiem myszy (Windows) i wybrać „Kopiuj wartość”, aby uzyskać cały wynik i wkleić go w innym miejscu do analizy.
źródło
Używamy rozszerzenia Commerce Bug Alana Storma i uważamy , że jest ono niezbędne do debugowania różnych rzeczy w Magento, w tym problemów z układem. W przypadku układów możesz zobaczyć, które uchwyty układu są aktywne na każdej stronie i jakie konfiguracje XML układu są stosowane na stronie.
To nie jest darmowe, ale zaoszczędzi dużo czasu na debugowanie tego rodzaju rzeczy.
Uwaga: w żaden sposób nie jestem związany z Alan Storm ani Commerce Bug, tylko zadowolony klient.
źródło
Thanx Ben Marks! To jest moja wersja rejestratora układu XML, który opisałeś.
Jest to bardzo długi plik, więc utworzyłem z niego XML ... :-) Możesz otworzyć za pomocą normalnego edytora ....
A mój config.xml wygląda tak w węźle:
Mam nadzieję, że mój projektant to wszystko wyjaśni ... \ o /
źródło
Możesz dodać to do akcji kontrolera. Pokaże uchwyty w bardziej schludny sposób niż var_dump.
źródło