2012-07-25 72 views
0

我正在開發我的第二個Magento模塊,它應該檢索一些數據並渲染包含它的塊。這樣的塊將被其他頁面使用。Magento - 塊沒有呈現

目前,我幾乎已經安裝了整個模塊,但由於某種原因,當我調用控制器方法時,模塊未呈現。我提供了一些調試信息,我可以看到該塊的__construct()方法調用正確,但模板似乎沒有加載,返回的頁面爲空。

以下是適用於塊的代碼,其中我從另一個模塊複製和修改:

class Company_CustomerData_Block_CustomerSummary extends Mage_Core_Block_Template { 
    const _TEMPLATE = 'customerdata/customersummary.phtml'; 

    public function __construct() { 
    // This method is called correctly 
     parent::_construct(); 
     $this->setTemplate(self::_TEMPLATE); 
    } 
} 

文件customersummary.phtml是在應用程序/設計/前端/鹼/默認/模板/ customerdata,這應該是正確的地方(或者至少我認爲是這樣)。其內容如下:

It works! 

只是一些純文本。沒有標籤,沒有代碼,什麼都沒有。我不介意這是一個靜態文本,它會填充數據一次完成。

在需要的情況下,這裏的控制器(我刪除其中的數據被檢索到的部分,因爲他們不有所作爲)代碼:

public function dashboardAction() { 
    // Customer Data to render in the block 
    $CustomerData = array(); // Data is retrieved elsewhere 

    $this->getResponse()->setBody(
     $this->getLayout()->createBlock('customerdata/customersummary') 
     ->toHtml() 
    ); 
} 

什麼可能我是做錯了什麼?恐怕我又犯了一個愚蠢的錯誤,但我真的看不到它。

最後兩個問題:

  • 如何傳遞到模板我在控制器檢索數據?具體而言,變量$CustomerData
  • 模塊渲染完成後,如何從頁面內渲染其內容?該塊應該返回一個帶有一些東西的東西,我想在客戶儀表板內部呈現它,就在已經存在的信息的下面。

在此先感謝您的幫助。

+0

@Jim感謝您的編輯,我沒有發現破損的格式。我不應該在4AM發佈問題... :) – Diego 2012-07-25 11:11:09

回答

3

Magneto上的大多數課程源自Varien_ObjectVarien_Object(和它的後代)爲自己聲稱PHP的構造函數(__construct),並提供一個_construct回調函數,您可以隨意使用它。這意味着,如果你重寫PHP本身的構造函數(__construct),你需要記住幾件事情要做:

  1. 接受相同數量的參數作爲基礎類,並...
  2. 呼叫父構造函數(parent::__construct)與您的構造函數提供的參數。

或者,也可以使用Varien_Object提供的_construct回調函數完成。如果您使用Magento回調,則無需記得致電parent::_construct

所以要修復上面的代碼片段,您可以更改...

public function __construct() { 

...到...

public function _construct() { 

這將切換的使用Magento的回調結束了。或者,你可以改變...

parent::_construct(); 

..爲...

parent::__construct(); 

...調用父類的構造函數。記住添加父類提供的參數。

Alan Storm最近寫了一篇關於Magento's Block Lifecycle and call back methods的文章,這可能對我有幫助。

您的其他問題:

  • 從控制器將信息傳遞給塊通過Magento的註冊表一般都做。
  • 將模板渲染爲頁面的一部分需要您創建佈局指令(用XML編寫)來加載塊並將其放入父塊中。
+0

感謝您的答案。下劃線可能會令人困惑......這讓我想起了舊規則「下着座,確實是一個朋友」。我會馬上試試。 – Diego 2012-07-25 09:55:56

+0

感謝您的其他答案。我已經在嘗試瞭解如何編寫佈局文件,到目前爲止,我發現的所有示例都顯得太複雜了,無法滿足我的需求。畢竟,這只是一個小塊! :O – Diego 2012-07-25 09:56:56

+0

我做了你所建議的改變,我改變了方法到'public function _construct()',但是塊仍然沒有渲染。你還有什麼建議檢查?謝謝。 – Diego 2012-07-25 11:16:35

2

雖然吉姆的答案是正確的,我加入的第二部分,因爲我發現還有什麼是錯的:符號鏈接。正如我通常在爲框架開發插件時所做的那樣,我使用符號鏈接來避免一遍又一遍複製文件。但是,Magento使用函數RealPath(),它將符號鏈接解析爲完整路徑。因此,要加載的模板文件駐留在Magento安裝目錄之外的路徑中,出於安全原因無法加載。這很有道理,可惜它不是很明顯。

要解決此問題,我在開發PC上啓用了允許符號鏈接配置,現在模板已正確加載並呈現。

我認爲Magento可以在Admin界面中使用日誌查看器。如果沒有一個模塊已經完成,也許我應該自己創建一個模塊。

感謝大家的幫助。

+0

+1 - 良好的捕獲,允許Symlinks設置是一個真正的陷阱。你碰到這個問題很多id你使用modman在你的項目中包含模塊 – 2012-07-26 00:31:16

+0

實際上,管理界面中的日誌查看器會很方便。 – 2012-07-26 00:33:04

+0

@Jimohalloran可能是小意見,但我想你的意思是「很多,如果」。這不是迂腐,而是「ID」非常常見(用戶ID,客戶ID),我最初試圖瞭解「很多ID」是什麼。具有諷刺意味的是,「lot」也是與商業世界相關的一個詞。 :D – Diego 2012-07-26 09:00:54