0

ボタンをクリックしcgridviewて、拡張機能を使用してデータ(現在の検索結果)をCSVにエクスポートしようとしています。excelview

ただし、CSVでフィルタリングされたデータを取得していません。代わりに、モデル内のすべてのレコードを取得しています。

これは私が呼んでいる私のコントローラーアクションです:

    public function actionExcel()
{
    $model = new PackagingMetric('search'); 
    $this->widget('application.extensions.EExcelView', array( 
            'dataProvider'=> $model->search(), 
            'grid_mode'=>'export', 
            'exportType'=>'Excel5', 
            'filename'=>'report', 
            )); 
}

誰かがこの問題を解決する方法、または私のエラーがどこにあるか知っていますか?

4

1 に答える 1

1

そこには検索条件がありません。通常、次のようにします。

$model = new PackagingMetric('search');
$model->attributes = $_POST['PackagingMetric']; // this would be the model associated with the search form
$model->search();

ユーザー入力から値を取得するコードは何も表示されないため、何らかの方法で検索フォームを使用する必要があります。もちろん、モデルにデフォルト値を設定することもできますが、そうではないと思います。

編集:

使用している拡張機能のソースコードをもう少し調べました。エクスポートボタンは、実際には<a href=''></a>、Excelシートを出力することになっているページに移動する標準のリンクのようです。ただし、実際のフィルターデータはそのページに送信されないため、サーバー側でこれらのフィルターを適用する方法はありません。

これは拡張機能の意図された動作であるため、それを解決するためのエレガントな方法はありませんが、厄介な方法があります。

最初のオプションは、拡張機能を自分で微調整することですが、これにより、将来のバージョンとの互換性が失われます。もう1つの方法は、Javascriptを使用して、必要な場所にデータを送信することです。グリッドビューを表示しているビューファイルで、ウィジェットをform要素でラップするか、ActiveFormすべての検証を無効にしてでラップする必要があります。次に、次のJavascriptコードをページのどこかに配置する必要があります。

var $excelForm = $( '#your_form_id' );
$( '.summary a', $excelForm ).click( function() {
    $excelForm.attr( 'action', this.href ).submit();
    return false;
});

これにより、エクスポートリンクで指定されたアドレスにフォームが送信されます。フォームはウィジェットをラップするため、結果をフィルタリングする入力要素が含まれるため、サーバーでユーザーが入力したフィルターにアクセスできます。私が最初に投稿したコードを使用して、そこからデータを取得できます。

注:divエクスポートボタンを含むのデフォルトのクラス名を使用しています。これは.summaryです。別のクラスを使用している場合は、それぞれのJSコードを変更する必要があります。

于 2012-08-10T15:13:54.830 に答える