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

2022-01-07 00:00:00 search php yii2 gridview

Yii2 有一个 searchModel 来搜索 GridView 中的每个字段.是否可以只在 GridView 之外创建一个搜索字段,用户可以在其中输入关键字,并且当点击搜索按钮时,结果将显示在基于 GridView 的在输入的关键字上.

Yii2 has a searchModel to search each field in the GridView. Is it possible to just create a single search field outside the GridView where the user can input keywords and by the time Search button is hit, the results will display in the GridView based on the keywords entered.

控制器

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

I asked a question connected to this problem here: Main Search Form in Yii2

这不是因为 Kartik 的 Select2 搜索下拉小部件的一些复杂性.现在我暂时切换到一个简单的 Yii2 搜索字段.

It didn't due to some complications in Kartik's Select2 search dropdown widget. Now I switched temporarily to a simple Yii2 search field.

查看

echo $form->field($model, '_id')->textInput(array('placeholder' => 'search'))->label(false);

模型

<?php

namespace appmodels;

use Yii;
use yiiaseModel;
use yiidataActiveDataProvider;
use appmodelsUser;

/**
 * UserSearch represents the model behind the search form about `appmodelsUser`.
 */
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;
    }
}

您对如何实现单一搜索有任何想法吗?这是一种更智能的搜索,因为它可以根据输入的关键字搜索数据库表中的所有内容.

Do you have any idea on how to I implement a single search? It's kind of a smarter search since it can search everything in the database table based on keywords inputted.

编辑

当我搜索关键字时,例如你好",它会在按回车键后给我这个网址和错误:

When I search a keyword, say for example 'hello', it then gives me this url and error after hitting enter key:

网址:

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

错误信息:

错误请求 (#400) 缺少必需的参数:id

Bad Request (#400) Missing required parameters: id

帮助.

推荐答案

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

I had the same problem and my solution is:

模型

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

Extend your UserSearch Model with a search parameter

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

允许传递变量

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

更改您的搜索方法(注意:搜索字段与 orFilterWhere 结合,取决于您的需要).

Change your search-Method (beware: the searchfields are combined with orFilterWhere, depends on your needs).

     $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(也可以是布局)

使用搜索输入扩展您的表单.您可以自己设置输入字段的样式,这只是一个示例:

Extend your form with a search-input. You can style the input-field by yourself, this is just an example:

<?php
/* @var $searchModel appmodelsUserSearch */
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 的值.

Also check for the value of $searchstring after posting the form.

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

就是这样.

相关文章