2012-05-12 55 views
1

我需要在同一頁面上使用同一個自定義塊2次,但使用從數據庫加載的不同值。從page.xml中獲取<block>的值

所以我需要從我的page.xml文件中傳遞一個配置值(這裏稱爲SimpleMenuInstanceRef)到塊/模型,以便每個塊知道從數據庫加載什麼數據。

我與該塊做:

<block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label"> 
     <label>Left menu header</label> 
     <action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action> 
     </block> 

而且這還挺工程。在我leftMenuTemplate.phtml我可以做一個

回聲$這個 - > getSimpleMenuInstanceRef()

,這將顯示從配置價值。

但我需要在我的塊_construct方法中的值,以便我可以根據其值加載數據。但在_construct中執行$ this-> getSimpleMenuInstanceRef不會返回任何內容。那麼我怎樣才能得到我的代碼塊的價值,還是我需要以另一種方式轉移價值?

編輯:將__construct更改爲_construct以匹配實際代碼。

回答

1

是的,你需要。試圖聲明塊爲:

<block instance="4" template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label"> 
    <label>Left menu header</label> 
</block> 

這樣做後,你可以輕鬆地訪問到 '實例' VAR:

protected function _construct() { 
    parent::_construct(); 
    echo $this->getData('instance'); 
} 
+0

不工作。至少不在塊__construct方法中。 $ this-> getData(「instance」)只返回null。如果我調用$ this-> getData(),我得到的數組只有一個值(這不是我需要的名稱/值對) – MTilsted

+0

永遠不會使用__construct,而是使用_construct而不是 –

+0

對不起,我使用_construct一個_到文本中很多 – MTilsted

4

更新:儘管createBlock功能(在Mage_Core_Mode_Layout),具有PARAMATERS爲一個$arguments數組,它變成塊構造函數(在現代版本的Magento中)不通過

$block = $this->addBlock($className, $blockName); 

... 

public function addBlock($block, $blockName) 
{ 
    return $this->createBlock($block, $blockName); 
} 

... 

public function createBlock($type, $name='', array $attributes = array()) 
{ 
    ... 
    $block = $this->_getBlockInstance($type, $attributes); 
    ... 
} 

所以這個答案的核心是不正確的。儘管我在這裏留下了答案,因爲它包含其他有用的信息。

以下是您正在嘗試的問題。

佈局XML的每個節點都代表一行用於生成塊的PHP代碼。

當你說

<block template="simplemenu/leftMenuTemplate.phtml" 

幕後發生的事情是這樣的(其中$attributes是節點的屬性的表示)

$block = new $block($attributes); 

然後,Magento的遇到你的下一行

<action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action> 

它被翻譯爲

$block->setSimpleMenuInstanceRef('4'); 

所以,你正在運行到的問題是被稱爲__construct_construct_prepareLayout方法時,Magento的尚未處理的action節點,所以您未設置值。

一種可能的解決方案是包括數據作爲塊的屬性(my_data_here下文)

<block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label" my_data_here="4"> 

屬性被傳遞到塊的構造方法。雖然基塊不具有__construct,該Varien_Object類它擴展確實

#File: lib/Varien/Object.php 
public function __construct() 
{ 
    $args = func_get_args(); 
    if (empty($args[0])) { 
     $args[0] = array(); 
    } 
    $this->_data = $args[0]; 

    $this->_construct(); 
} 

此構造方法將採取的第一個構造函數參數,並將其設置爲對象的(在這種情況下,對象是我們的塊)數據陣列。這意味着您可以將該數據返回與

一個警告。

如果你想這樣做,你不能在你的塊中創建自己的構造方法,因爲這意味着Varien_Object構造函數將永遠不會被調用。這就是爲什麼你要在所有塊中使用單個下劃線構造函數(_construct)。

我寫了一篇文章,而一個覆蓋所有event lifecycle methods回來,你可能會發現它有用