2011-05-31 70 views
2

我嘗試使用http://sourceforge.net/projects/massaddtocart/多個產品添加到購物車 - Magento的

這是我想要的東西,但它顯示了這個錯誤:

Fatal error: Call to a member function setProduct() on a non-object in [...]/app/code/local/BD83/MassAddToCart/Helper/Data.php on line 20 

我想添加多個簡單的產品具有不同的只需點擊一次即可購物。這個選項在Magento中不存在。

任何幫助表示讚賞。

OK喬納森,那就是: http://www.dickblick.com/products/winsor-and-newton-artists-acrylics/ http://www.polymexint.com/nouvelle-montana-black-blk-400ml.html:

public function getButtonHtml(Mage_Catalog_Model_Product $product) 
{ 
    if ($product->getId() && !$product->getIsComposite()) { 
     $qtyBlock = Mage::app()->getLayout() 
      ->getBlock('bd83.massaddtocart.catalog.product.list.item.button'); 
     $qtyBlock->setProduct($product) // **LINE 20** 
      ->setProductId($product->getId()) 
      ->setMinQty(Mage::getStoreConfig(self::XML_PATH_MIN_QTY)) 
      ->setDefaultQty(Mage::getStoreConfig(self::XML_PATH_DEFAULT_QTY)) 
      ->setMaxQty(Mage::getStoreConfig(self::XML_PATH_MAX_QTY)); 
     return $qtyBlock->toHtml(); 
    } 
    return ''; 
} 

因爲我想獲得一些什麼exemples

@Oliver:檢查您的回覆

+0

粘貼在/app/code/local/BD83/MassAddToCart/Helper/Data.php的第20行左右,以便我們可以看到一些上下文請 – 2011-05-31 09:15:43

+0

感謝您的快速響應,即代碼: public function getButtonHtml (Mage_Catalog_Model_Product $ product) if($ product-> getId()&&!$ product-> getIsComposite()){ $ qtyBlock = Mage :: app() - > getLayout() - > getBlock('bd83 .massaddtocart.catalog.product.list.item.button'); $ qtyBlock-> setProduct($產品) - > setProductId($產品 - >的getId()) - > setMinQty(法師:: getStoreConfig(個體經營:: XML_PATH_MIN_QTY)) - > setDefaultQty(法師:: getStoreConfig(個體經營:: XML_PATH_DEFAULT_QTY)) - > setMaxQty(Mage :: getStoreConfig(self :: XML_PATH_MAX_QTY)); return $ qtyBlock-> toHtml(); } return''; } – Newbie 2011-05-31 09:25:32

+0

請編輯你的問題的代碼和格式,以便它的可讀性:)並標記哪些是第20行。thx – 2011-05-31 09:40:38

回答

4

仍在搜索?發現這個一個:

http://www.magentocommerce.com/boards/viewthread/9797

似乎在當前版本的工作,雖然我沒有測試它。如果你解決了它,至少將來的搜索者會知道在哪裏找到它!

/***編輯****/

好了,「不被認爲是一個貧窮的答案」,這個你應該如何實施解決方案。沒有任何代碼是我的工作,向Uni-Man,Nexus Rex和Magento論壇傢伙聲稱:)

該代碼已有詳細記錄。它在命名空間「Company」中創建一個名爲「Module」的完全Magento擴展。

首先,實現應用程序/代碼/本地/公司/模塊/幫手/ Data.php助手:

<?php 
    class Company_Module_Helper_Multiple extends Mage_Core_Helper_Url 
    { 
     /** 
     * Return url to add multiple items to the cart 
     * @return url 
     */ 
     public function getAddToCartUrl() 
     { 
      if ($currentCategory = Mage::registry('current_category')) { 
       $continueShoppingUrl = $currentCategory->getUrl(); 
      } else { 
       $continueShoppingUrl = $this->_getUrl('*/*/*', array('_current'=>true)); 
      } 

      $params = array(
       Mage_Core_Controller_Front_Action::PARAM_NAME_URL_ENCODED => Mage::helper('core')->urlEncode($continueShoppingUrl) 
      ); 

      if ($this->_getRequest()->getModuleName() == 'checkout' 
       && $this->_getRequest()->getControllerName() == 'cart') { 
       $params['in_cart'] = 1; 
      } 
      return $this->_getUrl('checkout/cart/addmultiple', $params); 
     } 
    } 

