Yanıtlar:
Devre dışı bırakardım System > Configuration > Sales Email > Order > Enabled
Bu normal yürütme sırasında gönderilmemesini sağlar
public function sendNewOrderEmail()
{
$storeId = $this->getStore()->getId();
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
return $this;
}
Ardından özel modülünüze benzer bir şey ekleyin
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();
}
Ana fikir, çalışma zamanında devre dışı bırakılmış yapılandırma değerini geçersiz kılmaktır. Kod test edilmemiştir ancak size bir başlangıç noktası vermelidir. Alan'ın blogundan daha fazla okuma önerilir: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching
Karşılaşabileceğiniz bir sorun, yukarıdakiler için önbelleğe alınmış bir değerdir.
İkinci seçenek kodu sendNewOrderEmail () 'den çoğaltmak olacaktır.
Bu tür (radikal) bir değişikliğin özü şudur:
Müşteri siparişi modeli yeniden yazmak için bazı örnek kodlar:
Aşağıdaki kod denilen bir tablonun varlığına bağlı olacaktır yourmodule_sales_email_queue
ve ben sihirli getters ile bazı sütunları referans olacak. Bu tamamen işlevsel bir kod ve bir tür kavram kanıtı olduğu gibi bir şema sağlamak için gitmeyeceğim; çalışan bir modül değil.
Bunu modülünüzün etc / config.xml dosyasına ekleyin :
<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>
Uygulamanın / kod / yerel / sirketiniz / 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');
}
}
Oradan bir kaynak modeli, bir koleksiyon ve bir cron çalışanı tanımlamanız gerekir.
Etc / config.xml'deki cron tanımı şöyle görünür:
<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>
Hangi sınıftan bir yöntem çağırır YourCompany_YourModule_Model_Observer
. Kuyruktan son 24 saatlik e-postaları yükleyeceğiz, ilişkili siparişi yükleyeceğiz ve bayrağı e-posta göndermesine izin verecek şekilde ayarlayacağız. Ardından e-posta gönderme yöntemini çağırırız:
<?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();
}
}
}
Yasal Uyarı:
Yukarıdaki kodun test edilmediğini ve kendi başına çalışmadığını unutmayın . Bu beklediğini çok varolmaya (koleksiyonları gibi) işlevselliği. Ayrıca akılda kalıcı olarak yazdım ve tutarsızlıklar olabilir , çünkü bu cevabı başlattığımdan beri bunu bir veya iki kez nasıl ele alacağım konusunda fikrimi değiştirdim.
Bu, başlamanıza ve bunu nasıl başaracağınızı düşünmeye yöneliktir. Sorularınızı cevaplamaya hazırım. Ben de Github bu tür bir modülün açık kaynak sürümüne katkıda bulunmaya hazırım.
İyi şanslar!