अपग्रेड स्क्रिप्ट चलाते समय करंट स्टोर 1 है


15

किसी भी विचार क्यों Mage::app()->getStore()आईडी 1 के साथ स्टोर दृश्य वापस करता है जब स्टोर दृश्य पर स्वतंत्र अपग्रेड स्क्रिप्ट के अंदर मैं (यहां तक ​​कि व्यवस्थापक) में अपग्रेड स्क्रिप्ट चला रहा हूं?
मेरा मतलब है, मुझे पता है कि यह कोड कहां है। इसमें Mage_Core_Model_App::getStore()यह है:

    if (!Mage::isInstalled() || $this->getUpdateMode()) {
        return $this->_getDefaultStore();
    }

और _getDefaultStoreइस तरह दिखता है:

   if (empty($this->_store)) {
        $this->_store = Mage::getModel('core/store')
            ->setId(self::DISTRO_STORE_ID)
            ->setCode(self::DISTRO_STORE_CODE);
    }
    return $this->_store;

$this->_store ऊपर की विधि तक पहुँचने पर हमेशा खाली रहता है।

मुझे अपग्रेड स्क्रिप्ट के शीर्ष पर इसे जोड़ने पर भी समान परिणाम मिलता है:

Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));

मैं इस 'सुविधा' के व्यावसायिक तर्क के बारे में उत्सुक हूं।


मैंने सोचा कि अपग्रेड स्क्रिप्ट हमेशा फ्रंटेंड दायरे में चल रही हैं। अक्सर मैं निम्नलिखित लाइनों के लिए व्यवस्थापक स्टोर का उपयोग करने के लिए अपग्रेड स्क्रिप्ट को स्पष्ट करता हूं।
बुकार्ट

@bukart। मैंने एडमिन स्टोर व्यू को चलाने के लिए अपग्रेड स्क्रिप्ट को स्पष्ट रूप से बताने की कोशिश की, लेकिन मुझे वही परिणाम मिला। प्रश्न में मेरी अंतिम 3 पंक्तियाँ देखें।
मेरियस

मैंने नीचे आपके प्रश्न का उत्तर देने की कोशिश की
bukart

जवाबों:


5

NB: यह मत भूलो कि प्रेषण स्टोर का दायरा तब तक सेट नहीं किया जाता है जब तक डिस्पैचिंग नहीं हो रही है और एक नियंत्रक Mage_Adminhtml_Controller_Actionनिष्पादित कर रहा है ( adminhtml_controller_action_predispatch_startघटना और संबंधित पर्यवेक्षक देखें Mage_Adminhtml_Controller_Action::preDispatch())।

मैं इस 'सुविधा' के व्यावसायिक तर्क के बारे में उत्सुक हूं।

आप केवल एक ही नहीं हैं; ऐसा कहकर, हम कभी नहीं जान पाएंगे जब तक कि मोशे या दीमा चर्चा करना चाहता है।

सेटअप स्क्रिप्ट एप्लिकेशन इनिशियलाइज़ेशन में जल्दी निष्पादित होती है। इसका डिज़ाइन संभवतः इस कारण से है कि, जब तक बाकी स्टैक को निष्पादित नहीं किया जाता है, तब तक आवश्यक माइग्रेशन और अन्य काम "किया जाएगा" - जिसका अर्थ है कि सिस्टम ठीक उसी समय उपयोग करने के लिए तैयार था जब एक मॉड्यूल स्थापित किया जा रहा था या उन्नत किया गया। मैं सोच रहा था कि अगर मूल आर्किटेक्ट शुरू में कभी सोचा था कि एक और अधिक आरंभिक प्रणाली की आवश्यकता होगी। मैं यह अनुमान लगाता हूं, जबकि बहुत सारे कोड मानते हैं कि स्टोर इंस्टेंस उपलब्ध है, _getDefaultStore()तर्क यह सुनिश्चित करता है कि स्टोर इंस्टेंस है।

पूर्ण गुंजाइश सेटिंग्स 1.4.0.0 और डेटा सेटअप स्क्रिप्ट के माध्यम से उपलब्ध हैं।


3

ठीक है, अपनी अपग्रेड स्क्रिप्ट में एडमिन स्टोर का उपयोग करने के लिए

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

