একাধিক স্টোর ভিউ থাকার পরে একই ক্রমটি ক্রমবৃদ্ধি_সংখ্যার সীমা ভাগ করে নেওয়া


13

ম্যাজেন্টো কি কোনও উপায়ে কনফিগার করা যায়, একই ওয়েবসাইটের একাধিক স্টোর ভিউ একই অর্ডার increment_idনম্বর পরিধি ভাগ করতে পারে? এবং যদি তা হয়, কিভাবে?

উদাহরণস্বরূপ, এখানে একটি মাল্টিস্টোর সেটআপ সহ 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

এখন একটি নতুন স্টোর ভিউ যুক্ত deltaকরা হয়েছে:

store_id        code    website_id    group_id
       4       delta             1           1

ধরে alphaনিচ্ছি যে শেষ অর্ডার ইনক্রিমেন্ট আইডি বর্তমানে 1000123, কীভাবে অর্জন করবেন:

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

একই চালানটি একই চালান increment_idনম্বর পরিসীমা ভাগ করে নেওয়ার জন্য এবং / অথবা একই ক্রেডিটমেমো increment_idনম্বর পরিসীমা ভাগ করে নেওয়ার জন্য একাধিক স্টোর ভিউয়ের জন্য যায় ।

ম্যাজেন্টো কি এই বাক্সটিকে বাইরে সমর্থন করে?


@ অলেসান্দ্রো-রঞ্চি থেকে দিকনির্দেশ দিয়ে আমি সমাধানটি এর মতো বাস্তবায়িত করেছি। gist.github.com/mblaren/012dce6f55ad5d442f41e9157e74530e আমার জন্য দুর্দান্ত কাজ করে।
মাইকেল

উত্তর:


5

আমি ভাবতাম যে এটি বেশ কঠিন হবে। বর্ধিত eav_entity_storeআইডিগুলির সারণীতে সংরক্ষণ করা হয় এবং আশ্চর্যজনকভাবে প্রতিটি স্টোরের নিজস্ব প্রবেশ রয়েছে যা একটি আদেশ (এবং উদ্ধৃতি, চালান ইত্যাদি) তৈরি হওয়ার পরে আপডেট হয়। সমস্ত স্টোরকে একই ইনক্রিমেন্টার ব্যবহার করার জন্য আপনাকে এই যুক্তিটি আবার লিখতে হবে যাতে এটি ডিবিতে একই সারি ব্যবহার করে। সাইটের অন্যান্য ক্ষেত্রগুলিতে এটির কী প্রভাব ফেলতে পারে তা অন্য কিছু যা বিবেচনা করা দরকার to


আমি রিচার্ডের সাথে একমত
সিলভাইন রায়é

আপনি সম্ভবত ঠিক আছেন তবে এই কোডটি চালানো আমার সমস্ত চালানগুলি একই সংখ্যার ক্রম অনুসরণ করেছেMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
জয় ঘোষ

3

আপনার নিজের মডেলটিতে কাস্টম লজিক সরবরাহ করে "ইভ / সত্তা_সংশ্লিষ্ট_নামারিক" শ্রেণিটি পুনরায় লিখে অর্ডার, শিপিংস, ইনভয়েস এবং ক্রেডিট মেমো ইনক্রিমেন্ট মডেলকে ওভাররাইড করতে পারেন।

আপনার নিজের যুক্তি কীভাবে সরবরাহ করবেন তা বোঝার জন্য পূর্বপুরুষের ক্লাসগুলিতে (ম্যাজ_ইভ_মোডেল_সেন্টিটি_সংশোধন_ সংখ্যাসূচক এবং ম্যাজ_এড_মডেল_সেন্টিটি_সংশোধন_আবস্ট্র্যাক্ট) দেখুন।

আপনি getNextId () ফাংশনটির $টিটিটাইপকোড প্যারামিটারটি যা আপনি ওভাররাইড করবেন তা পরীক্ষা করে আপনি বিভিন্ন সত্তার মধ্যে লজিককে আলাদা করতে পারেন।

