Пользовательские правила цены Magento для продукта - PullRequest
2 голосов
/ 18 октября 2011

Здравствуйте, мне нужно использовать magento для продажи продукта, для которого будут действовать пользовательские ценовые правила.
правило будет зависеть от количества проданного продукта.
Я знаю, что magento может создать специальное правило, если клиент++ количество этого продукта, но мне нужно применить другое правило, и я не могу найти способ.
Например, продукт, купленный у клиентов впервые 100 раз, цена: 100 $
продукт, купленный 200-500 раз, цена 400 $
500-1000, продукт 800 $
1000 ->продукт фиксированная цена 1000 $
возможно ли это для magento?



Спасибо

Ответы [ 2 ]

8 голосов
/ 18 октября 2011

Вы можете сделать это, создав модуль, который использует наблюдателей checkout_cart_product_add_after и checkout_cart_update_items_after.

Затем внутри вашего класса наблюдателей вы можете установить следующую функцию для установки цены:

public function yourAddToCartFunction($observer) {

    if ($p = $observer->getQuoteItem()->getParentItem()) {
        $discount_amount = $your_discount_logic;
        $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #configs
    } else  {
        $p = $observer->getQuoteItem();
        $discount_amount = $your_discount_logic;
        $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #simple products
    }
}

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

public function yourCartUpdateFunction($observer) {
    $cart = $observer->cart;
    $quote = $cart->getQuote();

    foreach($quote->getAllVisibleItems() as $item) {
        if ($p = $item->getParentItem()) {
            $discount_amount = $your_discount_logic;
            $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #configs
        } else {
            $discount_amount = $your_discount_logic;
            $item->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #simple products
        }
    }
}

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

Массовое редактирование:

Хорошо, вот как бы я это сделал. Я предполагаю, что вы начинаете с базового, функционального модуля.

Первое, что вы хотите сделать, это настроить ваших наблюдателей в файле config.xml ваших модулей. В этом случае вы собираетесь использовать наблюдателей checkout_cart_product_add_after и checkout_cart_update_items_after. Вы установите это, добавив следующее в файл config.xml:

<config>
    ...
    <global>
        ...
        <events>
            <checkout_cart_product_add_after>
                <observers>
                    <call_this_something_unique>
                        <type>singleton</type>
                        <class>Ocaff_Custompricing_Model_Cart_Observer</class>
                        <method>calculateAddToCart</method>
                    </call_this_something_unique>
                </observers>
            </checkout_cart_product_add_after>

            <checkout_cart_update_items_after>
                <observers>
                    <call_this_something_unique_2>
                        <type>singleton</type>
                        <class>Ocaff_Custompricing_Model_Cart_Observer</class>
                        <method>calculateCartUpdate</method>
                    </call_this_something_unique_2>
                </observers>
            </checkout_cart_update_items_after>
        </events>
        ...
    </global>
    ...
</config>

По сути, это говорит Magento, что, когда событие checkout_cart_product_add_after инициируется, запустите метод executeAddToCart класса Ocaff_Custompricing_Model_Cart_Observer, а также запустите функцию convertCartUpdate, когда событиеoutout_cart_up_ategate_up_ategate_ategate_ategate_t_t_t_t_t_t_t_t_t_t_t_t_t_t_tart

Хорошо, теперь, когда ваша конфигурация собрана, вы можете создать свою модель. В этом примере класс будет расположен в файле /app/code/local/Ocaff/Custompricing/Model/Cart/Observer.php (однако вы поместите класс, соответствующий вашему модулю)

Хорошо, теперь в вашем файле Observer.php вы добавите следующий код:

<?php

class Ocaff_Custompricing_Model_Cart_Observer {

    public function calculateAddToCart($observer) {
        if ($p = $observer->getQuoteItem()->getParentItem()) {
        $discount_amount = Mage::helper('custompricing')->calculatePrice($p);
        $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #configs
    } else  {
        $p = $observer->getQuoteItem();
        $discount_amount = Mage::helper('custompricing')->calculatePrice($p);
        $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #simple products
    }
    }

    public function calculateCartUpdate($observer) {
        $cart = $observer->cart;
    $quote = $cart->getQuote();

    foreach($quote->getAllVisibleItems() as $item) {
        if ($p = $item->getParentItem()) {
            $discount_amount = Mage::helper('custompricing')->calculatePrice($prpoduct);
            $p->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #configs
        } else {
            $discount_amount = Mage::helper('custompricing')->calculatePrice($p);
            $item->setCustomPrice($discount_amount)->setOriginalCustomPrice($discount_amount); #simple products
        }
    }
    }

}

Хорошо, несколько заметок здесь. обе функции принимают один параметр, который я назвал наблюдателем (и почти везде это тоже называется). Это единственная переменная, которая содержит всю информацию, которую Magento передает всем функциям, которые обрабатывают событие. В случае с функцией calcAddToCart мы только берем элемент кавычки (что сбивает с толку, так как при оформлении заказа в Magento есть довольно много различных объектов, которые все представляют одну и ту же вещь, если вы смотрите на нее с высоты 50000 футов). Эта функция берет элемент цитаты и определяет, является ли продукт, который был добавлен в корзину, простым или настраиваемым продуктом, и выполняет соответствующее действие.

Функция CalculateCartUpdate в основном делает то же самое, но вместо этого ей приходится перебирать все товары в корзине, поскольку в Magento вы обновляете всю корзину сразу, а не каждую позицию.

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

Хорошо, теперь вы можете заметить или не заметить, что я сделал что-то немного меньшее, чем обычное для определения переменной $ discount_amount. Я вызываю вспомогательную функцию, чтобы получить цену, на которую должен быть установлен продукт. Я поместил это в помощник, потому что вы можете захотеть получить доступ к этой логике в другом месте системы, и я обычно предпочитаю помещать такую ​​логику в помощник (на самом деле я уверен, что вы захотите использовать это в продукте и страницы категорий, поскольку вы изменяете способ определения цены для некоторых продуктов, и клиенты злятся, когда цены неожиданно меняются)

Хорошо, теперь на вспомогательную функцию.Так как я не уверен на 100%, какую логику вы действительно хотите в итоге, мы просто сделаем эту функцию простой и сделаем так, чтобы она возвращала 2 доллара.Это сделает все, что входит в корзину, $ 2 независимо от его цены.Это будет то, где вы выясните свою логику ценообразования.

<?php 

class Ocaff_Custompricing_Helper_Data {

    public function calculatePrice($product=null) {

        // Your custom logic will go here. Whatever number you come up with and return will be the price that the item is set to

        return 2;

    }

}

По большей части это должно дать вам около 90% от того, что вы хотите быть.Попробуйте это и опубликуйте вопросы, и я сделаю все возможное, чтобы помочь вам.

Другое Правка: Активация помощников в config.xml

Поместите этот код в файл config.xml сразу после вашегоблок наблюдателей подробно описан выше.Это сообщит Magento расположение вспомогательных файлов для вашего модуля.

<helpers>
    <custompricing>
    <class>Ocaff_Custompricing_Helper</class>
    </custompricing>
</helpers>
1 голос
/ 18 октября 2011

Это функция уровня цен, вам не нужно создавать правило цены каталога.Проверьте страницу редактирования продукта, когда вы управляете своими продуктами в бэкэнде, на вкладке Цены и увидите опцию «Уровень цен»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...