Gỡ lỗi bố trí tải XML


36

TL; DR: có cách nào để tôi có thể gỡ lỗi tải bố cục không? Vì tôi tin rằng bố cục của một mô-đun là xung đột với nhau.

Liên quan đến câu hỏi trước tôi đã thực hiện: Cách tạo bố cục mô-đun để hiển thị trên tất cả các chủ đề

Tôi đã tải thành công mô-đun của mình trên môi trường thử nghiệm cục bộ (còn gọi là PC phát triển của tôi), đã thử nghiệm chuyển đổi giữa 3 chủ đề khác nhau và nó vẫn ổn. Sau đó, tôi đã cập nhật mô-đun trên môi trường thử nghiệm hoặc "tiền sản xuất" mà chúng tôi có, nơi có rất nhiều mô-đun khác nhau, một số mô-đun độc quyền khác do chúng tôi tạo ra. Trên môi trường này, mô-đun không hiển thị những gì cần thiết trên frontpage sản phẩm. Sau một số thử nghiệm, cuối cùng tôi đã đi đến kết luận rằng vấn đề nên nằm ở quá trình tải bố cục.

Vì vậy, có cách nào để tôi có thể gỡ lỗi tải bố cục, làm thế nào các mô-đun khác nhau thay thế hoặc thêm các khối riêng của chúng? Quan điểm của tôi là tôi tin rằng có ít nhất một mô-đun nên xung đột với tôi. Và vì chúng ta có rất nhiều mô-đun, tôi đang tìm kiếm một cách tiếp cận khác nhau để vô hiệu hóa từng mô-đun và xem đó là mô-đun có vấn đề.

Tệp cấu hình của tôi là:

<?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>

Tệp quan sát của tôi:

<?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;
      ....
      ....
}

Đây là tập tin bố trí của tôi:

<?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>

Trước đây có một chút khác nhau thay vì <default></default>tôi có <Product_Campaign_Banner></Product_Campaign_Banner>. Nó cũng làm việc.

Tập tin sản phẩm của tôi.

<div class="visual">
    <?php echo $this->showCampaign(); ?>
</div>

Các product.phtmltập tin không được tải và do đó showCampaignkhông được thực hiện và có nơi tất cả các HTML cần thiết được tạo ra.


2
Điều tốt nhất sẽ là có env địa phương càng nhiều càng tốt như env tiền sản xuất
Fra

Đó là những gì tôi đang làm ngay bây giờ, nhưng không dễ, chúng tôi có hơn 20 mô-đun của bên thứ ba và thậm chí một số trong số họ không hoạt động trên môi trường tiền sản xuất và (các) nhà phát triển của họ đang kiểm tra mã.
Yaroslav

4
Tôi rất tò mò muốn biết lý do đằng sau câu hỏi này được gắn cờ vì đóng cửa vì quá cục bộ. Câu hỏi nói về gỡ lỗi bố cục chung, mà nếu bạn chưa thực hiện, thì khá hữu ích và có tính ứng dụng rộng rãi.
đánh dấu

Tôi cũng tò mò. Nhưng tôi nghĩ có thể là kết quả là sau vài lần chỉnh sửa cho người khác dường như tôi chỉ đang cố gắng giải quyết vấn đề rất cục bộ của chính mình. Và thực sự là tôi, nhưng đồng thời tôi vẫn hy vọng rằng bằng cách gỡ lỗi quá trình tạo bố cục, tôi sẽ có thể tìm thấy lỗi của mình nằm ở đâu. Do đó, giải pháp sẽ hữu ích cho những người khác.
Yaroslav

Câu trả lời:


55

Bạn có thể đăng nhập các chỉ thị XML bố trí được biên dịch được sử dụng để tạo các khối. Tạo một người quan sát controller_action_layout_generate_blocks_beforevà trong phương thức người quan sát ghi nhật ký XML cập nhật từ đối tượng bố trí được vận chuyển:

public function logCompiledLayout($o)
{
    $req  = Mage::app()->getRequest();
    $info = sprintf(
        "\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",
        $req->getRouteName(),
        $req->getRequestedRouteName(),      //full action name 1/3
        $req->getRequestedControllerName(), //full action name 2/3
        $req->getRequestedActionName(),     //full action name 3/3
        implode("\n\t",$o->getLayout()->getUpdate()->getHandles()),
        $o->getLayout()->getUpdate()->asString()
    );

    // Force logging to var/log/layout.log
    Mage::log($info, Zend_Log::INFO, 'layout.log', true);
}

Đầu ra sẽ tương tự như:

2013-01-23T16:24:26+00:00 INFO (6): 
Request: cms
Full Action Name: cms_index_index
Handles:
    default
    cms_page
    STORE_default
    THEME_frontend_default_default
    cms_index_index
    page_two_columns_right
    customer_logged_out
Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<!-- ... ->

Có vẻ hữu ích, sẽ dùng thử vào ngày mai vào giờ đầu tiên
Yaroslav

