Magento: ส่งอีเมลคำสั่งซื้อใหม่ด้วย cronjobs เท่านั้น


11

ฉันจะส่งอีเมลคำสั่งซื้อใหม่โดยใช้:

$order->sendNewOrderEmail();

เฉพาะจาก cronjob ที่ใช้ในโมดูลที่กำหนดเองของฉัน

ขอบคุณที่ช่วยเหลือ.

คำตอบ:


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

แนวคิดหลักคือการแทนที่ค่าการกำหนดค่าที่ปิดใช้งานที่รันไทม์ รหัสไม่ได้ทดสอบ แต่ควรให้จุดเริ่มต้นแก่คุณ การอ่านที่แนะนำเพิ่มเติมจากบล็อกของ Alan: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching

ปัญหาหนึ่งที่คุณอาจพบคือค่าแคชสำหรับด้านบน

ตัวเลือกที่สองคือการทำซ้ำรหัสจาก sendNewOrderEmail ()


อัจฉริยภาพ บริสุทธิ์บริสุทธิ์ไร้มลทิน
philwinkle

1
คำเยินยอจะพาคุณไปทุกหนทุกแห่ง ;-)
Kristof ที่ Fooman

3

แก่นแท้ของการเปลี่ยนแปลง (รากฐาน) ชนิดนี้คือ:

  • เขียน sendNewOrderEmail เพื่อทำหน้าที่เป็นคิวและส่ง / ไม่ส่งแบบมีเงื่อนไขโดยขึ้นอยู่กับโหมดคิว (ดูรหัสหลอกบางอย่างด้านล่าง)
  • ขึ้นอยู่กับโหมดคิวของรูปแบบคำสั่งขายเราส่งอีเมลจากคิวโดยการโหลดคำสั่งซื้อจากงาน cron และส่งอีเมลด้วยตนเอง

โค้ดตัวอย่างบางส่วนสำหรับการเขียนแบบใบสั่งขายซ้ำ:

รหัสต่อไปนี้จะขึ้นอยู่กับการปรากฏตัวของตารางที่เรียกว่าyourmodule_sales_email_queueและฉันจะอ้างอิงบางคอลัมน์ด้วย get get magic ฉันจะไม่ให้สคีมาเนื่องจากรหัสนี้ไม่ได้ใช้งานได้อย่างสมบูรณ์และเป็นการพิสูจน์แนวคิด ไม่ใช่โมดูลที่ใช้งานได้

เพิ่มสิ่งนี้ไปยังetc / 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>

app / รหัส / ท้องถิ่น / 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');
    }


}

จากที่นั่นคุณจำเป็นต้องกำหนดรูปแบบทรัพยากรการรวบรวมและผู้ปฏิบัติงาน cron

นิยาม cron ใน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();
        }

    }
}

Disclaimer:

โปรดทราบว่ารหัสข้างต้นไม่ได้ทดสอบและจะไม่ทำงานด้วยตัวเอง คาดว่าจะมีฟังก์ชั่นมากมาย (เช่นคอลเล็กชัน) ฉันยังได้เขียนสิ่งที่ดีที่สุดและอาจมีความไม่สอดคล้องกันเนื่องจากฉันเปลี่ยนใจว่าฉันจะจัดการกับเรื่องนี้ครั้งเดียวหรือสองครั้งตั้งแต่เริ่มตอบคำถามนี้

สิ่งนี้มีไว้เพื่อให้คุณเริ่มเตะและคิดว่าคุณจะทำสิ่งนี้ได้อย่างไร ฉันยินดีที่จะตอบคำถามใด ๆ ที่คุณอาจมี ฉันยินดีที่จะมีส่วนร่วมใน Github กับโมดูลโอเพ่นซอร์สของโมดูลประเภทนี้

ขอให้โชคดี!


นี้จะ overengineered เมื่อเทียบกับวิธีการแก้ปัญหา @ fooman และฉันชอบเขาดีกว่าฉัน :)
philwinkle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.