Скрыть кнопку "Добавить в корзину", если определенные товары уже есть в корзине
У меня в магазине 100 товаров. 4 товара (все в одной категории) являются "специальными товарами", которые нельзя приобрести в одной корзине с другими 96 товарами. Я хотел бы скрыть кнопку "Добавить в корзину" на остальных 96 товарах, если в корзину были добавлены какие-либо из 4 "специальных товаров".
4 "специальных товара" МОЖНО приобрести вместе, поэтому я не хочу скрывать кнопку "Добавить в корзину" на этих товарах. Только хочу, чтобы кнопка была спрятана на другом 96 продукты, которые несовместимы с 4 "специальными продуктами".
В моем шаблоне используется $_product->isSaleable, поэтому я подумал, что можно было бы каким-то образом скрыть кнопку на 96 продуктах, используя ее. Будучи относительно новичком в Magento, я не смог понять, как это сделать. Возможно, это тоже совершенно неправильный путь.
В 4 "специальных продуктах" используется индивидуальный дизайн, поэтому мой мыслительный процесс состоял в том, чтобы просто удалить $_product->isSaleable из этого шаблона дизайна ( товары никогда не отсутствуют на складе и всегда будут доступны.)
Дополнительным вариантом было бы запретить клиентам добавлять один из 96 товаров в корзину и просто отображать уведомление/сообщение, информирующее их о том, что они не могут добавить товар в корзину из-за специального товара(ов), уже находящегося в корзине.
Я использую Magento CE 1.8.1.
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;
}
}
Это может быть встроено в ваш шаблон или в функцию, которую вы предоставляете своему шаблону (очиститель).
Для этого вы можете использовать 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; ?>
Вот и все, с вами покончено. Удачи вам в вашей работе