তালিকা পরিবর্তন সনাক্ত করুন te


18

যখনই কোনও পণ্যের ইনভেন্টরি স্তর পরিবর্তন হয় তখন আমাকে সনাক্ত করতে হবে। cataloginventory_stock_item_save_afterইভেন্টটি ব্যাকএন্ডে পরিবর্তিত হওয়ার পরে, বা যখন ফ্রন্ট্যান্ডে (পেপালের মাধ্যমে) কোনও অর্ডার বাতিল করা হয়, তবে যখন অগ্রভাগ থেকে পণ্য কেনা হয় তখন ট্রিগার হয় না এমন ইভেন্টটি ব্যবহার করে আমার কিছুটা সাফল্য হয়েছিল।

আমি cataloginventory_stock_item_save_afterইভেন্টটির মতো এইভাবে ঝুঁকছি :

<global>
    <events>
        <cataloginventory_stock_item_save_after>
            <observers>
                <cataloginventory_stock_item_save_after_handler>
                    <type>model</type>
                    <class>stockchange/observer</class>
                    <method>stockChange</method>
                </cataloginventory_stock_item_save_after_handler>
            </observers>
        </cataloginventory_stock_item_save_after>
    </events>

<?php
class FashionBunker_StockChange_Model_Observer {
    public function stockChange(Varien_Event_Observer $observer) {

যখন কোনও গ্রাহক কিছু কেনেন, তখন আমার কী কী পরিবর্তনগুলি ক্যাপচার করার জন্য অন্য ইভেন্টটি ব্যবহার করা দরকার, বা আমি যেভাবে ইভেন্টটিতে প্রবেশ করেছি তাতে কোনও সমস্যা আছে?

উত্তর:


26

এটি বেশ কিছু সময় আগে হয়েছে যে আমি এর জন্য কিছু তৈরি করেছি, আমাকে একাধিক পর্যবেক্ষকের কথা শুনতে হয়েছিল কারণ তারা যেখানে ক্যাটালগের তালিকাভুক্তির দ্বারা পরিচালিত হয় না, সেখানে আমাকে নিম্নলিখিত কোডগুলি অনুসরণ করতে হয়:

    <events>
        <cataloginventory_stock_item_save_commit_after>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>catalogInventorySave</method>
                </genmato_stockupdate>
            </observers>
        </cataloginventory_stock_item_save_commit_after>
        <sales_model_service_quote_submit_before>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>subtractQuoteInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_model_service_quote_submit_before>
        <sales_model_service_quote_submit_failure>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>revertQuoteInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_model_service_quote_submit_failure>
        <sales_order_item_cancel>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>cancelOrderItem</method>
                </genmato_stockupdate>
            </observers>
        </sales_order_item_cancel>
        <sales_order_creditmemo_save_after>
            <observers>
                <genmato_stockupdate>
                    <class>genmato_stockupdate/observer</class>
                    <method>refundOrderInventory</method>
                </genmato_stockupdate>
            </observers>
        </sales_order_creditmemo_save_after>
    </events>

এবং পর্যবেক্ষক নিম্নলিখিত কোড:

public function catalogInventorySave(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $event = $observer->getEvent();
        $_item = $event->getItem();

        if ((int)$_item->getData('qty') != (int)$_item->getOrigData('qty')) {
            $params = array();
            $params['product_id'] = $_item->getProductId();
            $params['qty'] = $_item->getQty();
            $params['qty_change'] = $_item->getQty() - $_item->getOrigData('qty');
        }
    }
}

public function subtractQuoteInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $quote = $observer->getEvent()->getQuote();
        foreach ($quote->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getTotalQty() * -1);
        }
    }
}

public function revertQuoteInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $quote = $observer->getEvent()->getQuote();
        foreach ($quote->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getTotalQty());
        }
    }
}

public function cancelOrderItem(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $item = $observer->getEvent()->getItem();
        $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled();
        $params = array();
        $params['product_id'] = $item->getProductId();
        $params['sku'] = $item->getSku();
        $params['qty'] = $item->getProduct()->getStockItem()->getQty();
        $params['qty_change'] = $qty;
    }
}

public function refundOrderInventory(Varien_Event_Observer $observer)
{
    if ($this->isEnabled()) {
        $creditmemo = $observer->getEvent()->getCreditmemo();
        foreach ($creditmemo->getAllItems() as $item) {
            $params = array();
            $params['product_id'] = $item->getProductId();
            $params['sku'] = $item->getSku();
            $params['qty'] = $item->getProduct()->getStockItem()->getQty();
            $params['qty_change'] = ($item->getQty());
       }
    }
}

আশা করি আপনি যা খুঁজছেন এটি এটি কিছুটা।


