Magento: केवल क्रोनॉजर्स के साथ नया ऑर्डर ईमेल भेजें


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

एक मुद्दा जो आपके सामने आ सकता है, वह उपरोक्त के लिए कैश्ड मान है।

दूसरा विकल्प sendNewOrderEmail () से कोड को डुप्लिकेट करना होगा।


प्रतिभा। शुद्ध, असम्बद्ध, प्रतिभा।
philwinkle

1
चापलूसी आपको हर जगह मिल जाएगी ;-)
फोमन

3

इस तरह के (कट्टरपंथी) परिवर्तन करने का सार निम्नलिखित है:

  • एक पंक्ति के रूप में कार्य करने के लिए पुनः भेजें SendNewOrderEmail और कतार मोड के आधार पर सशर्त रूप से भेजें / न भेजें (नीचे कुछ छद्म कोड देखें)
  • बिक्री आदेश मॉडल के कतार मोड के आधार पर, हम क्रोन जॉब से ऑर्डर लोड करके और मैन्युअल रूप से ईमेल भेजकर कतार से ईमेल भेजते हैं।

बिक्री आदेश मॉडल के लिए कुछ नमूना कोड फिर से लिखना:

निम्न कोड नामक तालिका की उपस्थिति पर निर्भर करेगा 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>

एप्लिकेशन / कोड / स्थानीय / आपकी कंपनी / 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');
    }


}

वहां से आपको एक संसाधन मॉडल, एक संग्रह और एक क्रोन कार्यकर्ता को परिभाषित करने की आवश्यकता है।

Etc / config.xml में क्रोन परिभाषा कुछ इस तरह दिखाई देगी:

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

    }
}

अस्वीकरण:

ध्यान दें कि उपरोक्त कोड का परीक्षण नहीं किया गया है और यह अपने आप काम नहीं करेगा । यह बहुत अधिक कार्यक्षमता (जैसे संग्रह) मौजूद होने की उम्मीद करता है। मैंने इसे टॉप-ऑफ़-माइंड भी लिखा है और इसमें असंगतताएं हो सकती हैं , जैसा कि मैंने इस जवाब को शुरू करने के बाद एक या दो बार इसे कैसे हैंडल किया है, इस पर मैंने अपना दिमाग बदल दिया है।

यह आपको किक-स्टार्ट करने के लिए है और यह सोचने के लिए कि आप इसे कैसे पूरा करेंगे। मैं आपके किसी भी प्रश्न का उत्तर देने के लिए तैयार हूं। मैं इस प्रकार के मॉड्यूल के ओपन-सोर्स संस्करण में जीथब पर योगदान करने के लिए भी तैयार हूं।

शुभकामनाएँ!


यह @ fooman के समाधान की तुलना में अतिरंजित है और मुझे उसकी तुलना में बेहतर है :)
फिल्विंकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.