Magento: надсилайте нове замовлення електронною поштою лише за допомогою кронштейнів


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

Основна ідея полягає в тому, щоб змінити відключене значення конфігурації під час виконання. Код не перевіряється, але повинен дати вам вихідну точку. Далі рекомендується читати з блогу Алана: http://alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching

Одне питання, з яким ви можете зіткнутися, - це кешоване значення для вищезазначеного.

Другим варіантом буде дублювання коду з sendNewOrderEmail ().


Геніальність. Чистий, непорочний, геніальний.
philwinkle

1
лестощі дістануть вас всюди ;-)
Крістоф у Фомані

3

Суть внесення подібних (радикальних) змін полягає в наступному:

  • Перезапишіть sendNewOrderEmail, щоб виконувати функцію черги та умовно надсилати / не надсилати на основі режиму черги (див. Псевдо-код нижче)
  • Виходячи з режиму черги моделі замовлення на продаж, ми надсилаємо електронне повідомлення з черги, завантажуючи замовлення з завдання cron і вручну надсилаючи повідомлення.

Деякі зразкові коди для перезапису моделі замовлення на продаж:

Наступний код буде залежати від наявності таблиці, що називається, 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>

app / code / local / 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 у 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();
        }

    }
}

Відмова:

Зауважте, що вищевказаний код не перевіряється і не працюватиме самостійно. Він очікує, що існує багато функціональних можливостей (як колекцій). Я також написав це чітко , і можуть виникнути невідповідності , оскільки я змінив свою думку про те, як би я впорався з цим один-два рази з моменту початку цієї відповіді.

Це призначено для того, щоб ви почали починати і думати про те, як би ви це зробили. Я готовий відповісти на будь-які запитання. Я також готовий внести участь у Github у відкритій версії цього модуля.

Удачі!


Це переосмислено порівняно з рішенням @ fooman, і мені подобається його краще, ніж моє :)
philwinkle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.