Magento新的自定义块模块


12

我正在使用Magento 1.8.1.0版本

我正在尝试创建一个新的自定义块模块,该模块将用于创建新的主页。

  • 命名空间:十字军
  • 模块:CLHomePage
  • 街区类型:十字军东征
  • 类:Qwerty(仅在测试时才适用)
  • 设计包:十字军
  • 主题:默认

这是我到目前为止所拥有的:

\ app \ etc \ modules \ Crusader_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_CLHomePage>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_CLHomePage>
    </modules>
</config>

\ app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_CLHomePage>
            <version>0.0.1</version>
        </Crusader_CLHomePage>
    </modules>
    <global>
        <blocks>
            <crusaderhome>
                <class>Crusader_CLHomePage_Block</class>
            </crusaderhome>
        </blocks>
    </global>
</config>

\ app \ code \ local \ Crusader \ CLHomePage \ Block \ Qwerty.php

<?php
class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="core/template" name="homepage" template="crusader/home.phtml">
                <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
            </block>
        </reference>
    </cms_index_index>
</layout>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ home.phtml

<div id="home">
<p>Home Wrapper</p>
<?php echo $this->getChildHtml('homeads'); ?>
</div>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ homeads.phtml

<p>Adverts</p>

现在,有了上述内容,我的主页上仅显示“ Home Wrapper”,因此home.phtml显示了的内容,但不显示的内容homeads.phtml

如果我改变了块类型homeadscore/template,它的工作原理,我看到两个“家包装”和“广告”。因此,我知道问题出在我的新方块类型(称为十字军东征)上。

我在这里做错什么了?

编辑

经过回答的建议后,我已经如下更新了一些文件,但仍然无法正常工作:

\ app \ etc \ modules \ Crusader_Home.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_Home>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_Home>
    </modules>
</config>

\ app \ code \ local \ Crusader \ Home \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_Home>
            <version>1.0.0</version>
        </Crusader_Home>
    </modules>
    <global>
        <blocks>
            <crusader_home>
                <class>Crusader_Home_Block</class>
            </crusader_home>
        </blocks>
    </global>
</config>

\ app \ code \ local \ Crusader \ Home \ Block \ Qwerty.php

<?php
class Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml(简化为仅使用一个块,而不是我之前尝试过的嵌套块)

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="crusader_home/qwerty" name="homepage" template="crusader/home.phtml" />
        </reference>
    </cms_index_index>
</layout>

\ app \ design \ frontend \ crusader \ default \ template \ crusader \ home.phtml

<p>Home</p>

所以我仍然没有任何表现。

在@FabianBlechschmidt提示后,我打开了日志,并在exception.log中显示:

2014-04-09T14:04:54+00:00 ERR (3): 
exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty' in W:\stores\magento-dev\app\Mage.php:595
Stack trace:
#0 W:\stores\magento-dev\includes\src\__default.php(27744): Mage::throwException('Invalid block t...')
#1 W:\stores\magento-dev\includes\src\__default.php(27686): Mage_Core_Model_Layout->_getBlockInstance('crusader_home/q...', Array)
#2 W:\stores\magento-dev\includes\src\__default.php(27721): Mage_Core_Model_Layout->createBlock('crusader_home/q...', 'homepage')
#3 W:\stores\magento-dev\includes\src\__default.php(27488): Mage_Core_Model_Layout->addBlock('crusader_home/q...', 'homepage')
#4 W:\stores\magento-dev\includes\src\__default.php(27454): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
#5 W:\stores\magento-dev\includes\src\__default.php(27459): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element))
#6 W:\stores\magento-dev\includes\src\__default.php(13895): Mage_Core_Model_Layout->generateBlocks()
#7 W:\stores\magento-dev\includes\src\__default.php(11274): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#8 W:\stores\magento-dev\includes\src\__default.php(11213): Mage_Cms_Helper_Page->_renderPage(Object(Mage_Cms_IndexController), 'home')
#9 W:\stores\magento-dev\app\code\core\Mage\Cms\controllers\IndexController.php(45): Mage_Cms_Helper_Page->renderPage(Object(Mage_Cms_IndexController), 'home')
#10 W:\stores\magento-dev\includes\src\__default.php(13969): Mage_Cms_IndexController->indexAction()
#11 W:\stores\magento-dev\includes\src\__default.php(18331): Mage_Core_Controller_Varien_Action->dispatch('index')
#12 W:\stores\magento-dev\includes\src\__default.php(17865): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#13 W:\stores\magento-dev\includes\src\__default.php(20465): Mage_Core_Controller_Varien_Front->dispatch()
#14 W:\stores\magento-dev\app\Mage.php(684): Mage_Core_Model_App->run(Array)
#15 W:\stores\magento-dev\index.php(176): Mage::run('crusadergifts', 'store')
#16 {main}

