如何在yii2中实现单一搜索表单

问题描述 投票:0回答:2

Yii2 有一个

searchModel
来搜索
GridView
中的每个字段。是否可以在
GridView
之外创建一个搜索字段,用户可以在其中输入关键字,并且在点击搜索按钮时,结果将根据输入的关键字显示在
GridView
中。

控制器

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 中的主搜索表单

这并不是因为 Kartik 的

Select2
搜索下拉小部件中的一些复杂性。现在我暂时切换到简单的 Yii2 搜索字段。

查看

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) 缺少必需参数:id

帮助。

php search gridview yii2
2个回答
8
投票

我遇到了同样的问题,我的解决方案是:

型号

使用搜索参数扩展您的 UserSearch 模型

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

启用变量传递

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

就是这样。


0
投票

您的问题在以下代码中

$query->andFilterWhere([
            '_id' => $this->_id,
            'creator_id' => $this->creator_id,
        ]);

请使用 orFilterWhere 代替 andFilterWhere

© www.soinside.com 2019 - 2024. All rights reserved.