3

我正在尝试将一些装运详细信息打印为 CSV 文件,我几乎完成了此操作,但它没有提供下载选项。它会自动创建文件并将其保存在提到的目录中。

我想我缺少 _prepareDownloadResponse() 函数,但我该如何实现它。

我正在使用此代码->

$file_path = 'sample_shipment.csv';
$mage_csv = new Varien_File_Csv();
$mage_csv->saveData($file_path, $content); 

编辑:所有这些代码都在我的 indexcontroller.php 中 indexcontroller.php 的完整代码->

class Company_Manifestupload_IndexController extends Mage_Adminhtml_Controller_Action
{        
public function indexAction() {
    echo 'Manifestupload Index!';
}
public function bluedartmanifestuploadAction() {
    $request = $this->getRequest();
    $shipmentIds = $request->getPost('shipment_ids', array());
    $file_path = 'manifest_upload_'.Mage::getSingleton('core/date')->date('d-m-Y_H-i-s').'_csv.csv';
    $mage_csv = new Varien_File_Csv();
    $shipment_csv=array();

            /*  Putting data in $shipment_csv[] */
            $mage_csv->saveData($file_path, $shipment_csv);
            }
4

2 回答 2

3

为了使 csv 文件可下载,只需将以下代码放入相关的控制器操作中:

$fileName       = 'filename.csv';
$content        = $csvData; //prepare the csv data and return as string
$this->_prepareDownloadResponse($fileName, $content); //this will make the csv file downloadable with the $content as contents in it.

希望这可以帮助。

编辑: 请找到更新的控制器操作代码。

public function bluedartmanifestuploadAction() {
    $request        = $this->getRequest();
    $shipmentIds    = $request->getPost('shipment_ids', array());
    $fileName       = 'manifest_upload_'.Mage::getSingleton('core/date')->date('d-m-Y_H-i-s').'_csv.csv';

    //prepare csv contents
    #prepare header
    $csv = '';
    $_columns = array(
        "field1",
        "field2",
        //...
    );
    $data = array();
    foreach ($_columns as $column) {
        $data[] = '"'.$column.'"';
    }
    $csv .= implode(',', $data)."\n";
    #prepare data
    foreach($dataFromShipmentIds as $_data){ //just dummy loop
        $data = array();
        $data[] = $_data['field1'];
        $data[] = $_data['field2'];
        //...
        $csv .= implode(',', $data)."\n";
    }
    //now $csv varaible has csv data as string

    $this->_prepareDownloadResponse($fileName, $csv); 
}

编辑2:上述代码仅在理想情况下才能正常工作。当字段中有“\n”和“,”时,它不会生成正确的CSV。为了使其正常工作,可以使用varien文件CSV中的代码。我会在这里添加它-

首先如上所述在 $data[] 中创建值数组,而不是$csv.=implode(',',$data)."\n"使用下面的代码。

foreach ($data as $value) {
         if (strpos($value, $delimiter) != false ||
             strpos($value, $enclosure) != false ||
             strpos($value, "\n") != false ||
             strpos($value, "\r") != false ||
             strpos($value, "\t") != false ||
             strpos($value, ' ') != false) {
             $str2 = $enclosure;
             $escaped = 0;
             $len = strlen($value);
             for ($i=0;$i<$len;$i++) {
                 if ($value[$i] == $escape_char) {
                     $escaped = 1;
                } else if (!$escaped && $value[$i] == $enclosure) {
                     $str2 .= $enclosure;
                 } else {
                     $escaped = 0;
                 }
                     $str2 .= $value[$i];
             }
             $str2 .= $enclosure;
             $str .= $str2.$delimiter;
         } else {
             $str .= $enclosure.$value.$enclosure.$delimiter;
         }
     }
            $str = substr($str,0,-1);
            $str .= "\n";
于 2012-08-08T09:23:34.040 回答
2

如果您想为您订购的商品创建可下载的 csv,您可以使用以下脚本。

$orders = Mage::getModel("sales/order")->getCollection();
// prepare CSV header
$csv = '';
$_columns = array(
     "Order Id",
     "Product Name",
     "Sku",
     "Price"
);
$data = array();
// prepare CSV header...
foreach ($_columns as $column) {
       $data[] = '"'.$column.'"';
}
$csv .= implode(',', $data)."\n";
foreach ($orders as $order) {
         $items = $order->getAllItems();
         foreach ($items as $item) {
               $loadProduct = Mage::getModel('catalog/product')->load($item->getProductId());
               //prepare csv contents
                $data = array();
                $data[] = $order->getId();
                $data[] = $loadProduct['name'];
                $data[] = $loadProduct['sku'];
                $data[] = $loadProduct['price'];

                $csv .= implode(',', $data)."\n";
               //now $csv varaible has csv data as string
    }
}

$this->_redirect('*/*/');
$this->_prepareDownloadResponse('file.csv', $csv, 'text/csv');

欲了解更多信息,请访问这里

于 2014-04-22T05:22:47.847 回答