Недопустимый тип блока модуля Magento


Я создал модуль, в котором пытаюсь создать новый фильтр слоя категорий Magento. Я работаю в области "код/локально", потому что я переопределил некоторые основные файлы. Все было в порядке, пока я не попытался добавить новый блок просмотра слоя каталога.

Допустим, у меня есть такая структура:

Core/local/Mynamespace/Mymodule/etc/config.xml

Здесь я определил путь к модулю для контроллеров, блоков, моделей и помощники

..

<config>
    ...
    <global>
        <blocks>
            <Mynamespace_Mymodule>
                <class>Mynamespace_Mymodule_Block</class>
            </Mynamespace_Mymodule>
        </blocks>
    ...

Итак, блоки хорошо сконфигурированы.

В папке: ядро/локальное/Mynamespace/Mymodule/Блок У меня есть:

Core/local/Mynamespace/Mymodule/Block/Catalog/Layer/View.php

И

Core/local/Mynamespace/Mymodule/Block/Catalog/Layer/Newtype.php

В View.php содержит:

    class Mynamespace_Mymodule_Block_Catalog_Layer_View extends Mage_Catalog_Block_Layer_View
{

    protected $_newtypeBlockName;

        protected function _initBlocks()
        {
            parent::_initBlocks();

            $this->_newtypeBlockName = "mynamespace_mymodule/catalog_layer_filter_newtype;
        }


    protected function _prepareLayout()
        {
            $newtypeBlock = $this->getLayout()->createBlock($this->_newtypeBlockName)
                    ->setLayer($this->getLayer())
                    ->init();

            $this->setChild('newtype_filter', $newtypeBlock);

            return parent::_prepareLayout();
        }

В функции _prepareLayout я получаю ошибку в этом блоке кода, где я использую функция "setLayer":

функция "setLayer":

$newtypeBlock = $this->getLayout()->createBlock($this->_newtypeBlockName)
                    ->setLayer($this->getLayer())
                    ->init();

Я отладил ошибку, и сообщение выглядит так:

Invalid block type: Mage_Mynamespace_Mymodule_Block_Catalog_Layer_View

Ошибка исходит из класса: mage_core_model_layout, точнее, из этой функции:

public function createBlock($type, $name='', array $attributes = array())
    {
        try {
            $block = $this->_getBlockInstance($type, $attributes);
        } catch (Exception $e) {
            var_dump($e);die(" - FROM HERE COMES THE ERROR");
            Mage::logException($e);
            return false;
        }

        if (empty($name) || '.'===$name{0}) {
            $block->setIsAnonymous(true);
            if (!empty($name)) {
                $block->setAnonSuffix(substr($name, 1));
            }
            $name = 'ANONYMOUS_'.sizeof($this->_blocks);
        } elseif (isset($this->_blocks[$name]) && Mage::getIsDeveloperMode()) {
            //Mage::throwException(Mage::helper('core')->__('Block with name "%s" already exists', $name));
        }
         ..

Вы можете видеть, что я отредактировал эту функцию и использовал var_dump для отображения ошибки.

Эта функция также вызывает эту функцию:

protected function _getBlockInstance($block, array $attributes=array())
    {
        if (is_string($block)) {
            if (strpos($block, '/')!==false) {
                if (!$block = Mage::getConfig()->getBlockClassName($block)) {
                    Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $block));
                }
            }
            if (class_exists($block, false) || mageFindClassFile($block)) {
                $block = new $block($attributes);
            }
        }
        if (!$block instanceof Mage_Core_Block_Abstract) {
            Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $block));
        }
        return $block;
    }

И в этой строке создается исключение: if (!$block instanceof Mage_Core_Block_Abstract) {

В моем случае тип $block - это Mage_Core_Block_Template (который расширяет класс mage_core_block_abstract, но все равно не помогает мне).

У меня также есть файл xml-макета интерфейса, из которого я загружаю блок:

<catalog_category_layered>
    <reference name="left_first">
        <reference name="catalog.leftnav">
            <action method="setTemplate">
                <template>Mynamespace/Mymodule/catalog/layer/view.phtml</template>
            </action>
        </reference>
        <block type="mynamespace_mymodule/catalog_layer_view" name="mynamespace_mymodule.catalog.leftnav" after="currency" template="Mynamespace/Mymodule/catalog/layer/view.phtml"/>
    </reference>
</catalog_category_layered>

При создании своего модуля я следовал этому http://www.techytalk.info/create-custom-layered-navigation-filter-magento / учебное пособие. Есть идеи, почему я получаю ошибку, о которой упоминал раньше?

Ошибка была: Недопустимый тип блока: Mage_Mynamespace_Mymodule_Block_Catalog_Layer_View пространство_модуля

Любая помощь будет большой, спасибо.

Author: Pascut, 2015-07-07

2 answers

Вы должны вызвать все block types по префиксу блока mynamespace_mymodule

Но вы должны определить это как Mynamespace_Mymodule

 <blocks>
            <Mynamespace_Mymodule> <!-- call as block prefix -->
                <class>Mynamespace_Mymodule_Block</class>
            </Mynamespace_Mymodule>
        </blocks>

Вам необходимо изменить префикс блока Mynamespace_Mymodule на mynamespace_mymodule

<config>
    ...
    <global>
        <blocks>
            <mynamespace_mymodule>
                <class>Mynamespace_Mymodule_Block</class>
            </mynamespace_mymodule>
        </blocks>
    ...
 1
Author: Amit Bera, 2015-07-07 13:57:44

В некоторых случаях (Magento 1.9), если мы забыли использовать функцию построения в файле PHP блока, то поместите ее, и проблема будет исправлена:

 protected function _construct()
    {
        parent::_construct();
    }
 0
Author: ADSingh, 2018-02-27 12:49:14