簡體   English   中英

Magento:在CMS中調用自定義塊

[英]Magento: call a custom block in CMS

我正在嘗試為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() ?>

非常感謝您如此詳盡而有意義的解釋:-)

如果這些myNamespace_myModulname確實是您實際代碼中的名稱,請首先查看@fantasticrice答案

然后,如果我們以正確的命名約定考慮您的代碼(請參見本文結尾處的注釋),那么這不是有效的塊類:

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中的類名應始終遵循與文件路徑完全相同的體系結構 (除了控制器,但是我們根本不會在此處提供的代碼中談論控制器)=>

class Mynamespace_Mymodulename_Block_Index === Mynamespace/Mymodulename/Block/Index.php

(請參閱我如何用下划線替換下划線,並使用.php擴展.php后綴嗎?)。

然后,您真正想要的是您的視圖mynamespace/mymoduleoutput.phtml以使用您自己的模塊塊。
為此,您必須為塊指定正確的類型

該類型由config.xml中定義的句柄以及從塊文件的路徑的組合定義。

1.手柄

在為模塊定義config.xml時,必須注意某些部分是“固定的”,而某些部分是“句柄”的
這意味着Magento期望某些部分具有有限的可能性,例如, frontend or adminhtml or globalblocks, models, helpers, ... there is more here還有一些只是為模塊起別名並命名為按照我們在Magento下的說法進行處理。

在這里,您在config.xml中說,對於<global>配置(意味着前端和后端(= admin)均表示)-已修復 -您想添加到現有<blocks>列表中-已修復 Magento的你的模塊將被引用的塊- 手柄 - <mynamespace_mymodulename>然后將映射到其中的類都將開始文件Mynamespace_Mymodulename_Block

這是您想要的模塊塊類型的第一部分。
mynamespace_mymodulename將等同於Magento的到Mynamespace_Mymodulename_Block

2.正確的方塊

然后,您只需指定從Blocks的根文件夾到Magento的正確路徑即可,這與您的文件夾/文件架構完全相同:再次,對於您的情況,只需index
如您現在所了解,Magento將在文件Mynamespace/Mymodulename/Block/Index.php Mynamespace_Mymodulename_Block_Index查找類Mynamespace_Mymodulename_Block_Index (句柄+'_'+指定的塊)。
但是,如果您的文件位於app/code/local/Mynamespace/Mymodulename/Block/Path/To/File.php ,則將具有path_to_file => class Mynamespace_Mymodulename_Block_Path_To_File ,文件Mynamespace/Mymodulename/Block/Path/To/File.php

現在我們有了類型的第二部分,我們只需要用斜杠將它們組合起來即可: mynamespace_mymodulename/index

因此,您必須將cms中的呼叫更改為:

{{block type="mynamespace_mymodulename/index" template="mynamespace/mymoduleoutput.phtml"}}

並希望以此解決問題。

注意1/3:正如@fantasticrice指出的那樣 ,我還建議您遵循class的命名約定:

Zend Framework遵循類命名約定的標准,由此類的名稱直接映射到存儲它們的目錄。 (......)

類名只能包含字母數字字符。 類名中允許使用數字,但在大多數情況下不建議使用數字。 僅允許使用下划線代替路徑分隔符; 文件名“ Zend / Db / Table.php”必須映射到類名“ Zend_Db_Table”。

如果一個類名包含多個單詞,則每個新單詞的首字母必須大寫。 不允許連續使用大寫字母,例如,不允許使用“ Zend_PDF”類,而可以使用“ Zend_Pdf”。

這些約定為Zend Framework定義了偽命名空間機制。 Zend Framework將在可用時采用PHP名稱空間功能,並且對於我們的開發人員在其應用程序中使用是可行的。

有關此類名約定的示例,請參見標准庫和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中

<?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>

應用程序/代碼/本地/ myNameSpace對象/ Mymodulename /座/ index.php文件

<?php
class Mynamespace_Mymodulename_Block_Index extends Mage_Core_Block_Template
{
    public function getCollection()
    {
       // some code
        return $collection;
    }
}

CMS內容

{{block type="mynamespace_mymodulename/index" template="mynamespace/mymoduleoutput.phtml"}}

應用程序的/ etc /模塊/ Mynamespace_Mymodulename.xml

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

應用程序/設計/前端/基/默認/模板/ myNameSpace對象/ mymoduleoutput.phtml

<?php /** @var $this Mynamespace_Mymodulename_Block_Index */ ?>
<?php foreach($this->getCollection() as $item): ?>
    <?php //do something ?>
<?php endforeach; ?>

我注意到這里有幾個問題,所以我將盡力解決那些可以通過您在問題中發表的內容看到的問題,盡管您要完成的任務還不是很清楚,您可能會從中受益最大通過閱讀有關Magento的布局,塊和模板的指南

  1. 您當前的類名稱未遵循Magento自動加載器的命名約定 ,您會注意到在每個path元素上使用ucwords() 您的類名稱應類似於: Mynamespace_Mymodulename_Block_Myblockname ,它將映射到文件app/code/.../Mynamespace/Mymodulename/Block/Myblockname.php 您的配置XML應該進行更新以匹配。

  2. 您的CMS指令當前未使用新的塊類型,因為如果您希望在自己的塊中使用塊的自定義邏輯,則將其設置為type="core/template"時應將其設置為type="Mynamespace_Mymodulename/Myblockname"模板。 模板的代碼未顯示,但這可能是為什么在模板中調用getCollection()無法正常工作的原因。

如果您的工作更多,我們可能會提供更多幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM