Как реализовать единую форму поиска в yii2

Yii2 имеет searchModel для поиска каждого поля в GridView . Можно ли просто создать одно поле поиска вне GridView где пользователь может вводить ключевые слова и к моменту поиска кнопки нажать, результаты будут отображаться в GridView на основе введенных ключевых слов.

КОНТРОЛЛЕР

 public function actionIndex() { $session = Yii::$app->session; //$searchModel = new PayslipTemplateSearch(); $PayslipEmailConfig = PayslipEmailConfig::find()->where(['company_id'=> new \MongoId($session['company_id'])])->one(); $payslipTemplateA = PayslipTemplate::find()->where(['company_id' => new \MongoId($session['company_id'])])->andwhere(['template_name' => 'A'])->one(); $payslipTemplateB = PayslipTemplate::find()->where(['company_id' => new \MongoId($session['company_id'])])->andwhere(['template_name' => 'B'])->one(); $pTemplateModel = PayslipTemplate::find()->where(['company_id' => new \MongoId($session['company_id'])])->all(); $user = User::find()->where(['_id' => new \MongoId($session['user_id'])])->one(); $module_access = explode(',', $user->module_access); //$dataProvider = User::find()->where(['user_type' => 'BizStaff'])->andwhere(['parent' => new \MongoId($session['company_owner'])])->all(); $searchModel = new UserSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'PayslipEmailConfig' => $PayslipEmailConfig, 'dataProvider' => $dataProvider, 'payslipTemplateA' => $payslipTemplateA, 'payslipTemplateB' => $payslipTemplateB, 'searchModel' => $searchModel, ]); } public function actionSearchresults($keyword) { $session = Yii::$app->session; if ( $keyword == '') { return $this->redirect(\Yii::$app->request->getReferrer()); } else { $user = User::find()->where( [ '_id' => new \MongoId($id) ] )->one(); $searchModel = new PayslipTemplateSearch(); $payslipTemplateA = PayslipTemplate::find()->where(['company_id' => new \MongoId($session['company_id'])])->andwhere(['template_name' => 'A'])->one(); $payslipTemplateB = PayslipTemplate::find()->where(['company_id' => new \MongoId($session['company_id'])])->andwhere(['template_name' => 'B'])->one(); return $this->render('searchresults', [ 'searchModel' => $searchModel, 'user' => $user, 'payslipTemplateA' => $payslipTemplateA, 'payslipTemplateB' => $payslipTemplateB, ]); } } 

Я задал вопрос, связанный с этой проблемой здесь: Основная форма поиска в Yii2

Это произошло не из-за некоторых осложнений в Select2 выпадающего списка Select2 для Select2 . Теперь я временно переключился на простое поле поиска Yii2.

ПОСМОТРЕТЬ

 echo $form->field($model, '_id')->textInput(array('placeholder' => 'search'))->label(false); 

МОДЕЛЬ

 <?php namespace app\models; use Yii; use yii\base\Model; use yii\data\ActiveDataProvider; use app\models\User; /** * UserSearch represents the model behind the search form about `app\models\User`. */ class UserSearch extends User { /** * @inheritdoc */ public function rules() { return [ [[/*'_id',*/ 'creator_id'], 'integer'], [['fname', 'lname', 'email', 'username', 'user_type'], 'safe'], ]; } /** * @inheritdoc */ public function scenarios() { // bypass scenarios() implementation in the parent class return Model::scenarios(); } /** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params) { $session = Yii::$app->session; $query = User::find(); $query->where(['user_type' => 'BizStaff'])->andwhere(['parent' => new \MongoId($session['company_owner'])]); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere([ '_id' => $this->_id, 'creator_id' => $this->creator_id, ]); $query->andFilterWhere(['like', 'fname', $this->fname]) ->andFilterWhere(['like', 'lname', $this->lname]) ->andFilterWhere(['like', 'email', $this->email]) ->andFilterWhere(['like', 'username', $this->username]) ->andFilterWhere(['like', 'user_type', $this->user_type]); return $dataProvider; } } 

Есть ли у вас какие-либо идеи о том, как реализовать один поиск? Это своего рода интеллектуальный поиск, поскольку он может искать все в таблице базы данных на основе введенных ключевых слов.

РЕДАКТИРОВАТЬ

Когда я ищу ключевое слово, скажем, например, «hello», он затем дает мне этот url и ошибку после нажатия клавиши ввода:

URL:

HTTP: //localhost/iaoy-dev/web/index.php г =-шаблон расчетных ведомостей% 2Fsearchresults & PayslipTemplateSearch% 5B_id% 5D = привет

Сообщение об ошибке:

Плохой запрос (№ 400) Отсутствие необходимых параметров: id

Помогите.

Related of "Как реализовать единую форму поиска в yii2"

У меня была та же проблема, и мое решение:

Модель

Расширьте модель UserSearch с помощью параметра поиска

 class UserSearch extends User { public $searchstring; ... 

Включить передачу переменной

  public function rules() { return [ ... [['searchstring'], 'safe'], ]; } 

Измените свой метод поиска (будьте осторожны: поля поиска объединены с orFilterWhere , зависит от ваших потребностей).

  $query->orFilterWhere(['like', 'fname', $this->searchstring]) ->orFilterWhere(['like', 'lname', $this->searchstring]) ->orFilterWhere(['like', 'email', $this->searchstring]) ->orFilterWhere(['like', 'username', $this->searchstring]) ->orFilterWhere(['like', 'user_type', $this->searchstring]); 

Просмотр (может быть также макет)

Расширьте форму с помощью ввода-поиска. Вы можете создать поле ввода самостоятельно, это просто пример:

 <?php /* @var $searchModel app\models\UserSearch */ echo $form->field($searchModel, 'searchstring', [ 'template' => '<div class="input-group">{input}<span class="input-group-btn">' . Html::submitButton('GO', ['class' => 'btn btn-default']) . '</span></div>', ])->textInput(['placeholder' => 'Search']); ?> 

контроллер

Также проверьте значение $searchstring после отправки формы.

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

Вот и все.