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
Помогите.
У меня была та же проблема, и мое решение:
Модель
Расширьте модель 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, ]); }
Вот и все.