ที่จัดเก็บปัจจุบันคือ 1 เมื่อเรียกใช้สคริปต์อัปเกรด


15

แนวคิดใดที่Mage::app()->getStore()ส่งคืนมุมมองร้านค้าด้วย id 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));

ฉันอยากรู้เกี่ยวกับตรรกะทางธุรกิจของการมี 'คุณสมบัติ' นี้


ฉันคิดว่าสคริปต์อัปเกรดมักจะทำงานในขอบเขตส่วนหน้า บ่อยครั้งที่ฉันบอกสคริปต์การอัปเกรดอย่างชัดเจนให้ใช้ที่เก็บของ admin สำหรับบรรทัดต่อไปนี้
bukart

@bukart ฉันพยายามบอกสคริปต์การอัปเกรดอย่างชัดเจนเพื่อเรียกใช้มุมมองที่เก็บของผู้ดูแลระบบ แต่ฉันได้รับผลลัพธ์เดียวกัน ดู 3 บรรทัดสุดท้ายของฉันในคำถาม
Marius

ฉันพยายามตอบคำถามของคุณด้านล่าง
bukart

คำตอบ:


5

หมายเหตุ: อย่าลืมว่าจะไม่มีการตั้งค่าขอบเขตการจัดเก็บของผู้ดูแลระบบจนกว่าจะมีการจัดส่งและตัวควบคุมที่ขยายการMage_Adminhtml_Controller_Actionทำงาน (ดูadminhtml_controller_action_predispatch_startเหตุการณ์และผู้สังเกตการณ์ที่เกี่ยวข้องMage_Adminhtml_Controller_Action::preDispatch())

ฉันอยากรู้เกี่ยวกับตรรกะทางธุรกิจของการมี 'คุณสมบัติ' นี้

คุณไม่ใช่คนเดียว ที่กล่าวว่าเราอาจไม่มีทางรู้นอกจากMosheหรือDimaต้องการที่จะพูดคุย

สคริปต์การตั้งค่าจะดำเนินการตั้งแต่ต้นในการเริ่มต้นแอปพลิเคชัน การออกแบบสิ่งนี้อาจเกิดจากการที่เวลาที่เหลือของสแต็กถูกดำเนินการการโยกย้ายที่จำเป็นและงานอื่น ๆ จะ "เสร็จสิ้น" - หมายความว่าระบบพร้อมใช้งานทันทีแม้ในขณะที่ติดตั้งโมดูล หรืออัพเกรด ฉันสงสัยว่าในตอนแรกสถาปนิกดั้งเดิมคิดว่าจะต้องมีระบบเริ่มต้นหรือไม่ ฉันจะคาดเดาว่าในขณะที่รหัสส่วนใหญ่ถือว่ามีอินสแตนซ์ร้านค้าพร้อมใช้งาน_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)); ไม่ประสบความสำเร็จเนื่องจากไม่มี storeview ที่โหลดได้สำหรับผู้ดูแลระบบอยู่แล้ว

บ่อยครั้งที่ฉันใช้รูปแบบเช่นนี้:

// 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ตาราง มีบันทึกที่มี 0ID นอกจากนี้หากคุณลองสิ่งนี้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()ส่งคืนร้านค้าด้วย id 1 ในสคริปต์อัพเกรด
Marius

โอ้ ... ถูกต้อง ... มีร้านค้าของผู้ดูแลระบบในฐานข้อมูลแน่นอน
bukart

