Скрыть кнопку "Добавить в корзину", если определенные товары уже есть в корзине


У меня в магазине 100 товаров. 4 товара (все в одной категории) являются "специальными товарами", которые нельзя приобрести в одной корзине с другими 96 товарами. Я хотел бы скрыть кнопку "Добавить в корзину" на остальных 96 товарах, если в корзину были добавлены какие-либо из 4 "специальных товаров".

4 "специальных товара" МОЖНО приобрести вместе, поэтому я не хочу скрывать кнопку "Добавить в корзину" на этих товарах. Только хочу, чтобы кнопка была спрятана на другом 96 продукты, которые несовместимы с 4 "специальными продуктами".

В моем шаблоне используется $_product->isSaleable, поэтому я подумал, что можно было бы каким-то образом скрыть кнопку на 96 продуктах, используя ее. Будучи относительно новичком в Magento, я не смог понять, как это сделать. Возможно, это тоже совершенно неправильный путь.

В 4 "специальных продуктах" используется индивидуальный дизайн, поэтому мой мыслительный процесс состоял в том, чтобы просто удалить $_product->isSaleable из этого шаблона дизайна ( товары никогда не отсутствуют на складе и всегда будут доступны.)

Дополнительным вариантом было бы запретить клиентам добавлять один из 96 товаров в корзину и просто отображать уведомление/сообщение, информирующее их о том, что они не могут добавить товар в корзину из-за специального товара(ов), уже находящегося в корзине.

Я использую Magento CE 1.8.1.

Author: user5783, 2014-03-20

2 answers

Если вы не можете сохранить продукты в "специальную" категорию, как предложил @Julien, вы можете установить другой набор атрибутов специально для продуктов, или, если вы не можете сделать ни того, ни другого, я бы предложил установить атрибут продукта. Как бы вы это ни делали, вам все равно придется запросить базу данных для этих товаров, затем взять свою корзину и посмотреть, есть ли в ней какие-либо товары.

Итак, давайте создадим атрибут продукта и назовем его "рекомендуемый". Создайте новый атрибут, как Да/Нет, и назначьте его к соответствующему набору атрибутов. Отметьте эти 4 продукта как таковые.

