Magento // Получить последний созданный продукт

Надеюсь, кто-нибудь может мне помочь.

У меня в корзине запущены некоторые расчеты для изменения цены - это работает очень хорошо.

НО, если я дважды добавлю один и тот же продукт в корзину, но с разными значениями пользовательских параметров - первое значение параметров продуктов будет перезаписано значениями параметров второго....

Ну... не очень!

Я не знаю, как это понять... Итак, я сделал несколько грязных вещей и клонировал каждый продукт, который перемещается в корзину, поэтому у меня есть новый 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);

person Sebastian Großmann    schedule 08.08.2013    source источник


Ответы (1)


Когда Magento добавляет товары в корзину, сначала выполняется поиск, чтобы увидеть, был ли товар уже добавлен, и просто увеличивается количество. Как вы упомянули, это не помогает при добавлении одного и того же продукта с разными пользовательскими параметрами.

Я нашел способ сделать это вручную. Обязательно замените $YOUR_OPTIONS_HERE вашими пользовательскими параметрами и выберите правильный продукт.

// be sure to load the correct product
$product = Mage::getModel("catalog/product")->load($product_id);
$cart = Mage::getSingleton("checkout/cart");
$cart->init();

$options = new Varien_Object(array("options" => $YOUR_OPTIONS_HERE,
                                   "qty" => 1));

$addall = $product->getTypeInstance(true)
  ->prepareForCartAdvanced($YOUR_OPTIONS_HERE, $product, Mage_Catalog_Model_Product_Type_Abstract::PROCESS_MODE_FULL);
$addme = array_shift($addall);

Вручную создайте новую позицию коммерческого предложения для корзины

$item = Mage::getModel('sales/quote_item');
$item->setStoreId(Mage::app()->getStore()->getId());
$item->setProduct($addme)
 ->setOptions($addme->getCustomOptions());

Вручную добавьте это в предложение (корзину)

$item->setQty(1);
$cart->getQuote()->addItem($item);

После добавления всего, что вы хотите добавить

$cart->save();
person Andy Jones    schedule 09.08.2013
comment
Ну, я думаю, вы не поняли мою мысль :-/ Моя проблема не в том, что Magento просто добавляет количество + 1, когда я добавляю тот же продукт с другими пользовательскими параметрами. У меня есть 2 товара в корзине, когда я добавляю продукт с разными вариантами. Моя проблема в том, что когда я добавляю в корзину второй товар (тот же товар, но разные варианты), сумма первого продукта перезаписывается вторым. Мне нужно, чтобы magento обрабатывал каждый продукт как уникальный! Когда я клонирую продукт и добавляю это, проблем нет. - person Sebastian Großmann; 09.08.2013
comment
сумма перезаписывается - вы имеете в виду цену? У вас есть демо для просмотра? Вы также можете использовать вышеуказанное, чтобы установить пользовательскую цену на продукт. - person Andy Jones; 10.08.2013