Yii2:refresh()在发送响应内容后不工作
我有一个Yii2:refresh()在发送响应内容后不工作,yii2,Yii2,我有一个ActiveForm,我用它来获取一些数据,当我点击发送按钮时,它将运行模型(在本例中是csv文件生成器),但刷新不起作用,当我删除该方法时,它将刷新 经过一些测试后,fputcsv()似乎会停止脚本,因此在此之后出现的所有内容都不会运行 查看 public function actionIndex() { $model = new Export(); if ($model->load(Yii::$app->request->post()) &
ActiveForm
,我用它来获取一些数据,当我点击发送按钮时,它将运行模型(在本例中是csv文件生成器),但刷新不起作用,当我删除该方法时,它将刷新
经过一些测试后,fputcsv()
似乎会停止脚本,因此在此之后出现的所有内容都不会运行
查看
public function actionIndex()
{
$model = new Export();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$fields = Yii::$app->request->post('Export');
\backend\models\Export::generate();//this prevents the refresh
Yii::$app->session->setFlash();
return $this->refresh();
} else {
return $this->render('index' , ['model' => $model]);
}
}
型号
static public function generate()
{
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="sample.csv"');
header("Pragma: no-cache");
header("Expires: 0");
$data = [array comes here];
$fp = fopen('php://output', 'w') or die("Unable to open file!");
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
foreach ( $data as $line ) {
fputcsv($fp , $line , ';' );
}
stream_get_contents($fp);
fclose($fp);
}
Controller::refresh()
使用Location
标题重新加载页面。由于标题必须位于内容之前,因此无法在发送内容后添加新标题。您的Export::generate()
方法发送内容,因此在此之后无法添加任何标题,因此$this->refresh()
不起作用
在Yii 2.0.14之前,有一个bug,框架被忽略,您试图在发送内容之后发送标题。如果您升级了Yii,在这种情况下应该会得到“nice”异常
若你们试图在下载文件后显示漂亮的页面,你们的方法是不正确的。您不能返回文件,然后重定向到其他页面。您应该首先显示漂亮的HTML页面,并在页面内部将用户重定向到下载页面(例如,在head中使用
,或者创建隐藏表单并通过JavaScript提交)。下载文件后,用户将停留在这个漂亮的页面上,因此从用户体验的角度来看,一切都应该正常。是否尝试开始下载并刷新页面?使用文本编辑器查看sample.csv。我猜您会在那里找到您所期望的内容(或者出现错误“Header havey sent…”)。你可以通过JS解决它。看。是的,我创建了一个csv文件,下载它,然后我想刷新te页面。csv文件中没有错误。是您的完整函数generate()
?标题指示浏览器将以下所有数据放入文件sample.csv中。因此,任何HTML也会进入其中。不确定你是否真的需要这个。最好保持简单,然后开始下载。为什么要重新加载页面?请注意,$this->refresh()
还发送头。。。顺便说一句:stream\u应该得到什么内容($fp)代码>做什么<代码>Yii::$app->session->setFlash()代码>没有参数?请提供正确的代码…重新加载是为了重置表单,并触发闪存。