Далее вам нужно что-то вроде:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addFieldToFilter(array(array('attribute'=>'featured','eq'=>'1'));

$exemptProducts = array();
$exemptProductFound = false;

foreach ($collection as $product) {
    $exemptProducts[] = $product->getId();
}

// now let's check if any are in the basket
$cart = new Mage_Checkout_Model_Cart();
$cart->init();

foreach ($cart->getItems() as $item) {
    if(in_array($item->getProductId(), $exemptProducts)) {
        // to make it simple, just set a flag
        $exemptProductFound = true;
    }
}

Это может быть встроено в ваш шаблон или в функцию, которую вы предоставляете своему шаблону (очиститель).

 0
Author: Douglas Radburn, 2014-03-20 11:48:38

Для этого вы можете использовать observer method. Чтобы использовать это, давайте создадим модуль, который наблюдает за событием catalog_product_load_after. Это событие будет срабатывать всякий раз, когда страница просмотра продукта пытается загрузиться. Пусть имя нашего модуля будет Mysite_Disablebutton

Примечание: Я предполагаю, что здесь вы используете custom product attribute с идентификатором set_as_special_product для установки продукта в качестве special product. Исходя из этого предположения, давайте начнем

Конфигурационный файл вашего модуля будет выглядеть следующим образом

Местоположение : app/code/core/local/Mysite/Disablebutton/etc/config.xml

<config>
<modules>
    <Mysite_Disablebutton>
        <version>0.1.0</version>
    </Mysite_Disablebutton>
</modules>
<frontend>
    <events>
      <catalog_product_load_after>
          <observers>
              <disable_addtocart_btn>
                  <type>singleton</type>
                  <class>disablebutton/observer</class>
                  <method>disableAddtoCartButton</method>
              </disable_addtocart_btn>
          </observers>
      </catalog_product_load_after>
    </events>   
</frontend>
<global>
    <models>
        <disablebutton>
            <class>Mysite_Disablebutton_Model</class>
        </disablebutton>
    </models>
</global>
</config>

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

Теперь давайте сообщим magento о нашем модуле.Для этого вам нужно добавить этот файл в указанное местоположение

Местоположение:app/etc/modules/Mysite_Disablebutton.xml

<config>
<modules>
    <Mysite_Disablebutton>
        <active>true</active>
        <codePool>local</codePool>
    </Mysite_Disablebutton>
</modules>
</config>

Теперь пришло время определить нашего наблюдателя.Давайте сделаем это

Местоположение : app/code/local/Mysite/Disablebutton/Model/Observer.php

<?php

class Mysite_Disablebutton_Model_Observer
{

    public function disableAddtoCartButton(Varien_Event_Observer $observer)
    {
            /*
            * get product that going to show in product view page
            */
            $currentPrdouct=$observer->getEvent()->getProduct();

            /*
            * declare a session variable
            * it will set to either true or false according to the cart condition
            * false -> if no special product in cart
            * true ->if special product does exist in cart
            */
            $session = Mage::getSingleton("core/session");
            $sessionVar="disableBtn".$currentPrdouct->getId();

            /*
            * defines general variables that we need to use in future
            */
            $yes="";$specialPdtIds=array();

            /*
            * loads special product attribute
            *this custom product attribute is used to set a product as special product
            * possible two values : yes or no
            * yes -> product is set as special product therogha admin
            * no -> product is not set as special product
            * here, get value of 'yes' option by loading this attribute, which we will use
                in future for checking
            */
            $attribute = Mage::getModel('eav/config')->getAttribute('catalog_product','set_as_special_product');
            foreach($attribute->getSource()->getAllOptions(true,true) as $option)
            {
                if(strtolower(trim($option['label']))=="yes")
                {
                    $yes=$option['value'];
                    break;
                }
            }            

            if(!empty($currentPrdouct))
            {
                /*
                * this methos only works if your attribute idenifier is 'set_as_special_product'
                */
                $specialProductStatus=$currentPrdouct->getSetAsSpecialProduct();
                //if the current product is not a special product, it will go for checking cart
                if($specialProductStatus!=$yes)
                {
                    /*
                    *get cart prdoucts and check whether it is empty or not
                    */
                    $cart = Mage::getModel('checkout/cart')->getQuote();
                    $items=$cart->getAllItems();
                    if(!empty($items))
                    {
                        /*
                        * stores ids of cart product to an array
                        */
                        foreach ($items as $key=>$item) 
                        {
                            $specialPdtIds[$key]=$item->getProduct()->getId();

                        }
                        /*
                        *check whether any one of cart product is set as special product
                            * if varible empty -> means no special products
                            *if varible not empty -> has special product
                        */
                        $specialPdts=Mage::getModel('catalog/product')->getCollection()
                                        ->addAttributeToFilter('entity_id',$specialPdtIds )
                                        ->addAttributeToFilter('set_as_special_product',$yes);

                        if(!empty($specialPdts))
                        {
                            //special products exist; indicate it by sets session variable as true
                            $session->setData($sessionVar, true);
                        }
                        else
                        {
                            //no special product. Hence session variable sets to false
                            $session->setData($sessionVar, false);
                        }


                    }
                    //since cart is empty; sets session variable to false
                    else
                    {
                        $session->setData($sessionVar, false);
                    }
                }
                //current product is special prdouct; set session variable to false
                else
                {
                    $session->setData($sessionVar, false);
                }
            }
            else
            {
                $session->setData($sessionVar, false);
            }
    } 
}

Я объясню, что делает наш наблюдатель в коротко: Он проверит, является ли наш текущий продукт специальным продуктом или нет. Если нет, он проверит, существуют ли товары в корзине или нет. Если он существует, он проверит, содержит ли корзина какой-либо специальный товар или нет. Если в корзине есть специальный товар, то он установит session variable, который указывает, что нам нужно отключить(удалить) add to cart button. Если какое-либо из условий не выполняется, для этой переменной сеанса будет установлено значение false.

Итак, мы так близки. Теперь нам нужно проверить состояние нашей переменной сеанса в product view page, перед отображением add to cart button. Для этого перейдите по ссылке

Местоположение : app/design/frontend/<your_package>/<your_theme>/template/catalog/product/view.phtml

Заменить следующий раздел

  <?php if($_product->isSaleable()): ?>
       <?php echo $this->getChildHtml('addtocart') ?>
       <?php if( $this->helper('wishlist')->isAllow() || $_compareUrl=$this->helper('catalog/product_compare')->getAddUrl($_product)): ?>
        <span class="or"><?php echo $this->__('OR') ?></span>
       <?php endif; ?>
  <?php endif; ?>

С этим кодом

<?php
      /*look for button info*/
       $session = Mage::getSingleton("core/session");
       $sessionVar="disableBtn".$_product->getId();
       $btnStatus = $session->getData($sessionVar);
   if($btnStatus!==true):

?>
           <?php if($_product->isSaleable()): ?>
                <?php echo $this->getChildHtml('addtocart') ?>
                <?php if( $this->helper('wishlist')->isAllow() || $_compareUrl=$this->helper('catalog/product_compare')->getAddUrl($_product)): ?>
                     <span class="or"><?php echo $this->__('OR') ?></span>
                <?php endif; ?>
          <?php endif; ?>
      <?php endif; ?>

Вот и все, с вами покончено. Удачи вам в вашей работе

 1
Author: Rajeev K Tomy, 2014-03-21 04:19:19