2009-07-16 19 views
15

Ich versuche, eine Datenbanktabelle als CSV-Datei aus dem Browser zu exportieren. Mein Code ist Zend Framework basiert und ich bin fast da mit der folgenden Aktion:export csv in zend framework

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); 
} 

Ich kann meine CSV-Datei enthält gültige Daten herunterladen. Aber selbst wenn ich das Layout und den Renderer deaktiviere, bekomme ich immer noch die Ausgabe des Headers, der Seitenleiste und der Fußzeile meiner Seite am Ende meiner .csv-Datei. Gibt es eine Möglichkeit, eine andere HTML-Ausgabe als die in meiner exportTableAction erzeugte zu deaktivieren? Oder kann ich die Header-Informationen und die CSV-Zeichenfolge auf andere Weise an den Browser senden?

BTW: Ich bin die Aktion Stack Plugin mir die Kopf- und Seitenleiste zu helfen, machen Sie wie folgt vor:

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

Cheers, Adrian

+0

Verwenden Sie die Action-Plugin für Ihren Header, Sidebar und Footer? –

+0

Ja, tatsächlich. Ich habe die folgende Zeile in meiner bootstrap.php: $ frontController-> registerPlugin (new Project_Controller_Plugin_ActionSetup()); Kann ich dies in meiner exportTableAction deaktivieren? – aimfeld

+1

hey - jede Chance, die Sie die Implementierung Ihres getCsv ($ tableName, $ fileName) buchen könnten; Methode? – emeraldjava

Antwort

7

gibt es eine Lösung für das Problem. Ich ersetzte die folgende Zeile

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

von

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

Wenn setNeverRender() verwendet wird, keine Ansichten gerendert werden (von Plugin weder).

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

Sie können ContextSwitch Aktion Helfer verwenden.

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;