Có nhiều lượt xem cửa hàng chia sẻ cùng một dãy số tăng dần_id


13

Magento có thể được cấu hình theo cách mà nhiều lượt xem cửa hàng của cùng một trang web có thể chia sẻ cùng mộtincrement_id phạm vi số thứ tự không? Và nếu vậy thì thế nào?

Ví dụ: với thiết lập nhiều tầng như thế này trong core_store:

store_id        code    website_id    group_id
       0       admin             0           0
       1       alpha             1           1
       2       bravo             2           2
       3     charlie             2           2

Bây giờ một giao diện cửa hàng mới deltađược thêm vào:

store_id        code    website_id    group_id
       4       delta             1           1

Giả sử alphaid gia tăng đơn hàng cuối cùng hiện tại là 1000123, làm thế nào để đạt được:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

Cùng một câu hỏi dành cho nhiều lượt xem cửa hàng chia sẻ cùng một increment_idphạm vi số hóa đơn và / hoặc chia sẻ cùng một increment_idphạm vi số tín dụng.

Magento có hỗ trợ điều này không?


Với sự hướng dẫn từ @ alessandro-ronchi tôi đã thực hiện giải pháp như thế này. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e hoạt động tuyệt vời cho tôi.
Michael

Câu trả lời:


5

Tôi tưởng tượng rằng điều này sẽ khá khó khăn. Id tăng được lưu trữ trong eav_entity_storebảng và không có gì ngạc nhiên khi mỗi cửa hàng có mục nhập riêng được cập nhật khi đơn hàng (và báo giá, hóa đơn, v.v.) được tạo. Để có được tất cả các cửa hàng sử dụng cùng một bộ tăng, bạn cần phải viết lại logic này để nó sử dụng cùng một hàng trong DB. Khá nhiều tác động này có thể có trên các khu vực khác của trang web là một cái gì đó khác cần phải được xem xét.


Tôi đồng ý với Richard.
Sylvain Rayé

Bạn có thể đúng nhưng việc chạy mã này đã khiến tất cả các hóa đơn của tôi tuân theo một chuỗi số giống nhauMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh

3

Bạn có thể ghi đè lên các đơn đặt hàng, shippings, hóa đơn và mô hình gia tăng ghi nhớ tín dụng bằng cách viết lại lớp "eav / entity_increment_numeric" cung cấp logic tùy chỉnh trong Mô hình của bạn.

Hãy xem các lớp tổ tiên (Mage_Eav_Model_Entity_Increment_Numeric và Mage_Eav_Model_Entity_Increment_Abauge) để hiểu cách cung cấp logic của riêng bạn.

Bạn có thể phân biệt logic giữa các thực thể khác nhau bằng cách kiểm tra tham số $ entityTypeCode của hàm getNextId () mà bạn sẽ ghi đè.

Một cách khác (xâm lấn hơn) là chỉ định một mô hình gia tăng khác nhau cho từng loại thực thể bằng cách ghi đè (thông qua tập lệnh cài đặt) giá trị của cột "lũy tiến_model" của bảng "eav_entity_type". Cá nhân tôi thích giải pháp "viết lại" được đề cập ở trên.

Hãy chú ý: id gia tăng có một ràng buộc duy nhất trong các phiên bản Magento mới nhất để bạn không thể lưu trữ cùng một id gia tăng cho hai thực thể khác nhau cùng loại. Nói cách khác, bạn không thể có hai hóa đơn khác nhau có cùng id tăng.

Hy vọng nó giúp.


Đã xem xét điều này nhưng tôi không thể tìm thấy getLastId()trong Mage_Eav_Model_Entity_Increment_Numerichoặc trong bất kỳ lớp hoặc giao diện nào khác trong hệ thống phân cấp. Btw, đây sẽ là câu trả lời được chấp nhận.
Michael

CẬP NHẬT: Chỉ cần nhận ra đó là một tài sản được thiết lập Varien_ObjecttừMage_Eav_Model_Entity_Type
Michael

Đã triển khai nó như thế này: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
Michael

2

Trong khi đào sâu hơn, tôi nhận ra rằng eav_entity_type.increment_per_storecó thể hữu ích.

Nó là. Nhưng chỉ trong trường hợp này, khi bạn muốn tất cả các lượt xem cửa hàng (trên toàn cầu, bất kể trang web nào được xác định trong) cài đặt Magento của bạn để chia sẻ cùng một increment_idphạm vi số thứ tự .

Điều này không giải quyết được vấn đề cụ thể của tôi, nhưng có lẽ nó hữu ích với một số người khác, vì vậy chúng tôi đi đây:

Để kích hoạt chia sẻ toàn cầu số thứ tự của bạn, hãy eav_entity_type.increment_per_stoređặt thực thể đơn hàng thành 0,

Điều này dẫn đến Mage_Eav_Model_Entity_Type::fetchNewIncrementId()việc sử dụng store_id = 0khi tải eav_entity_storebản ghi của thực thể đơn hàng, bất kể cửa hàng xem nó thực sự thuộc về cửa hàng nào.

Nếu không có hồ sơ như vậy tồn tại, Magento tạo ra một, sử dụng store_idincrement_prefixcủa 0.

