Magento目录类别布局xml句柄?

时间:2013-04-03 16:19:11

标签: php magento magento-layout-xml

所以我遇到了一个奇怪的问题。我正在尝试通过锁定到与此URL对应的控制器操作的句柄来进行布局更新:“... / index.php / admin / catalog_category / index /".

基本上,在管理面板中,当用户点击“目录” - >“类别” - >“管理类别”时,这就是显示的网址。在我自己的模块中,我试图使用以下更新来锁定此控制器操作:

<layout>
    <admin_catalog_category_index>
        <reference name="content">
            <block type="categorysearch/adminhtml_categorysearch_search" name="categorysearch" />
        </reference>
    </admin_catalog_category_index>
</layout>

我不确定为什么这不能正常工作。我在弄清楚为什么没有添加我的块时遇到了很多麻烦。

感谢您提供任何帮助!

修改 另外,我忘了提到在我的块的构造函数中,我只是回应“到达这里”并杀死应用程序。我已经使用其他句柄和控制器操作测试了块,以确认块正确加载。我还在我正在使用的xml文件中放置了其他句柄,以确保正在加载xml文件。

更新 我尝试在此网址使用由alanstorm提供的LayoutViewer模块:“http://alanstorm.com/layouts_blocks_and_templates”。在使用这个工具时,事实证明没有句柄,这怎么可能?

1 个答案:

答案 0 :(得分:1)

看起来你正在使用错误的布局句柄,虽然很容易看出为什么人们会被这个绊倒。

如果我use Commerce Bug to view the layout handles(自我链接,Commerce Bug是我创建和销售的商业调试扩展程序),我会看到以下内容

enter image description here

这是admin_catalog_category_edit而不是admin_catalog_category_index

为什么edit代替index?如果我使用Commerce Bug's请求选项卡查找控制器文件

enter image description here

然后查看索引操作方法。

#File: app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php
public function indexAction()
{
    $this->_forward('edit');
}
啊哈哈! indexAction方法转发到edit操作。当你在Magento转发请求时,你说的是

  

Hey Magento,让我们假装请求使用操作方法而不是实际操作方法,不用执行HTTP重定向。

假设您的布局XML位于正确的文件中,请将admin_catalog_category_index句柄更改为admin_catalog_category_edit,您就可以开始使用了。

更新:当然,假设您不想更新内容块 类别编辑页面的另一个问题是,当页面加载时,它用AJAX请求替换其内容区域。当我将以下内容添加到local.xml

<layout>
    <admin_catalog_category_index>
        <reference name="content">
            <!-- <block type="categorysearch/adminhtml_categorysearch_search" name="categorysearch" /> -->
            <block type="core/text" name="WednesdayApril32013">
                <action method="setText">
                    <text>This is a test</text>
                </action>
            </block>
        </reference>
    </admin_catalog_category_index>
</layout>

文本“这是一个测试”在页面源(Chrome中的View -> Developer -> View Source)中呈现。但是,Magento会立即向这样的URL

发出后台ajax请求
http://store.example.com/index.php/admin/catalog_category/edit/key/c184cfd77dcf298659d1cb3a31c51852/section/general/?isAjax=true

并替换内容部分。如果我们再看一下控制器

    #File: app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php
    if ($this->getRequest()->getQuery('isAjax')) {
        // prepare breadcrumbs of selected category, if any
        $breadcrumbsPath = $category->getPath();
        if (empty($breadcrumbsPath)) {
            // but if no category, and it is deleted - prepare breadcrumbs from path, saved in session
            $breadcrumbsPath = Mage::getSingleton('admin/session')->getDeletedPath(true);
            if (!empty($breadcrumbsPath)) {
                $breadcrumbsPath = explode('/', $breadcrumbsPath);
                // no need to get parent breadcrumbs if deleting category level 1
                if (count($breadcrumbsPath) <= 1) {
                    $breadcrumbsPath = '';
                }
                else {
                    array_pop($breadcrumbsPath);
                    $breadcrumbsPath = implode('/', $breadcrumbsPath);
                }
            }
        }

        Mage::getSingleton('admin/session')
            ->setLastViewedStore($this->getRequest()->getParam('store'));
        Mage::getSingleton('admin/session')
            ->setLastEditedCategory($category->getId());
    //            $this->_initLayoutMessages('adminhtml/session');
        $this->loadLayout();

        $eventResponse = new Varien_Object(array(
            'content' => $this->getLayout()->getBlock('category.edit')->getFormHtml()
                . $this->getLayout()->getBlock('category.tree')
                ->getBreadcrumbsJavascript($breadcrumbsPath, 'editingCategoryBreadcrumbs'),
            'messages' => $this->getLayout()->getMessagesBlock()->getGroupedHtml(),
        ));

        Mage::dispatchEvent('category_prepare_ajax_response', array(
            'response' => $eventResponse,
            'controller' => $this
        ));

        $this->getResponse()->setBody(
            Mage::helper('core')->jsonEncode($eventResponse->getData())
        );

        return;
    }

我们可以在正常的布局渲染流程之外处理这个ajax请求。

因此,利用这些额外的知识,我将为category_prepare_ajax_response创建一个事件监听器,然后将您的内容添加到传入的响应对象中