yii2

2015-10-02 13 views
7

में एकल खोज फ़ॉर्म को कैसे कार्यान्वित करें GridView में प्रत्येक फ़ील्ड को खोजने के लिए Yii2 में searchModel है। क्या GridView के बाहर एक एकल खोज फ़ील्ड बनाना संभव है जहां उपयोगकर्ता कीवर्ड इनपुट कर सकता है और जब तक खोज बटन मारा जाता है, तो परिणाम दर्ज किए गए कीवर्ड के आधार पर GridView में प्रदर्शित होंगे।yii2

नियंत्रक

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, 
     ]); 
    }  
} 

मैं एक सवाल इस समस्या को यहां से जुड़ा पूछा: Main Search Form in Yii2

यह कार्तिक के Select2 खोज लटकती विजेट में कुछ जटिलताओं के कारण ऐसा नहीं किया। अब मैंने अस्थायी रूप से एक साधारण वाईआई 2 खोज क्षेत्र में स्विच किया है।

देखें

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; 
    } 
} 

आप मैं एक खोज के क्रियान्वयन के तरीके के किसी भी विचार है? यह एक प्रकार की स्मार्ट खोज है क्योंकि यह इनपुट किए गए कीवर्ड के आधार पर डेटाबेस तालिका में सबकुछ खोज सकता है।

संपादित

जब मैं एक कीवर्ड खोज करते हैं, उदाहरण के लिए कहते हैं कि 'हैलो', यह तो मुझे इस यूआरएल और त्रुटि कुंजी दर्ज टकराने के बाद देता है:

यूआरएल:

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

त्रुटि संदेश:

गलत अनुरोध (# 400) आवश्यक पैरामीटर गुम: आईडी

सहायता।

+1

आपने 'idl 'को' payslip-template/searchresults' कार्रवाई में पैरामीटर के रूप में पास किया है? – GAMITG

+0

क्या आपने 'searchresults' का उपयोग _search.php में' ActiveForm' की क्रिया के रूप में किया है? और सभी कोड ऊपर काम कर रहे हैं, अगर आपने 'searchresults' को _search.php में फॉर्म की क्रिया के रूप में उपयोग किया है, तो यह 'इंडेक्स' एक्शन के साथ प्रतिस्थापित होता है .. – GAMITG

+0

मेरे यूआरएल में कुछ अजीब है:' /index.php?r=payslip-template/ searchresults और PayslipTemplateSearch [_id] = samplekeyword' –

उत्तर

5

मैं एक ही समस्या थी और मेरे समाधान है:

मॉडल

ऐसा खोज पैरामीटर

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

गुजर सक्षम के साथ अपने UserSearch मॉडल का विस्तार चर

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, 
    ]); 
} 

यही है।

 संबंधित मुद्दे