উত্তর:
আমি অক্ষম করতাম 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
আপনি যে সমস্যার মুখোমুখি হতে পারেন তা হ'ল উপরের জন্য একটি ক্যাশেড মান।
দ্বিতীয় বিকল্পটি হ'ল সেন্ডইউআর্ডারইমেল () থেকে কোডটি নকল করুন।
এই ধরণের (র্যাডিক্যাল) পরিবর্তন করার সারমর্মটি নিম্নলিখিত:
বিক্রয় অর্ডার মডেল পুনর্লিখনের জন্য কিছু নমুনা কোড:
নীচের কোডটি বলা একটি টেবিলের উপস্থিতির উপর নির্ভর করবে yourmodule_sales_email_queue
এবং আমি যাদু গেটের সাথে কিছু কলাম উল্লেখ করব। আমি কোনও স্কিমা সরবরাহ করতে যাচ্ছি না কারণ এটি সম্পূর্ণরূপে কার্যকরী কোড নয় এবং ধারণাটির প্রমাণ হিসাবে এটি; একটি কাজের মডিউল নয়।
এটি আপনার মডিউল ইত্যাদিতে / 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 / মডেল / 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');
}
}
সেখান থেকে আপনার একটি সংস্থান মডেল, সংগ্রহ এবং ক্রোন কর্মী সংজ্ঞায়িত করতে হবে।
ইত্যাদি / কনফিগারেশন.এক্সএমএল- এ ক্রোন সংজ্ঞাটি এর মতো দেখতে পাবেন:
<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();
}
}
}
দাবি পরিত্যাগী:
নোট করুন যে উপরের কোডটি পরীক্ষা করা হয়নি এবং এটি নিজের মতো করে কাজ করবে না । এটি প্রচুর কার্যকারিতা (সংগ্রহের মতো) বিদ্যমান থাকার প্রত্যাশা করে । আমি এটিকে শীর্ষ-মনের মধ্যেও লিখেছি এবং এখানে অসঙ্গতি থাকতে পারে , কারণ আমি এই উত্তরটি শুরু করার পরে কীভাবে একবার বা দু'বার এটি পরিচালনা করব সে সম্পর্কে আমার মন পরিবর্তন করে ফেলেছে।
এটি আপনাকে লাথি মেরে শুরু করা এবং আপনি কীভাবে এটি সম্পাদন করতে পারবেন তা চিন্তা করার জন্য to আপনার যে কোনও প্রশ্নের উত্তর দিতে আমি রাজি। আমি গিথুবকে এই ধরণের মডিউলের একটি ওপেন-সোর্স সংস্করণে অবদান রাখতেও প্রস্তুত।
শুভকামনা করছি!