Magento:在CMS中调用自定义块

时间:2015-06-01 19:58:44

标签: php magento module magento-layout-xml

我正在尝试为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() ?>

非常感谢您提供如此详尽和有意义的解释: - )

2 个答案:

答案 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中定义的句柄和块文件路径的组合定义。

1。句柄

为模块定义config.xml时,您必须注意某些部分是“fixed”,而某些部分是“handle”。 /> 这意味着Magento预期某些部分的可能性有限,例如: frontend or adminhtml or globalblocks, models, helpers, ... there is more here,其中一些只是名称,用于为您的模块添加别名,并在Magento下调用它或处理它。

这里你在config.xml中说明了<global>配置(对于前端和后端(= admin)的意思) - 已修复 - 你要添加到Magento的现有<blocks> - 已修复的列表 - 模块的块将被 - 句柄引用 - {{ 1}} 然后会映射到所有类都以<mynamespace_mymodulename>开头的文件。

这是您希望自己的模块块的类型的第一部分 对于Magento来说,Mynamespace_Mymodulename_Block等同于mynamespace_mymodulename

2。右侧块

然后你必须再次指出从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中,根据惯例,我们不会在句柄中使用大写字母。

TL; DR

应用程序/代码/本地/ 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可能会从中获益最多:

  1. 您当前的班级名称不遵循Magento autoloader naming conventions,您会注意到每个路径元素都使用ucwords()。您的班级名称应为:Mynamespace_Mymodulename_Block_Myblockname,它将映射到文件app/code/.../Mynamespace/Mymodulename/Block/Myblockname.php。您的配置XML应该更新以匹配。

  2. 您的CMS指令当前未使用新的块类型,因为如果您希望使用块的自定义逻辑,它应设置为type="core/template"时应为type="Mynamespace_Mymodulename/Myblockname"在你的模板中。您的模板代码未显示,但这可能是您在模板中调用getCollection()无效的原因。

  3. 如果您展示更多作品,我们可能会提供更多帮助。