Умело отключите параметры "кэш" в блоке просмотра пакетов


У меня есть интересный вариант использования для отключения "кэша" параметров пакета:

Контроллер:

public function indexAction()
{
    Mage::register('my_flag',true);
    //...other stuff
}

App/code/local/MyCompany/MyModule/Block/Product/View/Type/Bundle.php:

#class rewrite of Mage_Bundle_Block_Catalog_Product_View_Type_Bundle
public function getOptions()
{
    if (!$this->_options || Mage::registry('my_flag')) { // this is the undesired hack
        $product = $this->getProduct();
        $typeInstance = $product->getTypeInstance(true);
        $typeInstance->setStoreFilter($product->getStoreId(), $product);

        $optionCollection = $typeInstance->getOptionsCollection($product);

        $selectionCollection = $typeInstance->getSelectionsCollection(
            $typeInstance->getOptionsIds($product),
            $product
        );

        $this->_options = $optionCollection->appendSelections($selectionCollection, false,
            Mage::helper('catalog/product')->getSkipSaleableCheck()
        );
    }

    return $this->_options;
}

В настоящее время я переписываю это и требую, чтобы оно извлекалось/добавлялось из коллекции, если существует значение Mage::registry. Это кажется... грязным.

Я бы хотел умное решение, которое не требует от меня устанавливать значение Mage::registry в контроллер. Я подумывал о том, чтобы заставить представление установить $this->_options на null: но я бы предпочел переписать, честно говоря, чем иметь такую логику в представлении.

Редактировать:

Из того же Bundle.php переписать:

public function getProduct() {
    if (!$this->hasData('product') || Mage::registry('my_flag')) { // same hack
        $product = Mage::registry('product');
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }
        $this->setData('product', $product);
    }
    return $this->getData('product');
}
 1
Author: philwinkle, 2014-02-03

1 answers

Если у вас есть пользовательский дескриптор макета для работы, возможно, можно <reference> заблокировать блок и установить там флаг. Это не избавит вас от необходимости переписывать класс типа блока, но, по крайней мере, вы избегаете использования реестра.

Контроллер:

$this->getLayout()->getUpdate()->addHandle('custom_bundle_view');

Local.xml или XML-файл макета пользовательского модуля:

<custom_bundle_view>
    <reference name="product.info.bundle">
        <action method="setSkipOptionsCache"><value>1</value></action>
    </reference>
<custom_bundle_view>

App/code/local/MyCompany/MyModule/Block/Product/View/Type/Bundle.php:

if (!$this->_options || $this->getSkipOptionsCache()) {

 2
Author: beeplogic, 2014-02-03 20:26:49