76 lines
2.1 KiB
PHP
76 lines
2.1 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/core/APIResponse.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class APIResponse
|
|
*
|
|
* @ingroup core
|
|
*
|
|
* @brief Extends the Response class in the Slim microframework.
|
|
*/
|
|
|
|
namespace PKP\core;
|
|
|
|
use Slim\Http\Response;
|
|
|
|
class APIResponse extends Response
|
|
{
|
|
public const RESPONSE_CSV = 'text/csv';
|
|
public const RESPONSE_TSV = 'text/tab-separated-values';
|
|
|
|
/**
|
|
* CSV Response
|
|
*
|
|
* @param integer $maxRows The total amount of rows, that is provided within the onw X-Total-Count header field
|
|
*/
|
|
public function withCSV(array $rows, array $columns, int $maxRows, string $mimeType = self::RESPONSE_CSV): self
|
|
{
|
|
$separator = ',' ;
|
|
if ($mimeType == self::RESPONSE_TSV) {
|
|
$separator = "\t";
|
|
}
|
|
$fp = fopen('php://output', 'wt');
|
|
//Add BOM (byte order mark) to fix UTF-8 in Excel
|
|
fprintf($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
|
|
if (!empty($columns)) {
|
|
fputcsv($fp, [''], $separator);
|
|
fputcsv($fp, $columns, $separator);
|
|
}
|
|
foreach ($rows as $row) {
|
|
fputcsv($fp, $row, $separator);
|
|
}
|
|
$csvData = stream_get_contents($fp);
|
|
fclose($fp);
|
|
$this->getBody()->rewind();
|
|
$this->getBody()->write($csvData);
|
|
$this->withStatus(200);
|
|
return $this->withHeader('X-Total-Count', $maxRows)->withHeader('Content-Type', $mimeType);
|
|
}
|
|
|
|
/**
|
|
* Response with an error message
|
|
*
|
|
* @param string $msg The message translation key
|
|
* @param array $params Optional parameters to pass to the translation
|
|
*
|
|
* @return APIResponse
|
|
*/
|
|
public function withJsonError($msg, $params = null)
|
|
{
|
|
return $this->withJson(
|
|
[
|
|
'error' => $msg,
|
|
'errorMessage' => __($msg, $params ?? []),
|
|
]
|
|
);
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\PKP\core\APIResponse', '\APIResponse');
|
|
}
|