【问题标题】:Yii2: refresh() not working after sending response contentYii2:发送响应内容后刷新()不起作用
【发布时间】:2018-10-19 12:55:59
【问题描述】:

我有一个 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);
}

【问题讨论】:

  • 您是否尝试开始下载并刷新页面?使用文本编辑器查看 sample.csv。我猜你在那里找到了你所期望的(或者错误'标头已经发送......')。你可以通过JS解决它。看here
  • 是的,我创建了一个 csv 文件,下载它,然后我想刷新页面。 csv 文件中没有错误。
  • 这就是你的完整功能generate()
  • 标题指示浏览器将所有后续数据放入文件 sample.csv。因此,任何 HTML 都会进入其中。不确定这是否真的需要您。最好保持简单,然后开始下载。为什么要重新加载页面?请注意,$this->refresh() 也发送标头。 ...顺便说一句:stream_get_contents($fp); 应该做什么? Yii::$app->session->setFlash(); 没有参数?请提供正确的代码...
  • reload是重置表单,触发flash。

标签: yii2


【解决方案1】:

Controller::refresh() 使用 Location 标头重新加载页面。由于标头需要在内容之前,您不能在内容发送后添加新标头。您的 Export::generate() 方法发送内容,因此您不能在此之后添加任何标题,因此 $this->refresh() 不起作用。

在 Yii 2.0.14 之前,有一个错误和框架简单地忽略了您在发送内容后尝试发送标头。如果你升级 Yii,在这种情况下你应该得到 "nice" 异常。


如果您在下载文件后尝试显示漂亮的页面,则您的方法不正确。您不能真正返回文件,然后重定向到不同的页面。您应该首先显示漂亮的 HTML 页面,并在其中将用户重定向到下载页面(例如,通过在头部使用 <meta http-equiv="refresh" content="0; url=http://example.com/" /> 或创建隐藏表单并通过 JavaScript 提交)。下载文件后,用户将停留在这个漂亮的页面,所以从用户体验的角度来看,一切都应该没问题。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2015-10-01
    • 2016-09-24
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多