Answers:
我会禁用 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
而我将使用魔术吸气剂来引用某些列。我将不提供模式,因为它不是功能齐全的代码,只是一种概念证明。不是工作模块。
将此添加到模块的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>
应用程序/代码/本地/YourCompany/YourModule/Model/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 worker。
etc / config.xml中的cron定义如下所示:
<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();
}
}
}
免责声明:
请注意,以上代码未经测试,因此无法单独运行。它期望存在许多功能(如集合)。我也很想写它,可能会有不一致之处,因为自从开始回答以来,我已经改变了主意如何处理一两次。
这是为了让您起步并思考如何实现此目的。我愿意回答您可能遇到的任何问题。我也愿意在Github上为这种模块的开源版本做出贡献。
祝你好运!