0

我正在尝试通过单击按钮cgridview使用扩展名将数据(当前搜索结果)导出到 CSV 。excelview

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

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

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

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

4

1 回答 1

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 代码。

于 2012-08-10T15:13:54.830 回答