Cửa hàng hiện tại là 1 khi chạy các kịch bản nâng cấp


15

Bất kỳ ý tưởng nào tại sao Mage::app()->getStore()trả về chế độ xem cửa hàng với id 1 khi bên trong các tập lệnh nâng cấp độc lập với chế độ xem cửa hàng Tôi đang chạy tập lệnh nâng cấp trong (ngay cả quản trị viên)?
Ý tôi là, tôi biết mã đó làm ở đâu. Trong Mage_Core_Model_App::getStore()đó có:

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

_getDefaultStoretrông như thế này:

   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 luôn trống khi đạt đến phương thức trên.

Tôi nhận được kết quả tương tự ngay cả khi tôi thêm phần này vào đầu tập lệnh nâng cấp:

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

Tôi tò mò về logic kinh doanh của việc có 'tính năng' này.


Tôi nghĩ rằng các kịch bản nâng cấp luôn chạy trong phạm vi frontend. Thông thường tôi nói các kịch bản nâng cấp rõ ràng để sử dụng cửa hàng quản trị cho các dòng sau.
bukart

@bukart. Tôi đã cố gắng nói rõ kịch bản nâng cấp để chạy chế độ xem cửa hàng quản trị, nhưng tôi nhận được kết quả tương tự. Xem 3 dòng cuối cùng của tôi trong câu hỏi.
Marius

Tôi đã cố gắng trả lời câu hỏi của bạn dưới đây
bukart

Câu trả lời:


5

Lưu ý: đừng quên rằng phạm vi cửa hàng quản trị viên không được đặt cho đến khi việc gửi đi diễn ra và bộ điều khiển mở rộng Mage_Adminhtml_Controller_Actionthực thi (xem adminhtml_controller_action_predispatch_startsự kiện và người quan sát có liên quan trong Mage_Adminhtml_Controller_Action::preDispatch()).

Tôi tò mò về logic kinh doanh của việc có 'tính năng' này.

Bạn không phải là người duy nhất; điều đó nói rằng, chúng ta có thể không bao giờ biết trừ khi Moshe hoặc Dima muốn thảo luận.

Các kịch bản thiết lập thực thi sớm trong khởi tạo ứng dụng. Thiết kế của điều này có lẽ là do, vào thời điểm phần còn lại của ngăn xếp được thực thi, việc di chuyển cần thiết và các công việc khác sẽ được "thực hiện" - có nghĩa là hệ thống đã sẵn sàng để sử dụng ngay cả khi cài đặt mô-đun hoặc nâng cấp. Tôi tự hỏi nếu các kiến ​​trúc sư ban đầu từng nghĩ rằng sẽ cần một hệ thống khởi tạo hơn. Tôi sẽ phỏng đoán rằng, trong khi phần lớn mã cho rằng có một phiên bản cửa hàng có sẵn,_getDefaultStore() logic đảm bảo rằng có một phiên bản cửa hàng.

Cài đặt phạm vi đầy đủ có sẵn trong 1.4.0.0 trở lên thông qua các tập lệnh thiết lập dữ liệu.


3

Ok, để sử dụng cửa hàng quản trị trong tập lệnh nâng cấp của bạn, chỉ cần sử dụng

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

Cách tiếp cận của bạn Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); không thể thành công, vì không có kho lưu trữ có thể tải thực sự cho quản trị viên

Tôi thường sử dụng một mô hình như thế này:

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

Mặt khác, đôi khi sau khi tập lệnh nâng cấp được thực thi, khách truy cập của bạn sẽ được chuyển hướng đến trang quản trị thay vì giao diện đôi khi.


Cập nhật:

Tôi đã giải thích sai câu hỏi dưới đây, vì vậy đây là một cố gắng mới để giải thích ^^

Các kịch bản nâng cấp được gọi từ một phương thức sâu hơn trong lõi ( Mage_Core_Model_Resource_Setup::_modifyResourceDb(...))

Ở đây tôi đã cố gắng liệt kê ngăn xếp

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

và bây giờ hãy xem 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;
}

phương thức _initModules()được gọi trước $scopeCode$scopeTypeđược xác định.

Hiện tại tôi không thể tìm ra nơi dự phòng giả định được xác định.


Ồ, nhưng có một chế độ xem cửa hàng có thể tải cho quản trị viên. hãy nhìn vào core_storebảng Có một bản ghi với id 0. Ngoài ra nếu bạn thử điều này, var_dump(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID))bạn sẽ nhận được một phiên bản hợp lệ của cửa hàng quản trị. Cũng đã thử Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);nhưng tôi nhận được kết quả tương tự. Nhưng câu hỏi của tôi không phải là về cách đặt cửa hàng quản trị trong các tập lệnh nâng cấp. Tôi đã hỏi tại sao Mage::app()->getStore()trả lại cửa hàng với id 1 trong các kịch bản nâng cấp.
Marius

