题
基本问题是这样的: 我们已启用免费(零小计)订单的发票创建功能。这工作正常,并且发票已创建,但未发送发票电子邮件。
我预计我只需要在创建方法的任何地方覆盖该方法,可能只是为了添加一个 $invoice->sendEmail()
, ,但我很难找到它到底在哪里。
解决方案
假设您已在中正确设置出站电子邮件地址 Menu > System > Configuration
:商店电子邮件地址:
System > Configuration : Store Email Addresses Configuration">
浏览销售:在与上面相同的界面中的“销售电子邮件”选项卡并展开“发票”手风琴菜单:
您需要确保:
- 发票电子邮件已启用
- 您已根据上面配置的地址选择了发件人地址。此示例使用销售代表,但您可以选择任何正确配置的电子邮件地址。
- 为注册用户选择模板(如果您正在测试注册用户)
- 为来宾用户选择模板(如果您正在测试来宾用户)
我在 CE 1.9.1 上截取了这些屏幕截图,但 EE 中的设置应该类似。您使用的 Magento EE 版本不使用新的队列系统,因此只要您正确配置了这些设置,并实现了自定义观察者 类似于这篇博文中的代码, ,您的发票电子邮件应该已发送。
关键是让您的自定义模块将观察者附加到 sales_order_invoice_save_after
事件 - 保存发票后,您可以查询发票内容并发送电子邮件。
* 重要笔记 *
如果您的目标是确保此功能应用于零小计结账发票中的可下载产品,就像更多常规产品一样,如@xinqiu 评论中指出, ,你可能应该将你的观察者附加到 sales_order_invoice_save_commit_after
事件代替。
什么时候 sales_order_invoice_save_after
被触发时,包含所购买的可下载产品链接的详细信息的写入操作尚未保存到数据库,即使其他订单/发票和其他行项目信息可能已保存。
虽然这是我零直接经验的领域,但我的理解是,如果数据库级别出现一些故障并且事务被 MySQL 回滚,则最初为唯一可下载产品链接创建的 url 将重新生成由 Magento 当重试保存/提交操作时
更简洁地说,直到 sales_order_invoice_save_commit_after
事件被触发(即使其他高级订单详细信息已在 MySQL 中提交,例如总计、订单/发票编号等...)
虽然我还没有机会亲自尝试,但我似乎找不到该策略逻辑上的缺陷(尽管这可能是我比其他人经验少得多的领域之一)我会比较喜欢)。我猜你应该能够在经过一番挖掘和实验后确认这一点 - 当我自己进行简短的实验时,我必须承认我觉得使用它可能会更谨慎 sales_order_invoice_save_commit_after
...
...无论您在 Magento 商店中处理哪种产品...鉴于其在整个 Magento 订购/发票工作流程中的(后来的)顺序,至少此时您至少会知道所有相关的订单和订单项详细信息已被存储,并且生成某种异常并被适当回滚并重试/或其行为符合正常预期。
假设您想在用于生成发票电子邮件的模板中包含可下载产品的链接,您应该修改我下面包含的代码以附加到 sales_order_invoice_save_commit_after
这将确保有关订单和任何可下载产品的所有相关信息都保存在数据库中并在事务中提交(如果可能)。
我不明白为什么使用 sales_order_invoice_save_commit_after
可能会引入任何其他问题,但请注意,我自己从未这样做过,并且我在下面提供的代码我已经成功使用了几次,所以我可能是错的&“您的里程可能会有所不同”。
* 重要笔记 *
该示例中的模块代码非常简单。默认情况下,只有当您单击管理界面中的按钮手动向客户发送发票电子邮件(如果总数 < 0 时,会自动发送)时,仅针对 0.00 美元发票触发发送发票电子邮件功能。
上面的代码触发与按钮相同的逻辑,但是当事件触发观察者时触发。该解决方案由 3 个基本组成部分组成:
模块配置.xml:
<config>
<modules>
<Havsund_Autoorder>
<version>1.0.0</version>
</Havsund_Autoorder>
</modules>
<global>
<events>
<sales_order_invoice_save_after>
<observers>
<havsund_autoorder_observer>
<type>singleton</type>
<class>Havsund_Autoorder_Model_Observer</class>
<method>automaticallyInvoiceShipCompleteOrder</method>
</havsund_autoorder_observer>
</observers>
</sales_order_invoice_save_after>
</events>
</global>
</config>
观察者代码:
class Havsund_Autoorder_Model_Observer
{
/* @var Magento_Sales_Model_Order_Invoice */
var $_invoice;
/**
* Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
* protected $_eventPrefix = 'sales_order';
* protected $_eventObject = 'order';
* event: sales_order_save_after
*/
public function automaticallyInvoiceShipCompleteOrder($observer)
{
try {
/* @var $order Magento_Sales_Model_Order_Invoice */
$this->_invoice = $observer->getEvent()->getInvoice();
$this->_invoice->sendEmail();
} catch (Mage_Core_Exception $e) {
Mage::log("HAVSUND AUTOORDER: Fehler #58 " . $e->getMessage());
}
return $this;
}
}
模块激活配置:
<?xml version="1.0"?>
<config>
<modules>
<Havsund_Autoorder>
<active>true</active>
<version>1.0.0</version>
<codePool>local</codePool>
<depends>
</depends>
</Havsund_Autoorder>
</modules>
</config>
笔记:如果您启用了编译,则在部署自定义后必须禁用/重新编译才能执行它,或者 你可能会得到一个错误 喜欢:
Warning: get_class() expects parameter 1 to be object, boolean given in /app/code/core/Mage/Core/Model/App.php on line 1340