Domanda

Ho uno strano problema sul mio sistema di test. Sono abbastanza nuovo per Magento e che questo problema potrebbe esistere, perché è un sistema di test.

Ho alcuni prodotti con prodotti correlati. Se cerco di aggiungere un prodotto al carrello della spesa con il suo prodotto correlato (s). Il prodotto correlato (s) non ottengono aggiunto al carrello.

La mia prima risposta è stata una javascript rotto, ma tutto sembra ci sia ok. Il mio prossimo passo è stato quello di farmi i dati di temperamento per firefox. Ho verificato, che il Postdatum contiene:

product         = $id_of_product
related_product = $id_of_related_product
qty             = $qty_of_product

Ancora il relativo prodotto non vengono aggiunti al carrello. Questo potrebbe essere un problema con l'installazione del sistema di test? La modifica dei quantitativi funziona bene per il prodotto normale. Cambiare l'id del related_product per l'id di un altro prodotto non aggiunge nulla al carrello, anche.

Grazie in anticipo

Modifica

Ok, come altri potrebbero avere lo stesso problema che ho lasciare la domanda originale e descrivere qui come eseguire il debug di questo.

La prima cosa da fare è disattivare tutti i moduli in locale e della comunità. Il modo più semplice è quello di rinominare temporaneamente il app/code/local cartelle e app/code/community e verificare se funziona in seguito. Se non funziona si deve cercare ulteriormente.

Se l'errore persiste ancora controllare il messaggio di posta inviato al server. Un modo semplice per farlo è quello di ottenere l'addon Tamper Data per Firefox. Se il messaggio post non apparire come il messaggio nella foto:

Inserisci richiesta

L'errore è probabilmente all'interno del JavaScript del file app/design/frontend/base/default/template/catalog/product/list/related.phtml. Modificare il percorso per il tema che si sta utilizzando.

Il campo POSTDATA dovrebbe contenere related_product=Comma_Separated_Ids_Of_Selected_Related_Products

Se tutto sembra a posto fino ad ora, l'errore è da qualche parte nel codice di Magento. Come Magento aggiunge prodotti al carrello è descritto in un post sul blog qui: http://www.ecomdev.org/2012/12/12/magento-checkout-shopping-cart-flow.html

Il POSTDATA è calcolata in app/code/core/Magento/Checkout/controllers/CartController.php le linee sotto

        193  $cart->addProduct($product, $params);
        194  if (!empty($related)) {
        195      $cart->addProductsByIds(explode(',', $related));
        196  }

Assicurati che la variabile $related contiene gli ID dei vostri prodotti correlati.

Se questo è il caso questo vi porterà a app/code/core/Mage/Checkout/Model/Cart.php dove nel mio caso l'errore è stato.

È stato utile?

Soluzione

Ok, ho finalmente può aggiungere il related_product al carrello. Nel file code/core/Mage/Checkout/Model/Cart.php sono due funzioni per aggiungere prodotti nel carrello. Il primo è chiamato public function addProduct($productInfo, $requestInfo=null), la seconda funzione è public function addProductsByIds($productIds).

Il related_product viene aggiunto da id, gli altri sono aggiunti con la funzione addProduct(). L'aggiunta da id non sembra funzionare (almeno per me che non ha. Anche se Magento utilizzato il file Cart.php inalterato da 1.7.0.2.

Ho risolto questo alterando il file Cart.php in questo modo:

 /**
 * Add product to shopping cart (quote)

 * This is the original function pasted from
 * Mage/Checkout/Model/Cart.php line 245
 * The function is working and adding products to the cart

 *
 * @param   int|Mage_Catalog_Model_Product $productInfo
 * @param   mixed $requestInfo
 * @return  Mage_Checkout_Model_Cart
 */
