Добавить новый атрибут в котировку / заказ Magento - PullRequest
4 голосов
/ 30 ноября 2010


Я работаю над модулем пользовательских баллов лояльности. Во время оформления заказа клиент имеет возможность обменять свои баллы.
В настройках модуля я создал eav_attribute redeem_points (он присутствует в таблице eav_attribute), и я добавил атрибут в цитату, ну вроде ...
Вот как я это сделал:

  • в mysql4-install-0.1.0.php я вызываю $ installer-> installEntities ();
  • в Namespace_Module_Model_Resource_Eav_Mysql4_Setup (который расширяет Mage_Eav_Model_Entity_Setup) есть только 1 метод открытая функция getDefaultEntities () , которая только возвращает массив, содержащий: *

       'quote' => array(
            'entity_model'  => 'sales/quote',
            'table'         => 'sales/quote',
            'attributes'    => array(
                'redeemed_points'   => array('type' => 'static')
            ),
        ),
    
  • снова в mysql4-install-0.1.0.php Я создаю столбец в таблице sales_flat_quote, как это

       //add redeemed_points to quote table
       $installer->getConnection()->addColumn($installer->getTable('sales/quote'), 'redeemed_points', 'bigint(20)');
       $installer->addAttribute('quote', 'redeemed_points', array('type'=>'static'));
    

В кассе, когда я выкупаю баллы, вызывается метод savePoints ($ data) из моего класса, который расширяет Mage_Checkout_Model_Type_Onepage:

public function savePoints($data)
{
    //save data
    if ($data == 1) {
        $redeemedPoints = Mage::helper('points')->getRedeemablePoints();
        $this->getQuote()->setRedeemedPoints($redeemedPoints['points']);
    } else {
        $this->getQuote()->setRedeemedPoints(0);
    }
    $this->getQuote()->collectTotals()->save();

    $this->getCheckout()
         ->setStepData('points', 'complete', true);
    if ($this->getQuote()->isVirtual()) {
        $this->getCheckout()->setStepData('payment', 'allow', true);
    } else {
        $this->getCheckout()->setStepData('shipping_method', 'allow', true);
    }

    Mage::helper('firephp')->debug($this->getQuote()->debug());

    return array();
}

Вы заметите, что я отлаживаю объект цитаты в firephp: в этот момент (на этом этапе оформления заказа просто сохраните его в цитате) я вижу атрибут redeemed_points с правильным значением.
Моя проблема в том, что на следующем шаге этот атрибут удален из объекта цитаты: (
Итак, я понимаю, что мне не удалось включить мой атрибут redeemed_points в объект цитаты, но я действительно не знаю, что мне не хватает ...
Кто-нибудь смеется?

Ответы [ 3 ]

7 голосов
/ 18 июля 2012

Попробуйте вручную удалить var / cache / *. Схемы БД там кешируются, и иногда Magento не берет ваши новые столбцы таблицы, даже если они там есть. Кроме того, кажется, что это не очищается с помощью функции очистки кэша в бэкэнде, а только удалением всего содержимого в каталоге вручную.

1 голос
/ 13 декабря 2016

Следующий расширенный пример включает очистку программного кэша:

$installer = Mage::getResourceModel('sales/setup', 'sales_setup');

    $installer->startSetup();

    $installer->addAttribute('order', 'new_attribute', array('type'=>'boolean','default'=>0));
    $installer->addAttribute('quote', 'new_attribute', array('type'=>'boolean','default'=>0));


    // Refresh DB table describing cache programmatically

    if (method_exists($this->_conn, 'resetDdlCache')) {
        $this->_conn->resetDdlCache('sales_flat_order');
        $this->_conn->resetDdlCache('sales_flat_quote');
    }

$installer->endSetup();
0 голосов
/ 18 февраля 2016

Есть самый простой способ, попробуйте этот пример:

$installer = Mage::getResourceModel('sales/setup', 'sales_setup');
    $installer->startSetup();
    $installer->addAttribute('order', 'new_attribute', array('type'=>'boolean','default'=>0));
    $installer->addAttribute('quote', 'new_attribute', array('type'=>'boolean','default'=>0));
$installer->endSetup();
...