2015-10-02 16 views
7

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:

http://localhost/iaoy-dev/web/index.php?r=payslip-template%2Fsearchresults&PayslipTemplateSearch%5B_id%5D=hello

Messaggio di errore:

Bad Request (# 400) Manca parametri richiesti: id

Guida.

+1

avete passato 'id' come parametro nell'azione' payslip-template/searchresults'? – GAMITG

+0

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

+0

qualcosa di strano nel mio URL: '/index.php?r=payslip-template/ searchresults & PayslipTemplateSearch [_id] = samplekeyword' –

risposta

5

Ho avuto lo stesso problema e la mia soluzione è:

Modello

Allungate l'UserSearch Modello con un parametro di ricerca

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

Abilita passando la variabile

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

Cambia il tuo searc Metodo h (attenzione: i campi di ricerca sono combinati con orFilterWhere, dipende dalle tue esigenze).

 $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 (potrebbe essere anche il layout)

estendere la vostra forma con una ricerca-input.È possibile lo stile l'input-campo da soli, questo è solo un esempio:

<?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']); 
?> 

controller

controllare anche per il valore di $searchstring dopo la pubblicazione del modulo.

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

Questo è tutto.