Фильтрация товаров yii2
на главной странице есть категории товаров. (категория 1, категория 2, категория 3, категория 4)
реализована обычная модель + search модель + вью(внутри listView).
как с главной страницы передать инфу о категории в модель, чтобы на новой странице происходила сразу же фильтрация?
Код контроллера:
/**
* Lists all Product models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new ProductSearchFront();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$category = Category::find()->all();
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'category'=>$category
]);
}
Код Search Модели:
class ProductSearchFront extends Product
{
public function rules()
{
return [
[['id', 'cat_id'], 'integer'],
[['name', 'img', 'url', 'maker', 'cat_name'], 'safe'],
];
}
public function search($params){
$query = Product::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'cat_id' => $this->cat_id,
// 'cat_name'=>$cat_name
]);
$query->andFilterWhere(['like', 'name', $this->name])
->andFilterWhere(['like', 'img', $this->img])
->andFilterWhere(['like', 'url', $this->url])
->andFilterWhere(['like', 'maker', $this->maker])
->andFilterWhere(['like', 'cat_name', $this->cat_name]);
return $dataProvider;
}
}
Код вьюшки:
<?
use yii\helpers\Html;
use yii\widgets\Pjax;
?>
<div class="body-content">
<div class="row">
<?php echo $this->render('_search', ['model' => $searchModel]); ?>
</div>
</div>
<?php Pjax::begin(); ?>
<?= \yii\widgets\ListView::widget([
'dataProvider' => $dataProvider,
'emptyText'=>'Ничего не найдено',
'options' => [
'class'=>'list'
],
'itemOptions' => ['class' => 'item'],
'itemView' => function ($model, $key, $index, $widget) {
return Html::a(Html::encode($model->name), ['view', 'id' => $model->id]);
},
]) ?>
<?php Pjax::end(); ?>
Код вьюшки главной страницы:
<div class="row">
<?php foreach ($category as $cat):?>
<div class="col-lg-4">
<h2><?= $cat->cat_name?></h2>
<!-- --><?//= Html::a('Подробнее',['catalog/index', 'cat_name'=>$cat->cat_name, 'category'=>$category])?>
<?= Html::a('Подробнее',['catalog/index'])?>
</div>
<?php endforeach;?>
</div>
Ответы (1 шт):
Автор решения: Streletz
→ Ссылка
В Вашем случае, лучший способ - передавать id категории GET параметром и в контроллере фильтровать.
В search model должно быть что-то наподобие такого:
public function searchByCategory($params)
{
$query = Product::find()->where(['cat_id'=>$params['cat_id']]);
// Далее обработка фильтров и пр., как обычно.
}
В контроллере:
public function actionByCategory($cat_id)
{
$searchModel = new ProductSearchFront();
// Здесь отбор по id категории
$dataProvider = $searchModel->searchByCategory(Yii::$app->request->queryParams);
$category = Category::find()->all();
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'category'=>$category
]);
}
Примерно, как-то так...
P.S. Код писал прямо на сайте, просто чтобы показать принцип решения задачи. За работоспособность не ручаюсь.