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 _getDefaultStore
terlihat 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.
store-view
install-script
Marius
sumber
sumber
Jawaban:
NB: jangan lupa bahwa ruang lingkup admin store tidak diatur sampai pengiriman terjadi dan pengontrol memperluas
Mage_Adminhtml_Controller_Action
dieksekusi (lihatadminhtml_controller_action_predispatch_start
acara dan pengamat terkait diMage_Adminhtml_Controller_Action::preDispatch()
).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.
sumber
Oke, untuk menggunakan admin store di skrip upgrade Anda, gunakan saja
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 adminSeringkali saya menggunakan pola seperti ini:
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)
:metode
_initModules()
ini dipanggil sebelum$scopeCode
dan$scopeType
ditentukan.Saat ini saya tidak tahu di mana fallback yang diasumsikan didefinisikan.
sumber
core_store
tabel. Ada catatan dengan id0
. 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 mencobaMage::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 mengapaMage::app()->getStore()
mengembalikan toko dengan id 1 di skrip pemutakhiran.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.Mage::app()->getCurrentStore();
tampaknya tidak didefinisikan dan memberikan kesalahan fatal saat dipanggil. Sebagai gantinya, saya menggunakan ID$currentStoreId = Mage::app()->getStore()->getId();
.Jadi jawaban dasarnya adalah bahwa itu benar-benar masuk ke 3 jika ..... tunggu apa
Bagi saya itu mengembalikan benar
Mage::isInstalled()
dan salah$this->getUpdateMode()
yang kedengarannya salah. Tapi ini hanya terjadi pada hit pertamagetStore
.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:
Nilai
self::DISTRO_STORE_ID
1 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.
sumber
core_store
tetapi skrip pengaturan berfungsi