2012-10-10 50 views
5

我正在尋找一個很好的解決方案來覆蓋Magento配置而不更改默認值。替代Magento配置

例如,我想覆蓋core_config_data表中的「web/unsecure/base_skin_url」項而不刪除現有值。因此,如果在任意位置的代碼這個確切的代碼被稱爲:

Mage::getStoreConfig('web/unsecure/base_skin_url'); 

它會找到的配置選項,我設置,而不是默認的一個......提前

謝謝!

回答

9

的Magento在運行時直接從配置對象的樹結構讀取它的配置值,所以你需要使用的配置對象的本地setNode方法來改變值。然而,由於Magento loads in scoped configuration(自我鏈接)的方式,它並不像看起來那麼簡單。

對於當前版本的Magento(我相信但尚未用舊版本進行測試),您需要在當前store的一組節點中設置配置值。

第一步是獲取當前設置的商店的代碼。您可以通過以下

$store = Mage::app()->getStore(); 
$code = $store->getCode(); 

編程方式做到這一點的話,你可以設置一個配置值與以下調用

$config = Mage::getConfig(); 
$config->setNode("stores/$code/web/unsecure/base_skin_url", 'value_to_set'); 

請記住,這一切都需要發生的Magento已經自舉配置目的。另外請記住,有一段時間Magento將有一個加載配置,但商店對象不會被加載。如果是這種情況,您無法從商店對象中加載商店代碼。

我在Pulse Storm Chaos module中做了類似的事情。如果你對工作代碼感興趣,那麼它就是Github

+0

感謝您的好解釋艾倫!我可以看到這對每個商店的配置如何工作,但如果我想讓所有商店(和網站)使用我的自定義配置選項,該怎麼辦?實質上,我想我的自定義配置選項是全球... –

+0

@ChuckD簡短版本:您需要爲系統中的每個商店添加它(多個調用)。當Magento創建stores/store_code節點時,會考慮默認值和網站值。這樣,getStoreConfig方法總是可以查看stores/store_code以找到正確的值。 –

+0

Chuck,你嘗試過'$ config-> setNode(「global/web/unsecure/base_skin_url」,'value_to_set');'?只是一個想法,未經考驗。 – Jongosi

1

如果你想覆蓋一些特殊的配置數據,你可以把它放在app/etc/local.xml中。但那隻適用於你自己的商店,而不適用於公共模塊。

繼承人一種覆蓋base_url用於開發目的而不改變數據庫的方式。

<config> 
... 
    <stores> 
     <default> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </default> 
     <admin> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </admin> 
    </stores> 
... 
</config> 
+0

只有代碼爲「default」和admin的商店纔會重寫價值。另外,合併來自所有XML文件的全局配置後,Magento會從core_config_data表中更新它。如果商店範圍中的值是在它將覆蓋xml中的值之前定義的。 –

+0

這正是我正在尋找的。我錯過了「」標籤,但現在它工作:)我不完全確定@PavelNovitsky說的事情。但對於一個簡單的商店網站來說,這應該足夠了。 – func0der

7

Alan的答案是正確的,但它並不關心配置緩存。例如,如果您撥打Mage::getStoreConfig('web/unsecure/base_skin_url')兩次並更改兩者之間的值,則更改不起作用。 要解決此問題,您應該使用$store->setConfig('web/unsecure/base_skin_url', 'value_to_set')。它既:更新配置緩存並用Alan的方法設置配置節點。

+2

謝謝,它的作品!如果有人對如何獲得'$ store'變量感興趣,在回答中提到:'$ store = Mage :: app() - > getStore();' –