问题描述
Yii2 有一个 searchModel
来搜索 GridView
中的每个字段.是否可以只在 GridView
之外创建一个搜索字段,用户可以在其中输入关键字,并且当点击搜索按钮时,结果将显示在基于 GridView
的在输入的关键字上.
Yii2 has a searchModel
to search each field in the GridView
. Is it possible to just create a single search field outside the GridView
where the user can input keywords and by the time Search button is hit, the results will display in the GridView
based on the keywords entered.
控制器
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 中的主要搜索表单
I asked a question connected to this problem here: Main Search Form in Yii2
这不是因为 Kartik 的 Select2
搜索下拉小部件的一些复杂性.现在我暂时切换到一个简单的 Yii2 搜索字段.
It didn't due to some complications in Kartik's Select2
search dropdown widget. Now I switched temporarily to a simple Yii2 search field.
查看
echo $form->field($model, '_id')->textInput(array('placeholder' => 'search'))->label(false);
模型
<?php
namespace appmodels;
use Yii;
use yiiaseModel;
use yiidataActiveDataProvider;
use appmodelsUser;
/**
* UserSearch represents the model behind the search form about `appmodelsUser`.
*/
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;
}
}
您对如何实现单一搜索有任何想法吗?这是一种更智能的搜索,因为它可以根据输入的关键字搜索数据库表中的所有内容.
Do you have any idea on how to I implement a single search? It's kind of a smarter search since it can search everything in the database table based on keywords inputted.
编辑
当我搜索关键字时,例如你好",它会在按回车键后给我这个网址和错误:
When I search a keyword, say for example 'hello', it then gives me this url and error after hitting enter key:
网址:
http:///localhost/iaoy-dev/web/index.php?r=payslip-template%2Fsearchresults&PayslipTemplateSearch%5B_id%5D=hello
错误信息:
错误请求 (#400) 缺少必需的参数:id
Bad Request (#400) Missing required parameters: id
帮助.
推荐答案
我遇到了同样的问题,我的解决方案是:
I had the same problem and my solution is:
模型
使用搜索参数扩展您的 UserSearch 模型
Extend your UserSearch Model with a search parameter
class UserSearch extends User
{
public $searchstring;
...
允许传递变量
public function rules()
{
return [
...
[['searchstring'], 'safe'],
];
}
更改您的搜索方法(注意:搜索字段与 orFilterWhere
结合,取决于您的需要).
Change your search-Method (beware: the searchfields are combined with orFilterWhere
, depends on your needs).
$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]);
View(也可以是布局)
使用搜索输入扩展您的表单.您可以自己设置输入字段的样式,这只是一个示例:
Extend your form with a search-input. You can style the input-field by yourself, this is just an example:
<?php
/* @var $searchModel appmodelsUserSearch */
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
的值.
Also check for the value of $searchstring
after posting the form.
public function actionIndex()
{
...
$searchModel = new UserSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
...
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
就是这样.
这篇关于如何在yii2中实现单一搜索表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!