2009-07-16 50 views
15

データベーステーブルを.csvとしてブラウザからダウンロードしようとしています。私のコードは、ベースのZendのフレームワークであると私は、次のアクションではほとんど存在してる:zendフレームワークでcsvをエクスポートする

public function exportTableAction() 
{ 
    $this->_helper->layout->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 

    $fileName = $this->_getParam('fileName'); 
    $tableName = $this->_getParam('tableName');  

    header('Content-type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.$fileName.'"'); 

    echo $this->getCsv($tableName, $fileName); 
} 

私は、有効なデータを含む私の.csvファイルをダウンロードすることができます。しかし、レイアウトとレンダラーを無効にしても、私の.csvファイルの最後に、私のページのヘッダー、サイドバー、およびフッターの出力が得られます。 exportTableActionで生成されたもの以外のhtml出力を無効にする方法はありますか?あるいは、ヘッダ情報とcsv文字列を別の方法でブラウザに送ることはできますか?

ところで:私は次のように私は、ヘッダーやサイドバーのレンダリングを支援するプラグインアクション・スタックを使用しています:

... 
$actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack'); 
$actionStack->pushStack($userlogAction); 
$actionStack->pushStack($rightcolAction); 

乾杯、エイドリアン

+0

はあなたのヘッダー、サイドバー、フッターのためにActionStackプラグインを使用していますか? –

+0

はい、確かに。 bootstrap.phpに次の行があります。 $ frontController-> registerPlugin(new Project_Controller_Plugin_ActionSetup()); exportTableActionでこれを無効にすることはできますか? – aimfeld

+1

ちょっと - あなたのgetCsv($ tableName、$ fileName)の実装を投稿する可能性があります。方法? – emeraldjava

答えて

7

我々は問題の解決策を見つけました。 setNeverRender()が使用され、何のビューが(どちらもプラグインないから)、レンダリングされていない場合、私は

$this->_helper->viewRenderer->setNeverRender(); 

で次の行

$this->_helper->viewRenderer->setNoRender(); 

を置き換えます。

0
public function getCsv($tableName, $fileName) 
{ 
    $content = new $tableName(); 

    $content_arr = array();  
    $content_arr = $content->fetchAll('1=1','id ASC'); 

    $csv_terminated = "\n"; 
    $csv_separator = ","; 
    $csv_enclosed = '"'; 
    $csv_escaped = "\\";   

    $schema_insert = ""; 

    $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, 
    stripslashes("Email Address")) . $csv_enclosed; 
    $schema_insert .= $l; 
    $schema_insert .= $csv_separator; 

    $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, 
    stripslashes("Add Date")) . $csv_enclosed; 
    $schema_insert .= $l; 
    $schema_insert .= $csv_separator; 

    $out = trim(substr($schema_insert, 0, -1)); 
    $out .= $csv_terminated; 

    if(count($content_arr) > 0) 
    {    
     foreach($content_arr as $content) 
     { 
      $schema_insert = ''; 

      if ($content->email != '' || $content->add_date != '') 
      {       
        $schema_insert .= $csv_enclosed . 
        str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $content->email) . $csv_enclosed; 

        $schema_insert .= $csv_separator; 

        $schema_insert .= $csv_enclosed . 
        str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $content->add_date) . $csv_enclosed; 
        $schema_insert .= $csv_separator; 

      }   

      $schema_insert .= $csv_separator; 
      $out .= $schema_insert; 
      $out .= $csv_terminated; 

     } 
    } 
    return $out; 
}` 
6

contextSwitchアクションヘルパーを使用できます。

public $contexts = array(
    'test'  => array('csv') 
); 

public function testAction() 
{ 
    $filename = time() . '.csv'; 
    $this->_helper->contextSwitch()->addContext('csv', 
      array('suffix' => 'csv', 
        'headers' => array('Content-Type' => 'application/csv', 
            'Content-Disposition' => 'attachment; filename="'. $filename.'"')))->initContext('csv'); 
    ........................ 
    ........................ 
} 
1
$this->_helper->viewRenderer->setNoRender(); 
$this->view->layout()->disableLayout(); 

$response = $this->getResponse(); 
$response->setHeader('Content-type', 'application/octet-stream'); 
$response->setHeader('Content-Disposition', 'attachment; filename="contatos.csv"'); 

echo $your_csv_content; 
関連する問題