<?php namespace phpList\plugin\Common; /** * CommonPlugin for phplist. * * This file is a part of CommonPlugin. * * @category phplist * * @author Duncan Cameron * @copyright 2011-2018 Duncan Cameron * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, Version 3 */ /** * This class manages the export in CSV format. */ class ExportCSVAsync { const PROGRESS_POLL_INTERVAL = 2000; /** * Write export progress in JSON format. * * @param string $text the progress message * @param string $status either 'inprogress' or 'complete' */ private function updateProgress($text, $status = 'inprogress') { session_start(); $_SESSION['export']['progress'] = json_encode(['status' => $status, 'message' => $text]); session_write_close(); } public function __construct() { $this->i18n = I18N::instance(); } /** * Generate the html for the progress area. */ public function start() { global $img_busy; $buildUrl = PageURL::createFromGet(['stage' => 'build']); $progressUrl = PageURL::createFromGet(['stage' => 'progress']); $format = <<<'END' <p>%s</p> %s <div id="done"></div> <iframe src="%s" frameborder="0" scrolling="no" width="1" height="1"></iframe> <script type="text/javascript"> window.timerId = setInterval( function () { $.getJSON('%s', function(data) { console.log(data.status); if (data.status == 'complete') { clearInterval(window.timerId); closedialog(); } $("#done").html(data.message); }); }, %s ); </script> END; printf( $format, $this->i18n->get('Exporting, this may take a while'), $img_busy, $buildUrl, $progressUrl, self::PROGRESS_POLL_INTERVAL ); } /** * Export data into a temporary file. * Close the session early to allow progress requests to run. * When the data has been exported redirect the browser to the 'send' page. * * @param IExportable $exportable object providing the data to be exported */ public function export(IExportable $exportable) { global $tmpdir, $installation_name; set_time_limit(0); $tempFile = tempnam($tmpdir, sprintf('%s-export-%s', $installation_name, time())); if (false === ($out = fopen($tempFile, 'w'))) { logEvent("Unable to open temporary file $tempFile"); return; } $_SESSION[__CLASS__]['file'] = $tempFile; session_write_close(); fputcsv($out, $exportable->exportFieldNames()); $this->updateProgress($this->i18n->get('Generating the export data')); $rows = $exportable->exportRows(); $total = count($rows); $interval = max((int) ($total / 10), 100); foreach ($rows as $i => $row) { if ($i % $interval == 0) { $percent = round($i / $total * 100); $this->updateProgress($this->i18n->get('Exported %d of %d %d%%', $i, $total, $percent)); } fputcsv($out, $exportable->exportValues($row)); } fclose($out); $this->updateProgress('Finished', 'complete'); $redirect = PageURL::createFromGet(['stage' => 'send']); header('Location: ' . $redirect); } /** * Send the temporary file to the browser. * * @param IExportable $exportable object providing the data to be exported */ public function send(IExportable $exportable) { if (!isset($_SESSION[__CLASS__]['file'])) { return; } set_time_limit(0); $tempFile = $_SESSION[__CLASS__]['file']; $fileName = $exportable->exportFileName(); header('Content-Type: text/csv'); header(sprintf('Content-Disposition: attachment; filename="%s.csv"', $fileName)); readfile($tempFile); $deleted = unlink($tempFile); if ($deleted === false) { logEvent("unable to delete temporary file $tempFile"); } unset($_SESSION[__CLASS__]); } public function progress() { if (isset($_SESSION['export']['progress'])) { echo $_SESSION['export']['progress']; } } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
DAO | Folder | 0755 |
|
|
BaseController.php | File | 936 B | 0644 |
|
Config.php | File | 1003 B | 0644 |
|
Container.php | File | 509 B | 0644 |
|
Context.php | File | 1.18 KB | 0644 |
|
Controller.php | File | 2.43 KB | 0644 |
|
ControllerFactory.php | File | 479 B | 0644 |
|
ControllerFactoryBase.php | File | 1.4 KB | 0644 |
|
DAO.php | File | 692 B | 0644 |
|
DB.php | File | 2.47 KB | 0644 |
|
DBResultIterator.php | File | 931 B | 0644 |
|
Exception.php | File | 1.03 KB | 0644 |
|
ExportCSV.php | File | 962 B | 0644 |
|
ExportCSVAsync.php | File | 4.3 KB | 0644 |
|
ExportXML.php | File | 1.4 KB | 0644 |
|
FPDF.php | File | 1.03 KB | 0644 |
|
FileNotFoundException.php | File | 631 B | 0644 |
|
FileServer.php | File | 2.21 KB | 0644 |
|
FrontendTranslator.php | File | 1.46 KB | 0644 |
|
HelpManager.php | File | 2.61 KB | 0644 |
|
HtmlToPdf.php | File | 683 B | 0644 |
|
I18N.php | File | 5.05 KB | 0644 |
|
IChartable.php | File | 447 B | 0644 |
|
IExportable.php | File | 569 B | 0644 |
|
IMailClient.php | File | 1.33 KB | 0644 |
|
IPopulator.php | File | 517 B | 0644 |
|
ImageTag.php | File | 894 B | 0644 |
|
Listing.php | File | 1.23 KB | 0644 |
|
Logger.php | File | 2.88 KB | 0644 |
|
MailSender.php | File | 7.12 KB | 0644 |
|
Main.php | File | 1.21 KB | 0644 |
|
Model.php | File | 2.17 KB | 0644 |
|
PageLink.php | File | 1.33 KB | 0644 |
|
PageURL.php | File | 1.87 KB | 0644 |
|
Pager.php | File | 7.46 KB | 0644 |
|
Paginator.php | File | 1.53 KB | 0644 |
|
Populator.php | File | 1.34 KB | 0644 |
|
StringCallback.php | File | 559 B | 0644 |
|
StringStream.php | File | 3.41 KB | 0644 |
|
Tabs.php | File | 707 B | 0644 |
|
Toolbar.php | File | 2.62 KB | 0644 |
|
UniqueLogger.php | File | 1.14 KB | 0644 |
|
View.php | File | 669 B | 0644 |
|
WebblerListing.php | File | 3.85 KB | 0644 |
|
Widget.php | File | 1.12 KB | 0644 |
|
about.tpl.php | File | 553 B | 0644 |
|
depends.php | File | 1.45 KB | 0644 |
|
helpmanager.tpl.php | File | 676 B | 0644 |
|
pager.tpl.php | File | 2.14 KB | 0644 |
|
toolbar.tpl.php | File | 1.04 KB | 0644 |
|
widget_attributeform.tpl.php | File | 3.42 KB | 0644 |
|