Güncelleme komut dosyaları çalıştırılırken mevcut mağaza 1'dir


15

Herhangi bir fikir neden Mage::app()->getStore()mağaza görünümünde bağımsız yükseltme komut dosyaları içinde id 1 ile mağaza görünümünü döndürür Ben yükseltme komut dosyası (hatta admin) çalıştırıyorum?
Yani, bunu yapan kodun nerede olduğunu biliyorum. İçinde Mage_Core_Model_App::getStore()bu var:

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

ve _getDefaultStoreşuna benzer:

   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 yukarıdaki yönteme ulaşıldığında her zaman boştur.

Yükseltme komut dosyasının en üstüne eklesem bile aynı sonucu alıyorum:

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

Bu 'özelliğe' sahip olmanın iş mantığını merak ediyorum.


Yükseltme komut dosyalarının her zaman ön uç kapsamında çalıştığını düşündüm. Genellikle yükseltme komut dosyalarını aşağıdaki satırlar için yönetici deposunu kullanmayı açık bir şekilde söylerim.
bukart

@bukart. Açıkça yönetici mağaza görünümünü çalıştırmak için yükseltme komut dosyası anlatmaya çalıştım, ama aynı sonucu elde. Sorudaki son 3 satırımı görün.
Marius

Sorunuzu aşağıda cevaplamaya çalıştım
bukart

Yanıtlar:


5

Not: gönderme gerçekleşene ve bir denetleyici genişletilene kadar yönetici deposu kapsamının ayarlanmadığını unutmayın Mage_Adminhtml_Controller_Action( adminhtml_controller_action_predispatch_startolaya ve ilgili gözlemciye bakın Mage_Adminhtml_Controller_Action::preDispatch()).

Bu 'özelliğe' sahip olmanın iş mantığını merak ediyorum.

Sadece sen değilsin; dedi ki, Moshe veya Dima olmadan asla bilemeyiz tartışmak istemedikçe .

Kurulum komut dosyaları uygulama başlatma işleminin başlarında yürütülür. Bunun tasarımı muhtemelen, yığının geri kalanı yürütüldüğünde, gerekli geçişler ve diğer işlerin "yapılması" anlamına gelir - yani bir modül kurulurken bile sistemin hemen kullanıma hazır olduğu anlamına gelir. veya yükseltilmiş. Orijinal mimarların başlangıçta daha başlatılmış bir sisteme ihtiyaç olacağını düşünüp düşünmediğini merak ediyorum. Buna karşın, kodun çoğunun kullanılabilir bir mağaza örneği olduğunu varsayarken , _getDefaultStore()mantığın bir mağaza örneği olmasını sağlar.

Tam kapsamlı ayarlara 1.4.0.0 ve sonraki sürümlerde veri kurulum komut dosyaları aracılığıyla erişilebilir.


3

Tamam, yükseltme komut dosyalarınızda yönetici deposunu kullanmak için

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

Yaklaşımınız Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); başarılı olamaz, çünkü yönetici için gerçekten mevcut bir yüklenebilir mağaza görünümü yok

Genellikle böyle bir desen kullanıyorum:

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

Aksi takdirde, bazen bir yükseltme komut dosyası yürütüldükten sonra, ziyaretçileriniz bazen ön uç yerine yönetici sayfasına yönlendirilir.


Güncelleme:

Aşağıdaki soruyu yanlış yorumladım, işte yeni bir açıklama denemek ^^

Yükseltme komut dosyaları, çekirdeğin daha derinindeki bir yöntemden çağrılır (Mage_Core_Model_Resource_Setup::_modifyResourceDb(...) )

Burada yığını listelemeye çalıştım

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

ve şimdi bir göz atın 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;
}

yöntem ve _initModules()öncesi çağrılır.$scopeCode$scopeType belirlenir.

Şu anda varsayılan geri dönüşün nerede tanımlandığını anlayamıyorum.


