我正在尝试增强现有的支付模块(Paybox),而且我已经被困在这个突破性的场景中了几个小时:即使我成功地将模型从原始模型保存到数据库,我也无法调用/保存它来自另一个班级/模特。
原始模型:
class Quadra_Paybox_Model_Saved extends Mage_Core_Model_Abstract
{
public function saveCardInformation() {
$data['customer_id'] = 12;
$data['porteur'] = 'porteur';
$data['dateval'] = 'dateval';
$data['cvv'] = 'cvv';
$data['numtrans'] = 'numtrans';
$data['numappel'] = 'numappel';
$this->setData($data);
$this->save();
return $this;
}
}
当然,附加了资源模型并正在工作:
class Quadra_Paybox_Model_Mysql4_Saved extends Mage_Core_Model_Mysql4_Abstract {
public function _construct() {
$this->_init('paybox/saved', 'id');
}
}
“通话”模式:
class Quadra_Paybox_Model_Direct extends Mage_Payment_Model_Method_Cc
{
public function saveCardInformationAlias() {
Mage::getModel('paybox/saved')->saveCardInformation();
}
public function capture(Varien_Object $payment, $amount)
{
$this->saveCardInformationAlias();
die('ok');
}
}
请注意,此型号扩展了Mage_Payment_Model_Method_Cc。当我尝试使它扩展Mage_Core_Model_Abstract时,我得到这个错误,这可能是我无法使用/理解的线索:
Error: Invalid method Quadra_Paybox_Model_Direct::prepareSave(Array ( ) )
我用于测试的文件:
我创建了一个嵌入phtml模板(template / testmodule.phtml)的CMS页面(identifier = testmodule)。我通过导航到www.mydomain.com/testmodule来调用它 以下是此模板的代码:
<?php
Mage::getModel('paybox/direct')->saveCardInformationAlias();
?>
现在是棘手的部分。 循序渐进的场景:
第1步 - 导航至www.mydomain.com/testmodule。 Everyhting流程,DB正确更新:
第2步 - 在前台办理订单,通过“调用”模型Quadra_Paybox_Model_Direct的capture()方法:
证明该过程“顺利”:我得到die('ok');
但数据库未更新!它仍然显示:
第3步 - 再次导航到www.mydomain.com/testmodule ...并且惊喜,这里有一个新行,但ID中有一个跳转(auto_increment):
所以这是我需要你的大力帮助的地方:
为什么我的模型不是在第2步保存数据?
为什么ID字段会跳转,这意味着请求/插入已经以某种方式发送到数据库?
我希望这些解释清楚明确,并为您提供足够的数据来分享您的线索。
编辑:我也尝试过直接核心/写入查询,也通过调度我在100%独立模块中观察到的事件。在这两种情况下都有相同的结论:在自己的工作中调用方法但在工作流程中调用它不会...在数据库中仍然没有保存和ID跳转。
答案 0 :(得分:1)
如果数据库的自动增量正在递增但显然没有保存,那么它必须是一个中止的事务。尝试从代码中删除die()
以查看代码是否进一步发展,您仍然可以使用Mage::log()
进行输出。
在整个销售模块中使用了几个事务,ack用于“core / resource_transaction”以查看其中的一些事务。现有事件不会传递真正有用的事务对象,因此可能没有办法将对象添加到其中之一。模型在自己的保存期间也使用了一个事务,这意味着其他模型不能保存在其中,MySQL不支持嵌套事务。
您的最终解决方案可能必须将保存移至流程的另一部分。或者您可以利用Mage_Sales_Model_Order_Payment
上的字段,因为它与您正在存储的内容相近,并且正确保存为订单交易的一部分。