Сохранение свойства объекта через $ object-> save (); проблемы - PullRequest
0 голосов
/ 05 января 2011

Я программист на 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.

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

Спасибо, Гуго.

Ответы [ 2 ]

1 голос
/ 05 января 2011

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

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

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

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

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

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

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

0 голосов
/ 05 января 2011

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

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

...