Yii eexcelview不导出网格过滤器

时间:2012-08-10 14:50:30

标签: php csv controller yii

我正在尝试使用cgridview扩展程序将excelview数据(当前搜索结果)导出为CSV,方法是点击按钮。

但是,我没有在我的CSV中获取过滤后的数据;相反,我得到了模型中的所有记录。

这是我正在调用的控制器操作:

    public function actionExcel()
{
    $model = new PackagingMetric('search'); 
    $this->widget('application.extensions.EExcelView', array( 
            'dataProvider'=> $model->search(), 
            'grid_mode'=>'export', 
            'exportType'=>'Excel5', 
            'filename'=>'report', 
            )); 
}

有人知道如何解决此问题,或者我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

您没有任何搜索条件。通常你这样做:

$model = new PackagingMetric('search');
$model->attributes = $_POST['PackagingMetric']; // this would be the model associated with the search form
$model->search();

我的代码中没有看到任何从用户输入获取值的内容,因此您应该以某种方式使用搜索表单。当然,您可以在模型中使用默认值,但我不认为是这种情况。

修改

我看了一下你正在使用的扩展的源代码。似乎导出按钮实际上是标准<a href=''></a>链接,它们会将您发送到应该输出Excel工作表的页面。但是,由于实际的过滤数据不会传输到该页面,因此无法在服务器端应用这些过滤器。

由于这是扩展的预期行为,因此没有优雅的方法来解决它,但是有一些混乱的方法。

第一个选择是自己调整扩展名,但这会破坏与未来版本的兼容性。另一种方法是使用Javascript在您需要的地方发送数据。在要显示gridview的视图文件中,应将窗口小部件包装在form元素或ActiveForm中,并禁用所有验证。然后,您需要在页面上的某处放置以下Javascript代码:

var $excelForm = $( '#your_form_id' );
$( '.summary a', $excelForm ).click( function() {
    $excelForm.attr( 'action', this.href ).submit();
    return false;
});

这会将表单提交到导出链接指定的地址。由于表单包装窗口小部件,因此它将包含过滤结果的输入元素,因此您可以访问服务器上用户输入的过滤器。您可以使用我最初发布的代码从那里获取数据。

注意:我使用的是包含导出按钮的div的默认类名,即.summary。如果您使用的是其他类,则应更改相应的JS代码。