ম্যাজেন্টো: কেবল ক্রোনজবস সহ নতুন অর্ডার ইমেল প্রেরণ করুন


11

আমি কীভাবে নতুন অর্ডার ইমেলগুলি প্রেরণ করতে পারি:

$order->sendNewOrderEmail();

শুধুমাত্র আমার কাস্টম মডিউলটিতে ব্যবহৃত ক্রোনজব থেকে।

সাহায্যের জন্য ধন্যবাদ.

উত্তর:


8

আমি অক্ষম করতাম System > Configuration > Sales Email > Order > Enabled

এটি নিশ্চিত করে তোলে যে সাধারণ সম্পাদনের সময় এটি প্রেরণ করা হয় না

public function sendNewOrderEmail()
{
    $storeId = $this->getStore()->getId();

    if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
        return $this;
    }

তারপরে আপনার কাস্টম মডিউলে এর মতো কিছু অন্তর্ভুক্ত রয়েছে

    Mage::getConfig()->setNode(
        'default/'.Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
    );
    foreach(Mage::app()->getStores() as $storeCode=>$store){
        Mage::getConfig()->setNode(
            "stores/{$storeCode}/".Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
        );
    }
    $collection = Mage::getModel('sales/order')->getCollection()->addAttributeToFilter('email_sent', 0);
    foreach ($collection as $order){
        $order->sendNewOrderEmail();
    }

মূল ধারণাটি রানটাইমে অক্ষম কনফিগারেশন মানকে ওভাররাইড করা। কোডটি পরীক্ষিত নয় তবে আপনাকে একটি সূচনা পয়েন্ট দেওয়া উচিত। আরও অ্যালান এর ব্লগ থেকে পড়া বাঞ্ছনীয়: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching

আপনি যে সমস্যার মুখোমুখি হতে পারেন তা হ'ল উপরের জন্য একটি ক্যাশেড মান।

দ্বিতীয় বিকল্পটি হ'ল সেন্ডইউআর্ডারইমেল () থেকে কোডটি নকল করুন।


জিনিয়াস। খাঁটি, অযৌক্তিক, প্রতিভা।
ফিলিউঙ্কল


3

এই ধরণের (র‌্যাডিক্যাল) পরিবর্তন করার সারমর্মটি নিম্নলিখিত:

  • একটি সারিবদ্ধ হিসাবে কাজ করতে সেন্ডউইনর্ডার ইমেলটি পুনরায় লিখুন এবং শর্ত অনুসারে পাঠান / পাঠাবেন না কিউ মোডের ভিত্তিতে (নীচে কিছু সিউডো কোড দেখুন)
  • বিক্রয় আদেশের মডেলের কাতারি মোডের ভিত্তিতে, আমরা ক্রোন জব থেকে অর্ডার লোড করে এবং ম্যানুয়ালি ইমেল প্রেরণ করে কাতার থেকে ইমেল প্রেরণ করি।

বিক্রয় অর্ডার মডেল পুনর্লিখনের জন্য কিছু নমুনা কোড:

নীচের কোডটি বলা একটি টেবিলের উপস্থিতির উপর নির্ভর করবে yourmodule_sales_email_queueএবং আমি যাদু গেটের সাথে কিছু কলাম উল্লেখ করব। আমি কোনও স্কিমা সরবরাহ করতে যাচ্ছি না কারণ এটি সম্পূর্ণরূপে কার্যকরী কোড নয় এবং ধারণাটির প্রমাণ হিসাবে এটি; একটি কাজের মডিউল নয়।

এটি আপনার মডিউল ইত্যাদিতে / config.xml এ যুক্ত করুন :

<global>
    <model>
        <emailqueue>
            <class>YourCompany_YourModule_Model</class>
            <resourceModel>emailqueue_resource</resourceModel>
        </emailqueue>
        <emailqueue_resource>
            <class>YourCompany_YourModule_Model_Resource</class>
            <entities>
                <queue>
                    <table>yourmodule_sales_email_queue</table>
                </queue>
            </entities>
        </emailqueue_resource>
        <sales>
            <rewrite>
                <order>YourCompany_YourModule_Model_Order</order>
            </rewrite>
        </sales>
    </model>
</global>

অ্যাপ্লিকেশন / কোড / স্থানীয় / yourcompany / YourModule / মডেল / Order.php

<?php

class YourCompany_YourModule_Model_Order extends Mage_Sales_Model_Order
{
    protected $_isQueueMode = false;

    public function sendNewOrderEmail()
    {       
        //send order email if our custom queue mode is set
        if($this->_isQueueMode){
            parent::sendNewOrderEmail();
            return;
        }

        //not running from queue, let's shove stuff into the queue
        $this->getEmailQueue()->load($this)->save();
    }


    public function getEmailQueue()
    {
        if(!isset($this->queue)){
            $this->queue = $this->_getEmailQueue();
        }
        return $this->queue;
    }

    protected function _getEmailQueue()
    {
        return Mage::getResourceModel('emailqueue/queue');
    }


}

সেখান থেকে আপনার একটি সংস্থান মডেল, সংগ্রহ এবং ক্রোন কর্মী সংজ্ঞায়িত করতে হবে।

ইত্যাদি / কনফিগারেশন.এক্সএমএল- এ ক্রোন সংজ্ঞাটি এর মতো দেখতে পাবেন:

<crontab>
    <jobs>
        <emailqueue_send_order_emails>
            <schedule>
                <cron_expr>0 0 * * *</cron_expr>
            </schedule>
            <run>
                <model>emailqueue/observer::sendEmailsFromQueue</model>
            </run>
        </emailqueue_send_order_emails>
    </jobs>
</crontab>

যা ক্লাস থেকে একটি পদ্ধতি আহ্বান করে YourCompany_YourModule_Model_Observer। আমরা সারি থেকে শেষ 24 ঘন্টা ইমেলগুলি লোড করব, সম্পর্কিত অর্ডারটি লোড করব এবং এটি ইমেল প্রেরণের জন্য পতাকাটি সেট করব। তারপরে আমরা ইমেল প্রেরণের পদ্ধতিটি শুরু করব:

<?php

class YourCompany_YourModule_Model_Observer
{
    public function sendEmailsFromQueue($observer)
    {
        //load queue and define the run window
        $queue = Mage::getModel('emailqueue/queue')->getCollection()->getSelect()
                ->where('created_at',array('lt'=>Zend_Db_Expr('NOW()')))
                ->where('created_at',array('gt'=>Zend_Db_Expr('NOW() - INTERVAL 24 HOUR')));

        foreach($queue as $worker){
            //logic to send the email e.g.:
            $order = Mage::getModel('sales/order')->loadByIncrementId($worker->getOrderIncrementId());
            $order->_isQueueMode = true;
            $order->sendNewOrderEmail();
        }

    }
}

দাবি পরিত্যাগী:

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

এটি আপনাকে লাথি মেরে শুরু করা এবং আপনি কীভাবে এটি সম্পাদন করতে পারবেন তা চিন্তা করার জন্য to আপনার যে কোনও প্রশ্নের উত্তর দিতে আমি রাজি। আমি গিথুবকে এই ধরণের মডিউলের একটি ওপেন-সোর্স সংস্করণে অবদান রাখতেও প্রস্তুত।

শুভকামনা করছি!


@ ফুমানের সমাধানের তুলনায় এটি অত্যধিক সুরক্ষিত এবং আমি আমার চেয়ে তার চেয়ে ভাল পছন্দ করি :)
ফিলিঙ্কল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.