所以我遇到了一个奇怪的问题。我正在尝试通过锁定到与此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”。在使用这个工具时,事实证明没有句柄,这怎么可能?
答案 0 :(得分:1)
看起来你正在使用错误的布局句柄,虽然很容易看出为什么人们会被这个绊倒。
如果我use Commerce Bug to view the layout handles(自我链接,Commerce Bug是我创建和销售的商业调试扩展程序),我会看到以下内容
这是admin_catalog_category_edit
而不是admin_catalog_category_index
。
为什么edit
代替index
?如果我使用Commerce Bug's请求选项卡查找控制器文件
然后查看索引操作方法。
#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
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
创建一个事件监听器,然后将您的内容添加到传入的响应对象中