有什么想法吗?。??

编辑2

@Malachy找到了答案...是编译器。我禁用了编译器,它现在似乎可以工作了。


我假设您在某处有错字,请检查文件名的大写/小写。文件看起来不错。您是否清理了配置缓存?
Fabian Blechschmidt 2014年

@FabianBlechschmidt我已经检查了我的大写/小写的代码和文件名-对我来说还可以。以上所有内容均从我的文件中粘贴。目前我已关闭所有缓存,并且我刚刚清除了所有缓存并再次尝试-仍然无法正常工作。
斯蒂芬

您检查了system.log和exception.log吗?如果其中没有任何内容,我将在MAge_Core_Model_Config-> getGroupedClassName()中开始调试。除此之外:请查看出色的调试教程并进行报告。
Fabian Blechschmidt 2014年

我以前没有使用过日志。我现在启用了它们,exception.log显示:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
Stephen

我已经根据此处的其他答案更新了模块名称,因此得到了块类型名称(CLHomePage-> Home)。
斯蒂芬

Answers:


11

我发现整个XML事情都很困难,因此我对您的事业表示同情。

在我看来,您的类名和块XML不一致

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

    <block type="core/template" name="homepage" template="crusader/home.phtml">
        <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

让我们从块类型开始,然后向后工作。我想在这里我希望看到类似

<block type="crusader_home/qwerty" ...

然后该类型会将Magento推荐给该类

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

继续在此方法上继续进行工作,需要将文件app \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml修改为类似

<global>
    <blocks>
        <crusader_home>
            <class>Crusader_Home_Block</class>
        </crusader_home>
    </blocks>
</global>

它将Magento指向所有以'Crusader_Home_Block_ *'开始的类。现在我认为您需要重命名模块Crusader_Home而不是Crusader_CLHomePage并相应地更改文件夹名称...

AND /但我强烈建议您更改模块名称。在模块名称的开头只能使用一个大写字母,而不能在模块名称的开头使用三个大写字母。

您可能需要研究一些可用于生成模块的工具。我发现它们对于避免键入错误非常有用。我在MGT Commerce的非常聪明的人那里使用了这一代码(它很简单),而这是Silk Software的无所不包和令人惊讶的编码

***编辑以下评论

另外根据错误日志,我认为问题是Magento找不到您的类文件。因此,请仔细检查是否刷新或关闭了缓存,尤其是XML缓存,并且已关闭或重新启用编译器


谢谢,我已经尝试过您的建议。我已将模块重命名为“ Home”,并更新了所有引用和文件夹。仍然不起作用。我将编辑问题以显示更改。
斯蒂芬2014年

1
当然看起来更好。我想知道在某个地方是否仍然存在偷偷摸摸的键入错误。根据错误日志,我认为问题是Magento找不到您的类文件。因此,请仔细检查缓存是否已刷新或已关闭。XML缓存,编译器已关闭或重新启用。这不会是文件权限问题吗?
Malachy 2014年

1
您提到了神奇的词-Complier ...我禁用了Complier,它现在似乎可以工作了。谢谢!如果您将此添加为答案,我会为您接受!:-)
斯蒂芬

实际上,不仅仅是编译器。您的原始XML <block type="crusaderhome/qwerty"不正确。解决方案是:a)更正XML b)重新编译
Malachy 2014年

-1

首先回答您的问题

    <block type="core/template" name="homepage" template="crusader/home.phtml">
       <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

应该替换为

<block type="core/template" name="homepage" template="crusader/home.phtml"></block>
<block type="crusaderhome/qwerty" name="homeads" as="homeads" 
template="crusader/homeads.phtml" />

因为homeads不是主页的子级。我认为这会起作用。


谢谢!我以前没有运气尝试过。当块类型是核心/模板(而不是我的自定义块类型)时,父/子工作正常,所以我的问题不是块放置。
斯蒂芬2014年

-1

我遇到了同样的问题,并通过替换config.xml中的以下代码解决了它

<global>
    <blocks>
        <crusaderhome>
            <class>Crusader_CLHomePage_Block</class>
        </crusaderhome>
    </blocks>
</global>

对此

<global>
    <blocks>
        <crusader_clhomepage>
            <class>Crusader_CLHomePage_Block</class>
        </crusader_clhomepage>
    </blocks>
</global>

它应该解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.