Oh, ama yönetici için yüklenebilir bir mağaza görünümü var. core_storetabloya bir göz atın . Kimliğine sahip bir kayıt var 0. Ayrıca bunu denerseniz var_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)), yönetici deposunun geçerli bir örneğini alırsınız. Ayrıca denedim Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);ama aynı sonucu alıyorum. Ancak sorum, yükseltme deposunda yönetici deposunun nasıl ayarlanacağıyla ilgili değildi. Neden Mage::app()->getStore()yükseltme komut dosyalarında kimlik 1 ile mağaza döner soruyordu .
Marius

oh ... doğru ... veritabanında gerçekten bir yönetici mağazası var.
bukart

1
Hmm ... Yığını biliyordum ama şimdi cevabında gördüğüme göre bana vurdu. Güncellemeler bir şekilde 'vatansız' çalışmalıdır. Ama bir şeyi çalıştırmak için bir mağazaya ihtiyacınız var. Bu nedenle mağaza için varsayılan bir değer. Şimdi mantıklı olmayan tek şey şu: Neden bu varsayılan mağaza 0(admin) değil ve yönetici arayüzünden kolayca silinebilecek bir mağaza görünümü? Gözlerimi açmak için +1. Bu konuda başka net bir cevap alamazsam, bunu kabul edeceğim.
Marius

mhh ... iyi soru ... belki öğle yemeğinden sonra bir göz
atacağım

1.9.3.6 itibariyle Mage::app()->getCurrentStore();tanımlanmış görünmüyor ve çağrıldığında önemli bir hata veriyor. Bunun yerine, kimliği kullanarak aldım $currentStoreId = Mage::app()->getStore()->getId();.
Eric Seastrand

2

Yani temel cevap aslında 3. eğer alır ..... ne bekle :(

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

Benim için Mage::isInstalled()yanlış $this->getUpdateMode()ve kulağa yanlış geliyor. Ama bu sadece ilk vuruşundagetStore .

Bu nedenle, güncelleme modu ayarlanmadan önce mağazayı kurduğu anlaşılıyor, daha sonra kurulum komut dosyasına geri geldiğinde, aşağıdaki kodu kullanan varsayılan mağaza çağrısını kullanıyor:

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

Değeri self::DISTRO_STORE_ID 1 sanırım bir şey gerekiyor ve yönetici mağaza bize kurulum değildi sanırım :(

Bu yüzden aslında id 1 ile saklamamış bir sistemim var ve güncelleme betiği iyi çalışıyor gibi görünüyor. Tablolar / öznitelikler ekliyorsak, sorun değil ve siteye özgü cms bloğu eklerken bile bu da işe yarıyor, ancak tüm mağaza kimliğini alıyor ve mağazaya özel verileri kaydederken özellikle ayarlıyoruz.


Aynı şeyi kazdım. Ne anlamıyorum "Magento neden u yükseltmeler için yönetici mağaza kullanın?". Daha makul dikişler.
Marius

Kimse varsayılan mağazayı silmek için yeterince deli olmaz;)
David Manners

Şimdi bunu bildiğime göre, deli olmayacağım, ama bunun mümkün olduğu gerçeği ... şey ... bir kullanıcıya asla güvenme.
Marius

Başbakanlarımızdan biri bana geçen hafta eski mağazaları kaldırabileceğini sordu. Sanırım "Olabilecek en kötü şey ne" diye cevap verdim .... ve mevcut proje kurulumumuzda daha da garip olan id 1 :( tablosunda hiçbir mağazamız yok core_storeama kurulum komut dosyaları çalışıyor
David Manners

1
mağaza kapsamının Mage_Core_Model_App :: DISTRO_STORE_CODE içine kilitlenmediği bir veri yükseltme (kurulum değil) betiğinde bir cms bloğu eklenmesi gerekir; daha genel olarak, veri içeriğini değiştirmek (ve mağaza kapsamını kilitlemek) için yükleme komut dosyaları kullanılırken, veri içeriğini değiştirmek için veri yükseltme kullanılır (ve komut dosyası sırasında depo kapsamı değiştirilebilir)
Alessandro Ronchi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.