1

ID、名前、価格などの車のデータを返すモデルがあります。したがって、車のコントローラーと、モデルからこのデータをフェッチするcsvアクションがあります。

$carTable = $this->getServiceLocator()->get('Application\Model\DbTable\Cars');
$cars = $carTable->fetchAll();

この「$cars」データをCSVファイルとしてダウンロードして、ユーザーがディスクに保存できるようにする必要があります。

レイアウトを無効にしてCSV文字列をエコーし​​、「content-type」やその他のヘッダーを設定しようとしましたが、そのままでは機能しませんでした。次に、おそらくカスタムCsvRendererを作成して、構成に登録する必要があると考えました。

ZF2サイトまたはブログとStackoverflowの回答でこれに関するドキュメントを見つけることができなかったので、これがZF2でCSVとしてデータをダウンロードするための推奨される一般的なアプローチであるかどうかを知りたいですか?または私が気付いていないより簡単な解決策はありますか?

ありがとう

4

3 に答える 3

11

1つの解決策は、コントローラーから直接Responseオブジェクトを返すことです。

このようなものは、機能する可能性が高くなります。

public function downloadAction()
{
    // magically create $content as a string containing CSV data

    $response = $this->getResponse();
    $headers = $response->getHeaders();
    $headers->addHeaderLine('Content-Type', 'text/csv');
    $headers->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\"");
    $headers->addHeaderLine('Accept-Ranges', 'bytes');
    $headers->addHeaderLine('Content-Length', strlen($content));

    $response->setContent($content);
    return $response;
}

(私はこのコードをテストしていませんが、コメントに沿って更新していることに注意してください!)

于 2012-12-03T20:10:55.067 に答える
3

ZF2について話しているので、新しいCSV ViewStrategy / Renderer/ViewModelを追加することでこれを解決したいと思います。

ここでは、独自のレンダリングおよび応答戦略の実装について詳しく読むことができます:Zend Docs

またはここでも:http://zend-framework-community.634137.n4.nabble.com/ZF2-Implementing-custom-renderer-strategy-td4655896.html

これにより、コントローラーのヘッダーを気にする必要がなく、レンダラーのヘッダーを気にする必要がないため、コントローラーのコードがよりスリムでクリーンになり、より明確になります。そうすれば、新しいCSV出力が必要になるたびに、そのアクションを最初からやり直す必要はなく、CSVビューモデルを使用するだけです。

于 2014-02-18T16:42:38.937 に答える
2

これは、ロブによって提供された回答に基づいています。

Robの回答では、新しい変数に割り当て$response->getHeaders()てから、その新しい$headers変数にを適用する->addHeaderLineと、のヘッダーが適切に設定されません$response。そのため、返されたときに、ヘッダーは応答に添付されませんでした。

$responseこれを修正するには、以下に示すようにヘッダーを直接追加します。

public function downloadAction()
{
    // magically create $content as a string containing CSV data

    $response = $this->getResponse();
    $response->getHeaders()
             ->addHeaderLine('Content-Type', 'text/csv')
             ->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\"")
             ->addHeaderLine('Accept-Ranges', 'bytes')
             ->addHeaderLine('Content-Length', strlen($content));

    $response->setContent($content);
    return $response;
}
于 2013-04-11T21:56:24.263 に答える