从类调用时保存的模型,但不从另一个调用时保存 - save()不起作用

时间:2012-01-12 17:39:54

标签: magento

我正在尝试增强现有的支付模块(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正确更新:

step1


第2步 - 在前台办理订单,通过“调用”模型Quadra_Paybox_Model_Direct的capture()方法:

证明该过程“顺利”:我得到die('ok');

返回的“确定”

但数据库未更新!它仍然显示:

step2


第3步 - 再次导航到www.mydomain.com/testmodule ...并且惊喜,这里有一个新行,但ID中有一个跳转(auto_increment):

step3


所以这是我需要你的大力帮助的地方:

  • 为什么我的模型不是在第2步保存数据?

  • 为什么ID字段会跳转,这意味着请求/插入已经以某种方式发送到数据库?

我希望这些解释清楚明确,并为您提供足够的数据来分享您的线索。


编辑:我也尝试过直接核心/写入查询,也通过调度我在100%独立模块中观察到的事件。在这两种情况下都有相同的结论:在自己的工作中调用方法但在工作流程中调用它不会...在数据库中仍然没有保存和ID跳转。

1 个答案:

答案 0 :(得分:1)

如果数据库的自动增量正在递增但显然没有保存,那么它必须是一个中止的事务。尝试从代码中删除die()以查看代码是否进一步发展,您仍然可以使用Mage::log()进行输出。

在整个销售模块中使用了几个事务,ack用于“core / resource_transaction”以查看其中的一些事务。现有事件不会传递真正有用的事务对象,因此可能没有办法将对象添加到其中之一。模型在自己的保存期间也使用了一个事务,这意味着其他模型不能保存在其中,MySQL不支持嵌套事务。

您的最终解决方案可能必须将保存移至流程的另一部分。或者您可以利用Mage_Sales_Model_Order_Payment上的字段,因为它与您正在存储的内容相近,并且正确保存为订单交易的一部分。