Экспорт csv в zend framework
Я пытаюсь экспортировать таблицу базы данных как .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);
Приветствия, Адриан
Ответы
Ответ 1
Мы нашли решение проблемы. Я заменил следующую строку
$this->_helper->viewRenderer->setNoRender();
по
$this->_helper->viewRenderer->setNeverRender();
Если используется setNeverRender(), представления не отображаются (из плагина нет).
Ответ 2
Вы можете использовать помощник действий 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');
........................
........................
}
Ответ 3
$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;
Ответ 4
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;
}`