Toko saat ini adalah 1 saat menjalankan skrip upgrade

15

Adakah ide mengapa Mage::app()->getStore()mengembalikan tampilan toko dengan id 1 ketika di dalam skrip pemutakhiran independen pada tampilan toko saya menjalankan skrip pemutakhiran di (bahkan admin)?
Maksudku, aku tahu di mana kode yang melakukan ini. Di sini Mage_Core_Model_App::getStore()ada:

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

dan _getDefaultStoreterlihat seperti ini:

   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 selalu kosong saat mencapai metode di atas.

Saya mendapatkan hasil yang sama bahkan jika saya menambahkan ini di bagian atas skrip pemutakhiran:

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

Saya ingin tahu tentang logika bisnis memiliki 'fitur' ini.

Marius
sumber
Saya pikir skrip pemutakhiran selalu berjalan dalam cakupan frontend. Seringkali saya memberi tahu skrip pemutakhiran secara eksplisit untuk menggunakan admin store untuk baris berikut.
bukart
@Bukart. Saya mencoba secara eksplisit memberi tahu skrip pemutakhiran untuk menjalankan tampilan admin store, tetapi saya mendapatkan hasil yang sama. Lihat 3 baris terakhir saya di pertanyaan.
Marius
Saya mencoba menjawab pertanyaan Anda di bawah ini
bukart

Jawaban:

5

NB: jangan lupa bahwa ruang lingkup admin store tidak diatur sampai pengiriman terjadi dan pengontrol memperluas Mage_Adminhtml_Controller_Actiondieksekusi (lihat adminhtml_controller_action_predispatch_startacara dan pengamat terkait di Mage_Adminhtml_Controller_Action::preDispatch()).

Saya ingin tahu tentang logika bisnis memiliki 'fitur' ini.

Anda bukan satu-satunya; yang mengatakan, kita mungkin tidak pernah tahu kecuali Moshe atau Dima ingin membahas.

Script pengaturan dijalankan di awal inisialisasi aplikasi. Rancangan ini mungkin disebabkan sehingga, pada saat sisa tumpukan dieksekusi, migrasi yang diperlukan dan pekerjaan lain akan "selesai" - artinya sistem siap digunakan segera bahkan ketika modul sedang dipasang atau ditingkatkan. Saya bertanya-tanya apakah arsitek asli awalnya pernah berpikir akan ada kebutuhan untuk sistem yang lebih diinisialisasi. Saya akan menduga bahwa, sementara banyak kode mengasumsikan bahwa ada contoh toko yang tersedia, _getDefaultStore()logika memastikan bahwa ada contoh toko.

Pengaturan cakupan penuh tersedia dalam 1.4.0.0 dan lebih tinggi melalui skrip pengaturan data.

tanda batas
sumber
3

Oke, untuk menggunakan admin store di skrip upgrade Anda, gunakan saja

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

Pendekatan Anda Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); tidak dapat berhasil, karena tidak ada tampilan toko yang dapat dimuat untuk admin

Seringkali saya menggunakan pola seperti ini:

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

Kalau tidak, kadang-kadang setelah skrip pemutakhiran dijalankan, pengunjung Anda akan diarahkan ke halaman admin, bukan ke frontend.


Memperbarui:

Saya salah mengartikan pertanyaan di bawah ini, jadi inilah upaya baru untuk menjelaskan ^^

Skrip pemutakhiran dipanggil dari metode yang lebih dalam di inti ( Mage_Core_Model_Resource_Setup::_modifyResourceDb(...))

Di sini saya mencoba daftar stack

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

dan sekarang lihat 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;
}

metode _initModules()ini dipanggil sebelum $scopeCodedan $scopeTypeditentukan.

Saat ini saya tidak tahu di mana fallback yang diasumsikan didefinisikan.

