0

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

本质上,在管理面板中,当用户单击目录-> 类别-> 管理类别时,这就是显示的 URL。在我自己的模块中,我尝试使用以下更新锁定此控制器操作:

<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 在此 url 提供的 LayoutViewer 模块:“ http://alanstorm.com/layouts_blocks_and_templates ”。在使用这个工具时,结果发现没有手柄,这怎么可能?

4

1 回答 1

1

看起来您使用了错误的布局句柄,尽管很容易看出为什么人们会被这个绊倒。

如果我使用 Commerce Bug 查看该页面的布局句柄(自我链接,Commerce Bug 是我创建和销售的商业调试扩展),我会看到以下内容

在此处输入图像描述

所以这admin_catalog_category_edit不是admin_catalog_category_index.

为什么edit而不是index?如果我使用Commerce Bug 的请求选项卡来查找控制器文件

在此处输入图像描述

然后看索引动作方法。

#File: app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php
public function indexAction()
{
    $this->_forward('edit');
}

啊哈!该indexAction方法转发到edit操作。当您在 Magento 中转发请求时,您是在说

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

假设您的 Layout 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>

View -> Developer -> View Source页面源代码(在 Chrome 中)中呈现了文本“这是一个测试” 。但是,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,然后将您的内容添加到传入的响应对象中

于 2013-04-03T16:45:34.067 回答