【问题标题】:Yii2 - DetailView Search boxYii2 - DetailView 搜索框
【发布时间】:2016-03-24 12:28:15
【问题描述】:

我在 ProdutosController 中有这个动作。它渲染 view2 的 itemview 指向 _view2,而 _view2 有一个 DetailView 来显示产品。

public function actionView2()
{   
    $model = new Produtos();
    $dataProvider = new ActiveDataProvider([
    'query' => Produtos::find(),
    'pagination' => false,
    ]);

    // get the posts in the current page
    $posts = $dataProvider->getModels();

    // render
    return $this->render('view2', [
        'dataProvider' => $dataProvider,
        'model' => $model,
    ]);
}

观点2

<?php

use yii\helpers\Html;
use yii\widgets\ListView;
use yii\helpers\Url;

/* @var $this yii\web\View */
/* @var $model app\models\Atividades */

// $this->title = implode('', $cat);
?>
<div class="produtos-view2">
    <?php
    //use kartik\social\FacebookPlugin;
    //echo FacebookPlugin::widget(['type'=>FacebookPlugin::SHARE, 'settings' `=> []]);`
    ?>
</div>

<?= ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '_view2',
]); ?>

<br/><br/>

还有_view2作为DetailView里面的:

<?= DetailView::widget([
    'model' => $model,
    'options' => ['class' => 'detail1-galeria-view2'],
    'attributes' => [
        // cria um array com a fotografia, em que carrega a path no campo fieldName da bd
        [
            'attribute'=>'',
            //'value'=>$model->foto,
            'value'=>Html::a(Html::img(Yii::$app->getUrlManager()->getBaseUrl() . "/" .$model->foto, ['width'=>'192', 'height' => "256"]), $model->foto),
            'format' => 'raw',
        ],
        [
        'attribute'=>'',
        'value'=>$model->nome,
        ],
        [
        'attribute'=>'',
        'value'=>$model->categoria,
        ],
        [
        'attribute'=>'',
        'value'=>$model->descricao,
        ],
        [
        'attribute'=>'',
        'value'=>$model->valor.' '.'€',
        ],
        // info
        [
        'attribute'=>'',
        'format' => 'raw',
        'value'=> Html::a(Yii::t('app','Comprar'), Url::toRoute(['contacto/create2'])),
        ],
    ],
]) ?>

在另一个项目中,我能够通过在其中渲染 _search.php 并修改 ProdutosSearch 模型在 _view2 中创建一个搜索框。但这是通过 GridView 实现的,该 GridView 直接在小部件内接受 $dataprovider 和 $searchModel。

现在在我的新项目中,我正在努力制作一个搜索输入框来过滤 DetailView 显示的内容(它显示产品的照片、名称、类别等)但无法做到因为详细视图不接受 $dataProvider 数据。

我该如何解决这个问题并使用 DetailView 制作带有搜索框的产品库。

编辑

控制器动作:

public function actionMySearchFunction()
{   
    $model = new Produtos();
    $searchModel = new CategoriasSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider = new ActiveDataProvider([
    'query' => Produtos::find(),
    'pagination' => false,
    ]);

    // get the posts in the current page
    $posts = $dataProvider->getModels();

    // render
    return $this->render('view2', [
        'dataProvider' => $dataProvider,
        'searchModel' => $searchModel,
        'model' => $model,
    ]);
}

MySearchFunction.php

<?php
public function MySearchFunction()

{
$post = Yii::$app->request->post(); 

if (!empty($post)){

    $postParam1 = $post['categoria']; // get the value ffrom the filter field submitted) 

    $query = ProdutosSearch::find()->where(['categoria' =>  $postParam1]);

    $dataProvider = new \yii\data\ActiveDataProvider([
        'query' => $query,
    ]);

    $dataProvider->pagination->pageSize=15;

    return $this->render('view2', [
        'dataProvider' => $dataProvider,
    ]);

}

} ?>

VIEW2

<?php $form = ActiveForm::begin([
    'action' => Url::to(['/produtos/my-search-function']),
    'method' => 'get',
    'options' => ['class' => 'form-inline form-group form-group-sm col-xs-12'],
    'fieldConfig' => [
        'template' => "{input}",
    ],
]); ?>
</div>
<?php echo var_dump(Url::to(['/produtos/my-search-function'])); ?>