Câu trả lời của bạn là đúng, chỉ là những gì tôi đang tìm kiếm. Nhật ký đã tạo xuất ra tất cả các thẻ điều khiển, yêu cầu, v.v. khi tải trang. Tôi đã xác nhận rằng tay cầm của tôi được tải chính xác vào mảng tay cầm chính nhưng vì một số lý do, khối tương ứng không được tải / hiển thị.
Yar Tư

1
điều đó sẽ dễ dàng hơn để khắc phục sự cố bây giờ bố cục đã được loại trừ :-).
đánh dấu

Tôi giả sử rằng bạn đang đặt cái này trong tệp Action.php? Ngoài ra, làm thế nào điều này được gọi bởi magento?
Thủ đô

"Tạo người quan sát trên controller_action_layout_generate_blocks_before" - Đây là một câu hỏi M1.
đánh dấu

23

Bạn có thể truy xuất tất cả các điều khiển bố trí trong bộ điều khiển của mình bằng cách thực hiện việc này:

var_dump($this->getLayout()->getUpdate()->getHandles());

Hoặc bất cứ nơi nào (miễn là bố cục đã được khởi tạo) bằng cách sử dụng:

var_dump(Mage::app()->getLayout()->getUpdate()->getHandles());

Có lẽ điều đó sẽ giúp bạn gỡ lỗi.

CHỈNH SỬA

Bạn đã thiết lập tệp config.xml của mình để chỉ định lớp khối chưa?

    <blocks>
        <banners>
            <class>My_Banners_Block</class>
        </banners>
    </blocks>

Cả hai thử nghiệm, xử lý của tôi được thêm chính xác vào phương pháp quan sát nhưng sau đó bố trí không được tải. Tôi sẽ cập nhật câu hỏi của tôi với một số mã, có thể nó sẽ giúp.
Yar Tư

@ Nam Tư đã cập nhật câu trả lời của tôi
Rick Kuipers

Vâng, tôi có điều đó trên cấu hình, sẽ cập nhật câu hỏi của tôi.
Yar Tư

@ Nam Tư Bạn có thể kiểm tra xem sản phẩm.phtml có được tải khi thay đổi loại khối core/templatekhông? Đây chỉ là để loại bỏ các lỗi trong cài đặt mô-đun của bạn.
Rick Kuipers

1
@ Nam Tư có vẻ như vấn đề này hơi quá phổ biến và khó gỡ lỗi ở đây trên stackexchange. Nó không rõ ràng cho tôi những gì có thể gây ra vấn đề.
Rick Kuipers

12

Tôi đang sử dụng PhpStorm với Magicento và vì vậy tôi nghĩ rằng tôi sẽ điều chỉnh @benmark câu trả lời tuyệt vời cho việc sử dụng của mình.

Trong PhpStorm, mở lên app/code/core/Mage/Core/Controller/Varien/Action.phpvà đặt một điểm dừng trong phương thức generateLayoutBlocks(). Tôi nghĩ rằng vấn đề là chèn nó bất cứ nơi nào trước $this->getLayout()->generateBlocks();. Tôi đặt nó trên dòng trước.

Sau khi bạn chèn điểm dừng, được biểu thị bằng dấu chấm màu đỏ ở bên trái theo số dòng, bạn có thể nhấp chuột phải vào nó để tùy chỉnh hành vi. Nhấp vào "Khác" ở dưới cùng để mở ra tất cả các tùy chọn. nhập mô tả hình ảnh ở đây

Khi bạn mở nó lên, bạn đánh dấu vào ô "Đăng nhập thông báo vào bảng điều khiển" (tùy chọn) và "Nhật ký biểu thức được đánh giá" (nơi phép màu xảy ra). Sau đó sao chép dán mã thích ứng này vào hộp văn bản. Điều duy nhất tôi đã thay đổi là đánh vần $requestbiến như Mage::app()->getRequest()mọi lần và thay đổi $obiến thành $this(b / c chúng ta không ở trong bối cảnh quan sát viên ở đây).

sprintf("\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",Mage::app()->getRequest()->getRouteName(),Mage::app()->getRequest()->getRequestedRouteName(),Mage::app()->getRequest()->getRequestedControllerName(),Mage::app()->getRequest()->getRequestedActionName(),implode("\n\t",$this->getLayout()->getUpdate()->getHandles()),$this->getLayout()->getUpdate()->asString())

Vì vậy, bây giờ nó trông như thế này: Hình ảnh hiển thị cài đặt điểm dừng nâng cao

Sau khi bạn chạy chương trình (sử dụng trình gỡ lỗi xdebug hoặc zend), bạn sẽ dừng ở điểm dừng và xem phần này trong nhật ký:

Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">
   <block type="page/html_head" name="head" as="head">
      <action method="addJs">
         <script>jquery/jquery-migrate-1.2.1.min.js</script>
      </action>
      <action method="addJs">
         <script>jquery/jquery-ui/jquery-ui.min.js</script>
      </action>
      <action method="addJs">
         <script>prototype/prototype.js</script>
      </action>
      <action method="addJs" ifconfig="dev/js/deprecation">
         <script>prototype/deprecation.js</script>
      </action>
      <action method="addJs">
         <script>lib/ccard.js</scrip

