2015-07-30 4 views
0

Я хочу реализовать форму поиска. Я получаю результаты поиска, но когда запрос не в форме, Listview отображает все данные из таблицы.Как отобразить результаты поиска в Yii2

Как установить условия, чтобы при пустой форме поиска возвращался пустой Listview?

Модели:

public function search($params) 
{ 
$query = Product::find(); 
$dataProvider = new ActiveDataProvider(['query' => $query]); 
if (!($this->load($params) && $this->validate())) { 
return $dataProvider; 
} 
$query->andFilterWhere(['title' => $this->title]);  
return $dataProvider; 
} 

контроллеры:

public function actionSearch() 
{ 
$searchModel = new SearchForm(); 
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
return $this->render('search', [ 
'searchModel' => $searchModel, 
'dataProvider' => $dataProvider, 
]); 
} 

форма:

<div class="site-search"> 
<?php 
$form = ActiveForm::begin([ 
'action' => ['search'], 
'method' => 'get',]) 
?>   
<?=$form->field($model, 'title')?> 
<div class="form-group"> 
<?=Html::submitButton('Submit', ['class' => 'btn btn-primary'])?> 
</div> 
<?phpActiveForm::end();?> 
</div> 

вид:

<?php   
echo $this->render('_form', ['model' => $searchModel]);?> 
<div class="listView"> 
<?php 
echo ListView::widget([ 
'dataProvider' => $dataProvider, 
'itemView' => '_product',]); 
?> 
</div> 
+0

Пожалуйста, учитывайте ответ, как принято, если он решит вашу проблему. –

ответ

2

Ваша проблема, вероятно, связана с моделью поиска (ее трудно сказать окончательно, так как отсутствуют правила проверки модели). Функция поиска только устанавливает условие запроса, если модель может быть заполнена от $params. Добавление условия, которое всегда не выполняется в запросе, исправит это.

public function search($params) 
{ 
    if (!($this->load($params) && $this->validate())) { 
     $query = Product::find()->where('1 <> 1'); 
    } else { 
     $query = Product::find()->where(['title' => $this->title]); 
    } 
    return new ActiveDataProvider(['query' => $query]); 
} 

В качестве альтернативы, можно также возвращать другой тип DataProvider:

public function search($params) 
{ 
    if (!($this->load($params) && $this->validate())) { 
     return new yii\data\ArrayDataProvider(['allModels' => []]); 
    } 
    $query = Product::find()->where(['title' => $this->title]); 
    return new ActiveDataProvider(['query' => $query]); 
} 

Однако, тт поражает меня как странно, что один будет по-прежнему хотят, чтобы вернуть поставщика данных, если проверка не пройдена. Выбрасывание и обнаружение ошибки и сообщение об ошибке при отказе проверки правильности выглядят как достойный вариант и могут быть лучше, чем показывать только пустой список результатов.