Надеюсь, кто-нибудь может мне помочь.
У меня в корзине запущены некоторые расчеты для изменения цены - это работает очень хорошо.
НО, если я дважды добавлю один и тот же продукт в корзину, но с разными значениями пользовательских параметров - первое значение параметров продуктов будет перезаписано значениями параметров второго....
Ну... не очень!
Я не знаю, как это понять... Итак, я сделал несколько грязных вещей и клонировал каждый продукт, который перемещается в корзину, поэтому у меня есть новый Product_ID, и мои вычисления должны выполняться правильно, потому что я думаю, что проблема в том, что значения первого продукта просто перезаписываются вторым, потому что это тот же идентификатор продукта .......
Итак, что я хочу теперь:
_1 Вариант: мне нужно, чтобы мои расчеты выполнялись без изменения цены первого продукта, когда тот же Product_ID находится в корзине.
or
_2 Вариант: мне нужно загрузить клонированные продукты в корзину вместо оригинальных и показать их.
Есть идеи?
Cartcontroller.php
/**
* if customer enteres shopping cart we should mark quote
* as modified bc he can has checkout page in another window.
*/
$this->_getSession()->setCartWasUpdated(true);
Varien_Profiler::start(__METHOD__ . 'cart_display');
$this
->loadLayout()
->_initLayoutMessages('checkout/session')
->_initLayoutMessages('catalog/session')
->getLayout()->getBlock('head')->setTitle($this->__('Shopping Cart'));
$this->renderLayout();
Varien_Profiler::stop(__METHOD__ . 'cart_display');
}
public function addAction()
{
$connection = Mage::getSingleton("core/resource")->getConnection("core_read");
$cart = $this->_getCart();
$params = $this->getRequest()->getParams();
try {
if (isset($params['qty'])) {
$filter = new Zend_Filter_LocalizedToNormalized(
array('locale' => Mage::app()->getLocale()->getLocaleCode())
);
$params['qty'] = $filter->filter($params['qty']);
}
$product = $this->_initProduct();
$related = $this->getRequest()->getParam('related_product');
/**
* CLONE PRODUCT
*/
$clone=$product->duplicate();
$clone->setSku($clonedSku);
$clone->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE);
$clone->setStatus(1); // AKTIV=1
$clone->setVisibility(4);
$clone->setTaxClassId(2);
$clone->setCategoryIds("93");
/**
* Check product availability
*/
if (!$clone) {
$this->_goBack();
return;
}
$cart->addProduct($product, $params);
if (!empty($related)) {
$cart->addProductsByIds(explode(',', $related));
}
$cart->save();
################## table from which to get percent sku catalog_product_option_type_value & catalog_product_option
foreach($this->_getQuote()->getAllItems() as $item)
{
if($item->getProductId() == $product->getId())
{
$percentage_total = 0;
$optionsArray = array();
foreach($params['options'] as $key => $value){
$qry = "SELECT `catalog_product_option_type_value`.`option_type_id`, `catalog_product_option_type_value`.`option_id` ,`catalog_product_option_type_price`.`price` FROM `catalog_product_option_type_price` INNER JOIN `catalog_product_option_type_value` ON `catalog_product_option_type_price`.`option_type_id` = `catalog_product_option_type_value`.`option_type_id` AND `catalog_product_option_type_value`.`sku` = 'percent' AND `catalog_product_option_type_value`.`option_type_id` = '".$value."' AND `catalog_product_option_type_value`.`option_id` = '".$key."'";
$percentvalue = $connection->fetchAll($qry);
if(intval($percentvalue[0]['price'])>0) $optionsArray[] = $percentvalue[0];
}
if(count($optionsArray)>0)
{
$rowTotal = $item->getRowTotalInclTax();
$newTotal = $rowTotal;// - $percentage_total;
$newTotalGrand = 0;
foreach($optionsArray as $optionsArr)
{
$newTotalGrand += $optionsArr['price'];
}
if($newTotalGrand>0)
{
$newTotalGrand = ($newTotal/100)*$newTotalGrand;
$newTotal = $newTotal + $newTotalGrand;
$query = "UPDATE `sales_flat_quote_item` SET `custom_price` = '".$newTotal."',`original_custom_price` = '".$newTotal."' WHERE `sales_flat_quote_item`.`item_id` ='".$item->getId()."'";
$connection->query($query);
}
}
}
}
$clone->setPrice($newTotal);
$clone->getResource()->save($clone);
$this->_getSession()->setCartWasUpdated(true);