आपका दृष्टिकोण Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); सफल नहीं हो सकता, क्योंकि व्यवस्थापक के लिए वास्तव में कोई मौजूदा लोड करने योग्य स्टोरव्यू नहीं है

अक्सर मैं इस तरह से एक पैटर्न का उपयोग करता हूं:

// remembering old current store
$currentStore = Mage::app()->getCurrentStore();

// switching to admin store
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

// switching back to old current store
Mage::app()->setCurrentStore($currentStore->getStoreId());

अन्यथा कभी-कभी अपग्रेड स्क्रिप्ट निष्पादित करने के बाद आपके विज़िटर को कभी-कभी फ्रंटएंड के बजाय व्यवस्थापक पृष्ठ पर भेज दिया जाएगा।


अपडेट करें:

मैंने नीचे दिए गए प्रश्न की गलत व्याख्या की, इसलिए यहां ^ ^ समझाने का एक नया प्रयास किया गया है

उन्नयन स्क्रिप्ट को कोर में गहरी विधि से बुलाया जाता है (Mage_Core_Model_Resource_Setup::_modifyResourceDb(...) )

यहाँ मैंने स्टैक को सूचीबद्ध करने का प्रयास किया

  • Mage_Core_Model_App::run($params)

  • Mage_Core_Model_App::_initModules()

  • Mage_Core_Model_Resource_Setup::applyAllUpdates()

  • Mage_Core_Model_Resource_Setup::applyUpdates()

  • Mage_Core_Model_Resource_Setup::_upgradeResourceDb($oldVersion, $newVersion)

  • Mage_Core_Model_Resource_Setup::_modifyResourceDb($actionType, $fromVersion, $toVersion)

और अब एक नजर Mage_Core_model_App::run($params):

public function run($params)
{
    $options = isset($params['options']) ? $params['options'] : array();
    $this->baseInit($options);
    Mage::register('application_params', $params);

    if ($this->_cache->processRequest()) {
        $this->getResponse()->sendResponse();
    } else {
        $this->_initModules();
        $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);

        if ($this->_config->isLocalConfigLoaded()) {
            $scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
            $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
            $this->_initCurrentStore($scopeCode, $scopeType);
            $this->_initRequest();
            Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
        }

        $this->getFrontController()->dispatch();
    }
    return $this;
}

विधि _initModules()से पहले कहा जाता है $scopeCodeऔर$scopeType निर्धारित किया निर्धारित किया जाता है।

वर्तमान में मैं यह पता नहीं लगा सकता कि ग्रहण की गई गिरावट कहां परिभाषित की गई है।


ओह, लेकिन व्यवस्थापक के लिए एक लोड करने योग्य स्टोर दृश्य है। में एक बार देख ले core_storeमेज। आईडी के साथ एक रिकॉर्ड है 0। यदि आप इसे आजमाते हैं, तो आपको var_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))व्यवस्थापक स्टोर का एक वैध उदाहरण मिलेगा। भी कोशिश की गई, Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);लेकिन मुझे वही परिणाम मिला। लेकिन मेरा सवाल यह नहीं था कि अपग्रेड स्क्रिप्ट में एडमिन स्टोर कैसे सेट किया जाए। मैं पूछ रहा था कि Mage::app()->getStore()उन्नयन स्क्रिप्ट में आईडी 1 के साथ स्टोर क्यों लौटाता है।
मेरियस

ओह ... ठीक है ... डेटाबेस में एक व्यवस्थापक स्टोर है, वास्तव में।
बुकार्ट

1
हम्म ... मैं स्टैक जानता था लेकिन अब जब मैंने इसे आपके उत्तर में देखा है तो इसने मुझे मारा। अपडेट किसी तरह 'स्टेटलेस' चलना चाहिए। लेकिन कुछ चलाने के लिए आपको एक स्टोर की आवश्यकता होती है। इसलिए स्टोर के लिए एक डिफ़ॉल्ट मूल्य। अब केवल एक चीज जो समझ में नहीं आती है: यह डिफ़ॉल्ट स्टोर क्यों नहीं है 0(व्यवस्थापक) और एक स्टोर दृश्य है जो आसानी से व्यवस्थापक UI से हटा दिया जा सकता है? मेरी आँखें खोलने के लिए +1। अगर मुझे इस पर कोई अन्य स्पष्ट जवाब नहीं मिलता है तो मैं इसे स्वीकार करूंगा।
मेरियस

