4

こんにちは、私が直面している問題は、最初は非常に単純なように見えましたが、今では本当の悪夢に変わりました。

すべての製品に属性(つまりポイント)を追加し(管理パネルを使用して非常に簡単に実行されました)、その合計をカート属性としてルールを設定できるようにするように求められました!?

カートの属性が次のように定義されていることは非常に肯定的です。

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;
}
<...>

したがって、このモデルを上書きしてその配列に項目を追加すると、ルール定義の管理パネルに表示される属性が取得されます。total_qtyとpayment_methodを除いて、これらすべての属性のsales_flat_quote_addressテーブルに一致する列があるようです。

ここで問題となるのは、ルール処理で新しい属性を計算して評価するにはどうすればよいですか?このテーブルに列を追加し、カートの変更時にその値を更新する必要がありますか?

これを行う方法についての洞察は、非常に価値のあるものになります。

4

1 に答える 1

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 のインスタンスを準備し、それを親の validate メソッドに送信します。このオブジェクト ($address) にはデフォルトで payment_method がないことがわかります。そのため、このメソッドが作成して割り当てます。だから私は同じことをしました.リターンの前に次のコードを追加しただけです:

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

これで、この属性にルールを設定できます。

これらの情報が将来誰かの時間を節約することを願っています.

于 2012-11-12T17:26:25.623 に答える