Модель сохраняется при вызове из класса, но не из другого - save () не работает - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь улучшить существующий платежный модуль (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 ( ) )

Файл, который я использую для тестирования:

Я создал страницу CMS (identifier = testmodule), в которую встроен шаблон phtml (template / testmodule.phtml).Я вызываю это, перейдя на www.mydomain.com/testmodule. Вот код этого шаблона:

<?php
Mage::getModel('paybox/direct')->saveCardInformationAlias();
?>

Теперь самое сложное.Пошаговый сценарий:

Шаг 1- Перейдите по адресу www.mydomain.com/testmodule.Каждый поток проходит, БД корректно обновляется:

step1


Шаг 2 - Поместите заказ на фронт-офис, который проходит через захват ()метод "вызывающей" модели Quadra_Paybox_Model_Direct:

Доказательство того, что процесс идет "хорошо": я получаю "ok", возвращаемое die('ok');

, но БД не обновляется!Он по-прежнему показывает:

step2


Шаг 3- Перейдите снова на www.mydomain.com/testmodule ... и, неожиданно, новая строказдесь, но со скачком идентификатора (auto_increment):

step3


Так вот, где мне нужна ваша большая помощь:

  • почему моя модель не сохраняет данные на шаге 2?

  • почему в поле идентификатора есть скачок, означающий, что каким-то образом запрос / вставка был отправлен в БД?

Я надеюсь, что эти объяснения ясны и дадут вам достаточно данных, чтобы поделиться вашими подсказками.


Редактировать: я также пробовал через direct core /писать запросы, а также через отправку события, которое я наблюдаю в 100% независимом модуле.В обоих случаях один и тот же вывод: вызов метода сам по себе, но вызов его в рабочем процессе не ... По-прежнему нет сохранения и скачка идентификатора в БД.

1 Ответ

1 голос
/ 13 января 2012

Если автоинкремент базы данных увеличивается, но, очевидно, без сохранения, то это должна быть прерванная транзакция. Попробуйте удалить die() из вашего кода, чтобы увидеть, будет ли он работать дальше, вы все равно можете использовать Mage::log() для вывода.

В модуле Sales используется несколько транзакций, ack для "core / resource_transaction", чтобы увидеть некоторые из них. Существующие события не передают объекты транзакций, которые были бы действительно полезны, поэтому может не быть способа добавить ваш объект в один из них. Также модели используют транзакцию во время собственного сохранения, что означает, что другие модели не могут быть сохранены в них, MySQL не поддерживает вложенные транзакции.

Ваше возможное решение может заключаться в переносе сохранения в другую часть процесса. Или, возможно, вы можете использовать поля в Mage_Sales_Model_Order_Payment, поскольку это близко к тому, что вы храните, и правильно сохраняется как часть транзакции заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...