আর একটি (আরও আক্রমণাত্মক) উপায় হ'ল "eav_entity_type" টেবিলের "ইনক্রিমেন্ট_মোডেল" কলামের মান ওভাররাইট করে প্রতিটি সত্তা টাইপের জন্য আলাদা ইনক্রিমেন্ট মডেল নির্দিষ্ট করা। ব্যক্তিগতভাবে আমি উপরে উল্লিখিত "পুনর্লিখন" সমাধানটি পছন্দ করি।

মনোযোগ দিন: সাম্প্রতিক ম্যাজেন্টো সংস্করণগুলিতে ইনক্রিমেন্ট আইডির স্বতন্ত্রতা বাধা রয়েছে যাতে আপনি একই ধরণের দুটি পৃথক সত্তার জন্য একই বর্ধিত আইডি সংরক্ষণ করতে পারবেন না। অন্য কথায় একই বর্ধিত আইডি সহ আপনার দুটি পৃথক চালান থাকতে পারে না।

আশা করি এটা সাহায্য করবে.


এই মধ্যে লাগছিল কিন্তু আমি খুঁজে পেতে অসমর্থ আছি getLastId()মধ্যে Mage_Eav_Model_Entity_Increment_Numericবা অন্য কোন ক্লাসে বা শ্রেণীবিন্যাসে ইন্টারফেস। বিটিডব্লিউ, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
মাইকেল

আপডেট: সবেমাত্র উপলব্ধি করা হয়েছে যে এটি থেকে একটি সম্পত্তি সেট Varien_Objectহয়েছেMage_Eav_Model_Entity_Type
মাইকেল

এটি এর মতো বাস্তবায়িত হয়েছে: gist.github.com/mblaren/012dce6f55ad5d442f41e9157e74530e
মাইকেল

2

আরও গভীর খনন করার সময়, আমি বুঝতে পারি যে eav_entity_type.increment_per_storeএটি সহায়ক হতে পারে।

এটা. তবে কেবলমাত্র সেই ক্ষেত্রে, যখন আপনি একই ম্যাজেন্টো ইনস্টলেশনের একই অর্ডার নম্বর পরিসীমা ভাগ করে নেওয়ার জন্য সমস্ত স্টোর দর্শন (বিশ্বব্যাপী, তারা কোন ওয়েবসাইটের মধ্যে তারা সংজ্ঞায়িত হয়েছেন তা বিবেচনা করে) চান increment_id

এটি আমার নির্দিষ্ট সমস্যাটি সমাধান করে না তবে এটি অন্য কারও পক্ষে সহায়ক, তাই আমরা এখানে যাচ্ছি:

আপনার অর্ডার নম্বরগুলির বিশ্বব্যাপী ভাগ করে নেওয়ার জন্য eav_entity_type.increment_per_store, এতে অর্ডার সত্তার সেট করুন 0,

অর্ডার সত্তার রেকর্ডটি লোড করার সময় এটি Mage_Eav_Model_Entity_Type::fetchNewIncrementId()ব্যবহারে বাড়ে , এটি কোনও স্টোর দর্শন সত্যই অন্তর্ভুক্ত তা বিবেচনা করে না।store_id = 0eav_entity_store

যদি এরকম কোনও রেকর্ড বিদ্যমান না থাকে তবে ম্যাজেন্টো ব্যবহার করে store_idএবং increment_prefixএর একটি তৈরি করে 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;
}

এই ব্যবহার করে যে কোনও সত্তা টাইপ জন্য কাজ করা উচিত eav/entity_increment_numericমডেল, মত order, invoice, shipmentএবং creditmemo

যদিও সচেতন থাকুন যে আমি increment_per_storeএখনও কোনও অফিসিয়াল ডকুমেন্টেশন পাইনি । এবং এটি ম্যাগেন্টো ব্যাকএন্ডে কোনও বিকল্প নেই যাতে আপনাকে এটি কনফিগার করতে দেয়।

এর অর্থ বা অর্থ হতে পারে, এটি আনুষ্ঠানিকভাবে ব্যবহার করা হবে বলে ভাবা হয় না।

