Сохранение свойств объекта через $object-›save(); проблемы

Я программист Magento, и я потерял несколько долгих минут, чтобы понять, почему свойство объекта не было сохранено в базе данных.

Давайте объясним, вот 3 фрагмента кода, которые, как я ожидаю, будут делать одно и то же:

Первый код

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$order->getPayment()->setAdditionalInformation('my_info',$myInfo);
$order->getPayment()->save();  //No information in the database is saved

Значение не сохранено в базе данных.

Второй код

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$payment = $order->getPayment();
$payment->setAdditionalInformation('my_info',$myInfo);
$payment->save();  //No information in the database is saved

Значение не сохранено в базе данных.

Третий код

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$order->getPayment()->setAdditionalInformation('my_info',$myInfo)->save();  //YEAHHH ! It works ! I now have that in my database.

Наконец то я понял !

Код из setAdditionalInformation

   /**
     * Additional information setter
     * Updates data inside the 'additional_information' array
     * or all 'additional_information' if key is data array
     *
     * @param string|array $key
     * @param mixed $value
     * @return Mage_Payment_Model_Info
     * @throws Mage_Core_Exception
     */
    public function setAdditionalInformation($key, $value = null)
    {
        if (is_object($value)) {
            Mage::throwException(Mage::helper('sales')->__('Payment disallow storing objects.'));
        }
        $this->_initAdditionalInformation();
        if (is_array($key) && is_null($value)) {
            $this->_additionalInformation = $key;
        } else {
            $this->_additionalInformation[$key] = $value;
        }
        return $this->setData('additional_information', $this->_additionalInformation);
    }

примечание: окончательный setData() всегда возвращает $this

Вопрос, почему?

Я думаю, что забыл некоторые особенности работы PHP, особенно для первого кода. Я бы понял, что это не работает из-за какой-то памяти с PHP.

Но два других фрагмента кода, почему они не работают?

Спасибо, Хьюз.


person liquidity    schedule 05.01.2011    source источник


Ответы (2)


Эти фрагменты кода идентичны с точки зрения Magento — вы ничего не забыли о том, как работает PHP. При установке Magento по умолчанию все 3 фрагмента должны давать одинаковые результаты.

Если результаты этих блоков кода отличаются, вам следует:

а) отключите все пользовательские расширения, которые вы используете, и попробуйте свои блоки кода без них - возможно, некоторые из расширений изменяют поведение моделей заказов или платежей по умолчанию.

б) убедитесь, что ваши фрагменты кода действительно такие же, как представленные в этом вопросе - возможно, были другие строки кода, которые вы считали неважными и не включали в этот вопрос

c) проверьте, что вы обновляете представление в своем клиенте MySQL после выполнения каждого фрагмента кода - возможно, вы видите просто старую информацию в таблице платежей

в2) убедитесь, что вы не используете реплицированные серверы MySQL - возможно, вы обновляете информацию в главной БД, но видите таблицу платежей из подчиненной БД, где эти изменения еще не были синхронизированы с

г) проверьте, что никакой другой код не выполняется после вашего — возможно, какая-то другая модель или контроллер модифицирует дополнительную_информацию и таким образом удалит все ваши изменения. Попробуйте вставить «выход» сразу после кода, чтобы быть уверенным в этом.

person Andrey Tserkus    schedule 05.01.2011
comment
Привет, спасибо за действительно подробный и точный ответ. Ты прав ! Вчера я выяснил (да... извините ^^), что другой фрагмент кода в другом файле просто отменял мои изменения (ответ 'd'). Тем не менее, я все равно благодарю вас, потому что теперь я уверен, что эти 3 фрагмента кода идентичны, в чем я не был полностью уверен во всех случаях. - person liquidity; 06.01.2011

Не пользователь Magento, но похоже, что каждый метод возвращает объект, который требуется следующему методу в цепочке.

Если вы вызываете каждый метод по отдельности, объект, который они создают или изменяют, не будет содержать никаких изменений, сделанных предыдущими вызовами метода. Связывая вызовы методов в цепочку, каждый из них получает изменения, сделанные предыдущим вызовом.

person simshaun    schedule 05.01.2011
comment
Привет, вы правы для возврата объекта: методы возвращают $this; Вот почему я понимаю, что первый код не работает. Однако второй код должен работать, потому что я работаю с той же переменной $payment. Я собираюсь отредактировать свой код, чтобы добавить код из setAdditionalInformation(); - person liquidity; 05.01.2011
comment
Кстати, второй кусок кода работает в другой части моего проекта, для того же объекта и той же функции. - person liquidity; 05.01.2011
comment
@HuguesALARY Привет, я пытаюсь добиться того же результата. Я имею в виду, что я пытаюсь сохранить платежную информацию безрезультатно. Моя новая установка Magento не содержит никаких внешних расширений. Так почему я не могу сохранить платежную информацию? КОД $order = Mage::getModel ('продажи/заказ')->loadByIncrementId ($data ['oid']); $order-›getPayment()-›setAdditionalInformation(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS, $data); $порядок-›сохранить(); - person Michelangelo; 20.07.2012