我正在尝试使用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',
));
}
有人知道如何解决此问题,或者我的错误在哪里?
答案 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代码。