Dường như có giới hạn kích thước cho các mục nhật ký có thể được xác định bởi thuộc idea.cycle.buffer.sizetính trong idea.propertiestệp cho PhpStorm, theo điều này . Bạn có thể thay đổi điều đó, hoặc chỉ cần nhấp chuột phải vào cửa sổ mã và chọn "Đánh giá biểu thức" từ menu thả xuống, sao chép và dán mã để thực thi trong đó và bạn sẽ nhận được đầu ra đầy đủ.

Trong cửa sổ bật lên "Đánh giá biểu hiện", bạn có thể nhấp chuột phải (Windows) vào kết quả và chọn "Sao chép giá trị" để lấy toàn bộ đầu ra và dán vào nơi khác để phân tích.

PhpStorm - sao chép từ cửa sổ bật lên Đánh giá biểu hiện


5

Chúng tôi sử dụng tiện ích mở rộng Lỗi thương mại của Alan Storm và thấy nó không thể thiếu để gỡ lỗi nhiều thứ trong Magento, bao gồm các vấn đề về bố cục. Đối với bố cục, bạn có thể xem các thẻ điều khiển bố cục nào đang hoạt động trên mỗi trang và cấu hình xml bố cục nào đang được áp dụng cho trang.

Nó không miễn phí, nhưng sẽ tiết kiệm rất nhiều thời gian để gỡ lỗi những thứ này.

Lưu ý: Tôi không liên kết với Alan Storm hoặc Commerce Bug dưới bất kỳ hình thức nào, chỉ là một khách hàng hài lòng.


9
Tôi liên kết với Alan Storm (trong đó tôi là anh ấy) và chỉ muốn chỉ ra rằng Commerce Bug 2 cũng cung cấp cho bạn khả năng tạo sơ đồ biểu đồ có hướng của bố cục. alanstorm.com/find_magento_block_name
Alan Storm

Chúng tôi cũng là khách hàng hài lòng của lỗi thương mại Alan Storm. Nhưng trên hệ thống mà tôi gặp phải những vấn đề này thì nó không được cài đặt và chúng tôi không có đủ giấy phép cho tất cả các hệ thống thử nghiệm và tiền sản xuất. Và nhân tiện, @AlanStorm, hoy chúng ta có thể nhận được bản cập nhật cho Commerce Bug 2 không?
Yar Tư

1
@ Nam Tư Liên hệ với bộ phận hỗ trợ và chúng tôi sẽ giúp bạn sắp xếp các bản cập nhật và nâng cấp pulsestorm.net/contact-us
Alan Storm

3

Thanx Ben Marks! Đây là phiên bản trình ghi nhật ký bố trí xml của tôi.

Đó là một tệp rất dài vì vậy tôi đã tạo XML từ nó ... :-) Bạn có thể mở bằng một trình soạn thảo bình thường ....

    <?php

class Gn_Optimization_Model_Debug_Layout {
  public function logCompiledLayout($o) {
    $req = Mage::app()->getRequest();

    $routeName = $req->getRouteName();
    $fullname = $req->getRequestedRouteName() . '_' . $req->getRequestedControllerName() . '_' . $req->getRequestedActionName();

    $info = sprintf(
      "\nRequest: %s\nFull Action Name: %s\nHandles:\n\t%s\n",
      $routeName, $fullname, implode("\n\t", $o->getLayout()->getUpdate()->getHandles())
    );

    Mage::log($info, Zend_Log::DEBUG, 'debug.'.$routeName.'.layout.log', true);
    file_put_contents(Mage::getBaseDir('log').DS.'debug.'.$routeName.'.layout.xml',
                      '<?xml version="1.0" encoding="utf-8"?>'.PHP_EOL
                      .'<layout>'.PHP_EOL.
                      $o->getLayout()->getUpdate()->asString().
                      '</layout>');
  }
}

Và tệp config.xml của tôi trông như thế này trong nút:

<events>
  <controller_action_layout_generate_blocks_before>
    <observers>
      <gn_optimization_controller_action_layout_generate_blocks_before>
        <type>singleton</type>
        <class>gn_optimization/debug_layout</class>
        <method>logCompiledLayout</method>
      </gn_optimization_controller_action_layout_generate_blocks_before>
    </observers>
  </controller_action_layout_generate_blocks_before>
</events>

Bây giờ, tôi hy vọng nhà thiết kế của tôi có thể giải thích tất cả những điều này ... \ o /


0

Bạn có thể thêm điều này vào hành động điều khiển của bạn. Nó sẽ hiển thị các thẻ điều khiển theo cách gọn gàng hơn var_dump.

Zend_Debug::dump($this->getLayout()->getUpdate()->getHandles());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.