Вы можете сделать это, создав модуль, который использует наблюдателей 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>