bukart
sumber
Oh, tapi ada tampilan toko yang dapat dimuat untuk admin. lihatlah di core_storetabel. Ada catatan dengan id 0. Juga jika Anda mencoba ini, var_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))Anda akan mendapatkan contoh toko admin yang valid. Juga mencoba Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);tetapi saya mendapatkan hasil yang sama. Tetapi pertanyaan saya bukan tentang bagaimana mengatur admin store dalam skrip upgrade. Saya bertanya mengapa Mage::app()->getStore()mengembalikan toko dengan id 1 di skrip pemutakhiran.
Marius
oh ... benar ... memang ada toko admin di database, memang.
bukart
1
Hmm ... Saya tahu tumpukan tetapi sekarang saya sudah melihatnya di jawaban Anda itu memukul saya. Pembaruan harus berjalan entah bagaimana 'stateless'. Tetapi untuk menjalankan sesuatu Anda membutuhkan toko. Oleh karena itu nilai default untuk toko. Sekarang satu-satunya hal yang tidak masuk akal adalah: Mengapa toko default ini tidak 0(admin) dan merupakan tampilan toko yang bisa dengan mudah dihapus dari UI admin? +1 untuk membuka mata saya. Jika saya tidak mendapatkan jawaban lain yang jelas tentang ini, saya akan menerima ini.
Marius
mhh ... pertanyaan bagus ... mungkin setelah makan siang saya akan melihat ... interresting ^^
bukart
Pada 1.9.3.6, Mage::app()->getCurrentStore();tampaknya tidak didefinisikan dan memberikan kesalahan fatal saat dipanggil. Sebagai gantinya, saya menggunakan ID $currentStoreId = Mage::app()->getStore()->getId();.
Eric Seastrand
2

Jadi jawaban dasarnya adalah bahwa itu benar-benar masuk ke 3 jika ..... tunggu apa

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

Bagi saya itu mengembalikan benar Mage::isInstalled()dan salah $this->getUpdateMode()yang kedengarannya salah. Tapi ini hanya terjadi pada hit pertama getStore.

Jadi tampaknya mengatur toko sebelum mode pembaruan telah ditetapkan, kemudian ketika kembali dalam skrip set-up ia menggunakan panggilan store default yang menggunakan kode berikut:

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

Nilai self::DISTRO_STORE_ID1 saya kira karena perlu sesuatu dan tidak diatur untuk kita admin store :(

Jadi saya sebenarnya memiliki sistem yang belum menyimpan dengan id 1 dan skrip pembaruan tampaknya berfungsi dengan baik. Jika kita menambahkan tabel / atribut itu baik dan bahkan ketika menambahkan blok cms spesifik situs ini juga berfungsi, tetapi kita mendapatkan semua id toko dan secara khusus mengaturnya saat menyimpan data spesifik toko.

David Manners
sumber
Saya menggali hal yang sama. Yang tidak saya mengerti adalah "Magento mengapa kamu tidak menggunakan admin store untuk peningkatan?". Jahitannya lebih masuk akal. Saya takut untuk berpikir apa yang terjadi jika saya menghapus toko dengan id 1.
Marius
Tidak ada yang akan cukup gila untuk menghapus toko default;)
David Manners
Sekarang saya tahu ini, saya tidak akan gila, tetapi kenyataan bahwa itu mungkin ... well ... jangan pernah mempercayai pengguna.
Marius
Salah satu PM kami bertanya apakah dia bisa melepas toko lama minggu lalu. Saya pikir saya menjawab dengan "Apa hal terburuk yang bisa terjadi" .... dan bahkan lebih aneh dalam pengaturan proyek kami saat ini, kami tidak memiliki toko dengan id 1 :( dalam tabel core_storetetapi skrip pengaturan berfungsi
David Manners
1
menambahkan blok cms harus dilakukan dalam skrip pemutakhiran data (tidak menginstal) di mana ruang lingkup toko tidak dikunci ke Mage_Core_Model_App :: DISTRO_STORE_CODE; lebih umum, skrip instal digunakan untuk mengubah struktur data (dan memiliki lingkup toko terkunci) sementara pemutakhiran data digunakan untuk mengubah konten data (dan cakupan toko dapat diubah selama skrip)
Alessandro Ronchi