2009-07-16 42 views
15

Tôi đang cố gắng xuất bảng cơ sở dữ liệu dưới dạng tệp .csv có thể tải xuống từ trình duyệt. Mã của tôi là khung công tác dựa trên zend và tôi hầu như ở đó với hành động sau:xuất csv trong khung công tác zend

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

Tôi có thể tải xuống tệp .csv chứa dữ liệu hợp lệ. Tuy nhiên, ngay cả khi tôi tắt bố cục và trình kết xuất đồ họa, tôi vẫn nhận được đầu ra của tiêu đề, thanh bên và chân trang của trang của tôi ở cuối tệp .csv của tôi. Có cách nào để vô hiệu hóa bất kỳ đầu ra html khác với một trong những tạo ra trong exportTableAction của tôi? Hoặc tôi có thể gửi thông tin tiêu đề và chuỗi csv đến trình duyệt theo cách khác không?

BTW: Tôi đang sử dụng plugin hành động ngăn xếp để giúp tôi làm cho tiêu đề và thanh bên như sau:

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

Chúc mừng, Adrian

+0

Bạn đang sử dụng plugin ActionStack cho tiêu đề của bạn, sidebar, và footer? –

+0

Vâng, thực sự. Tôi có dòng sau trong bootstrap.php: $ frontController-> registerPlugin (new Project_Controller_Plugin_ActionSetup()); Tôi có thể tắt tính năng này trong exportTableAction của mình không? – aimfeld

+1

hey - bất kỳ cơ hội nào bạn có thể đăng việc triển khai getCsv của bạn ($ tableName, $ fileName); phương pháp? – emeraldjava

Trả lời

7

Chúng tôi tìm thấy một giải pháp cho vấn đề. Tôi thay thế các dòng sau

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

bởi

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

Nếu setNeverRender() được sử dụng, không có quan điểm được trả lại (từ cắm không).

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

Bạn có thể sử dụng trình trợ giúp hành động 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; 
Các vấn đề liên quan