在zend框架中导出csv

aim*_*eld 15 php 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);
}
Run Code Online (Sandbox Code Playgroud)

我可以下载包含有效数据的.csv文件.但是,即使我禁用了布局和渲染器,我仍然可以在我的.csv文件末尾获得页面,侧边栏和页脚的输出.有没有办法禁用除exportTableAction中生成的html输出之外的任何html输出?或者我可以以不同的方式将标头信息和csv字符串发送到浏览器吗?

顺便说一句:我正在使用动作堆栈插件来帮助我呈现标题和侧边栏,如下所示:

...
$actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');
$actionStack->pushStack($userlogAction);
$actionStack->pushStack($rightcolAction);
Run Code Online (Sandbox Code Playgroud)

干杯,阿德里安

aim*_*eld 7

我们找到了解决问题的方法.我替换了以下行

$this->_helper->viewRenderer->setNoRender();
Run Code Online (Sandbox Code Playgroud)

通过

$this->_helper->viewRenderer->setNeverRender();
Run Code Online (Sandbox Code Playgroud)

如果使用setNeverRender(),则不会呈现任何视图(也不会从插件中).


Dmi*_*tro 6

您可以使用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');
    ........................
    ........................
}
Run Code Online (Sandbox Code Playgroud)