接下來,你需要做一些模板變化。將文件app/design/base/default/templates/catalog/list.phtml複製到app/design/default/default/templates/catalog/list.phtml。這確保了,一旦不再需要擴展名,您/您的客戶端就可以返回到正常列表視圖而無需編碼。如下 修改新list.phtml文件:

<?php echo $this->getToolbarHtml(); ?> 

添加

<form action="<?php echo $this->helper('Module/multiple')->getAddToCartUrl() ?>" method="post" id="product_addtocart_form"> 
<button class="form-button" onclick="productAddToCartForm.submit()"><span><?php echo $this->__('Add Items to Cart') ?></span></button> 

(這將打開的形式,所有以下項目將增加輸入框的數量,所以你可以使用一個單獨的按鈕將所有物品放入購物車,這也放在這裏。)

向下滾動,你會發現這裏通常產生的「加入購物車」按鈕面積:

<?php if($_product->isSaleable()): ?> 

更換,如果塊的與內容:

<fieldset class="add-to-cart-box"> 
    <input type="hidden" name="products[]" value="<?php echo $_product->getId() ?>" /> 
    <legend><?php echo $this->__('Add Items to Cart') ?></legend> 
    <span class="qty-box"><label for="qty<?php echo $_product->getId() ?>"><?php echo $this->__('Qty') ?>:</label> 
    <input name="qty<?php echo $_product->getId() ?>" type="text" class="input-text qty" id="qty<?php echo $_product->getId() ?>" maxlength="12" value="" /></span> 
</fieldset> 

這是數量的輸入字段。 要關閉 - 標籤,之後

<?php echo $this->getToolbarHtml() ?> 

在底部插入:

<button class="form-button" onclick="productAddToCartForm.submit()"><span><?php echo $this->__('Add Items to Cart') ?></span></button> 
</form> 

你在這裏做什麼是: - 產生第二「加入購物車」 - 鍵,同樣用一個頂部 - 關閉表格

當一個項目被添加到購物車時,通常Magento會調用Checkout_CartController。我們必須修改這一個,以便不僅添加一個,而且所有物品都以適量的數量添加到購物車中。

因此,添加文件的應用程序/代碼/本地/公司/模塊/控制器/結帳/ CartController.php,並填寫在此:

> require_once 'Mage/Checkout/controllers/CartController.php'; 
> 
> class Company_Module_Checkout_CartController extends 
> Mage_Checkout_CartController { 

>  public function addmultipleAction() 
>  { 
>   $productIds = $this->getRequest()->getParam('products'); 
>   if (!is_array($productIds)) { 
>    $this->_goBack(); 
>    return; 
>   } 
> 
>   foreach($productIds as $productId) { 
>    try { 
>     $qty = $this->getRequest()->getParam('qty' . $productId, 0); 
>     if ($qty <= 0) continue; // nothing to add 
>     
>     $cart = $this->_getCart(); 
>     $product = Mage::getModel('catalog/product') 
>      ->setStoreId(Mage::app()->getStore()->getId()) 
>      ->load($productId) 
>      ->setConfiguredAttributes($this->getRequest()->getParam('super_attribute')) 
>      ->setGroupedProducts($this->getRequest()->getParam('super_group', array())); 
>     $eventArgs = array(
>      'product' => $product, 
>      'qty' => $qty, 
>      'additional_ids' => array(), 
>      'request' => $this->getRequest(), 
>      'response' => $this->getResponse(), 
>    ); 
>  
>     Mage::dispatchEvent('checkout_cart_before_add', $eventArgs); 
>  
>     $cart->addProduct($product, $qty); 
>  
>     Mage::dispatchEvent('checkout_cart_after_add', $eventArgs); 
>  
>     $cart->save(); 
>  
>     Mage::dispatchEvent('checkout_cart_add_product', array('product'=>$product)); 
>  
>     $message = $this->__('%s was successfully added to your shopping cart.', $product->getName());  
>     Mage::getSingleton('checkout/session')->addSuccess($message); 
>    } 
>    catch (Mage_Core_Exception $e) { 
>     if (Mage::getSingleton('checkout/session')->getUseNotice(true)) { 
>      Mage::getSingleton('checkout/session')->addNotice($product->getName() . ': ' . $e->getMessage()); 
>     } 
>     else { 
>      Mage::getSingleton('checkout/session')->addError($product->getName() . ': ' . $e->getMessage()); 
>     } 
>    } 
>    catch (Exception $e) { 
>     Mage::getSingleton('checkout/session')->addException($e, $this->__('Can not add item to shopping cart')); 
>    } 
>   } 
>   $this->_goBack(); 
>  } } 

