Я пишу скрипт экспорта PHP для своей копии magento. По какой-то причине следующий код дает мне сообщение «Headers already sent»:
//Load magento and set to match frontend require_once '../../app/Mage.php'; umask(0); Mage::app(); Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND); //Send headers to browser to prep for csv file download header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename=exportSKUs.csv'); //Load only product collection details that we need. $product = Mage::getModel('catalog/product'); $product->getCollection()->getSelect()->limit(5); $products = $product->getCollection() ->addFieldToFilter('status','1') ->addAttributeToSelect('name') ->addAttributeToSelect('sku') ->addAttributeToSelect('upc') ->addAttributeToSelect('status') ->addAttributeToSelect('price') ->addAttributeToSelect('special_price') ->addAttributeToSelect('description') ->addAttributeToSelect('category_ids') ->addAttributeToSelect('short_description'); //Open current output to fputcsv $fp = fopen('php://output', 'w'); //CSV headers $headerRow = array( 'name', 'sku', 'upc', 'status', 'price', 'special_price', 'description', 'category_ids', 'short_description' ); fputcsv($fp, $headerRow); $count = 0; //CSV Rows foreach($products as &$product){ $categoryIds = implode(',', $product->getCategoryIds()); $row = array( $product->getName(), $product->getSku(), $product->getUpc(), $product->getStatus(), $product->getPrice(), $product->getSpecialPrice(), $product->getDescription(), $categoryIds, $product->getShortDescription() ); fputcsv($fp, $row); $count++; if($count>5){ //Close current output (save csv) fclose($fp); exit; } }
Здесь строка кода вызывает проблемы: fputcsv($fp, $headerRow);
По какой-то причине, когда эта строка закомментирована, скрипт работает нормально. Однако, когда эта строка запускается со сценарием, она снимает уже отправленную ошибку заголовка. Я не понимаю, почему я могу запускать fputcsv INSIDE мой цикл foreach сколько fputcsv($fp, $row);
раз ( fputcsv($fp, $row);
), но я не могу запустить его перед циклом foreach вообще.
У меня есть способы обойти эту проблему, так что это не суперкритично, но я действительно хочу, чтобы я мог понять, что здесь происходит, чтобы вызвать это.
Спасибо за ваше время!
Я изменил свой код … проверьте это. У меня есть процесс magento для экспорта …
<?php //Load magento and set to match frontend require_once '../../app/Mage.php'; umask(0); Mage::app(); Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND); //Send headers to browser to prep for csv file download //header('Content-Type: text/csv'); //header('Content-Disposition: attachment;filename=exportSKUs.csv'); // $filename="exportSKUs.csv"; //Load only product collection details that we need. $product = Mage::getModel('catalog/product'); $product->getCollection()->getSelect()->limit(5); $products = $product->getCollection() ->addFieldToFilter('status','1') ->addAttributeToSelect('name') ->addAttributeToSelect('sku') ->addAttributeToSelect('upc') ->addAttributeToSelect('status') ->addAttributeToSelect('price') ->addAttributeToSelect('special_price') ->addAttributeToSelect('description') ->addAttributeToSelect('category_ids') ->addAttributeToSelect('short_description'); $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($filename, 'w+'); $io->streamLock(true); $headerRow = array( 'name', 'sku', 'upc', 'status', 'price', 'special_price', 'description', 'category_ids', 'short_description' ); $io->streamWriteCsv($headerRow); foreach($products as &$product){ $categoryIds = implode(',', $product->getCategoryIds()); $row = array( $product->getName(), $product->getSku(), $product->getUpc(), $product->getStatus(), $product->getPrice(), $product->getSpecialPrice(), $product->getDescription(), $categoryIds, $product->getShortDescription() ); $io->streamWriteCsv($row); } ?>