1

Тема: Добавление настроек к блочному контроллеру, методов к классу.

Задача: добавить в фильтр товаров в категории фильтрацию по наличию скидки.

Сначала нужно добавить настройку - выводить ли этот фильтр.
В классе 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');
        }
    }
}

Правильно ли я понимаю, что на данный момент единственный способ решить эту задачу - это подмена оригинальных классов с потерей возможности их обновления?

Повысить оценку Понизить оценку

Re: Добавление настроек к блочному контроллеру, методов к классу.

Что касается блок контроллера, то можно просто его отклонировать в свой модуль и потом подключить, просто указав свой блок контроллер, его кстати можно отнаследовать от стандартного блок контроллера, чтобы просто добавить потом одно поле.
С остальными моментами сложнее, т.к. нужно, в контроллере списка товаров listproducts.inc.php обрабатывать приём параметра фильтра из запроса подготовленного блок контроллером.
Но здесь можно воспользоваться хуком controller.beforeexec.catalog-front-product (controller.beforeexec.КОРОТКОЕ_ИМЯ_КОНТРОЛЛЕРА).
О хукам можно почитать здесь:
http://readyscript.ru/dev-manual/dev_ho … hooks_list

В результате чего у нас должна появится публичная статическая функция

public static function [b]controllerBeforeExecCatalogFrontProduct($data)[/b]
{
      $controller = $data['controller'];//Объект фронт контроллера listproducts
      $action = $data['action'];//Метод класса который отрабатывает страницу. Надо проверить на index
      
      //Приём параметра из запроса
      $param = \RS\Http\Request::commonInstance()->request('Наш параметр из $_REQUEST который нужно принять', TYPE_STRING); 

      //Получаем объект запроса из апи товаров, т.к. в контроллере listproduct параметр $api публичный
      $q = $controller->api->queryObj(); 
      //Дальше запрос который Вам нужне и нужные действия
}

Т.к. у нас есть публичная переменная класса $api и первым всегда отрабатывает функция init в контроллере listproducts, то в $this->api будет объект АПИ для запросов, мы его из вне дополним.
Видео по запросам, можно посмотреть у нас в разделе видеоуроки