Comment mettre en œuvre seul formulaire de recherche dans yii2
Yii2 a un searchModel
de recherche de chaque champ dans la GridView
. Est-il possible de créer un seul champ de recherche à l'extérieur de la GridView
où l'utilisateur peut saisir des mots clés et par la Recherche de l'heure bouton est frappé, les résultats seront affichés dans la GridView
basée sur les mots-clés entrés.
CONTRÔLEUR
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,
]);
}
}
J'ai posé une question liée à ce problème ici: Principal Formulaire de Recherche dans Yii2
Il n'a pas en raison de certaines complications dans Kartik de Select2
liste déroulante de recherche widget. Maintenant je suis passé temporairement à un simple Yii2 champ de recherche.
VUE
echo $form->field($model, '_id')->textInput(array('placeholder' => 'search'))->label(false);
MODÈLE
<?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;
}
}
Avez-vous une idée sur comment mettre en œuvre une seule recherche? C'est un peu plus intelligents de recherche, car il peut chercher tout dans la table de base de données basé sur des mots-clés entrés.
MODIFIER
Quand je fais une recherche d'un mot-clé, par exemple "bonjour", puis, il me donne cette url et d'erreur après l'appui sur la touche entrée:
URL:
Message d'erreur:
Bad Request (#400) Manque des paramètres: id
Aider.
- vous avez pass
id
comme paramètre danspayslip-template/searchresults
action ? - avez-vous utiliser
searchresults
que l'action deActiveForm
dans _search.php ?. et par-dessus tout code de travail, si vous avez utilisésearchresults
que l'action de la forme dans _search.php donc, il remplace avecindex
action.. - quelque chose de bizarre dans mon URL:
/index.php?r=payslip-template/searchresults&PayslipTemplateSearch[_id]=samplekeyword
- Vous utilisez
index
action au lieu desearchresults
. par la présente son travail. parce que vous avez utilisé laid
paramètre danssearchresults
action commesearchresults($id)
. - bon j'ai l'obtenir. mais pourquoi est-il
PayslipTemplateSearch[_id]=samplekeyword
dans mon URL? - pouvez-vous mettre une réponse où vous pouvez afficher d'un simple
searchresults
page? parce que mon originalsearchresults
page ne fonctionne pas. PayslipTemplateSearch[_id]=samplekeyword
est la recherche param pour_id
.- pouvez-vous mettre
searchresults
code ?. etsearchresults
est la recherche de modèle ? - fait. mais ne vous embêtez pas avec lui, car il ne fonctionne pas
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et ma solution est la suivante:
Modèle
Prolonger votre UserSearch Modèle avec un paramètre de recherche
Permettre de passer la variable
Modifier votre recherche-Méthode (attention: la searchfields sont combinés avec
orFilterWhere
, dépend de vos besoins).Vue (peut-être aussi de mise en page)
Prolonger votre forme avec une recherche d'entrée. Vous pouvez définir le style de l'entrée-champ par vous-même, c'est juste un exemple:
Contrôleur
Également vérifier la valeur de
$searchstring
après la publication de la forme.Que c'est.