Ограничьте продукты, переопределив функцию isSalable()
Есть некоторые продукты, которые могут быть отправлены только в определенные страны. Я создал атрибут, чтобы установить разрешенные страны для каждого продукта.
В интерфейсе кнопка корзины должна быть скрыта и должно отображаться информационное сообщение.
Я пытаюсь переопределить функцию isSalable(). Это работает хорошо, но Magento показывает сообщение о том, что товар отсутствует на складе. Но должно быть такое сообщение: "Этот продукт недоступен в XY".
class Me_Mymodule_Model_Product_Type_Simple extends Mage_Catalog_Model_Product_Type_Simple
{
public function isSalable($product = null)
{
$salable = parent::isSalable($product);
if($salable && $this->getProduct($product)->hasData('allowed_countries')) {
$customer = Mage::getSingleton('customer/session')->getCustomer();
$shippingAddress = Mage::getModel('customer/address')->load($customer->default_shipping);
$allowedCountries = explode(',', $this->getProduct($product)->getData('allowed_countries'));
if(is_array($allowedCountries) && !empty($allowedCountries[0])) {
$salable = in_array($shippingAddress->getCountryId(), $allowedCountries) ? true : false;
}
}
return $salable;
}
}
Какие-нибудь идеи?
Удате:
Addtocart.phtml
Добавить карту.phtml<?php $_product = $this->getProduct(); ?>
<?php $buttonTitle = $this->__('Add to Cart'); ?>
<?php if($_product->isSaleable()): ?>
<div class="add-to-cart">
<?php if(!$_product->isGrouped()): ?>
<div class="qty-block">
<label for="qty"><?php echo $this->__('Qty:') ?></label>
<input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $this->getProductDefaultQty() * 1 ?>" title="<?php echo $this->__('Qty') ?>" class="input-text qty" />
</div>
<?php endif; ?>
<button type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" onclick="productAddToCartForm.submit(this)"><span><span><?php echo $buttonTitle ?></span></span></button>
<?php echo $this->getChildHtml('', true, true) ?>
</div>
<?php endif; ?>
1 answers
Нет необходимости переопределять это, если вы посмотрите на Mage_Catalog_Model_Product::isSalable()
, у вас есть два наблюдателя, которые должны выполнить действие над атрибутом is_salable
:
/** * Check is product available for sale * * @return bool */ public function isSalable() { Mage::dispatchEvent('catalog_product_is_salable_before', array( 'product' => $this )); $salable = $this->isAvailable(); $object = new Varien_Object(array( 'product' => $this, 'is_salable' => $salable )); Mage::dispatchEvent('catalog_product_is_salable_after', array( 'product' => $this, 'salable' => $object )); return $object->getIsSalable(); }
Вы можете использовать один из них:
- catalog_product_is_salable_before
- catalog_product_is_salable_after
Взгляните на файл
app/design/frontend/base/default/template/catalog/product/view/type/default.phtml
Здесь вы можете найти текст для
Out of stock
. Вы можете оставить свое сообщение здесь.
Редактировать
Здесь вы можете найти общий пример того, что вам нужно сделать:
- В вашем вспомогательном файле
public function getDisallowedCountries(Mage_Catalog_Model_Product $product) { // put you logic here to get countries from product return $_countries; }
В вашем phtml файл:
$countries = Mage::helper('your_helper')->getDisallowedCountries($product); echo $this->__('Out of stock in %s', $countries);