가격 변경을 통해 프로그래밍 방식으로 장바구니에 제품 추가
프로그래밍 방식으로 장바구니에 제품을 추가하고 싶습니다. 또한 장바구니에 담을 때 상품 가격을 변경하고 싶습니다.
내 제품의 가격이 100 달러라고 가정 해 보겠습니다. 장바구니에 추가 할 때 $ 90로 변경하고 싶었습니다.
장바구니에 상품을 추가했습니다. 하지만 제품 가격을 변경할 수 없습니다.
가능합니까?
장바구니에 제품을 추가하는 코드는 다음과 같습니다.
$cart = Mage::getSingleton('checkout/cart');
try {
$cart->addProduct($product, array('qty' => 1));
$cart->save();
}
catch (Exception $ex) {
echo $ex->getMessage();
}
마 젠토의 핵심 코드로 비트를 파고 후, 나는 당신이 사용할 필요가 있음을 발견 $item->getProduct()->setIsSuperMode(true)
하게하기 위해 $item->setCustomPrice()
와 $item->setOriginalPrice()
작동합니다.
다음은 checkout_cart_product_add_after
또는 checkout_cart_update_items_after
이벤트 를 수신하는 Observer 내에서 사용할 수있는 몇 가지 샘플 코드 입니다. 코드는 checkout_cart_product_add_after
하나의 항목에만 checkout_cart_update_items_after
호출되고 카트의 모든 항목에 대해 호출 된다는 점을 제외하면 논리적으로 동일 합니다. 이 코드는 예제로 2 가지 방법으로 분리 / 복제되었습니다.
이벤트 : checkout_cart_product_add_after
/**
* @param Varien_Event_Observer $observer
*/
public function applyDiscount(Varien_Event_Observer $observer)
{
/* @var $item Mage_Sales_Model_Quote_Item */
$item = $observer->getQuoteItem();
if ($item->getParentItem()) {
$item = $item->getParentItem();
}
// Discounted 25% off
$percentDiscount = 0.25;
// This makes sure the discount isn't applied over and over when refreshing
$specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);
// Make sure we don't have a negative
if ($specialPrice > 0) {
$item->setCustomPrice($specialPrice);
$item->setOriginalCustomPrice($specialPrice);
$item->getProduct()->setIsSuperMode(true);
}
}
이벤트 : checkout_cart_update_items_after
/**
* @param Varien_Event_Observer $observer
*/
public function applyDiscounts(Varien_Event_Observer $observer)
{
foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item /* @var $item Mage_Sales_Model_Quote_Item */) {
if ($item->getParentItem()) {
$item = $item->getParentItem();
}
// Discounted 25% off
$percentDiscount = 0.25;
// This makes sure the discount isn't applied over and over when refreshing
$specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);
// Make sure we don't have a negative
if ($specialPrice > 0) {
$item->setCustomPrice($specialPrice);
$item->setOriginalCustomPrice($specialPrice);
$item->getProduct()->setIsSuperMode(true);
}
}
}
Magento는 장바구니에서 가격이 계산되는 방식을 변경하여 v1.4 이후로는이를 수행하기가 매우 어렵습니다. 옵저버 또는 다른 장치를 사용하여 가격을 설정하면 거의 확실하게 카탈로그 가격으로 다시 덮어 쓰여집니다.
효과적으로이를 구현하려면 쇼핑 카트 규칙을 사용해야합니다.
견적 항목의 고객 별 가격을 설정할 수 있습니다. 따라서 다음과 같이해야합니다.
$quoteItem = $quote->addProduct($product, $qty);
$quoteItem->setCustomPrice($price);
// we need this since Magento 1.4
$quoteItem->setOriginalCustomPrice($price);
$quote->save();
도움이 되었기를 바랍니다...
Jonathan's answer is likely the best for most situations. But some customers might not like how shopping cart discounts are displayed in the cart. I recently did a project (with Magento 1.3.3) where the customer didn't like how the each line item still showed the full price as well as the subtotal, with a Discount line below the subtotal - he wanted to see the price of each item discounted, and the subtotal show the discounted price as well. He really didn't like having the Discount line after the Subtotal line.
Anyway, if you find yourself in the same boat, one approach is to override the getCalculationPrice() and getBaseCalculationPrice() methods in Mage_Sales_Model_Quote_Address_Item and Mage_Sales_Model_Quote_Item. I know that it isn't always pretty to override, much better to use events, but in this case I couldn't get events to work seamlessly on both the frontend and backend. Not sure if this approach will work in Magento 1.4+.
If I have to share my solution that I made on the base of Simon then I have managed to rewrite model class save function of quote.
public function save()
{
$this->getQuote()->getBillingAddress();
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->getQuote()->collectTotals();
//$this->getQuote()->save();
foreach($this->getQuote()->getAllItems() as $item) {
$productId = $item->getProductId();
$product = Mage::getModel('catalog/product')->load($productId);
if($product->getAttributeText('is_dummy') == 'Yes') {
$price = 2;
$item->setCustomPrice($price);
// we need this since Magento 1.4
$item->setOriginalCustomPrice($price);
}
}
$this->getQuote()->save();
$this->getCheckoutSession()->setQuoteId($this->getQuote()->getId());
/**
* Cart save usually called after chenges with cart items.
*/
Mage::dispatchEvent('checkout_cart_save_after', array('cart'=>$this));
return $this;
}
I had the same issue and i am not a developer. What i did was added a new price attribute in magento backend called "site price". On the product page this showed the higher price $100. the actual price of the item was $90. so when the shopper adds it to cart they will see the actual price of the item, but on the product page they see the custom attribute price of $100
if all your prices on the product page are a set % higher then the real price just multiply your product price by the 1+percent. So if you want to add 10% to all your prices do price*1.1 This will display your price as 10% higher but when the shopper adds to cart they will see the real price.
참고URL : https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change
'IT Share you' 카테고리의 다른 글
HRESULT : 0x80131040 : 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (0) | 2020.12.08 |
---|---|
Postgres : varchar를 텍스트로 변환 (0) | 2020.12.08 |
jQuery DataGrid 플러그인을 선택 하시겠습니까? (0) | 2020.12.08 |
if ($ variable)은 정확히 어떻게 작동합니까? (0) | 2020.12.08 |
자바 스크립트로 div에 img 요소 추가 (0) | 2020.12.08 |