Ограничьте продукты, переопределив функцию 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; ?>
Author: Klettseb, 2016-01-18

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);
 2
Author: Matthéo Geoffray, 2016-01-18 12:07:46