Умело отключите параметры "кэш" в блоке просмотра пакетов
У меня есть интересный вариант использования для отключения "кэша" параметров пакета:
Контроллер:
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 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()) {