Атрибут за нова количка на 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