2015-09-20 62 views
2

我想在Yii Grid View中使用PJax,而不是使用网格视图内部的关联过滤器,但使用外部的搜索过滤器,因此它可以过滤内部的结果。 enter image description here使用Yii中的GridView进行Ajax过滤

这里是索引文件的来源:

<div class="cars-index"> 

<h1><?= Html::encode($this->title) ?></h1> 


<?php echo $this->render('_search', ['model' => $searchModel]); ?> 

<p> 
    <?= Html::a('Create Cars', ['create'], ['class' => 'btn btn-success']) ?> 
</p> 


<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     'id', 
     'name', 
     ['attribute' => 'code', 
     'label' => 'Colour', 
     'format' => 'raw', 
     'value' => 'colour', 
     'contentOptions' => function ($model, $key, $index, $column){ 
      return ['style' => ' text-align: center; width: 100px;color:white;background-color:#'. $model -> code]; 
     }, 
     'headerOptions' => ['style' => 'text-align: center;'], 
     ], 
     'price', 
     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 

我应该创建一个活动形式,只是我要筛选的一部分吗?还是有另一种方式?

回答

2

如果你不能简单的过滤器添加到您的表像这样

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 

我建议你使用一个适当的行动,并提交基于指定的活性形式的所谓正确的搜索功能

动作形式例如:

<?php $form = ActiveForm::begin([ 
    'id' => 'search-form', 
    'method' => 'post', 
    'action' => ['controller/yourAction'] 
]); ?> 

控制器

$model = new yourActiveForm(); 

    if ($model->load(Yii::$app->request->post())) { 

     $dataProvider = $searchModel->search([ 'yuorSearchModel'=> ['your_att1' => $model->yourValue1]]); 
    } 

然后渲染

顺应yii2 doc

Pjax只与它的开始()和 端之间包围的内容涉及()调用,被称为widget的主体内容。默认情况下,任何 链接点击或表单提交(对于具有data-pjax 属性的表单)主体内容将触发AJAX请求。在 响应AJAX请求,Pjax将发送更新的主体 内容(基于AJAX请求)到客户端,这将替换 旧的内容与新的内容。浏览器的URL将使用pushState更新为 。整个过程不需要重新安装 的布局或资源(js,css)。

您可以配置$ linkSelector指定哪些环节应该触发 pjax,并配置$ formSelector来指定哪些表单提交可能 触发pjax。

您必须添加

<?php Pjax::begin(); ?> 
.... your active form 

<?php Pjax::end(); ?> 

,并配置适当的$ linkSelect和$ formSelector

+0

这就是我的想法..谢谢 –

+0

谢谢你,我看到你的工作进展顺利 – scaisEdge

+0

:)我是一个在sw开发公司的新毕业生培训。我主要是一名平面设计师,但我也在学习Yii2,感谢像你这样的人。 Registers –

0

在您的过滤视图:

<div id="myFilter"> 
    <?php $form = ActiveForm::begin([ 
     'id' => 'myFilterForm', 
     'method' => 'post', 
     'action' => [...], 
    ]); ?> 
    ... 
</div> 

并确保您呈现Pjax::begin之间的过滤器和Pjax::end

然而,这里有个窍门。如果您的服务器没有默认的超时时间内响应,Pjax被忽略和页面重新加载,所以一定要确保timeout足够大:

<?php Pjax::begin([ 
    'id'=>'myGrid', 
    'timeout' => 10000,     // <------------ THIS !!!!!!! 
    'formSelector' => '#myFilterForm' 
]); ?> 

<?= $this->render('myFilter', ['model' => $searchModel]); ?> 

<?= GridView::widget([ 
    ... 
]); ?> 
<?php Pjax::end(); ?> 

而且在你的控制器,你可能会想“重置”搜索模式,使从使用的请求唯一数据是实际使用search属性:

public function actionSearch() 
{ 
    $searchModel = new MySearch(); 

    if ($searchModel->load(Yii::$app->request->post())) { 
     $searchModel = new MySearch(); // "reset" 
     $dataProvider = $searchModel->search(Yii::$app->request->post()); 
    } else { 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
    } 

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

希望这有助于。干杯!