javascript - Yii2:在单击按钮时更改 Gridviews 的 DataProvider

标签 javascript php gridview yii2 pjax

我的 Gridview 有 3 个单独的 dataProvider,一个有已保存的数据,一个有未保存的数据,一个有两者。

现在这就是我想要完成的:

enter image description here

如果您点击保存,dataProvider 将更改为保存数据的那个。

我正在这样尝试:

<?php 

if($i == 1){
    $dataProvider = $dataProviderSaved;
} elseif($i == 2) {
    $dataProvider = $dataProviderNotsaved;
} else {
    $dataProvider = $dataProviderBoth;
};

\yii\widgets\Pjax::begin(['id' => 'gridview', 'timeout' => false,
 'enablePushState' => false, 'clientOptions' => ['method' => 'POST']]) ?>

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    //regular gridview..

\yii\widgets\Pjax::end(); ?>

Javascript:

var i = $i;

$("#saved").click(function(){
i=1;
$.pjax.defaults.timeout = false;//IMPORTANT
$.pjax.reload({container:"#gridview"});
});

', \yii\web\View::POS_READY);

所以,我刚刚读到,在 JS 中更改 PHP 变量是“不可能的”。

  • 我将如何做到这一点?
  • 有更好的方法吗?
  • 我需要 3 数据提供者? (这意味着 Controller 内部有 3 个 find())

最佳答案

如果我理解正确,您不需要 3 个数据提供者。您应该使用 GridView 的 FilterSelector 选项将该外部元素视为 GridView 过滤器的一部分。 例如

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'filterSelector' => "input[name='ModelSearch[_selection]'],",
    ...

然后,在您的过滤器模型中,您根据该值进行过滤

switch($this->_selection) {
    case 'Saved':
        $query->andFilterWhere([...]);
        break;
    case 'Unsaved':
        $query->andFilterWhere([...]);
        break;
    case 'Both':
        $query->andFilterWhere([...]);
        break;

不要忘记将 _selection 属性添加到您的模型类和 rules() 作为搜索模型类中的“安全”。

关于javascript - Yii2:在单击按钮时更改 Gridviews 的 DataProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30572607/

相关文章:

javascript - 不同控件的onclick加载不同的内容

javascript - .hover 在我的 div 上没有任何作用

javascript - 我可以在启动时在机器人上创建 channel 吗?

php - MySQL 不使用 INNER JOIN 在单独的表中显示重复的列名

php - libsodium PHP 将私钥存储在文件中

java - 带有 2x2 imageview android 的网格布局

php - 如何使按钮在插入时加载其自身的功能

php - 如何将 Jquery 变量值发送或分配给 php 变量?

c# - 从 Gridview 的可见 false BoundField 中检索数据

SQL通配符不返回数据?