ฉันจะส่งอีเมลคำสั่งซื้อใหม่โดยใช้:
$order->sendNewOrderEmail();
เฉพาะจาก cronjob ที่ใช้ในโมดูลที่กำหนดเองของฉัน
ขอบคุณที่ช่วยเหลือ.
ฉันจะส่งอีเมลคำสั่งซื้อใหม่โดยใช้:
$order->sendNewOrderEmail();
เฉพาะจาก cronjob ที่ใช้ในโมดูลที่กำหนดเองของฉัน
ขอบคุณที่ช่วยเหลือ.
คำตอบ:
ฉันจะปิดการใช้งาน 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 ()
แก่นแท้ของการเปลี่ยนแปลง (รากฐาน) ชนิดนี้คือ:
โค้ดตัวอย่างบางส่วนสำหรับการเขียนแบบใบสั่งขายซ้ำ:
รหัสต่อไปนี้จะขึ้นอยู่กับการปรากฏตัวของตารางที่เรียกว่า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 กับโมดูลโอเพ่นซอร์สของโมดูลประเภทนี้
ขอให้โชคดี!