Php Yii2:尝试使用ajax生成csv文件

Php Yii2:尝试使用ajax生成csv文件,php,yii2,export-to-csv,Php,Yii2,Export To Csv,我正在尝试生成一个包含一些数据的基本csv文件。当我在ajax调用中使用警报时,它会显示数据(因此有数据传递),但当我单击按钮时,它不会生成CSV文件。我是yii2的新手,所以我还在学习 已更新 我已经更改了文件 //查看export/index.php Pjax::begin(); $form = ActiveForm::begin([ 'action' => yii\helpers\Url::to(['cms-export/index']), 'options' =

我正在尝试生成一个包含一些数据的基本csv文件。当我在ajax调用中使用警报时,它会显示数据(因此有数据传递),但当我单击按钮时,它不会生成CSV文件。我是yii2的新手,所以我还在学习

已更新 我已经更改了文件

//查看export/index.php

Pjax::begin();

$form = ActiveForm::begin([
    'action'  => yii\helpers\Url::to(['cms-export/index']),
    'options' => ['data' => ['pjax' => true]],
    'layout'  => 'horizontal',
    'fieldConfig' => [
        'horizontalCssClasses' => [
            'label'   => 'col-sm-2',
            'offset'  => 'col-sm-offset-2',
            'wrapper' => 'col-sm-5',
            'hint'    => 'col-sm-5',
        ],
    ],
]);

    echo $form->field($model, 'language')->dropDownList([//some list]);

    echo $form->field($model, 'filename')->textInput()

    echo Html::submitButton('Submit', ['class' => 'btn btn-primary'])';



ActiveForm::end();

Pjax::end();
//模型

public function generateCsv(){

  header('Content-Type: application/csv');
  header('Content-Disposition: attachment; filename="sample.csv"');

    $data = [datacomeshere];

    $fp = fopen('php://output', 'w');
    foreach ( $data as $line ) {
        fputcsv($fp, $line, ';');
    }
    fclose($fp);

}
//控制器

public function actionIndex()
{

    $model = new Export();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {

        // validation works, but method does not work
        \common\models\Export::generateCsv();

    }

    return $this->render('index' , ['model' => $model]);

}
当我单击该按钮时,jquery文件中将显示一个500错误

xhr.send( options.hasContent && options.data || null );

我建议采用以下方法,删除整个JS代码:

使链接成为真实的链接。有一个GET请求是有意义的,因为您只是通过调用获取数据

<div class="modal-button-row">
    <a href="cms-export/download" id="export-trigger" class="btn btn-success pull-left">Export</a>
</div>
指南中的更多信息:


您还需要删除,因为它将通过JS使用链接和表单完成自己的工作!或者您必须配置Pjax,例如使用,这超出了本问题的范围。

我建议采用以下方法,删除整个JS代码:

使链接成为真实的链接。有一个GET请求是有意义的,因为您只是通过调用获取数据

<div class="modal-button-row">
    <a href="cms-export/download" id="export-trigger" class="btn btn-success pull-left">Export</a>
</div>
指南中的更多信息:


您还需要删除,因为它将通过JS使用链接和表单完成自己的工作!或者您必须配置Pjax,例如with,这超出了本问题的范围。

一个问题肯定是,常规操作调用总是创建发送到浏览器的标题、cookie和一些内容(甚至是空字符串,例如,如果您忘记了带有
$this->render(…)
)的返回语句)。我猜想你有错误。所以这必须被抑制,这样你的CSV代码才能控制

请尝试以下操作:

 public function actionIndex() {
    $model = new Export();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        \common\models\Export::generateCsv();
        Yii::$app->response->isSent = true;
    } else {
        return $this->render('index' , ['model' => $model]);
    }
}
顺便说一句:如果调用没有更改数据,请在表单中使用
method:GET
。这是一个HTTP标准。在添加或更改某些内容时使用POST


但是,我建议使用。这也适用于ActiveForm。正如该答案中所指出的,您必须删除或配置Pjax。

一个问题肯定是,常规操作调用总是创建头、cookie和一些内容(甚至是空字符串,例如,如果您忘记了发送到浏览器的带有
$this->render(…)
)的返回语句)。我猜想你有错误。所以这必须被抑制,这样你的CSV代码才能控制

请尝试以下操作:

 public function actionIndex() {
    $model = new Export();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        \common\models\Export::generateCsv();
        Yii::$app->response->isSent = true;
    } else {
        return $this->render('index' , ['model' => $model]);
    }
}
顺便说一句:如果调用没有更改数据,请在表单中使用
method:GET
。这是一个HTTP标准。在添加或更改某些内容时使用POST



但是,我建议使用。这也适用于ActiveForm。正如回答中所指出的,您必须删除或配置Pjax。

好的,很好,但遗憾的是,这在这里没有任何作用,所以我可能遗漏了什么吗?@user759235发生了什么事?@user759235是否调用了该操作?您是否获得状态400?@user759235如果没有调用操作,您可能必须使用
href=“/cms export/download”
。或者尝试
$csv=“asdf,fdsa”。您是否已删除JS代码?@user759235什么不起作用?你为什么不提供更清楚的信息?请描述发生了什么!不要这样改变你的问题好吧,很好,但很遗憾,这里什么都没有,所以我可能遗漏了什么吗?@user759235发生了什么事?@user759235是否调用了该操作?您是否获得状态400?@user759235如果没有调用操作,您可能必须使用
href=“/cms export/download”
。或者尝试
$csv=“asdf,fdsa”。您是否已删除JS代码?@user759235什么不起作用?你为什么不提供更清楚的信息?请描述发生了什么!不要把你的问题改成“不会产生”。。。会发生什么呢???我在jquery代码中看到一个500错误,您可以查看一下日志文件。应该记录此错误。如果发生错误500,则大多数情况下每次都会有内容写入服务器的错误日志。请找到该消息并将其附加到问题“不会生成”。。。会发生什么呢???我在jquery代码中看到一个500错误,您可以查看一下日志文件。应该记录此错误。如果发生错误500,则大多数情况下每次都会有内容写入服务器的错误日志。请找到该消息并将其附加到问题仍然不工作,我仍然在jquery文件中看到错误500状态代码,与其他解决方案相同。我发现错误500…名称空间错误,但它没有保存为文件,它只显示为文本仍然不工作,我仍然在jquery文件中看到错误500状态代码,与其他解决方案相同的错误Kay发现了500个错误…错误的名称空间,但它没有保存为文件,它只显示为文本