Вывод формы поиска в шаблоне yii2?

Доброй ночи.
Надо организовать поиск на сайте. Форма должна располагаться на всех страницах сайта.
Сделал отдельный файл с формой, который подключаю в 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. В общем случае, основную логику следует располагать в классе виджета, разделяя при этом код, отвечающий за разметку в представления.


Так как сделать правильно? Чтобы передавалась поисковая модель в виджет и форма не очищалась после завершения поиска(в полях оставались введённые данные)
  • Вопрос задан
  • 1883 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Делать виджет имеет смысл если форму надо параметризировать, при этом в него можно и модель передать.
Но в Вашем случае более логично получить модель прямо во вью c формой
<?php 
$model = new FlightsSearch();
$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() ?>

При чем возможно здесь более уместна yii\base\DynamicModel, в доках есть пример, как раз для реализации поиска:
www.yiiframework.com/doc-2.0/yii-base-dynamicmodel.html
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы