【问题标题】:Yii Refresh Grid On DropDown changeYii 在下拉更改时刷新网格
【发布时间】:2014-04-16 17:50:51
【问题描述】:

在 YII 视图文件夹中,我有测试模块和管理内容的 admin.php 文件在下面,我在此处呈现表单,我将表单代码和下拉列表放入其中,我希望下拉列表中状态更改的网格刷新值 假设我选择“已批准”而不是网格显示状态已批准的数据

    <?php
Yii::app()->clientScript->registerScript('dropdown', "

$('.dropdown-form form').submit(function(){
$('#testimonial-grid').yiiGridView('update', {
        data: $(this).serialize()
    });
    return false;
});
");
?>
<h1>Manage Testimonials</h1>
<div class="dropdown-form">
<?php $this->renderPartial('_dropdownform',array(
    'model'=>$model,
)); ?>
</div><!-- search-form -->
    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'testimonial-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'created_by',
        'test_name',
        'test_email',
        'comments',
        'created_at',
        /*
        'status',
        'approved_on',
        'approved_by',
        */
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

下面的表单是 _dropdownform ,它包含一个表单和下拉列表,我正在选择状态的值

<div class="wide form">
    <?php
    $form = $this->beginWidget('CActiveForm', array(
        'action' => Yii::app()->createUrl($this->route),
        'method' => 'get',
    ));
    ?>
    <div class="row">
        <?php
        echo CHtml::dropDownList('status', '', array(0 => 'New', 1 => 'Approved', 2 => 'Declined'), array(
            'prompt' => 'Select Status',
            'ajax' => array(
                'type' => 'POST',
                'url' => Yii::app()->createUrl('testimonial/loadthedata'), 
                //or $this->createUrl('loadcities') if '$this' extends CController
                'update' => '#testimonial-grid', //or 'success' => 'function(data){...handle the data in the way you want...}',
                'data' => array('status' => 'js:this.value'),
        )));
        ?>
    </div>

    <div class="row buttons">
<?php //echo CHtml::submitButton('Search');   ?>
    </div>
        <?php $this->endWidget(); ?>
</div><!-- search-form -->

我的控制器中的代码或在下拉菜单中提供的用于获取数据的 URL 正在执行操作,但我不知道如何从此函数中获取数据并传递到网格视图

public function actionloadthedata() {
    if (isset($_POST['status'])) {
        $status = $_POST['status'];
       if($status==0){
           $status='New';
       }
       if($status==1){
           $status='Approved';
       }
       if($status==2){
           $status='Declined';
       }
        Testimonial::model()->findByAttributes(array('status'=>$status));


    }
}

【问题讨论】:

    标签: drop-down-menu yii


    【解决方案1】:

    例如可以使用CGridView属性filterCssClass链接网格过滤器

    $this->widget('CGridView', array(
        'id' => 'my-list',
        'filterCssClass' => '#filterFormId .filter',
    

    还有过滤形式

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id' => 'filter-fomr-id',
    )); ?>
    
    <div class="filter clearfix">
        <?php echo $form->dropDownList($model, 'name', [0=>'all', '1'=>'some else']); ?>
    </div>
    

    在特定于您的表单的 jquery 选择器上替换 #filterFormId .filter。也就是说,为过滤表单设置id属性,然后使用“#THISID .row”。

    【讨论】:

    • 错误:语法错误,无法识别的表达式:#testimonial-grid .#filter-fomr-id .filter 输入,#testimonial-grid .#filter-fomr-id .filter select
    • 设置一些ID来过滤表单,然后使用#THISID .row
    【解决方案2】:

    感谢@Alex 的帮助,但我成功为网格制作 filterdropdown,代码如下,但请告诉我,我希望网格仅显示 status=New 的值,当页面加载网格显示时我该怎么做状态为新的值 但首先我粘贴网格下拉过滤器的工作代码 这是我的 admin.php 文件

        <?php
    $this->breadcrumbs = array(
        'Testimonials' => array('index'),
        'Manage',
    );
    $this->menu = array(
        array('label' => 'List Testimonial', 'url' => array('index')),
        array('label' => 'Create Testimonial', 'url' => array('create')),
    );
    ?>
    <h1>Manage Testimonials</h1>
    <!-----------drop down form------------->
    <?php
    Yii::app()->clientScript->registerScript('dropdownfilter', "
    
    $('.dropdown-form form #staticid').change(function(){
        $.fn.yiiGridView.update('testimonial-grid', {
            data: $(this).serialize()
        });
        return false;
    });
    ");
    ?>
    <div class="dropdown-form">
        <?php
        $this->renderPartial('_dropdownfilter', array(
            'model' => $model,
        ));
        ?>
    </div><!-- search-form -->
    <?php
    $this->widget('zii.widgets.grid.CGridView', array(
        'id' => 'testimonial-grid',
        'dataProvider' => $model->search(),
       // 'filter' => $model,
        'columns' => array(
            'id',
            'created_by',
            'test_name',
            'test_email',
            'comments',
            'created_at',
            'status',
            array(
                'class' => 'CButtonColumn',
            ),
        ),
    ));
    ?>
    

    这是我放置静态下拉菜单的渲染部分表单

    <div class="wide form">
    <?php
    $form = $this->beginWidget('CActiveForm', array(
        'action' => Yii::app()->createUrl($this->route),
        'method' => 'get',
    ));
    ?>
    <div class="row">
        <?php
        echo CHtml::dropDownList('staticid', '', array('0' => 'New', '1' => 'Approved', '2' => 'Declined'), array(
            // 'onChange' => 'this.form.submit()',
            'ajax' => array(
                'type' => 'POST', //request type
        )));
        ?>
    </div>
    <?php $this->endWidget(); ?>
    

    这是我在控制器中的管理代码

    public function actionAdmin() {
        $model = new Testimonial('search');
        $model->unsetAttributes();  // clear any default values
        if (isset($_GET['staticid'])) {
            $getStatus = $_GET['staticid'];
            if ($getStatus == 0)
                $status = 'New';
            if ($getStatus == 1)
                $status = 'Approved';
            if ($getStatus == 2)
                $status = 'Declined';
            $model->status = $status;
        }
        if (isset($_GET['Testimonial']))
            $model->attributes = $_GET['Testimonial'];
        $this->render('admin', array(
            'model' => $model,
        ));
    }
    

    现在我希望当我第一次触发 actionadmin 时它显示 status=New values

    【讨论】:

    • 在 actionAdmin 控制器中添加 $model-> unsetAttributes(); $model-> status = 'New';
    【解决方案3】:

    在您的 gridview 文件中,确保您有以下代码:

    Yii::app()->clientScript->registerScript('search', "
    $('.search-button').click(function(){
        $('.search-form').toggle();
        return false;
    });
    $('.search-form form').submit(function(){
        $('#ad-grid').yiiGridView('update', {
            data: $(this).serialize()
        });
        return false;
    });
    ");
    

    然后在CGridView定义中:

    $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'testimonial-grid',
        'dataProvider'=>$model->search(),
        'filter'=>$model,
        'columns'=>array(
            ...
            array(
                'name'=>'Status',
                'filter'=>CHtml::dropDownList('YourModel[status]', $model->status, array(0 => 'New', 1 => 'Approved', 2 => 'Declined'), array('empty' => '--all--') ),
                'value'=>'( $data->status == 0) ? "New": ( $data->status == 1) ? "Approved" : "Declined"',
                'htmlOptions' => array(
                    'style' => 'width: 40px; text-align: center;',
                ),
            ),
            ...
            array(
                'class'=>'CButtonColumn',
            ),
        ),
    ));
    // CGridView 
    

    为了将 if/else 保存在 'value' 部分中,您可以在模型中实现一个方法,该方法返回与整数关联的字符串。

    效果很好,只需使用默认的Yii admin.php view,您可以根据需要进行编辑。

    更新
    增加对空状态的支持,不过滤查询结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-10
      • 2015-03-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多