我正在运行Magento 1.7.0.2(在Ubuntu Linux 12.04 LTS上)。
我试图获得一部分Magento代码的灵感来自Alan Storm的No Frills Magento Layout第1.8节。首先,我认为该部分的Mage_Core_Template_Block应该读取Mage_Core_Block_Template。
但更重要的是,我对$ block = $ layout-> createBlock('foo_bar / hello')的调用返回false并在exception.log中抛出异常,因为它为foo添加了前缀,从而引用了一个名为Mage_Foo_Bar_Block_Hello的对象。不存在而不是返回Foo_Bar_Block_Hello类型的对象,这是我所追求的。以下是我的自定义文件和触发URL的内容:
触发错误的网址:
http:// localhost/magpractice/helloworld/index/layout/
/var/www/magpractice/app/code/local/Alanstormdotcom/Helloworld/controllers/IndexController.php
<?php
class Alanstormdotcom_Helloworld_IndexController extends Mage_Core_Controller_Front_Action {
function layoutAction() {
$layout = Mage::getSingleton('core/layout');
$block = $layout->createBlock('alanstormdotcom_helloworld/hello', 'root');
var_dump($block);
echo $block->toHtml();
}
}
?>
/var/www/magpractice/app/code/local/Alanstormdotcom/Helloworld/Block/Hello.php
<?php
class Alanstormdotcom_Helloworld_Block_Hello extends Mage_Core_Block_Template {
public function _construct() {
$this->setTemplate('helloworld.phtml');
return parent::_construct();
}
public function _beforeToHtml() {
$block_1 = new Mage_Core_Block_Text();
$block_1->setText('The first sentence.');
$this->setChild('the_first', $block_1);
}
public function fetchTitle() {
return 'Hello Fancy World!';
}
}
?>
/var/www/magpractice/app/code/local/Alanstormdotcom/Helloworld/etc/config.xml
<config>
<modules>
<Alanstormdotcom_Helloworld>
<version>0.1.0</version>
</Alanstormdotcom_Helloworld>
</modules>
<frontend>
<routers>
<helloworld>
<use>standard</use>
<args>
<module>Alanstormdotcom_Helloworld</module>
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
</frontend>
</config>
以下是/ var / www / magpractice / var / log:
的内容2013-06-11T12:42:56+00:00 ERR (3):
exception 'Mage_Core_Exception' with message 'Invalid block type: Mage_Alanstormdotcom_Helloworld_Block_Hello' in /var/www/magpractice/app/Mage.php:594
Stack trace:
#0 /var/www/magpractice/app/code/core/Mage/Core/Model/Layout.php(495): Mage::throwException('Invalid block t...')
#1 /var/www/magpractice/app/code/core/Mage/Core/Model/Layout.php(437): Mage_Core_Model_Layout->_getBlockInstance('alanstormdotcom...', Array)
#2 /var/www/magpractice/app/code/local/Alanstormdotcom/Helloworld/controllers/IndexController.php(38): Mage_Core_Model_Layout->createBlock('alanstormdotcom...', 'root')
#3 /var/www/magpractice/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Alanstormdotcom_Helloworld_IndexController->layoutAction()
#4 /var/www/magpractice/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('layout')
#5 /var/www/magpractice/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 /var/www/magpractice/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#7 /var/www/magpractice/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#8 /var/www/magpractice/index.php(88): Mage::run('', 'store')
#9 {main}
有人可以指出我在我的代码中出错的地方,或说明magento 1.7.0.2可能在alan storm nofrills magento布局文档(除此之外是一本优秀的书)中所描述的内容有所偏离吗?
感谢。
答案 0 :(得分:3)
您的config.xml
文件不完整。它应该是这样的:
<config>
<modules>
<Alanstormdotcom_Helloworld>
<version>0.1.0</version>
</Alanstormdotcom_Helloworld>
</modules>
<!-- Missing blocks and helpers definition here: -->
<global>
<blocks>
<helloworld>
<class>Alanstormdotcom_Helloworld_Block</class>
</helloworld>
</blocks>
<helpers>
<helloworld>
<class>Alanstormdotcom_Helloworld_Block</class>
</helloworld>
</helpers>
</global>
<frontend>
<routers>
<helloworld>
<use>standard</use>
<args>
<module>Alanstormdotcom_Helloworld</module>
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
</frontend>
</config>
答案 1 :(得分:3)
1.7.0.2中没有任何差异影响您的代码 - 您的config.xml
遗漏了<blocks/>
部分。
您正在实例化名为alanstormdotcom_helloworld/hello
的块。这是一个alanstormdotcom_helloworld
的群组名称,以及hello
的班级名称。
但是,您的模块没有blocks
配置部分。如果没有此部分,Magento不知道alanstormdotcom_helloworld
组中用于块的PHP类名称。由于它不知道,它假设您的块是Mage核心的一部分并且猜测一个名称(Mage_Alanstormdotcom_Helloworld_Block_Hello
)。
查看工作模块如何配置其<blocks/>
部分。这应该让你指出正确的方向。
不检查我的工作,您的配置应该看起来像这样
<config>
<!-- ... -->
<global>
<!-- ... -->
<blocks>
<alanstormdotcom_helloworld>
<class>Alanstormdotcom_Helloworld_Block</class>
</alanstormdotcom_helloworld>
</blocks>
</global>
</config>
如果您仍然遇到问题,请尝试将代码追溯到Magento从类别名(alanstormdotcom_helloworld/hello
)创建类名称的位置。除了解决yoru问题,对于新的Magento程序员来说,这总是一个很好的借口。