Yii2 ha un searchModel
per cercare ogni campo nel numero GridView
. È possibile creare un solo campo di ricerca al di fuori dello GridView
in cui l'utente può inserire parole chiave e quando viene premuto il pulsante Cerca, i risultati verranno visualizzati nello GridView
in base alle parole chiave immesse.Come implementare un singolo modulo di ricerca in yii2
CONTROLLER
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,
]);
}
}
ho fatto una domanda collegato a questo problema qui: Main Search Form in Yii2
Non ha fatto a causa di alcune complicazioni nella widget di discesa Select2
di ricerca di Kartik. Ora sono passato temporaneamente a un semplice campo di ricerca Yii2.
VISTA
echo $form->field($model, '_id')->textInput(array('placeholder' => 'search'))->label(false);
MODELLO
<?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;
}
}
Avete qualche idea su come a implementare una singola ricerca? È una specie di ricerca più intelligente poiché può cercare tutto nella tabella del database in base alle parole chiave immesse.
EDIT
Quando cerco una parola chiave, diciamo per esempio 'ciao', allora mi dà questo url ed errore dopo aver toccato il tasto enter:
URL:
Messaggio di errore:
Bad Request (# 400) Manca parametri richiesti: id
Guida.
avete passato 'id' come parametro nell'azione' payslip-template/searchresults'? – GAMITG
hai usato 'searchresults' come azione di' ActiveForm' in _search.php?. e soprattutto il codice funziona, se hai usato 'searchresults' come azione di forma in _search.php in modo da sostituirlo con l'azione' index' .. – GAMITG
qualcosa di strano nel mio URL: '/index.php?r=payslip-template/ searchresults & PayslipTemplateSearch [_id] = samplekeyword' –