2012-11-16 24 views
1

我現在在Magento中工作,並且存在變量範圍的問題。我有兩個文件在願望清單上顯示。我需要在這兩個文件之間傳遞一個變量,我可以成功執行此操作,但我遇到的問題是這兩個文件在循環中運行,我無法更改這些值。我們使用的基本代碼如下: 文件1:Magento中的文件之間的全局變量

global $var1; 
//$var1 = ''; 
if($condition == true){ 
    $var1 = 'string'; 
} 

其他文件呼應了$ VAR1正確,給我「串」。然後文件再次循環並重復該過程。我遇到的問題是,如果我取消註釋第二行來重置變量,它總是保留一個空字符串。 if語句被肯定觸發,變量不會被設置。我誤解了全球可訪問的變量如何在PHP中工作?

+0

從您發佈的代碼中,當$ condition爲true時,$ var1應始終爲'string',因爲它在重置爲「'後設置。我不完全理解你描述的其他部分。您可能需要一些代碼來重置它,以告知它何時應該重置。如果你的兩個代碼片斷可能更容易理解。 –

+0

http://alanstorm.com/magento_registry_singleton_tutorial –

回答

3

如果你想以Magento的方式做到這一點,你應該將信息連接到對象

不知道任何細節我們不能確定,但​​很有可能您的$var1價值可以邏輯連接到願望清單,願望清單項目或連接到它們的東西(如客戶或產品) 。

說了這麼多,你可以用不同的方式在(你基本上想要做的)之間傳遞周圍的信息。我不能給你具體的代碼,因爲我不知道你想做什麼,但我可以給你一些選項:

  • 塊類:每一個.phtml文件有一個$this對象。這意味着您的模板文件在對象的上下文中呈現。該對象是塊類的一個實例。佈局XML文件定義哪個塊類用於此特定塊。在intro to layouts瞭解更多關於它的信息。

    如果$var1中的信息僅用於這些塊中的介紹目的,您可以將存儲在其中一個塊對象本身的信息中。由於塊是按層次結構(並且使用循環),因此可以考慮使用父塊來存儲信息。您可以通過使用$this->getParentBlock()來獲取父塊。如果您找到了您的對象,則可以撥打$block->setYourVariableName('value')保存該值,然後$block->getYourVariableName()再次讀取它。您也可以通過$block->getChild('block_name')或其數據使用$block->getChildData('your_variable_name')訪問子塊。在API documentation中找到更多有用的方法。

  • 模型單身人士:另一種方法來做到這一點將是一個單身模型。單例確保只存在某個類的唯一一個實例。這樣,您可以隨時訪問完全相同的對象並共享數據。也許這不會是你的完美解決方案,因爲你將不得不創建一個新的模型類來存儲這些小信息。

    另一方面,有足夠的用例來構建獨立模型是有意義的。再一次,因爲我不知道你在做什麼,所以你可能會很好地創建一個模型。您仍然可以決定是要將模型存儲爲塊的一部分還是使用單例存取模型。如果你想使用單例,請參考article by Alan Storm,「Magento的單例模式」一節。

  • 註冊表:我會用這種最後的手段。註冊表是一箇中央和全球的「存儲這個信息給我/給我這個信息」的對象。這很容易使用,但如果您想擁抱最佳實踐,您應該儘可能避免這種情況。 (有些瑣事:Magento的單例實現實際上使用註冊表,但隱藏了您的詳細信息。)

    在做這件事之前請考慮其他選項,因爲您不希望將註冊表中的小信息位加載。如果你想使用它,再次看看Alans article

+0

非常感謝,這是一些非常有用的信息。 –

1

添加到Mattihias'非常詳細的解答,如果你最終使用註冊表(不是過度使用),請務必儘快從註冊表中刪除條目,因爲它是沒有必要的,以保持它的清潔。

Mage::unregister('registry_key')