我正在尝试为Magento 1.9.1创建自己的模块。在我的模块中,我试图在CMS内容中调用一个块,如下所示:
{{block type="core/template" template="myNamespace/myModulOutput.phtml"}}
myModulOutput.phtml
模板包含来自我自己的控制器的集合:
class myNamespace_myModelname_Block extends Mage_Core_Block_Template
{
public function getCollection()
{
// some code
return $collection;
}
}
该模块似乎处于活动状态,并在此配置中显示在Magento后端:
<config>
<modules>
<myNamespace_myModulname>
<version>0.1.0</version>
</myNamespace_myModulname>
</modules>
<global>
<blocks>
<myNamespace_myModulname>
<class>myNamespace_myModulname_Block</class>
</myNamespace_myModulname>
</blocks>
</global>
</config>
块类在文件app/code/local/myNamespace/myModulname/Blocks/Index.php
中定义。
这是有效的配置吗?我在前端收到错误:Fatal error: Call to a member function getCollection() on a non-object
。
修改
来自@ b.enoit.be的解释我尝试了以下设置......它运行了; - )
应用的/ etc /模块/ Mynamespace_Mymodulname.xml:
<?xml version="1.0"?>
<config>
<modules>
<Mynamespace_Mymodulname>
<active>true</active>
<codePool>local</codePool>
<depends/>
</Mynamespace_Mymodulname>
</modules>
</config>
应用/代码/本地/ myNameSpace对象/ Mymodulname /砌块/ index.php的:
<?php
class Mynamespace_Mymodulname_Block_Index extends Mage_Core_Block_Template
{
public function getTest()
{
// some code
return "mymodul:test";
}
}
?>
应用/代码/本地/ myNameSpace对象/ Mymodulname的/ etc / config.xml中:
<?xml version="1.0"?>
<config>
<modules>
<Mynamespace_Mymodulname>
<version>0.1.0</version>
</Mynamespace_Mymodulname >
</modules>
<global>
<blocks>
<mynamespace_mymodulname>
<class>Mynamespace_Mymodulname_Block</class>
</mynamespace_mymodulname >
</blocks>
</global>
</config>
CMS-呼叫
{{block type="mynamespace_mymodulname/index" template="mynamespace/myoutput.phtml"}}
应用/设计/前端/ MyTheme的/默认/ myNameSpace对象/ myoutput.phtml:
<?php /** @var $this Mynamespace_Mymodulname_Block_Index */ ?>
<?php echo $this->getTest() ?>
非常感谢您提供如此详尽和有意义的解释: - )
答案 0 :(得分:3)
如果那些myNamespace_myModulname
确实是您实际代码中的内容,请先查看@fantasticrice answer
然后,如果我们考虑使用正确命名约定的代码(请参阅本文末尾的注释),要启动,这不是一个有效的块类:
class Mynamespace_Mymodulename_Block extends Mage_Core_Block_Template{ /* ... */ }
如果像以后说的那样,您的文件位于
app/code/local/Mynamespace/Mymodulename/Block/Index.php
然后有效的块类是
class Mynamespace_Mymodulename_Block_Index extends Mage_Core_Block_Template{ /* ... */ }
因为Magento中的类名应始终遵循与文件路径完全相同的体系结构(控制器除外,但我们根本没有使用您在此处提供的代码来讨论控制器)= &GT;
class Mynamespace_Mymodulename_Block_Index === Mynamespace/Mymodulename/Block/Index.php
(请参阅我如何用斜杠替换下划线并使用.php
扩展名对其进行后缀?)。
然后你真正想要的是你的观点mynamespace/mymoduleoutput.phtml
使用你自己的模块
为此,您必须为块指定正确的类型。
类型由config.xml中定义的句柄和块文件路径的组合定义。
为模块定义config.xml时,您必须注意某些部分是“fixed”,而某些部分是“handle”。 />
这意味着Magento预期某些部分的可能性有限,例如: frontend or adminhtml or global
,blocks, models, helpers, ... there is more here
,其中一些只是名称,用于为您的模块添加别名,并在Magento下调用它或处理它。
这里你在config.xml中说明了<global>
配置(对于前端和后端(= admin)的意思) - 已修复 - 你要添加到Magento的现有<blocks>
- 已修复的列表 - 模块的块将被 - 句柄引用 - {{ 1}} 然后会映射到所有类都以<mynamespace_mymodulename>
开头的文件。
这是您希望自己的模块块的类型的第一部分
对于Magento来说,Mynamespace_Mymodulename_Block
等同于mynamespace_mymodulename
然后你必须再次指出从Blocks到Magento的根文件夹的正确路径,它将与你的文件夹/文件架构完全相同:所以在你的情况下,只需Mynamespace_Mymodulename_Block
。
正如您现在可以理解的那样,Magento将查找文件index
中的类Mynamespace_Mymodulename_Block_Index
(句柄+'_'+指定块),如前所述。
但是,如果您的文件位于Mynamespace/Mymodulename/Block/Index.php
下,则会app/code/local/Mynamespace/Mymodulename/Block/Path/To/File.php
=&gt;班级path_to_file
,档案Mynamespace_Mymodulename_Block_Path_To_File
现在我们已经拥有了类型的第二部分,我们只需要用斜杠组合它们: Mynamespace/Mymodulename/Block/Path/To/File.php
所以你必须将你的cms中的电话改为:
mynamespace_mymodulename/index
希望有了这个,它会起作用。
注意1/3:正如 @fantasticrice 指出的那样,我还建议您遵循类的命名约定:
Zend Framework标准化了一个类命名约定 类的名称直接映射到它们所在的目录 存储。 (...)
类名只能包含字母数字字符。编号是 在类名中允许但在大多数情况下不鼓励。 仅允许下划线代替路径分隔符;该 filename“Zend / Db / Table.php”必须映射到类名 “的Zend_Db_Table”。
如果类名由多个单词组成,则为第一个字母 每个新单词必须大写。连续的大写字母 是不允许的,例如不允许使用“Zend_PDF”类 “Zend_Pdf”是可以接受的。
这些约定为Zend定义了伪命名空间机制 框架。 Zend Framework将采用PHP命名空间功能 变得可用,我们的开发人员可以使用它们 应用
有关示例,请参阅standard和extras库中的类名 这个类名约定。
来源:http://framework.zend.com/manual/1.12/en/coding-standard.naming-conventions.html
注意2/3:按照惯例再次,只有类将具有大写文件名/文件夹结构。因此,您的模板文件夹和文件根本不应该有资金。
注意3/3:在Magento中,根据惯例,我们不会在句柄中使用大写字母。
应用程序/代码/本地/ myNameSpace对象/ Mymodulename的/ etc / config.xml中
{{block type="mynamespace_mymodulename/index" template="mynamespace/mymoduleoutput.phtml"}}
应用程序/代码/本地/ myNameSpace对象/ Mymodulename /砌块/ index.php的
<?xml version="1.0"?>
<config>
<modules>
<Mynamespace_Mymodulename>
<version>0.1.0</version>
</Mynamespace_Mymodulename>
</modules>
<global>
<blocks>
<mynamespace_mymodulename>
<class>Mynamespace_Mymodulename_Block</class>
</mynamespace_mymodulename>
</blocks>
</global>
</config>
CMS内容
<?php
class Mynamespace_Mymodulename_Block_Index extends Mage_Core_Block_Template
{
public function getCollection()
{
// some code
return $collection;
}
}
应用程序的/ etc /模块/ Mynamespace_Mymodulename.xml
{{block type="mynamespace_mymodulename/index" template="mynamespace/mymoduleoutput.phtml"}}
应用程序/设计/前端/碱/默认/模板/ myNameSpace对象/ mymoduleoutput.phtml
<?xml version="1.0"?>
<config>
<modules>
<Mynamespace_Mymodulename>
<active>true</active>
<codePool>local</codePool>
<depends/>
</Mynamespace_Mymodulename>
</modules>
</config>
答案 1 :(得分:1)
我注意到这里有几个问题,所以我会尝试解决你在问题中发表的问题,尽管你想要完成的事情并不完全清楚,你会阅读guide about Magento’s layout, blocks, and templates可能会从中获益最多:
您当前的班级名称不遵循Magento autoloader naming conventions,您会注意到每个路径元素都使用ucwords()
。您的班级名称应为:Mynamespace_Mymodulename_Block_Myblockname
,它将映射到文件app/code/.../Mynamespace/Mymodulename/Block/Myblockname.php
。您的配置XML应该更新以匹配。
您的CMS指令当前未使用新的块类型,因为如果您希望使用块的自定义逻辑,它应设置为type="core/template"
时应为type="Mynamespace_Mymodulename/Myblockname"
在你的模板中。您的模板代码未显示,但这可能是您在模板中调用getCollection()
无效的原因。
如果您展示更多作品,我们可能会提供更多帮助。