ồ ... đúng rồi ... thực sự có một cửa hàng quản trị trong cơ sở dữ liệu.
bukart

1
Hmm ... Tôi biết ngăn xếp nhưng bây giờ tôi đã thấy nó trong câu trả lời của bạn, nó đánh tôi. Các bản cập nhật sẽ chạy bằng cách nào đó "không quốc tịch". Nhưng để chạy một cái gì đó bạn cần một cửa hàng. Do đó một giá trị mặc định cho các cửa hàng. Bây giờ, điều duy nhất không có ý nghĩa là: Tại sao cửa hàng mặc định này không phải là 0(quản trị viên) và là chế độ xem cửa hàng có thể dễ dàng bị xóa khỏi giao diện người dùng quản trị viên? +1 để mở mắt của tôi. Nếu tôi không nhận được câu trả lời rõ ràng khác về điều này, tôi sẽ chấp nhận điều này.
Marius

mhh ... câu hỏi hay ... có lẽ sau bữa ăn trưa, tôi sẽ xem ...
can thiệp

Kể từ 1.9.3.6, Mage::app()->getCurrentStore();dường như không được xác định và gây ra lỗi nghiêm trọng khi được gọi. Thay vào đó, tôi đã nhận được ID bằng cách sử dụng $currentStoreId = Mage::app()->getStore()->getId();.
Eric Seastrand

2

Vì vậy, câu trả lời cơ bản là nó thực sự được vào thứ 3 nếu ..... đợi gì :(

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

Đối với tôi, nó trả về true Mage::isInstalled()và false cho $this->getUpdateMode()âm thanh sai. Nhưng điều này chỉ xảy ra trên hit đầu tiên của getStore.

Vì vậy, có vẻ như nó thiết lập cửa hàng trước khi chế độ cập nhật được thiết lập, sau đó khi nó quay lại trong tập lệnh thiết lập, nó sử dụng lệnh gọi cửa hàng mặc định sử dụng mã sau:

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

Giá trị self::DISTRO_STORE_IDlà 1 Tôi đoán vì nó cần thứ gì đó và không được thiết lập cho chúng tôi cửa hàng quản trị :(

Vì vậy, tôi thực sự có một hệ thống không lưu trữ với id 1 và tập lệnh cập nhật dường như hoạt động tốt. Nếu chúng tôi đang thêm bảng / thuộc tính thì vẫn ổn và ngay cả khi thêm khối cms cụ thể của trang, điều này cũng hoạt động, nhưng chúng tôi nhận được tất cả id cửa hàng và đặt riêng chúng khi lưu dữ liệu cụ thể của cửa hàng.


Tôi đã đào lên điều tương tự. Điều tôi không hiểu là "Magento tại sao bạn không sử dụng cửa hàng quản trị để nâng cấp?". Nó đường may hợp lý hơn. Tôi sợ nghĩ điều gì sẽ xảy ra nếu tôi xóa cửa hàng với id 1.
Marius

Không ai đủ điên rồ để xóa cửa hàng mặc định;)
David Manners

Bây giờ tôi biết điều này, tôi sẽ không điên, nhưng thực tế là nó có thể ... à ... không bao giờ tin người dùng.
Marius

Một trong những Thủ tướng của chúng tôi đã hỏi tôi rằng liệu anh ấy có thể loại bỏ các cửa hàng cũ vào tuần trước không. Tôi nghĩ rằng tôi đã trả lời với "Điều tồi tệ nhất có thể xảy ra" .... và thậm chí kỳ quặc hơn trong thiết lập dự án hiện tại của chúng tôi, chúng tôi không có cửa hàng nào có id 1 :( trong bảng core_storenhưng các tập lệnh thiết lập đang hoạt động
David Manners

1
việc thêm khối cms phải được thực hiện trong tập lệnh nâng cấp dữ liệu (không cài đặt) trong đó phạm vi cửa hàng không bị khóa đối với Mage_Core_Model_App :: DISTRO_STORE_CODE; nói chung, các tập lệnh cài đặt được sử dụng để thay đổi cấu trúc dữ liệu (và đã khóa phạm vi lưu trữ) trong khi nâng cấp dữ liệu được sử dụng để thay đổi nội dung dữ liệu (và phạm vi lưu trữ có thể được thay đổi trong tập lệnh)
Alessandro Ronchi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.