Update dropdown attribute value Programtically for single product
-
09-10-2020 - |
質問
Onclick Add to cart button we are trying to update the Attribute value from "NO" to "YES".
[ attribute code : cart_status
(Yes/No dropdown) Attribute ]
I tried below code, its changing attribute values for all products, but i need to change value only for that particular product that i added to cart.
<?php
foreach ($collections as $key => $product)
{
echo $product->getName().' <br><br>';
$_product = Mage::getModel('catalog/product')->load($product->getId());
?>
<form action="<?php
echo Mage::helper('checkout/cart')->getAddUrl($product);
// update cart_status
echo "\n".'updating '.$_product->getSku()."...\n";
$_product->setData('cart_status', 1)->getResource()->saveAttribute($_product, 'cart_status');
$_product->save();
// update cart_status end
?>" method="post">
<div>
<button>Add to cart</button>
</div>
</form>
Update
After following Dhiren Vasoya's Solution , once i click on Add to cart
, In 1)Frontend its changing Attribute value [From "NO" to "YES" , but once i refresh page, again it showing old value [ NO ] , But in 2)In Backend, updated Values are not showing for "Default Values" , but showing for "Stores"
Default values :
Stores :
config :
<checkout_cart_product_add_after>
<observers>
<example_add_to_cart_after>
<class>Amasty_Example_Model_Observer</class>
<method>AddToCartAfter</method>
</example_add_to_cart_after>
</observers>
</checkout_cart_product_add_after>
app/code/local/Amasty/Example/Model/Observer.php
class Amasty_Example_Model_Observer
{
public function AddToCartAfter($observer)
{
$product = $observer->getEvent()->getProduct();
$product->setCartStatus(1);
$product->save();
}
}
解決
First you need to add observer throught you extension config.xml.
app/code/CODEPOOL/Vendor/Extension/etc/config.xml
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<extension_add_to_cart_after>
<class>YOUR_OBSERVER_CLASS</class>
<method>AddToCartAfter</method>
</extension_add_to_cart_after>
</observers>
</checkout_cart_product_add_after>
</events>
</frontend>
Now you have to code in yorr observer.php file like this :
app/code/CODEPOOL/Vendor/Extension/Model/Observer.php
class Vendor_Extension_Model_Observer extends Mage_Core_Model_Observer
{
public function AddToCartAfter($observer)
{
$product = $observer->getEvent()->getProduct();
$product->setCartStatus(1);
$product->save();
}
}
他のヒント
override your checkout controller there in
addAction
after add to cart code use your code.OR create an event observer
checkout_cart_product_add_after
there you can get the particular product.
For the above process, if you not familiar do google you'll get those information.
you want to update particular product attribute value which one is getting added to cart. So it will better if you use observer for add to cart. Using that you can update attribute value for the specific product that you are adding to cart.
You are better off using event checkout_cart_product_add_after
and then utilise the code mentioned here
For your error message ... please try this code in your observer method:
$product = $observer->getEvent()->getProduct();
Mage::getSingleton('catalog/product_action')->updateAttributes(
array($product->getId()),
array('cart_status' => 1),
$storeId
);
Note: set $storeId
to 0
if you want to save it as default value or use Mage::app()->getStore()->getId()
for store view specific value.
Create a custom module
app/code/local/MagePal/UpdateProductOnAddToCart/etc/config.xml
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<magepal_updateproductonaddtocart_add_to_cart_after>
<class>MagePal_UpdateProductOnAddToCart_Observer</class>
<method>AddToCartAfter</method>
</magepal_updateproductonaddtocart_add_to_cart_after>
</observers>
</checkout_cart_product_add_after>
</events>
</frontend>
Observer
app/code/local/MagePal/UpdateProductOnAddToCart/Model/Observer.php
class MagePal_UpdateProductOnAddToCart_Observer extends Mage_Core_Model_Observer
{
public function AddToCartAfter($observer)
{
// Set store id to admin
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$product_id = $observer->getEvent()->getProduct()->getId();
$store_id = 0;
$action = Mage::getModel('catalog/resource_product_action');
$action->updateAttributes(array($product_id), array(
'cart_status' => 1
), $store_id);
}
}