আপনার নিজের ঝুঁকিতে ব্যবহার করুন। যদি আপনার পরিবর্তনগুলি সর্বনাশ করে তবে আমাকে দোষ দেবেন না। আপনাকে সতর্ক করা হয়েছে ^^


1

এটি বাক্সের বাইরে সমর্থিত নয়। মূল স্টোর থেকে একই ইনক্রিমেন্ট_আইডি ভাগ করে এ / বি পরীক্ষার জন্য দ্বিতীয় স্টোরভিউয়ের জন্য আমি একবার এটিও করতে চেয়েছিলাম।

আমি checkout_submit_all_afterবহিষ্কার হওয়ার সময় সেই সহজ 2 নম্বরগুলিকে মেলানোর চেষ্টা করেছি , তবে এটির সাথে খুব অস্বস্তি বোধ করেছি, তাই আমি এটিকে নামিয়ে দিয়েছি। আমি আরও স্টোরভিউ এবং প্রচুর ট্র্যাফিকের সাথে অনুমান করি যা এর ফলে সত্যিকারের বিশৃঙ্খলার সৃষ্টি হতে পারে যাতে আপনাকে ম্যাজেন্টোসের যুক্তিতে আরও গভীর খনন করতে হবে।


0

সমাধান:

ভিন্নতর অর্ডার / চালান / ক্রেডিটেমো ইত্যাদি থাকা ... বিভিন্ন পরিসরের জন্য সংখ্যা পরিসরটি বেশ দুর্দান্ত, যার বেশিরভাগ সময় স্টোর গ্রুপ স্তরের অর্থ means

আপনি যদি বিভিন্ন ভাষার জন্য স্টোর ভিউ ব্যবহার করেন তবে স্টোর ভিউ লেভেলে বিভিন্ন নম্বর রেঞ্জ থাকা খারাপ জিনিস, যা সমস্ত ক্ষেত্রে 90% এর মধ্যে সম্পন্ন হতে পারে।

ভাগ্যক্রমে এই থ্রেডে প্রস্তাবিত হিসাবে এটি এতটা কঠিন নয়:

আমরা কি করতে যাচ্ছি আমরা আনা হয় পরিবর্তে ডিফল্ট দোকান দৃশ্য আইডি দোকান দৃশ্য আইডি পদ্ধতি সঙ্গে বলা হয় ব্যবহার করে । আমরা বর্তমান স্টোর ভিউর জন্য স্টোর গ্রুপটি সমাধান করে এবং এটির ডিফল্ট স্টোর ভিউ আইডি নিয়ে এসেছি। তারপরে একটি নির্দিষ্ট স্টোর গ্রুপের প্রতিটি স্টোর ভিউ একই সংখ্যার রেঞ্জ ফর্ম্যাট (ডিফল্ট স্টোর ভিউ থেকে একটি) ব্যবহার করে।

এই শ্রেণিটি তৈরি করুন:

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;
    }

}

আপনার মডিউলটির config.xML এ এই পুনর্লিখনটি যুক্ত করুন:

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

আপনার যদি খুব সুন্দর উপায় থাকে তবে পুনরায় লিখন না করেই জ্ঞানটি ছড়িয়ে দিন। আনন্দ কর. কোর হ্যাক করবেন না।


0

ম্যাজেন্টো 2 এ ব্যবহার করুন ... থেকে * নির্বাচন করুন sales_sequence_meta

সমস্ত সিকোয়েন্স_সামগ্রী সারি একই বর্ধিত সারণীতে ব্যবহৃত হয় উদাহরণ 'সিকোয়েন্স_র্ডার_1' উদাহরণ: আপডেটের sales_sequence_metaসেট sequence_table= 'সিকোয়েন্স_র্ডার_1'। মেটা_আইডি = ?? ()

দ্রষ্টব্য: পূর্ববর্তী সমস্ত উক্তি এবং চালানের সাথে সম্পর্কিত সারিটি খালি করুন বা এই সারণীতে সর্বোচ্চ সিকোয়েন্স_মূল্য সারণিতে ব্যবহার করুন (সিকোয়েন্স_র্ডার_1, সিকোয়েন্স_র্ডার_0, সিকোয়েন্স_র্ডার_2)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.