<!--<nobr><?= $form->field($model, 'nome')->textInput(['placeholder' => 'Nome']) ?>-->

<nobr>
    <?= $form->field($searchModel, 'categoria')->dropDownList(ArrayHelper::map(Categorias::find()->all(), 'categoria','categoria'), ['prompt'=>Yii::t('yii', 'Escolha a categoria...')])  ?>
    <?= Html::submitButton(Yii::t('app', 'Pesquisar'), ['class' => 'btn btn-warning']) ?>
</nobr>
<?php ActiveForm::end(); ?>

<div class="user-view">

    <?= ListView::widget([
        'dataProvider' => $dataProvider,
        'itemView' => '_view2',
    ]); ?>

    <br/><br/>

</div>

【问题讨论】:

    标签: search filter widget yii2 detailview


    【解决方案1】:

    您可以从视图内的部分轻松地在操作中添加所需的字段, 搜索按钮将值提交给您用于搜索的操作,您可以将结果重定向到您需要的控制器。

    在动作表单中你可以设置目标控制器/动作。以这种方式按下提交按钮提交的控制器/操作中的值,例如:

    public function actionMySearchFunction()
    {
    
        $post = Yii::$app->request->post(); 
    
        if (!empty($post)){
    
            $postParam1 = $post['name_field_Filter1']; // get the value ffrom the filter field submitted) 
    
            $postParam2 = $post['name_field_Filter2'];
    
            $query = YourModel::find()->where(['field1' =>  $postParam1, 'field2' =>  $postParam2]);
    
            $dataProvider = new \yii\data\ActiveDataProvider([
                'query' => $query,
            ]);
    
            $dataProvider->pagination->pageSize=15;
    
            return $this->render('your_view', [
                'dataProvider' => $dataProvider,
            ]);
    
        }
    }
    

    【讨论】:

    • 我能够创建表单操作和渲染,以及搜索按钮。但是如何将值提交给要搜索的操作呢?我的提交按钮是这样的: = Html::submitButton(Yii::t('app', 'Pesquisar'), ['class' => 'btn btn-warning']) ?>
    • 我在 Produtos 文件夹中创建了 MySearchFunction.php 以及那里的其他视图。我在表单中使用指向 Produtos/MySearchFunction 的 Url 进行了操作,但出现以下错误:异常 'yii\base\InvalidRouteException' 并带有消息'无法解析请求:produtos/MySearchFunction'
    • 导航器中的Url显示:localhost:8888/beladona/web/…
    • 您必须在 Produtos 控制器中创建 actionMySearchFunction 而不是 MySearchFunction
    • 记住调用动作是在这个 wat produtos/my-search-function no camelCase non start with largecase...
    【解决方案2】:

    首先在该页面上添加搜索框:

    <?php
    
    use yii\helpers\Html;
    use yii\widgets\ActiveForm;
    
    /* @var $form yii\widgets\ActiveForm */
    ?>
    
    <div class="student-form">
        <?php $form = ActiveForm::begin(); ?>
    
        <?= $form->field($searchModel, 'nome') ?>
    
        <?= $form->field($searchModel, 'categoria') ?>
    
        <div class="form-group">
            <?= Html::submitButton('Apply', ['class' => 'btn btn-success']) ?>
        </div>
    
        <?php ActiveForm::end(); ?>
    </div>
    

    然后在模型中准备一个过滤方法。

    public function rules()
    {
        return [
            ['nome', 'string'],
            ['categoria', 'string'],
        ];
    }
    
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }
    
    public function search($params)
    {
        $query = Produtos::find();
    
        $dataProvider = new ActiveDataProvider(['query' => $query]);
    
        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }
    
        $query->andFilterWhere(['like', 'nome', $this->nome])
            ->andFilterWhere(['like', 'categoria', $this->categoria]);
    
        return $dataProvider;
    }
    

    【讨论】:

    • 我已经尝试过这种方式,但由于某种原因,使用 DetailView 小部件无法正常工作。
    猜你喜欢
    • 2016-05-05
    • 2017-03-26
    • 2017-07-10
    • 2018-07-19
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多