Magento Code Snippets

本文介绍了一个Magento应用程序中用于导出多种类型订单报表到CSV文件的方法。该应用通过执行复杂SQL查询来收集不同类型的客户报告数据,并使用Varien_Io_File类进行文件操作,最后将生成的报表提供给用户下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 public function statAction(){
       $fileName   ='report.csv';
       $io = new Varien_Io_File();
       $path = Mage::getBaseDir('var') . DS . 'export'. DS;
       $name = md5(microtime());
       $file = $path . DS . $name . '.csv';
      $io->setAllowCreateFolders(true);
       $io->open(array('path'=> $path));
       $io->streamOpen($file,'w+');
       $io->streamLock(true);
       
       $resource =Mage::getSingleton('core/resource');
       $readConnection =$resource->getConnection('core_read');      
       $table =$resource->getTableName('sales/order');
       
       $totalTitle0 = array('Total CustomerReport');
      $io->streamWriteCsv($totalTitle0); 
       $totalHeaders0 = array('Time','Total ofInvoices','Total Invoiced','Total Shipping Cost');
      $io->streamWriteCsv($totalHeaders0);
       $sql0 = "select t.created_at astime,count(t.entity_id) as num,sum(t.total_invoiced) asinvoice,sum(t.shipping_invoiced) as ship from (SELECTentity_id,total_invoiced,shipping_invoiced,DATE_FORMAT(`created_at`, '%Y-%m') as created_at FROM {$table} ) t  groupby time having invoice >0 order by time desc";
       $results0 =$readConnection->fetchAll($sql0);      
       foreach ($results0 as $result) {
          $io->streamWriteCsv($result);         
       }    
        
       $io->streamWriteCsv(array(' ',''));
       $totalTitle1 = array('Repeated CustomerReport');
      $io->streamWriteCsv($totalTitle1); 
       $totalHeaders1 = array('Time','Total ofInvoices','Total Invoiced','Total Shipping Cost');
      $io->streamWriteCsv($totalHeaders1);
       $sql1 = "SELECT t.created_at AS TIME, COUNT(t.entity_id ) AS num, SUM( t.total_invoiced ) AS invoice, SUM(t.shipping_invoiced ) AS ship
FROM (SELECT entity_id, total_invoiced, shipping_invoiced,DATE_FORMAT( created_at,  '%Y-%m' ) AScreated_at
FROM sales_order WHERE customer_id IN (SELECT customer_id FROMsales_order WHERE customer_id >0 GROUP BYcustomer_id HAVING COUNT( customer_id ) >1))t
GROUP BY TIME HAVING invoice >0 ORDER BY TIMEDESC";
       $results1 =$readConnection->fetchAll($sql1);      
       foreach ($results1 as $result) { 
          $io->streamWriteCsv($result);         
      
       
       $io->streamWriteCsv(array(' ','')); 
       $totalTitle2 = array('Registered Customersbuying for the first time');
      $io->streamWriteCsv($totalTitle2); 
       $totalHeaders2 = array('Time','Total ofInvoices','Total Invoiced','Total Shipping Cost');
      $io->streamWriteCsv($totalHeaders2);
       $sql2 =  "SELECT t.created_atAS TIME, COUNT( t.entity_id ) AS num, SUM( t.total_invoiced ) ASinvoice, SUM( t.shipping_invoiced ) AS ship FROM (
                 SELECT customer_id, `entity_id` ,  `total_invoiced`,  `shipping_invoiced` , DATE_FORMAT( `created_at`,  '%Y-%m' ) AS created_at
                 FROM sales_order WHERE customer_id
                 IN ( SELECT customer_id FROM sales_order WHEREcustomer_id >0 GROUP BY customer_id HAVING COUNT(customer_id ) =1) )t
                 GROUP BY TIME HAVING invoice >0ORDER BY TIME DESC";
       $results2 =$readConnection->fetchAll($sql2);      
       foreach ($results2 as $result) {           
          $io->streamWriteCsv($result);         
      
       
       $io->streamWriteCsv(array(' ',''));
       $totalTitle3 = array('Anonymous CustomerReport');
      $io->streamWriteCsv($totalTitle3); 
       $totalHeaders3 = array('Time','Total ofInvoices','Total Invoiced','Total Shipping Cost');
      $io->streamWriteCsv($totalHeaders3);
       $sql3 = "select t.created_at astime,count(t.entity_id) as num,sum(t.total_invoiced) asinvoice,sum(t.shipping_invoiced) as ship from (SELECT`entity_id`,`total_invoiced`,`shipping_invoiced`,DATE_FORMAT(`created_at`, '%Y-%m') as created_at FROM {$table} WHERE customer_id is null )t  group by t.created_at having invoice> 0 order by time desc";
       $results3 =$readConnection->fetchAll($sql3);      
       foreach ($results3 as $result) {
          $io->streamWriteCsv($result);         
      
       
       $io->streamWriteCsv(array(' ',''));
       $totalTitle4 = array('Quantity InvoicedReport');
      $io->streamWriteCsv($totalTitle4); 
       $totalHeaders4 = array('Time','ProductName','Product SKU','Quantity Invoiced');
      $io->streamWriteCsv($totalHeaders4);
       $sql4 = "SELECT DATE_FORMAT(st.created_at , '%Y-%m' ) AS time,st.name,st.sku, SUM(st.total_qty_ordered ) AS total FROM 
              (selectso.created_at,so.total_qty_ordered,so.total_invoiced,si.name,si.skufrom sales_order so inner join sales_flat_order_item si onso.entity_id = si.order_id where so.total_invoiced >0) st
              GROUP BYDATE_FORMAT(st.created_at ,'%Y-%m' ),st.name,st.sku having total> 0 order by time desc";
       $results4 =$readConnection->fetchAll($sql4);      
       foreach ($results4 as $result) {
          $io->streamWriteCsv($result);         
      
       
       $io->streamWriteCsv(array(' ',''));
       $totalTitle5 = array('Quantity CreditedReport');
      $io->streamWriteCsv($totalTitle5); 
       $totalHeaders5 = array('Time','ProductName','Product SKU','Quantity Credited');
      $io->streamWriteCsv($totalHeaders5);
       $sql5 = "SELECT DATE_FORMAT(st.created_at , '%Y-%m' ) AS time,st.name,st.sku, SUM(st.total_qty_ordered ) AS total FROM 
               (selectso.created_at,so.total_qty_ordered,so.total_paid,si.name,si.skufrom sales_order so inner join sales_flat_order_item si onso.entity_id = si.order_id) st
               wheretotal_paid > 0 GROUP BY DATE_FORMAT(st.created_at,'%Y-%m' ),st.name,st.sku having total > 0 order bytime desc "; 
       $results5 =$readConnection->fetchAll($sql5);      
       foreach ($results5 as $result) {
          $io->streamWriteCsv($result);         
      
             
       
       $io->streamUnlock();
       $io->streamClose();

       $csvFile = array(
           'type' => 'filename',
           'value'=> $file,
           'rm'   =>true 
       );
      $this->wonprepareDownloadResponse($fileName,$csvFile);       
    }
    
    private functionwonprepareDownloadResponse(
       $fileName,
       $content,
       $contentType = 'application/octet-stream',
       $contentLength = null)
    {
       $session =Mage::getSingleton('admin/session');
       if($session->isFirstPageAfterLogin()) {
          $this->_redirect($session->getUser()->getStartupPageUrl());
           return$this;
       }

       $isFile = false;
       $file   = null;
       if (is_array($content)) {
           if(!isset($content['type']) || !isset($content['value'])) {
              return $this;
           }
           if($content['type'] == 'filename') {
              $isFile        =true;
              $file         = $content['value'];
              $contentLength = filesize($file);
           }
       }

       $this->getResponse()
          ->setHttpResponseCode(200)
          ->setHeader('Pragma', 'public', true)
          ->setHeader('Cache-Control', 'must-revalidate,post-check=0, pre-check=0', true)
          ->setHeader('Content-type', $contentType,true)
          ->setHeader('Content-Length',is_null($contentLength) ? strlen($content) : $contentLength,true)
          ->setHeader('Content-Disposition', 'attachment;filename="'.$fileName.'"', true)
          ->setHeader('Last-Modified', date('r'), true);

       if (!is_null($content)) {
           if($isFile) {
             $this->getResponse()->clearBody();
             $this->getResponse()->sendHeaders();

              $ioAdapter = newVarien_Io_File();
             $ioAdapter->open(array('path' =>$ioAdapter->dirname($file)));
             $ioAdapter->streamOpen($file, 'r');
              while ($buffer =$ioAdapter->streamRead()) {
                 print $buffer;
              }
             $ioAdapter->streamClose();
              if (!empty($content['rm'])){
                 $ioAdapter->rm($file);
              }

              exit(0);
           } else{
             $this->getResponse()->setBody($content);
           }
       }
       return $this;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值