2016-04-13 21 views
1

私は、人々がイベントの場所を予約できるプロジェクトを持っています。数多くのイベントがあります。出席者を列挙したレポートを生成して、出席者がドアでチェックインできるようにするよう依頼されました。非常に多くのイベントがあるので、各イベント(CMS内)の編集フォームに「参加者レポート」ボタンを追加したいと思います。私はボタンを作成し、それは動作します。CMS EditFormからCSVを生成する

しかし、CSVでデータを取得する代わりに、(正しい)データがエコーされているかのようにCMSに表示されます。

は、ここに私の機能

パブリック関数getCustomersForEvent($データ、$フォーム){

$attendees = CustomerOrderLine::get()->filter(array("EventID" => $data["ID"])); 

    if(!$attendees){ 
     return false; 
    } 

    $fileName = "report.csv"; 

    $separator = ","; 
    $csvColumns = array("ID", "Description", "Customer"); 

    $fileData = ""; 

    foreach($attendees as $row){ 
     $fileData .= $row->Event()->EventName . $separator; 
     $fileData .= $row->CustomerOrder()->Customer()->FirstName . " " . $row->CustomerOrder()->Customer()->Surname . "\n"; 
    } 

    return SS_HTTPRequest::send_file($fileData, $fileName, 'text/csv'); 
} 

私はこのhttp://www.silverstripe.org/community/forums/general-questions/show/15325を見て持っていたが、データはとにかくCMSにエコーです。

私が間違っていることを教えてもらえますか?私が言ったように、データは問題ありませんが、私はCSV OpenまたはSaveダイアログを取得していません。

+0

おそらく出力のヘッダを設定してから、出力 –

+0

を送信する必要があります。 。 ではなく、CMS上にテキストとして出力されます。 – user3769009

答えて

2

解決策は、これをどのように呼び出すかになります。私は...あなたが完全に新しいコントローラを作成するなどのモジュールを変更することをあなたはPHPのコードをコピーして、あなたは上から必要データだけを返すように、それを修正することができ

https://github.com/axyr/silverstripe-phpexcel

を...助言します。ファイルのみをダウンロードしに焦点を当てているコントローラを作るために

...

class CustomersForEvent_Controller extends Page_Controller { 

    private static $allowed_actions = array (
     'downloadcsv', 
    ); 

    public function downloadcsv() { 
     return SS_HTTPRequest::send_file("my content",'myfile.csv','text/csv'); 
    } 

} 

と_config/config.yml内のルートにそのコントローラを追加...

Director: 
    rules: 
    'attendees': 'CustomersForEvent_Controller' 

。 ..andその後、あなただけ。これはローカルにテストされ、動作することを確認しました

yousite.com/attendees/downloadcsvにリンクすることができ

+0

これはCMSの内部で動作しますか? 私はそれを見ていきます。その間、私は、ファイルに(レポートを生成するメンバーごとに1つずつ)物事を保存してから、ファイルにsprintfリンクを返すことで問題を回避しました。 しかし、それは自宅犯罪と同じくらい醜いので、私はあなたの答えを見ていきます。 – user3769009

+0

はい両方のソリューションは「CMSで動作しますが、異なる方法で - このモジュールはこのためのボタンを調整/作成する方法を示します。カスタムコントローラーは、(target = "_blank"付きの)リンクを作成して、基本的に同じUXのダウンロードを開始できるように設計されています – Barry

0

このレポートはCMS自体から生成されますか?もしそうなら、CustomerOrderLineオブジェクトを管理するためのModelAdminがありますか?もしそうなら、GridFieldの "Export to CSV"ボタンを使用できませんか?

GridField自体で表示されるフィールド以外のものを出力するには、モデルクラスの$getExportFields()メソッドを作成/変更して、エクスポートするモデルのすべてのフィールドの配列を返す必要がありますこのように。

+0

はい、CMS内部で生成されています。 ModelAdmin。 GridFieldExportButtonを使用できるとは思わないのは、リスト全体ではなく、*イベントに参加している人のリストを取得しようとしているからです。 ユーザーはModelAdminに入り、レコードを選択し、ボタンはEditForm上にあります。 CSVレポートを生成することはできますが、通常の「開く」または「保存」ダイアログは表示されません。 – user3769009

+0

保存ダイアログが表示されないことがあります。理由を調べたい場合は、送信されたブラウザのヘッダーを見て、ウェブセーバーとブラウザツールを購入してください。 それ以外に、あなたは何をしようとしているのですか?それぞれのGridField行のエクスポートボタンが必要ですか? これは 'GridField_ActionProvider'の新しい実装を作成するための問題です。数年前に高度なワークフローモジュールで行ったことを見てみましょう。あなたが必要としているものはかなり必要なように見えますか? https://github.com/silverstripe-australia/advancedworkflow/blob/master/code/forms/gridfield/GridFieldExportAction.php – theruss

関連する問題