mhh ... अच्छा सवाल ... शायद दोपहर के भोजन के बाद मैं एक बार
देखूंगा

1.9.3.6 के रूप में, Mage::app()->getCurrentStore();परिभाषित नहीं होता है और जब कहा जाता है तो एक घातक त्रुटि देता है। इसके बजाय, मुझे आईडी का उपयोग करना पड़ा $currentStoreId = Mage::app()->getStore()->getId();
एरिक सस्टैंडैंड

2

तो मूल उत्तर यह है कि यह वास्तव में 3 में हो जाता है अगर ..... रुको क्या :(

if (!isset($id) || ''===$id || $id === true) {
    $id = $this->_currentStore;
}

मेरे लिए यह सही है Mage::isInstalled()और गलत है $this->getUpdateMode()जिसके लिए गलत लगता है। लेकिन यह केवल पहली हिट पर होता है getStore

तो ऐसा प्रतीत होता है कि यह अपडेट मोड सेट होने से पहले स्टोर को सेट करता है, फिर जब यह सेट-अप स्क्रिप्ट में वापस आता है तो यह डिफ़ॉल्ट स्टोर कॉल का उपयोग करता है जो निम्न कोड का उपयोग करता है:

$this->_store = Mage::getModel('core/store')
    ->setId(self::DISTRO_STORE_ID)
    ->setCode(self::DISTRO_STORE_CODE);

1 का मान self::DISTRO_STORE_IDहै मुझे लगता है कि इसका कारण कुछ है और हमें व्यवस्थापक स्टोर के लिए सेटअप नहीं था :(

इसलिए मेरे पास वास्तव में एक प्रणाली है जो आईडी 1 के साथ स्टोर नहीं हुई है और अपडेट स्क्रिप्ट अच्छी तरह से काम करती दिखाई देती है। यदि हम तालिकाओं / विशेषताओं को जोड़ रहे हैं तो यह ठीक है और साइट विशिष्ट सेमी ब्लॉक जोड़ते समय यह भी काम कर रहा है, लेकिन हम सभी स्टोर आईडी प्राप्त करते हैं और विशेष रूप से स्टोर विशिष्ट डेटा को सहेजते समय उन्हें सेट करते हैं।


मैंने उसी चीज को खोदा। मुझे समझ नहीं आ रहा है कि "Magento क्यों उन्नयन के लिए कोई उपयोग व्यवस्थापक स्टोर नहीं है?"। यह अधिक उचित है। मैं अगर मैं आईडी 1. साथ दुकान को हटाने के क्या होता है सोचने के लिए डर लग रहा है
मेरियस

डिफ़ॉल्ट स्टोर को हटाने के लिए कोई भी पागल नहीं होगा;)
डेविड मैनर्स

अब जब मैं यह जानता हूं, तो मैं पागल नहीं होऊंगा, लेकिन यह तथ्य कि यह संभव है ... अच्छी तरह से ... कभी भी किसी उपयोगकर्ता पर भरोसा न करें।
मेरियस

हमारे एक पीएम ने मुझसे पूछा कि क्या वह पिछले हफ्ते पुराने स्टोर हटा सकते हैं। मुझे लगता है कि मैंने "क्या सबसे बुरा है जो हो सकता है" के साथ जवाब दिया .... और हमारे वर्तमान परियोजना सेटअप में और भी अजीब है, हमारे पास आईडी 1 :( तालिका में कोई दुकान नहीं है, core_storeलेकिन सेटअप स्क्रिप्ट काम कर रही हैं
डेविड मैनर्स

1
एक सेमी ब्लॉक को जोड़ने को एक डेटा अपग्रेड (इंस्टॉल नहीं) स्क्रिप्ट में किया जाना चाहिए जहां स्टोर गुंजाइश Mage_Core_Model_App :: DISTRO_STORE_CODE पर लॉक नहीं है; सामान्य तौर पर, इंस्टॉल की गई स्क्रिप्ट्स का उपयोग डेटा संरचना को बदलने के लिए किया जाता है (और स्टोर स्कोप लॉक है) जबकि डेटा अपग्रेड डेटा सामग्री को बदलने के लिए उपयोग किया जाता है (और स्क्रिप्ट के दौरान स्टोर स्कोप को बदला जा सकता है)
एलासेंड्रो रोंची
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.