যখন আমি এটি যেমন ব্যবহার করি তখন অর্ডার বাতিল করার সময় এবং অর্ডার স্থাপনের কাজ না করলে এটি 500 টি সার্ভার ত্রুটি তৈরি করে। এটির কাজ করার জন্য আমাকে ($ this-> isEn सक्षम ()) শর্তটি মুছে ফেলতে হয়েছিল। কোনও কারণেই কেন এই ঘটনা? আমি সিঙ্গলটন টাইপ ব্যবহার করছি বলেই কি? ধন্যবাদ
মৌস্তফা এলকাব্বানি

5

আপনি স্টক আইটেমের মডেল সম্পর্কিত কোনও ইভেন্ট ব্যবহার করতে পারবেন না, কারণ মাগেন্তো একবারে সমস্ত অর্ডার করা আইটেমের স্টক হ্রাস করতে একটি অনুকূলিত এসকিউএল কোয়েরি ব্যবহার করে মডেলটিকে বাইপাস করে।

আমি Mage_CatalogInventory_Model_Stockযেখানে একটি অতিরিক্ত ইভেন্ট যুক্ত করেছি তার পুনরায় লেখার মাধ্যমে এটি সমাধান করেছি:

<?php
/**
 * Add events to observe stock qty change
 * 
 * @author Fabian Schmengler
 *
 */
class SGH_ShippingExpress_Model_CatalogInventory_Stock
    extends Mage_CatalogInventory_Model_Stock
{
    const EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE = 'cataloginventory_stock_item_correct_qty_before';
    const EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER = 'cataloginventory_stock_item_correct_qty_after';

    /**
     * (non-PHPdoc)
     * @see Mage_CatalogInventory_Model_Stock::registerProductsSale()
     */
    public function registerProductsSale($items)
    {
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
            'stock'     => $this,
            'items_obj' => (object)array('items' => &$items),
            'operator'  => '-'
        ));
        $result = parent::registerProductsSale($items);
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
            'stock'          => $this,
            'items'          => $items,
            'fullsave_items' => $result,
            'operator'       => '-'
        ));
        return $result;
    }
    /**
     * (non-PHPdoc)
     * @see Mage_CatalogInventory_Model_Stock::revertProductsSale()
     */
    public function revertProductsSale($items)
    {
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_BEFORE, array(
            'stock'     => $this,
            'items_obj' => (object)array('items' => &$items),
            'operator'  => '+'
        ));
        $result = parent::revertProductsSale($items);
        Mage::dispatchEvent(self::EVENT_CORRECT_STOCK_ITEMS_QTY_AFTER, array(
            'stock'          => $this,
            'items'          => $items,
            'fullsave_items' => $result,
            'operator'       => '+'
        ));
        return $result;
    }
}

তারপরে পর্যবেক্ষক এর cataloginventory_stock_item_correct_qty_afterমতো দেখতে পাবেন:

    /**
     * @var $items array array($productId => array('qty'=>$qty, 'item'=>$stockItem))
     */
    $items = $observer->getItems();
    foreach ($items as $productId => $item) {
        $stockItem = $item['item'];
        $product = $stockItem->getProduct();

        // Do anything you need with $stockItem and $product here

    }

আমি ভারী প্রক্রিয়াজাতকরণ বা অতিরিক্ত ডাটাবেস কলগুলি না করার পরামর্শ দিই (উদাহরণস্বরূপ পণ্যটি স্টকের বাইরে রয়েছে কিনা তা সনাক্ত করার জন্য প্রয়োজনীয়), তবে ক্রোনজব দ্বারা প্রসেস করা কাতারে পণ্য যুক্ত করার জন্য, অতিরিক্ত লোডের সময়কে কমিয়ে আনতে ব্যবহারকারী।


$stockItem->canSubtractQty()পর্যবেক্ষক না কাজ করছে না $stockItem->getId().. কোন টিপস? দেখে মনে হচ্ছে আমি পদ্ধতিগুলি অ্যাক্সেস করতে পারছি না
snh_nl

ফ্যাবিয়ান, আপনি এখানে ওভাররাইট ফাংশনটি দিয়ে বৈশিষ্ট্যটি যুক্ত করতে পারেন তাই এখানে কাস্টম ইভেন্টগুলি যুক্ত করার উদ্দেশ্য কী? এটি কি কেবল ডিকুবল করার জন্য? গাইড করুন।
ম্যাজেন্টো লার্নার

@ ম্যাজেন্টোলিয়ারার হ্যাঁ, আমার পক্ষে পুনরায় ব্যবহার এবং বিভিন্ন বৈশিষ্ট্য যুক্ত করা সহজ হয়েছে। প্রযুক্তিগতভাবে আপনি এর পরিবর্তে একটি ব্যক্তিগত পদ্ধতিও প্রবর্তন করতে পারেন
ফ্যাবিয়ান শেমঙ্গলার

এটিতে একটি মূল শ্রেণীর পুনর্লিখন জড়িত থাকতে পারে তবে এটি এখানে এখনও সবচেয়ে সম্পূর্ণ সমাধান। কখনও কখনও আপনাকে কেবল নিজের ইভেন্টগুলি এম 1: পি
ব্রায়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.