看起来您使用了错误的布局句柄,尽管很容易看出为什么人们会被这个绊倒。
如果我使用 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
,然后将您的内容添加到传入的响应对象中