Доброй ночи.
Надо организовать поиск на сайте. Форма должна располагаться на всех страницах сайта.
Сделал отдельный файл с формой, который подключаю в layouts/main.
Не могу понять, как в форму правильно передать модель поиска.
Файл с формой (сократил код формы)
<?php $form = ActiveForm::begin([
'method' => 'get',
'action' => ['/search-flights'],
]) ?>
<div class="secondRow clearfix">
<?= $form->field($model, 'city_from')->widget(Select2::className())->label(false) ?>
<?= $form->field($model, 'date_from')->widget(DatePicker::className())->label(false) ?>
<?= Html::input('submit',null,'Найти билеты', ['class' => 'peopleSubmit']) ?>
</div>
<?php ActiveForm::end() ?>
Для поиска сделал отдельный контроллер с одним действием.
class SearchController extends Controller
{
public function actionSearchFlights()
{
$searchModel = new FlightsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('search-flight', [
'dataProvider' => $dataProvider,
]);
}
}
Поисковая модель.
<?php
namespace app\modules\main\models\search;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\modules\airlines\models\Flights;
class FlightsSearch extends Model
{
public $city_from;
public $date_from;
public static function tableName()
{
return '{{%flights}}';
}
public function rules()
{
return [
['date_from','city_from'], 'required'],
['city_from', 'integer'],
['date_from', 'date', 'format' => 'php:d.m.Y' ],
];
}
public function attributeLabels()
{
return [
'city_from' => Yii::t('module', 'SEARCH_CITY_START'),
'date_from' => Yii::t('module', 'SEARCH_DATE_START'),
];
}
public function search($params)
{
$query = Flights::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if(!$this->validate()){
/*$query->where('0=1');*/
return $dataProvider;
}
$query->andFilterWhere(['>=', 'date_start', $this->date_from ? strtotime($this->date_from . ' 00:00:00') : null])
->andFilterWhere(['=', 'city_start_id', $this->city_from])
return $dataProvider;
}
}
Подключаю форму в шаблоне (я понимаю, что так передавать модель нельзя)
<?= $this->render('includes/_header', ['model' => new FlightsSearch()]); ?>
Layout main используется, кроме SearchController, ещё в трёх контроллерах.
Думал сделать виджет, где подключать форму и выполнять поиск по базе. Но, как я понял, после поисков информации по форумам, в виджете не рекомендуется напрямую обращаться к базе данных, можно только передать в виджет результат запроса к базе.
В документации сказано:
При создании виджетов, следует придерживаться основных принципов концепции MVC. В общем случае, основную логику следует располагать в классе виджета, разделяя при этом код, отвечающий за разметку в представления.
Так как сделать правильно? Чтобы передавалась поисковая модель в виджет и форма не очищалась после завершения поиска(в полях оставались введённые данные)