我們重寫與我們自己現有的法師核心類,導致我們的控制器用於此目的。

您還必須到模塊的config.xml添加像往常一樣在app /代碼/本地/公司/模塊的/ etc/config.xml文件:

<?xml version="1.0"?> 
    <config> 
     <modules> 
      <Company_Module> 
       <version>0.1.0</version> 
      </Company_Module> 
     </modules> 
     <global> 
      <rewrite> 
       <company_module_checkout_cart> 
        <from><![CDATA[#^/checkout/cart/addmultiple/.*$#]]></from> 
        <to>/module/checkout_cart/addmultiple/</to> 
       </company_module_checkout_cart> 
      </rewrite> 
      <helpers> 
       <Module> 
        <class>Company_Module_Helper</class> 
       </Module> 
      </helpers> 
     </global> 
     <frontend> 
      <routers> 
       <company_module> 
        <use>standard</use> 
        <args> 
         <module>Company_Module</module> 
         <frontName>module</frontName> 
        </args> 
       </company_module> 
      </routers> 
     </frontend> 
    </config> 

這裏做的事情: - 取代來電購物車控制器呼叫自己的多點控制器 - 登記幫手 - 適用路由器前端

請告訴我,如果需要更多的文檔。

+0

Lone鏈接[被認爲是一個不好的答案](http://stackoverflow.com/faq#deletion),因爲它本身毫無意義,並且目標資源未來不會保證活着。請儘量至少包含您要鏈接的信息摘要。 – j0k 2012-09-05 13:06:38

0

有一個更簡單的方法來做到這一點與jQuery/Javascript。頁面上的所有產品都在<li>標籤中。這些標籤有一個名爲data-product-id的屬性,其中包含每個產品的數字ID。另外,我確定您知道您可以使用網址將多個產品添加到購物車,例如http://www.yoursite.com/checkout/cart/add?product=1&related_product=2,3(用您自己的產品ID替換數字1,2和3)。

如果您有我們可以使用jQuery/JavaScript生成一個URL,該頁面可以獲取頁面上每個產品的所有產品ID,並將它們相應地放置在類似上面的URL中。

要做到這一點,首先,請確保您有jQuery的添加到您的網站:

<script src="http://code.jquery.com/jquery-1.10.0.min.js"></script> 
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 

現在,添加下面的腳本 - 有筆記,讓你知道每個變量和函數的作用:

<script> 
$(document).ready(function() { 
//Function to get all product ID's, & create a URL that will add all the items 
function generateUrl() { 
    //the variable 'firstItem' will find the first Product ID in an li tag 
    var firstItem = $("li").first().attr("data-product-id"); 
    //the variable 'otherItem' will earch all other li's, and grab their product ID's 
    var otherItem = $('li').nextAll().map(function() {return $(this).attr('data-product-id');}).get(); 
    //the newURL creates the URL that adds the products to the cart; replace the site URL with your own. 
    var newUrl = 'http://shop.yoursite.com/checkout/cart/add?product=' + firstItem + '&related_product=' + otherItem; 
    //this seeks a link with the ID of "productlink", then will add the URL generated from newURL to the href tag 
    $('#productlink').attr("href" , newUrl); 
} 
//start function! 
generateUrl(); 

}); 

</script> 

現在,使用productlink的id創建一個鏈接。

<a href="" id="productlink">Add All Items To Cart</a> 

就是這樣!

相關問題