Макет каталога категорий Mageneto XML-дескриптор?
Так что я сталкиваюсь со странной проблемой. Я пытаюсь сделать обновление макета, фиксируя дескриптор для действия контроллера, которое соответствует этому 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 загружается.
Обновление Я попытался использовать модуль LayoutViewer, предоставляемый alanstorm по этому адресу: " http://alanstorm.com/layouts_blocks_and_templates". При использовании этого инструмента оказывается, что никаких ручек нет, как это возможно?
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
в хроме). Тем не менее, Magento немедленно делает фоновый AJAX-запрос к 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
и затем добавьте свой контент к объекту ответа, который передается в