Я пытаюсь экспортировать таблицу базы данных как .csv, загружаемую из браузера. Мой код основан на базе 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); }
Я могу загрузить файл .csv, содержащий действительные данные. Однако даже если я отключил компоновку и рендерер, я все равно получаю вывод заголовка, боковой панели и нижнего колонтитула моей страницы в конце моего .csv-файла. Есть ли способ отключить любой вывод html, отличный от того, который был создан в моем exportTableAction? Или я могу отправить информацию заголовка и строку csv в браузер по-другому?
BTW: Я использую плагин action stack, чтобы помочь мне отобразить заголовок и боковую панель следующим образом:
... $actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack'); $actionStack->pushStack($userlogAction); $actionStack->pushStack($rightcolAction);
Приветствия, Адриан
Мы нашли решение проблемы. Я заменил следующую строку
$this->_helper->viewRenderer->setNoRender();
от
$this->_helper->viewRenderer->setNeverRender();
Если используется setNeverRender (), представления не отображаются (из плагина нет).
Вы можете использовать вспомогательный помощник 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'); ........................ ........................ }
$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;
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; }`