Атрибут новой корзины Magento

Привет, проблема, с которой я столкнулся, сначала казалась очень простой, но теперь превратилась в настоящий кошмар.

Меня попросили добавить атрибут (а именно точку) ко всем продуктам (что было сделано довольно просто с помощью панели администратора) и иметь его сумму в качестве атрибута корзины, на который можно установить правила!?

Я совершенно уверен, что атрибуты корзины определены в:

class Mage_SalesRule_Model_Rule_Condition_Address extends Mage_Rule_Model_Condition_Abstract
{
public function loadAttributeOptions()
{
    $attributes = array(
        'base_subtotal' => Mage::helper('salesrule')->__('Subtotal'),
        'total_qty' => Mage::helper('salesrule')->__('Total Items Quantity'),
        'weight' => Mage::helper('salesrule')->__('Total Weight'),
        'payment_method' => Mage::helper('salesrule')->__('Payment Method'),
        'shipping_method' => Mage::helper('salesrule')->__('Shipping Method'),
        'postcode' => Mage::helper('salesrule')->__('Shipping Postcode'),
        'region' => Mage::helper('salesrule')->__('Shipping Region'),
        'region_id' => Mage::helper('salesrule')->__('Shipping State/Province'),
        'country_id' => Mage::helper('salesrule')->__('Shipping Country'),
    );

    $this->setAttributeOption($attributes);

    return $this;
}
<...>

Поэтому, если я перезапишу эту модель и добавлю элемент в этот массив, я получу атрибут, показанный в административной панели определения правила. Кажется, что все эти атрибуты имеют соответствующие столбцы в таблице sales_flat_quote_address, кроме total_qty и payment_method!

Теперь проблема в том, что мне делать, чтобы мой новый атрибут вычислялся и оценивался при обработке правил? я должен добавить столбец в эту таблицу и обновить его значение при изменении корзины?

Любое понимание того, как это сделать, будет иметь большое значение, спасибо.


person Ehsan2e    schedule 01.11.2012    source источник


Ответы (1)


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

Класс, упомянутый в вопросе (например, Mage_SalesRule_Model_Rule_Condition_Address), является ключом к проблеме. Мне пришлось переписать его, и по какой-то странной причине я не мог получить то, что мне нужно, расширив его, поэтому мой класс расширил свой родительский класс (например, Mage_Rule_Model_Condition_Abstract).

Как я уже сказал, я добавил свой атрибут в $attributes следующим образом:

'net_score' => Mage::helper('mymodule')->__('Net Score')

Я также изменил метод getInputType() и объявил свой атрибут числовым.

теперь, что делает трюк, так это метод validate():

public function validate(Varien_Object $object)
{
    $address = $object;
    if (!$address instanceof Mage_Sales_Model_Quote_Address) {
        if ($object->getQuote()->isVirtual()) {
            $address = $object->getQuote()->getBillingAddress();
        }
        else {
            $address = $object->getQuote()->getShippingAddress();
        }
    }

    if ('payment_method' == $this->getAttribute() && ! $address->hasPaymentMethod()) {
        $address->setPaymentMethod($object->getQuote()->getPayment()->getMethod());
    }

    return parent::validate($address);
}

как вы можете видеть, он подготавливает экземпляр Mage_Sales_Model_Quote_Address и отправляет его родительскому методу проверки. вы можете видеть, что этот объект ($address) не имеет метода payment_method по умолчанию, поэтому этот метод создает его и присваивает ему. Поэтому я сделал то же самое, просто добавил следующий код перед возвратом:

if ('net_score' == $this->getAttribute() && ! $address->hasNetScore()) {
    $address->setNetScore( /*the logic for retrieving the value*/);
}

и теперь я могу установить правила для этого атрибута.

Надеюсь, что эта информация сэкономит чье-то время в будущем.

person Ehsan2e    schedule 12.11.2012