গ্রাহক_সেভ_পরে গ্রাহক নতুন কিনা তা নির্ধারণ করুন


9

আমার কাছে এমন ইভেন্টগুলি রয়েছে যা আমি যখন কোনও গ্রাহক নিবন্ধভুক্ত করেন বা তাদের বিশদ সংরক্ষণ করেন তখন আমি তা সম্পাদন করতে চাই। এর জন্য, আমি দুটি ইভেন্ট ব্যবহার করছি: গ্রাহক_রেজিস্টার_সাকসেস এবং গ্রাহক_সেজ_পরবর্তী after আমার যে সমস্যাটি হচ্ছে তা হ'ল গ্রাহক_সেজ_ফেরোডে টাস্কটি দ্বিগুণ চালানো শেষ হিসাবে সর্বদা একই এক্সিকিউশনে ডাকা হয় customer_register_success

আমি মূল ডেটা পরীক্ষা করে কল করে গ্রাহক নতুন কিনা তা সনাক্ত করার চেষ্টা করেছি isObjectNew, তবে উভয়ই রিটার্ন ডেটা যা বস্তুটিকে বোঝায় তা আসলে নতুন নয়। গ্রাহক কেবল ইভেন্টের রেজিস্ট্রিতে কিছু সেট করার ক্ষেত্রে গ্রাহক কেবল গ্রাহক_সেভ_পরবর্তী ইভেন্টে নিবন্ধন করছেন কিনা তা আমি কীভাবে পরীক্ষা করতে পারি customer_register_success?

উত্তর:


5

সবার আগে আপনি উভয় ইভেন্টের জন্য আপনার পর্যবেক্ষককে সিঙ্গেলটন হিসাবে সংজ্ঞায়িত করতে পারেন

<global>
    <events>
        <customer_save_after>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_save_after>
        <customer_register_success>
            <observers>
                <namespace_module>
                    <type>singleton</type>
                    <class>namespace_module/observer</class>
                    <method>doSomething</method>
                </namespace_module>
            </observers>
        </customer_register_success>
    </events>
</global>

এই ক্ষেত্রে একই পর্যবেক্ষক বস্তু উভয় ইভেন্টের জন্য ব্যবহৃত হবে। সুতরাং আপনি আপনার পর্যবেক্ষক এবং কিছু ক্রিয়া করার আগে এটি পরীক্ষা করে পতাকা তৈরি করতে পারেন।

class [Namespace]_[Module]_Model_Observer
{
    protected $canDoSomething = false;

    public function doSomething($observer)
    {
        if (!$this->canDoSomething) {

            //here your code

            //now set flag to true to prevent executing your code twice 
            $this->canDoSomething = true;
        }
    }
}

এখন আপনার কোডটি একবার কার্যকর করা হবে।


0

এটি প্রতিরোধের সবচেয়ে সহজ উপায় একটি রেজিস্ট্রি মান ব্যবহার করা use আপনার পর্যবেক্ষক পদ্ধতিটি নীচের মতো দেখতে হবে

class [Namespace]_[Module]_Model_Observer
{
   public function triggeredObserver($observer)
   {
      if (!empty(Mage::registry('[module]_istriggered')) return $this;

      // here you can perform whatever you want to do with your code

      Mage::register('[module]_istriggered', 1);
   }
}

প্রথমবার পদ্ধতিরটিকে কীটি পুনরায় তালিকাভুক্ত করা হয়, যার অর্থ দ্বিতীয়বার এটি ট্রিগার করা হয়েছে এটি আর খালি নয় এবং পদ্ধতিটি শুরুতে ফিরে আসবে means


হ্যাঁ আমি এটি সম্পর্কে চিন্তাভাবনা করেছি, তবে এটি বেশ নোংরা অনুভূত হয়েছে :( আমি অবাক হয়েছি যে আমি কোনও মডেল_সেভ_পরবর্তী ইভেন্টে সবেমাত্র কোনও বস্তু তৈরি করা হয়েছে কিনা তা আমি জানতে পারছি না
ম্যাথু হাওরথ

আমি এখনও যতটা জানি ডেটা কোনও beforeইভেন্টে isObjectNewডেটা থাকে না কেননা ডেটাটি এখনও সেভ হয় নি। যতদূর নোংরা যায়, আমার ধারণা এখানে আরও মার্জিত উপায় থাকবে তবে এটি অবশ্যই হ্যাক নয়
স্যান্ডার ম্যানগেল

$customer->save(); $this->_dispatchRegisterSuccess($customer);দুর্ভাগ্যক্রমে এখানে, গ্রাহক রেজিস্টার ইভেন্টটি চালিত হওয়ার আগেই সংরক্ষণ করা হয়েছে, সুতরাং পর্যবেক্ষক পদ্ধতি যেভাবেই চলবে না :(
ম্যাথু হাওরথ

0

আর একটি পদ্ধতি হ'ল কোন নিয়ামক এবং ক্রিয়াকলাপটি ইভেন্টটিকে ট্রিগার করেছে check

পর্যবেক্ষকটিতে আপনি মডিউল, নিয়ামক এবং ক্রিয়া নাম পেতে পারেন।

$frontName = Mage::app()->getRequest()->getRouteName();
$controllerName = Mage::app()->getRequest()->getControllerName();
$actionName = Mage::app()->getRequest()->getActionName();

$myURI = $frontName . '_'. $controllerName . '_' . $actionName;

এবং পরে আপনার পদ্ধতিটি পরীক্ষা করছেন কে পরীক্ষা করছে method

স্টক ম্যাজেন্টো ইনস্টলে, ব্যবহারকারীর অঞ্চল থেকে কোনও ব্যবহারকারী তৈরি করার সময় $ myURI এর মান হবে customer_account_createpost

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