Adicionando um produto ao carrinho via Querystring usando SKU
Pergunta
Eu sei que podemos adicionando um produto ao carrinho via querystring.
mas como adicionamos sku ao carrinho por meio de string de consulta no URL sem incluir ID do produtoassim :
domínio/checkout/carrinho/adicionar?sku=ABC
ou
domínio/checkout/carrinho/adicionar/sku=BC
Solução
Andhi Irawan, você não pode fazer esse tipo de trabalho em checkout Cart controllers
.Se quiser esse tipo de trabalho então você precisa rewrite Checkout CartController.php
e nesta classe magento é load the product object by id
antes going to cart
,Então você precisa load product by sku on
Esse lugar .
Passo 1:reescrever cartController.php e o código é para reescrever xml
<frontend>
<routers>
<checkout>
<args>
<modules>
<customcart before="Mage_Checkout">YourNameSpace_YourMOdule</customcart>
</modules>
</args>
</checkout>
</routers>
</frontend>
Passo 2: e em seu estendido Cartcontorller
_initProduct
função que você precisa carregar produto por sku
protected function _initProduct()
{
$sku=$this->getRequest()->setParam('sku');
$_catalog = Mage::getModel('catalog/product');
$idBySku = $_catalog->getIdBySku($sku);
if ($idBySku) {
$productId = $idBySku;
$this->getRequest()->setParam('product', $productId );
}else{
$productId = (int) $this->getRequest()->getParam('product');
}
if ($productId) {
$product = Mage::getModel('catalog/product')
->setStoreId(Mage::app()->getStore()->getId())
->load($productId);
if ($product->getId()) {
return $product;
}
}
return false;
}
Como reescrever o controlador, veja mais em: http://www.amitbera.com/how-to-override-a-controller-in-magento/
Outras dicas
minha função _initProduct():pastebin.com/873rBFYm
protected function _initProduct()
{
$sku = $this->getRequest()->getParam('sku');
$productId = (int) $this->getRequest()->getParam('product');
if($sku){
$params = $this->getRequest()->getParams();
$productId = Mage::helper('checkout/cart')->getProductIdByParams($params, false);
if(! $productId){
return false;
}
}
if ($productId) {
$product = Mage::getModel('catalog/product')
->setStoreId(Mage::app()->getStore()->getId())
->load($productId);
if ($product->getId()) {
return $product;
}
}
return false;
}
meu config.xml:pastebin.com/Ks85etyQ
<?xml version="1.0" ?><config>
<frontend>
<routers>
<checkout>
<args>
<modules>
<abc_checkout before="Mage_Checkout">ABC_Checkout</abc_checkout>
</modules>
</args>
</checkout>
</routers>
</frontend><global><helpers>
<checkout>
<rewrite>
<cart>ABC_Checkout_Helper_Cart</cart>
</rewrite>
</checkout>
</helpers></global></config>
meu ajudante:app\code\local\ABC\Checkout\Helper\Cart.php :pastebin.com/RZGSKJdr
<?php class ABC_Checkout_Helper_Cart extends Mage_Checkout_Helper_Cart{
public function getProductIdByParams($param, $outputFlag = true){
$sku = trim($param['sku']);
$_product = Mage::getModel('catalog/product')->setStoreId(Mage::app()->getStore()->getId())
->loadByAttribute('sku', $sku);
if($_product){
$productTypeId = $_product->getTypeId();
$productId = $_product->getId();
if($productTypeId == 'simple'){
$result = $outputFlag ? true : $productId;
}
elseif($productTypeId == 'configurable'){
$color = trim($param['color']);
$size = trim($param['size']);
$config = trim($param['option']);
$configurableProduct = Mage::getModel('catalog/product_type_configurable')->setProduct($_product);
$simpleCollections = $configurableProduct->getUsedProductCollection()
->addAttributeToSelect('id');
if(! empty($color)){
$attrColor = $_product->getResource()->getAttribute("sp_color");
$colorId = $attrColor->usesSource() ? $attrColor->getSource()->getOptionId($color) : '';
$simpleCollections->addAttributeToFilter('sp_color', $colorId);
}
if(! empty($size)){
$attrSize = $_product->getResource()->getAttribute("sp_size");
$sizeId = $attrSize->usesSource() ? $attrSize->getSource()->getOptionId($size) : '';
$simpleCollections->addAttributeToFilter('sp_size', $sizeId);
}
if(! empty($config)){
$attrConfig = $_product->getResource()->getAttribute("sp_config");
$configId = $attrConfig->usesSource() ? $attrConfig->getSource()->getOptionId($config) : '';
$simpleCollections->addAttributeToFilter('sp_config', $configId);
}
$simpleCollections->addFilterByRequiredOptions();
if($simpleCollections->count() == 1){
$productId = $simpleCollections->getFirstItem()->getId();
$result = $outputFlag ? true : $productId;
}
else{
$result = false;
}
}
return $result;
}
return false;
}}
então o sku pode ser adicionado por meio de uma string de consulta de URL como esta:
PRODUTO SIMPLES
Parameter:<br/>
~ sku<br/>
~ qty<br/>
a.Adicione produto com quantidade = 1
domain/id/index.php/checkout/cart/add/sku/ABCD<br/>
or<br/>
domain/id/index.php/checkout/cart/add?sku=ABCD
b.Adicione produto com quantidade superior a 1
domain/id/index.php/checkout/cart/add/sku/ABCD/qty/3<br/>
or<br/>
domain/id/index.php/checkout/cart/add?sku=ABCD&qty=3<br/>
CONFIGURABLE PRODUCT<br/>
Parameter:<br/>
~ sku<br/>
~ color<br/>
~ size<br/>
~ option (ex: used by XYZ)<br/>
~ qty<br/>
~ __store (id or en)<br/>
a.Adicione produto com quantidade = 1
domain/id/index.php/checkout/cart/add/sku/XYZ/color/merah tua/size/M/__store/id<br/>
domain/id/index.php/checkout/cart/add/sku/XYZ/color/maroon/size/M/__store/en<br/>
domain/id/index.php/checkout/cart/add/sku/XYZ/option/bilqis/__store/id<br/>
or<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&color=merah tua&size=M&__store=id<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&color=maroon&size=M&__store=en<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&option=bilqis&__store=id<br/>
b.Adicione produto com quantidade superior a 1
domain/id/index.php/checkout/cart/add/sku/XYZ/color/merah tua/size/M/qty/3/__store/id<br/>
domain/id/index.php/checkout/cart/add/sku/XYZ/color/maroon/size/M/qty/3/__store/en<br/>
domain/id/index.php/checkout/cart/add/sku/XYZ/option/bilqis/qty/3/__store/id<br/>
or<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&color=merah tua&size=M&qty=3&__store=id<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&color=maroon&size=M&qty=3&__store=en<br/>
domain/id/index.php/checkout/cart/add?sku=XYZ&option=bilqis&qty=3&__store=id