Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2:refresh()在发送响应内容后不工作_Yii2 - Fatal编程技术网

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()没有参数?请提供正确的代码…重新加载是为了重置表单,并触发闪存。