Тема: Добавление настроек к блочному контроллеру, методов к классу.
Задача: добавить в фильтр товаров в категории фильтрацию по наличию скидки.
Сначала нужно добавить настройку - выводить ли этот фильтр.
В классе Catalog\Controller\Block\SideFilters в методе getParamObject задаются настройки. В массив с настройками нужно добавить еще один элемент:
'show_is_discount' => new Type\Integer(array(
'description' => t('Отображать фильтр по наличию скидки'),
'checkboxView' => array(1,0)
)),
Теперь в filters.tpl можно написать:
{if $param.show_is_discount}
<div class="filter">
<h4>{t}Скидка{/t}:</h4>
<select class="yesno" name="bfilter[isdiscount]" data-start-value="">
<option value="">{t}Неважно{/t}</option>
<option value="1" {if $basefilters.isdiscount == '1'}selected{/if}>{t}Есть{/t}</option>
<option value="0" {if $basefilters.isdiscount == '0'}selected{/if}>{t}Нет{/t}</option>
</select>
</div>
{/if}
Осталось добавить в класс Catalog\Model\Api метод isDiscountFilter, где добавлять условия на выборку товаров со скидкой.
protected function isDiscountFilter($filter)
{
$old_cost_id = \Catalog\Model\CostApi::getOldCostId();
if ($old_cost_id) {
$q = $this->queryObj();
$q->leftjoin(new Xcost(), "A.id = XCO.product_id AND XCO.cost_id='{$old_cost_id}'", 'XCO');
if ($filter) {
$q->where('XCO.cost_val>0');
} else {
$q->where('XCO.cost_val=0');
}
}
}
Правильно ли я понимаю, что на данный момент единственный способ решить эту задачу - это подмена оригинальных классов с потерей возможности их обновления?