首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV文件不在cakephp中下载。

问CSV文件不在cakephp中下载。
EN

Stack Overflow用户
提问于 2016-04-21 07:34:00
回答 2查看 657关注 0票数 0

我是cakephp框架中的新手,我想生成csv file.Here,我有如下结果数组:

代码语言:javascript
复制
Array
(
[0] => Array
    (
        [User] => Array
            (
                [username] => yerica
                [email] => amoreyerica@gmail.com
                [phone] => 993643636
            )

        [DealPurchase] => Array
            (
                [deal_title] => Tour de Zaragoza
                [original_price] => 30
            )

    )

[1] => Array
    (
        [User] => Array
            (
                [username] => Rama Test
                [email] => rama@gmail.com
                [phone] => 9652369854
            )

        [DealPurchase] => Array
            (
                [deal_title] => Tour de Zaragoza
                [original_price] => 30
            )

    )

)

这里,我想要生成这个数组的csv。

在这里,我已经包含了视图中的CsvHelper.php文件/帮助者folder.This文件包含:

代码语言:javascript
复制
 <?php
  class CsvHelper extends AppHelper
  {
     var $delimiter = ',';
     var $enclosure = '"';
     var $filename = 'Export.csv';
     var $line = array();
     var $buffer;

     function CsvHelper()
     {
        $this->clear();
     }
     function clear() 
     {
        $this->line = array();
        $this->buffer = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
     }

     function addField($value) 
     {
        $this->line[] = $value;
     }

     function endRow() 
     {
        $this->addRow($this->line);
        $this->line = array();
     }

     function addRow($row) 
     {
       fputcsv($this->buffer, $row, $this->delimiter, $this->enclosure);
     }

     function renderHeaders() 
     {
        header('Content-Type: text/csv');
        header("Content-type:application/vnd.ms-excel");
        header("Content-disposition:attachment;filename=".$this->filename);
     }

     function setFilename($filename) 
     {
        $this->filename = $filename;
        if (strtolower(substr($this->filename, -4)) != '.csv') 
        {
            $this->filename .= '.csv';
        }
     }

     function render($outputHeaders = true, $to_encoding = null, $from_encoding ="auto") 
    {
      if ($outputHeaders) 
      {
        if (is_string($outputHeaders)) 
        {
           $this->setFilename($outputHeaders);
        }
        $this->renderHeaders();
      }
      rewind($this->buffer);
      $output = stream_get_contents($this->buffer);

     if ($to_encoding) 
     {
       $output = mb_convert_encoding($output, $to_encoding, $from_encoding);
     }
     return $this->output($output);
   }
}
?>

在MerchantController(控制器)函数中如下所示:

代码语言:javascript
复制
function download_csv($deal_id)
{           
    $options=array('fields'=>'User.username,User.email,User.phone,DealPurchase.deal_title,DealPurchase.original_price',
                    'joins' =>
                              array(
                                array(
                                    'table' => 'deal_purchases',
                                    'alias' => 'DealPurchase',
                                    'type' => 'inner',
                                    'foreignKey' => false,
                                    'conditions'=> array('DealPurchase.user_id = User.id')
                                )));

          $this->recursive = -1;
          $data = $this->User->find('all', $options);

         $this->set("users",$data);
         $this->layout = null;
         $this->autoLayout = false;
         Configure::write('debug', '0');

    }

在这里,我的视图文件代码是:

代码语言:javascript
复制
<?php
$line= $users[0]['User'];
$this->CSV->addRow(array_keys($line));
foreach ($users as $user)
{
   $line = $user['User'];
   $this->CSV->addRow($line);
}
$filename='users';
echo  $this->CSV->render($filename);

在这里,我的另一个函数包含下载csv文件和函数的链接,如下所示:

代码语言:javascript
复制
function deal_list(){            
        $this->_checkMerchantSession();
        $this->set('title_for_layout', 'Deal List');
        $this->layout = "after_login";
        //echo $this->Session->read('userData.Merchant.id');
        //$conditions = "Deal.merchant_id ='".$this->Session->read('userData.Merchant.id')."' AND Deal.isdeleted ='0' AND Deal.isapproved ='0' ";
        $conditions = "Deal.merchant_id ='".$this->Session->read('userData.Merchant.id')."' AND Deal.isdeleted ='0' ";

        //$ArDealdetails = $this->Deal->find('all', array('conditions'=>$conditions,'order'=>'Deal.modified DESC'));
        $this->paginate = array('conditions' => $conditions,'limit' =>5,'order'=>'Deal.id DESC');
        $ArDealdetails = $this->paginate('Deal');
        $this->set('ArDealdetails',$ArDealdetails);    

        $condition1 = "Merchant.id ='".$this->Session->read('userData.Merchant.id')."'";
        $merchant_detail = $this->Merchant->find('first',array('conditions'=>$condition1)); 
        $this->set('merchant_detail',$merchant_detail);        
    }

现在,当我将helper作为Csv包括时:

代码语言:javascript
复制
var $helpers = array('Html', 'Form','Javascript','Fck','Js','Paginator','Csv');

然后它会给出一个error.So,我如何解决这个问题?

注意: I有一个错误,例如:错误:在此服务器上找不到所请求的地址‘// deal_list’。我已经在deal_list视图文件中添加了下载链接。当我从帮助程序中删除Csv时,将显示此页面。

错误:未定义属性:视图::$Csv。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-23 07:50:23

这里,我刚刚将CsvHelper.php助手文件重命名为csv.php,以使其工作。所以有人能解释一下为什么它会因为csv.php的名字而起作用吗?

票数 0
EN

Stack Overflow用户

发布于 2016-04-21 09:05:18

在视图中,你的csv助手的套管是错误的。应该是$this->Csv

代码语言:javascript
复制
<?php
$line= $users[0]['User'];
$this->Csv->addRow(array_keys($line));
foreach ($users as $user)
{
   $line = $user['User'];
   $this->Csv->addRow($line);
}
$filename='users';
echo  $this->Csv->render($filename);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36762788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档