public function fetchNewIncrementId($storeId = null)
{
    if (!$this->getIncrementModel()) {
        return false;
    }

    if (!$this->getIncrementPerStore() || ($storeId === null)) {
        /**
         * store_id null we can have for entity from removed store
         */
        $storeId = 0;
    }

    // Start transaction to run SELECT ... FOR UPDATE
    $this->_getResource()->beginTransaction();

    $entityStoreConfig = Mage::getModel('eav/entity_store')
        ->loadByEntityStore($this->getId(), $storeId);

    if (!$entityStoreConfig->getId()) {
        $entityStoreConfig
            ->setEntityTypeId($this->getId())
            ->setStoreId($storeId)
            ->setIncrementPrefix($storeId)
            ->save();
    }

    $incrementInstance = Mage::getModel($this->getIncrementModel())
        ->setPrefix($entityStoreConfig->getIncrementPrefix())
        ->setPadLength($this->getIncrementPadLength())
        ->setPadChar($this->getIncrementPadChar())
        ->setLastId($entityStoreConfig->getIncrementLastId())
        ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
        ->setStoreId($entityStoreConfig->getStoreId());

    /**
     * do read lock on eav/entity_store to solve potential timing issues
     * (most probably already done by beginTransaction of entity save)
     */
    $incrementId = $incrementInstance->getNextId();
    $entityStoreConfig->setIncrementLastId($incrementId);
    $entityStoreConfig->save();

    // Commit increment_last_id changes
    $this->_getResource()->commit();

    return $incrementId;
}

Điều này sẽ làm việc cho bất kỳ loại thực thể bằng cách sử dụng eav/entity_increment_numericmô hình, như order, invoice, shipmentcreditmemo.

Mặc dù vậy, hãy lưu ý rằng tôi không thể tìm thấy bất kỳ tài liệu chính thức increment_per_storenào. Và không có tùy chọn nào trong phần phụ trợ Magento cho phép bạn định cấu hình này.

Điều này có thể có hoặc không có nghĩa là nó không được sử dụng chính thức.

Sử dụng có nguy cơ của riêng bạn. Nếu những thay đổi của bạn tàn phá, đừng đổ lỗi cho tôi. Bạn đã được cảnh báo ^^


1

Nó không được hỗ trợ ngoài luồng. Tôi cũng muốn làm điều này một lần để có kho lưu trữ thứ hai cho Thử nghiệm A / B chia sẻ cùng mức tăng_id từ cửa hàng ban đầu.

Tôi đã cố gắng khớp 2 số đó theo cách đơn giản khi checkout_submit_all_afterbị bắn, nhưng cảm thấy rất khó chịu với nó, vì vậy tôi đã bỏ nó. Tôi đoán với số lượt xem nhiều hơn và nhiều lưu lượng truy cập, điều này có thể dẫn đến một mớ hỗn độn thực sự, do đó bạn phải đào sâu hơn về logic Magentos.


0

Giải pháp:

Có một đơn đặt hàng / hóa đơn / tín dụng khác nhau, v.v ... phạm vi số khá đẹp, đối với các quốc gia khác nhau, điều này thường có nghĩa là ở cấp độ nhóm cửa hàng.

Nhưng có phạm vi số khác nhau ở cấp độ xem cửa hàng là một điều tồi tệ nếu bạn sử dụng chế độ xem cửa hàng cho các ngôn ngữ khác nhau, điều này có thể được thực hiện trong 90% của tất cả các trường hợp.

May mắn thay, nó không khó như đề xuất trong chủ đề này:

Những gì chúng ta sẽ làm là chúng ta tìm nạp id xem cửa hàng mặc định thay vì sử dụng id xem cửa hàng mà phương thức được gọi với . Chúng tôi đang làm điều này bằng cách giải quyết nhóm cửa hàng cho chế độ xem cửa hàng hiện tại và tìm nạp id chế độ xem cửa hàng mặc định của nó. Sau đó, mọi chế độ xem cửa hàng của một nhóm cửa hàng cụ thể sử dụng cùng một định dạng phạm vi số (một từ chế độ xem cửa hàng mặc định).

Tạo lớp này:

class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
    /**
     * Retreive new incrementId
     *
     * @param int $storeId
     * @return string
     * @throws Exception
     */
    public function fetchNewIncrementId($storeId = null)
    {
        if (!$this->getIncrementModel()) {
            return false;
        }

        if (!$this->getIncrementPerStore() || ($storeId === null)) {
            /**
             * store_id null we can have for entity from removed store
             */
            $storeId = 0;
        }

        //FIX START:
        $groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
        $group =  Mage::getModel('core/store_group')->load($groupId);
        $storeId = $group->getDefaultStoreId();
        //FIX END:

        // Start transaction to run SELECT ... FOR UPDATE
        $this->_getResource()->beginTransaction();

        try {

            $entityStoreConfig = Mage::getModel('eav/entity_store')
                ->loadByEntityStore($this->getId(), $storeId);

            if (!$entityStoreConfig->getId()) {
                $entityStoreConfig
                    ->setEntityTypeId($this->getId())
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($storeId)
                    ->save();
            }

            $incrementInstance = Mage::getModel($this->getIncrementModel())
                ->setPrefix($entityStoreConfig->getIncrementPrefix())
                ->setPadLength($this->getIncrementPadLength())
                ->setPadChar($this->getIncrementPadChar())
                ->setLastId($entityStoreConfig->getIncrementLastId())
                ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
                ->setStoreId($entityStoreConfig->getStoreId());

            /**
             * do read lock on eav/entity_store to solve potential timing issues
             * (most probably already done by beginTransaction of entity save)
             */
            $incrementId = $incrementInstance->getNextId();
            $entityStoreConfig->setIncrementLastId($incrementId);
            $entityStoreConfig->save();

            // Commit increment_last_id changes
            $this->_getResource()->commit();
        } catch (Exception $e) {
            $this->_getResource()->rollBack();
            throw $e;
        }

        return $incrementId;
    }

}

Thêm phần viết lại này vào config.xml của mô-đun của bạn:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

Nếu bạn có một cách đẹp hơn, mà không phải viết lại truyền bá kiến ​​thức. Chúc vui vẻ. Đừng hack lõi.

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.