1
อืม ... ฉันรู้สแต็ค แต่ตอนนี้ฉันเห็นมันในคำตอบของคุณแล้วมันก็ตีฉัน การอัปเดตควรเรียกใช้อย่างใดอย่างหนึ่ง 'ไร้สัญชาติ' แต่ในการใช้งานบางอย่างคุณต้องมีร้านค้า ดังนั้นค่าเริ่มต้นสำหรับการจัดเก็บ ทีนี้สิ่งเดียวที่ไม่สมเหตุสมผลคือ: เหตุใดร้านค้าเริ่มต้นนี้จึงไม่ใช่0(admin) และเป็นมุมมองร้านค้าที่สามารถลบได้อย่างง่ายดายจาก UI ของผู้ดูแลระบบ +1 เมื่อเปิดตา หากฉันไม่ได้รับคำตอบที่ชัดเจนเกี่ยวกับเรื่องนี้ฉันจะยอมรับสิ่งนี้
Marius

mhh ... คำถามที่ดี ... อาจจะหลังอาหารกลางวันฉันจะดู ... interresting ^^
bukart

ตั้งแต่ 1.9.3.6 Mage::app()->getCurrentStore();ไม่ปรากฏว่ามีการกำหนดและให้ข้อผิดพลาดร้ายแรงเมื่อเรียกใช้ แต่ฉันมี ID $currentStoreId = Mage::app()->getStore()->getId();โดยใช้
Eric Seastrand

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_IDคือ 1 ฉันเดาว่ามันจำเป็นต้องมีบางอย่างและไม่ได้ตั้งค่าให้เราที่ร้านค้าผู้ดูแลระบบ :(

ดังนั้นฉันจึงมีระบบที่ไม่ได้จัดเก็บด้วย id 1 และสคริปต์การอัปเดตดูเหมือนจะทำงานได้ดี หากเราเพิ่มตาราง / คุณสมบัติมันเป็นเรื่องปกติและแม้ในขณะที่เพิ่ม cms เฉพาะไซต์บล็อกสิ่งนี้ยังใช้งานได้ แต่เราได้รับรหัสร้านค้าทั้งหมดและตั้งค่าเฉพาะเมื่อบันทึกข้อมูลเฉพาะร้านค้า


ฉันขุดขึ้นมาในสิ่งเดียวกัน สิ่งที่ฉันไม่เข้าใจคือ "วีโอไอพีทำไมคุณไม่ใช้ร้านค้าผู้ดูแลระบบสำหรับการอัพเกรด" มันตะเข็บเหมาะสมกว่า ฉันกลัวที่จะคิดว่าจะเกิดอะไรขึ้นถ้าฉันลบร้านค้าที่มี id 1
Marius

ไม่มีใครจะบ้าพอที่จะลบร้านค้าเริ่มต้น;)
David Manners

ตอนนี้ฉันรู้แล้วฉันจะไม่บ้า แต่ความจริงที่เป็นไปได้ ... ดี ... ไม่เคยเชื่อถือผู้ใช้
Marius

หนึ่งใน PM ของเราถามฉันว่าเขาสามารถลบร้านค้าเก่าได้หรือไม่ ผมคิดว่าผมตอบด้วย "มีอะไรที่เลวร้ายที่สุดที่อาจเกิดขึ้น" .... และแม้กระทั่งแปลกมากขึ้นในการติดตั้งโครงการในปัจจุบันของเราเรามีร้านค้าใด ๆ กับ ID 1 :( ในตารางcore_storeแต่สคริปต์การติดตั้งกำลังทำงาน
เดวิดมารยาท

1
การเพิ่มบล็อก cms ควรกระทำในสคริปต์การอัพเกรดข้อมูล (ไม่ได้ติดตั้ง) ที่ขอบเขตการจัดเก็บไม่ได้ถูกล็อคใน Mage_Core_Model_App :: DISTRO_STORE_CODE; โดยทั่วไปแล้วสคริปต์การติดตั้งจะใช้ในการเปลี่ยนโครงสร้างข้อมูล (และมีขอบเขตการจัดเก็บที่ล็อค) ในขณะที่การอัปเกรดข้อมูลจะใช้ในการเปลี่ยนแปลงเนื้อหาข้อมูล (และขอบเขตการจัดเก็บสามารถเปลี่ยนแปลงได้ระหว่างสคริปต์)
Alessandro Ronchi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.