Макет каталога категорий 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и затем добавьте свой контент к объекту ответа, который передается в

Другие вопросы по тегам