public function addProduct($productInfo, $requestInfo=null)
{
    $product = $this->_getProduct($productInfo);
    $request = $this->_getProductRequest($requestInfo);

    $productId = $product->getId();

    if ($product->getStockItem()) {
        $minimumQty = $product->getStockItem()->getMinSaleQty();
        //If product was not found in cart and there is set minimal qty for it
        if ($minimumQty && $minimumQty > 0 && $request->getQty() < $minimumQty
            && !$this->getQuote()->hasProductId($productId)
        ){
            $request->setQty($minimumQty);
        }
    }

    if ($productId) {
        try {
            $result = $this->getQuote()->addProduct($product, $request);
        } catch (Mage_Core_Exception $e) {
            $this->getCheckoutSession()->setUseNotice(false);
            $result = $e->getMessage();
        }
        /**
         * String we can get if prepare process has error
         */
        if (is_string($result)) {
            $redirectUrl = ($product->hasOptionsValidationFail())
                ? $product->getUrlModel()->getUrl(
                    $product,
                    array('_query' => array('startcustomization' => 1))
                )
                : $product->getProductUrl();
            $this->getCheckoutSession()->setRedirectUrl($redirectUrl);
            if ($this->getCheckoutSession()->getUseNotice() === null) {
                $this->getCheckoutSession()->setUseNotice(true);
            }
            Mage::throwException($result);
        }
    } else {
        Mage::throwException(Mage::helper('checkout')->__('The product does not exist.'));
    }

    Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item' => $result, 'product' => $product));
    $this->getCheckoutSession()->setLastAddedProductId($productId);
    return $this;
}

/**
 * Adding products to cart by ids

 * This function is the altered function, which works for me
 * the edited lines are marked.

 *
 * @param   array $productIds
 * @return  Mage_Checkout_Model_Cart
 */
public function addProductsByIds($productIds)
{
    $allAvailable = true;
    $allAdded     = true;

    if (!empty($productIds)) {
        foreach ($productIds as $productId) {
            $productId = (int) $productId;
            if (!$productId) {
                continue;
            }
            $product = $this->_getProduct($productId);
            if ($product->getId() && $product->isVisibleInCatalog()) {
                try {
                    $this->getQuote()->addProduct($product);
                } catch (Exception $e){
                    $allAdded = false;
                }

                /**
                 * START EDIT
                 */

                /**
                * String we can get if prepare process has error
                */
                if (is_string($result)) {
                    $redirectUrl = ($product->hasOptionsValidationFail())
                        ? $product->getUrlModel()->getUrl(
                            $product,
                            array('_query' =>array                                   ('startcustomization' => 1))
                            )
                        : $product->getProductUrl();
                    $this->getCheckoutSession()->setRedirectUrl($redirectUrl);
                    if ($this->getCheckoutSession()->getUseNotice() === null) {
                        $this->getCheckoutSession()->setUseNotice(true);
                    }
                    Mage::throwException($result);
                }
                Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item' => $result, 'product' => $product));
                $this->getCheckoutSession()->setLastAddedProductId($productId);

                /**
                 * STOP EDIT
                 */

            } else {
                $allAvailable = false;
            }
        }

        if (!$allAvailable) {
            $this->getCheckoutSession()->addError(
                Mage::helper('checkout')->__('Some of the requested products are unavailable.')
            );
        }
        if (!$allAdded) {
            $this->getCheckoutSession()->addError(
                Mage::helper('checkout')->__('Some of the requested products are not available in the desired quantity.')
            );
        }
    }
    return $this;
}

Così ho copiato le linee dal altra funzione. Qualcuno pensa che questo avrà alcuni svantaggi? Per me sembra che questo introduce un altro controllo se tutto funziona correttamente esaminando la stringa di ritorno. Ma non so se invia l'evento potrebbe avere alcuni effetti negativi. Come ho detto, io sono nuovo a Magento e vorrei sapere se questa è una soluzione solida.

Qualcuno sa, perché le funzioni sono diverse? Perché fanno fondamentalmente la stessa. L'unica differenza è che la seconda funzione può aggiungere più di prodotto. Forse in questo caso invia l'evento è lento?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top