Недопустимый тип блока модуля 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 пространство_модуля
Любая помощь будет большой, спасибо.
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>
...
В некоторых случаях (Magento 1.9), если мы забыли использовать функцию построения в файле PHP блока, то поместите ее, и проблема будет исправлена:
protected function _construct()
{
parent::_construct();
}