আপগ্রেড স্ক্রিপ্টগুলি চলাকালীন বর্তমান স্টোরটি 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 লাইন দেখুন।
মারিয়াস

আমি নীচে আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা করেছি
বুকার্ট

উত্তর:


5

এনবি: ভুলে যাবেন না যে প্রেরণ না হওয়া অবধি প্রশাসক স্টোরের সুযোগ সেট করা থাকে না এবং একটি নিয়ামক প্রসারিত কার্যকর হয় Mage_Adminhtml_Controller_Action(এতে adminhtml_controller_action_predispatch_startইভেন্ট এবং সম্পর্কিত পর্যবেক্ষক দেখুন Mage_Adminhtml_Controller_Action::preDispatch())।

আমি এই 'বৈশিষ্ট্য' থাকার ব্যবসায়িক যুক্তি সম্পর্কে আগ্রহী।

আপনি একমাত্র নন; এটি বলেছিল, মোশি বা ডিমা আলোচনা না করতে চাইলে আমরা কখনই জানতে পারি না ।

অ্যাপ্লিকেশন প্রারম্ভের শুরুতে সেটআপ স্ক্রিপ্টগুলি কার্যকর করা হয়। এটির নকশা সম্ভবত কারণেই বাকী স্ট্যাকটি সম্পাদনের সময়, প্রয়োজনীয় স্থানান্তর এবং অন্যান্য কাজগুলি "সম্পন্ন" হয়ে যাবে - এর অর্থ মডিউল ইনস্টল করা হলেও সিস্টেমটি এখনই ব্যবহারের জন্য প্রস্তুত ছিল বা আপগ্রেড করা। আমি ভাবছি যে আর্কিটেক্টরা প্রাথমিকভাবে কখনও ভেবেছিল আরও বেশি প্রাথমিক পদ্ধতির প্রয়োজন হবে কিনা। আমি অনুমান করবো, যেখানে বেশিরভাগ কোড ধরে নেওয়া হয়েছে যে কোনও স্টোর উদাহরণ উপলব্ধ রয়েছে, _getDefaultStore()যুক্তিটি নিশ্চিত করে যে কোনও স্টোরের উদাহরণ রয়েছে।

সম্পূর্ণ স্কোপ সেটিংস 1.4.0.0 এ এবং ডেটা সেটআপ স্ক্রিপ্টগুলির মাধ্যমে পাওয়া যায়।


3

ঠিক আছে, আপনার আপগ্রেড স্ক্রিপ্টগুলিতে অ্যাডমিন স্টোরটি ব্যবহার করুন just

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(প্রশাসক) নয় এবং এমন একটি স্টোর ভিউ যা সহজেই অ্যাডমিন ইউআই থেকে মুছতে পারে? আমার চোখ খোলার জন্য +1। আমি যদি এর উপর অন্য কোনও পরিষ্কার উত্তর না পাই তবে আমি এটি গ্রহণ করব।
মারিয়াস

এমএইচএইচ ... ভাল প্রশ্ন ... দুপুরের খাবারের পরে আমি একবার দেখে নেব ...
ইন্টারস্ট্রেসিং

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);

এর মান self::DISTRO_STORE_ID1 আমার মনে হয় কারণ এর জন্য কিছু দরকার এবং এটি আমাদের কাছে অ্যাডমিন স্টোর সেটআপ করা হয়নি :(

সুতরাং আমার কাছে আসলে একটি সিস্টেম রয়েছে যা আইডি 1 এবং আপডেট স্ক্রিপ্টটি ভালভাবে কাজ করে না বলে মনে হয়। যদি আমরা সারণী / বৈশিষ্ট্যগুলি যুক্ত করে থাকি তবে এটি ঠিক আছে এবং সাইট নির্দিষ্ট সিমিএস ব্লক যুক্ত করার পরেও এটি কাজ করছে, তবে আমরা স্টোর আইডি পেয়ে থাকি এবং নির্দিষ্ট নির্দিষ্ট ডেটা সংরক্ষণ করার সময় সেগুলি নির্দিষ্টভাবে সেট করি।


আমি একই জিনিস খনন। আমি যা বুঝতে পারি না তা হ'ল "ম্যাজেন্টো কেন আপনি আপগ্রেডগুলির জন্য অ্যাডমিন স্টোর ব্যবহার করেন না?"। এটি আরও যুক্তিসঙ্গত seams। আমি আইডি 1 দিয়ে দোকানটি মুছে ফেললে কি হবে তা ভেবে ভয় পাচ্ছি
মরিয়াস

ডিফল্ট স্টোরটি মুছতে কেউ যথেষ্ট পাগল হবে না;)
ডেভিড ম্যানার্স

এখন যেহেতু আমি এটি জানি, আমি পাগল হব না, তবে এটি সম্ভব যে সত্য ... ভাল ... কোনও ব্যবহারকারীর উপর কখনও বিশ্বাস করবেন না।
মারিয়াস

আমাদের একজন প্রধানমন্ত্রী আমাকে জিজ্ঞাসা করেছিলেন যে তিনি গত সপ্তাহে পুরানো দোকানগুলি সরিয়ে ফেলতে পারেন কিনা। আমি মনে করি আমি "কী হতে পারে সবচেয়ে খারাপ" এর সাথে জবাব দিয়েছি .... এবং আমাদের বর্তমান প্রকল্পের সেটআপে আরও অদ্ভুত আমাদের আইডি 1 :( সহ কোনও স্টোর নেই তবে টেবিলে core_storeসেটআপ স্ক্রিপ্টগুলি কাজ করছে
ডেভিড ম্যানার্স

1
একটি সেন্টিমিটার ব্লক যুক্ত করে ডেটা আপগ্রেড (ইনস্টল করা হবে না) স্ক্রিপ্টে করা উচিত যেখানে স্টেজের সুযোগটি Mage_Core_Model_App এ লক করা নেই :: DISTRO_STORE_CODE; আরও সাধারণভাবে, ইনস্টল স্ক্রিপ্টগুলি ডেটা কাঠামো পরিবর্তন করতে ব্যবহৃত হয় (এবং স্টোর স্কোপ লক থাকে) যখন ডেটা আপগ্রেড ডেটা সামগ্রী পরিবর্তন করতে ব্যবহৃত হয় (এবং স্টোর স্কোপটি স্ক্রিপ্ট চলাকালীন পরিবর্তিত হতে পারে)
অলেসান্দ্রো রনচি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.