Доброго времени суток! Прошу вашей помощи. Имеется каталог с продуктами у которых может быть несколько категорий. У него есть страница с фильтром по категориям (категории выбираются чекбоксами) и цене.
Вот модель
<?php namespace Mfkboy\Katalog\Models;
use Model;
/**
* Model
*/
class Catalog extends Model
{
use \October\Rain\Database\Traits\Validation;
/*
* Disable timestamps by default.
* Remove this line if timestamps are defined in the database table.
*/
public $timestamps = false;
/**
* @var string The database table used by the model.
*/
public $table = 'mfkboy_katalog_catalog';
/**
* @var array Validation rules
*/
public $rules = [
];
public $belongsTo = ['brand' => 'Mfkboy\Katalog\Models\Brand'];
public $belongsToMany = [
'cat' => [
'Mfkboy\Katalog\Models\Category',
'table' => 'mfkboy_katalog_cat_pivot',
'order' => 'cat_name'
],
'otdelka' => [
'Mfkboy\Katalog\Models\Otdelka',
'table' => 'mfkboy_katalog_otdelka_pivot',
'order' => 'otd_name'
]
];
public static $allowedSortingOptions = array (
'popular asc' => 'По популярности',
'price_int asc' => 'Цена по возрастанию',
'price_int desc' => 'Цена по убыванию'
);
public function scopeListFrontEnd($query, $options = []){
extract(array_merge([
'page' => 1,
'perPage' => 12,
'sort' => 'name asc',
'cat' => null,
'price_min' => '',
'price_max' => '',
'price_min_mob' => '',
'price_max_mob' => '',
], $options));
if(!is_array($sort)){
$sort = [$sort];
}
foreach ($sort as $_sort){
if(in_array($_sort, array_keys(self::$allowedSortingOptions))){
$parts = explode(' ', $_sort);
if(count($parts) < 2){
array_push($parts, 'desc');
}
list($sortField, $sortDirection) = $parts;
$query->orderBy($sortField, $sortDirection);
}
}
if($cat){
$query->whereHas('cat', function($q) use ($cat){
$q->where('id', '=', $cat);
});
}
if($price_min){
$query->where('price_int', '>=', $price_min);
}
if($price_max){
$query->where('price_int', '<=', $price_max);
}
if($price_min_mob){
$query->where('price_int', '>=', $price_min_mob);
}
if($price_max_mob){
$query->where('price_int', '<=', $price_max_mob);
}
return $query->where('active',1)->orderBy('popular', 'asc')->paginate($perPage, $page);
}
}
Это в HTML
<?php
use Mfkboy\Katalog\Models\Catalog;
use Mfkboy\Katalog\Models\Category;
use Mfkboy\Katalog\Models\Otdelka;
function onStart() {
$this->prepareVars();
$this->prepareFilter();
}
function onFilterProducts() { $this->prepareVars(); }
function prepareVars() {
$options = post('Filter', []);
$this['products'] = Catalog::listFrontEnd($options);
$this['cat'] = Category::all();
$this['sortOptions'] = Catalog::$allowedSortingOptions;
$this['otdelkas'] = Otdelka::all();
}
function prepareFilter() {
$products = Catalog::all();
$price_min = [];
$price_max = [];
$price_min_mob = [];
$price_max_mob = [];
foreach($products as $product){
$price_min[] = $product->price_int;
$price_max[] = $product->price_int;
$price_min_mob[] = $product->price_int;
$price_max_mob[] = $product->price_int;
}
}
?>
Страница категории раньше выводилась через компонент:
<?php namespace Mfkboy\Katalog\Components;
use Cms\Classes\ComponentBase;
class category extends ComponentBase
{
public function componentDetails()
{
return [
'name' => 'Категории дверей',
'description' => 'Страница категории'
];
}
public function defineProperties()
{
return [
'slug' => [
'title' => 'Сслыка Категории',
'default' => '{{ :category }}',
],
'catalogs' => [
'title' => 'Количество',
'desctiption' => 'Количество дверей на странице',
'default' => '12',
],
];
}
public function onRun()
{
$category = \Mfkboy\Katalog\Models\Category::where('slug', $this->property('slug'))->first();
if (empty($category)){
return $this->controller->run('404');
}
$cats = \Mfkboy\Katalog\Models\Category::where('slug', '!=', $this->property('slug'))->get();
$this->page['category'] = $category;
$this->page['cats'] = $cats;
}
}
Но теперь необходимо добавить точно такой же фильтр на эту страницу. Чтобы по умолчанию показывались товары категории страницы и когда пользователь выбирает дополнительную категорию происходила фильтрация. Уже всю голову сломал, но совершенно не понимаю, как это сделать.