2012-10-10 15 views
5

ओवरराइड करें मैं डिफ़ॉल्ट मानों को बदले बिना Magento कॉन्फ़िगरेशन को ओवरराइड करने के लिए एक अच्छा समाधान ढूंढ रहा हूं।Magento Config

उदाहरण के लिए, मैं मौजूदा मूल्य को हटाए बिना core_config_data तालिका में "वेब/असुरक्षित/base_skin_url" आइटम को ओवरराइड करना चाहता हूं। तो अगर कहीं भी कोड में इस सटीक कोड कहा जाता है:

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

यह config विकल्प मैं सेट और नहीं डिफ़ॉल्ट एक मिल जाएगा ...

अग्रिम धन्यवाद!

चक

उत्तर

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 स्टोर/store_code नोड्स बनाता है तो यह डिफ़ॉल्ट और वेबसाइट मानों को ध्यान में रखता है। इस तरह, getStoreConfig विधि हमेशा सही मान खोजने के लिए स्टोर/store_code पर देख सकती है। –

+0

चक, क्या आपने '$ config-> setNode (" वैश्विक/वेब/असुरक्षित/base_skin_url ", 'value_to_set') की कोशिश की है;'? बस एक विचार, untested। – Jongosi

1

यदि आप कुछ विशेष कॉन्फ़िगरेशन डेटा को ओवरराइट करना चाहते हैं, तो आप इसे ऐप/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

आप केवल "डिफ़ॉल्ट" और व्यवस्थापक कोड के साथ स्टोर के लिए मूल्य लिख रहे हैं। साथ ही, सभी एक्सएमएल फाइलों से ग्लोबल कॉन्फ़िगरेशन विलय करने के बाद Magento इसे core_config_data तालिका से अपडेट करता है। यदि स्टोर स्कोप में मूल्य को परिभाषित किया गया था इससे पहले कि यह एक्सएमएल से मूल्य ओवरराइड करेगा। –

+0

वही था जो मैं खोज रहा था। मैं "" टैग पर चूक गया, लेकिन अब यह काम करता है :) मैं उन चीज़ों के बारे में पूरी तरह से निश्चित नहीं हूं जो @PavelNovitsky ने कहा था। लेकिन एक साधारण एक स्टोर साइट के लिए, यह पर्याप्त होना चाहिए। – func0der

7

एलन का उत्तर सही है, लेकिन यह कॉन्फ़िगर कैश की परवाह नहीं करता है। उदाहरण के लिए, यदि आप दो बार Mage::getStoreConfig('web/unsecure/base_skin_url') पर कॉल करते हैं और बीच में मूल्य बदलते हैं, तो परिवर्तन का कोई प्रभाव नहीं पड़ता है। इस समस्या को हल करने के लिए, आपको $store->setConfig('web/unsecure/base_skin_url', 'value_to_set') का उपयोग करना चाहिए। यह दोनों करता है: कॉन्फ़िगर कैश अपडेट करें और कॉन्फ़्रेंस नोड को एलन की विधि से सेट करें।

+2

धन्यवाद, यह काम करता है! यदि कोई जवाब में उल्लिखित '$ store' चर कैसे प्राप्त करने के बारे में उत्सुक है, तो '$ store = mage :: ऐप() -> getStore();' –