2009-07-16 16 views
15

Sto tentando di esportare una tabella di database come .csv scaricabile dal browser. Il mio codice è Zend Framework basato e io sono quasi lì con le seguenti azioni: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); 
} 

posso scaricare il mio file .csv che contiene dati validi. Tuttavia, anche se ho disabilitato il layout e il renderer, ottengo ancora l'output dell'intestazione, della sidebar e del piè di pagina della mia pagina alla fine del mio file .csv. C'è un modo per disabilitare qualsiasi output html diverso da quello generato nella mia exportTableAction? O posso inviare le informazioni dell'intestazione e la stringa csv al browser in un modo diverso?

BTW: sto usando il plugin pila azione per aiutarmi a rendere l'intestazione e la sidebar come segue:

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

Cheers, Adrian

+0

Si sta utilizzando il plugin ActionStack per l'intestazione, sidebar, e piè di pagina? –

+0

Sì, davvero. Ho la seguente riga nel mio bootstrap.php: $ frontController-> registerPlugin (new Project_Controller_Plugin_ActionSetup()); Posso disabilitare questo nel mio exportTableAction? – aimfeld

+1

hey - qualsiasi possibilità di pubblicare l'implementazione del tuo getCsv ($ tableName, $ fileName); metodo? – emeraldjava

risposta

7

abbiamo trovato una soluzione al problema. Ho sostituito la seguente riga

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

da

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

Se setNeverRender() viene utilizzato, senza vista sono rese (dal plugin di nessuno).

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

È possibile utilizzare l'assistente azione 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;