Magento: Yeni Sipariş E-postasını yalnızca cronjobs ile gönder


11

Yeni sipariş E-postalarını nasıl gönderebilirim:

$order->sendNewOrderEmail();

sadece Özel modülümde kullanılan bir cronjob'dan.

Yardım için teşekkürler.

Yanıtlar:


8

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.


Cin. Saf, katkısız, deha.
philwinkle

1
dalkavukluk sizi her yere
götürecektir

3

Bu tür (radikal) bir değişikliğin özü şudur:

  • SendNewOrderEmail'i kuyruk görevi görecek şekilde yeniden yazma ve kuyruk moduna bağlı olarak koşullu olarak gönderme / gönderme (aşağıdaki bazı sahte kodlara bakın)
  • Müşteri siparişi modelinin kuyruk moduna bağlı olarak, siparişi cron işinden yükleyip e-postayı manuel olarak göndererek kuyruktan e-posta göndeririz.

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_queueve 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!


Bu @ fooman'ın çözümü ile karşılaştırıldığında overengineered ve ben daha iyi benim gibi :)
philwinkle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.