Добавить несколько товаров в корзину - Magento

Я пытаюсь использовать этот http://sourceforge.net/projects/massaddtocart/

Это именно то, что я хочу, но он показывает эту ошибку:

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.

Любая помощь приветствуется.

ОК, Джонатан, то есть:

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 '';
}

несколько примеров того, что я хочу получить: http://www.dickblick.com/products/winsor-and-newton-artists-acrylics/ http://www.polymexint.com/nouvelle-montana-black-blk-400ml.html

@Oliver: проверяю твой ответ


person Newbie    schedule 31.05.2011    source источник
comment
вставьте содержимое /app/code/local/BD83/MassAddToCart/Helper/Data.php около строки 20, чтобы мы могли видеть некоторый контекст, пожалуйста   -  person Jonathan Day    schedule 31.05.2011
comment
спасибо за быстрый ответ, это код: 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) ->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)); вернуть $qtyBlock-›toHtml(); } возвращение ''; }   -  person Newbie    schedule 31.05.2011
comment
пожалуйста, отредактируйте свой вопрос с кодом и отформатируйте его так, чтобы он был читабельным :) и отметьте строку 20. спасибо   -  person Jonathan Day    schedule 31.05.2011
comment
Я объединил два ваших аккаунта вместе. Пожалуйста, прочитайте эту запись часто задаваемых вопросов об учетных записях на основе файлов cookie. Кроме того, StackOverflow — это не форум; если у вас есть новый вопрос, пожалуйста, задайте новый вопрос. Если вы хотите включить в свой вопрос дополнительную информацию, отредактируйте его. Если вы хотите пообщаться с одним из ответивших людей, вы можете оставить им комментарий.   -  person    schedule 31.05.2011


Ответы (2)


еще ищете? Нашел этот:

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

Кажется, работает в текущих версиях, хотя я еще не проверял. Если вы разгадаете ее, по крайней мере будущие искатели будут знать, где ее найти!

/***РЕДАКТИРОВАТЬ****/

Что ж, чтобы «не считаться плохим ответом», вы должны реализовать решение. Ни один код не является моей работой, спасибо Uni-Man, Nexus Rex и парням с форума Magento :)

Код хорошо документирован. Он создает полноценное расширение Magento в пространстве имен «Компания» с именем «Модуль».

Во-первых, реализуйте хелпер в app/code/local/Company/Module/helper/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()): ?> 

Замените содержимое блока if на:

<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. Мы должны изменить это, чтобы добавить не один, а все товары в корзину в нужном количестве.

Поэтому добавьте файл app/code/local/Company/Module/controllers/Checkout/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();
>     } }

Мы заменяем существующий класс Mage Core нашим собственным, в результате чего для этой цели используется наш контроллер.

Вам также нужно будет добавить config.xml модуля, как обычно, в app/code/local/Company/Module/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> 

Что это делает: - заменяет вызов контроллера корзины вызовом собственного мультиадд-контроллера - регистрирует помощника - применяет маршрутизатор к внешнему интерфейсу

Скажите, пожалуйста, нужна ли дополнительная документация по этому вопросу.

person simonthesorcerer    schedule 05.09.2012
comment
Одинокая ссылка считается плохим ответом, поскольку она сама по себе бессмысленна, а целевой ресурс не гарантируется в будущем. Пожалуйста, постарайтесь включить хотя бы краткое изложение информации, на которую вы ссылаетесь. - person j0k; 05.09.2012

Есть более простой способ сделать это с помощью jQuery/Javascript. Все товары на странице заключены в теги <li>. Эти теги имеют атрибут data-product-id, который содержит числовой идентификатор каждого продукта. Кроме того, я уверен, вы знаете, что вы можете добавить несколько продуктов в корзину, используя URL-адрес, такой как http://www.yoursite.com/checkout/cart/add?product=1&related_product=2,3 (замените числа 1,2 и 3 вашими собственными идентификаторами продуктов.)

Зная это, если у вас есть страница продуктов, мы можем использовать jQuery/JavaScript для создания URL-адреса, который получает все идентификаторы продуктов для каждого продукта на странице и размещает их соответствующим образом в 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.

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

Вот и все!

person David    schedule 30.05.2013