Avoid terminating the app using exit() or die()

Refs #3783
Refs #3746
This commit is contained in:
Samuel Georges 2019-03-29 07:10:07 +11:00
parent c5bc804d73
commit 5190c8177b
6 changed files with 70 additions and 23 deletions

View File

@ -35,7 +35,6 @@ use Exception;
*/ */
class ImportExportController extends ControllerBehavior class ImportExportController extends ControllerBehavior
{ {
/** /**
* @inheritDoc * @inheritDoc
*/ */
@ -159,7 +158,9 @@ class ImportExportController extends ControllerBehavior
return $response; return $response;
} }
$this->checkUseListExportMode(); if ($response = $this->checkUseListExportMode()) {
return $response;
}
$this->addJs('js/october.export.js', 'core'); $this->addJs('js/october.export.js', 'core');
$this->addCss('css/export.css', 'core'); $this->addCss('css/export.css', 'core');
@ -387,6 +388,7 @@ class ImportExportController extends ControllerBehavior
public function importIsColumnRequired($columnName) public function importIsColumnRequired($columnName)
{ {
$model = $this->importGetModel(); $model = $this->importGetModel();
return $model->isAttributeRequired($columnName); return $model->isAttributeRequired($columnName);
} }
@ -398,7 +400,9 @@ class ImportExportController extends ControllerBehavior
$dbColumns = $this->getImportDbColumns(); $dbColumns = $this->getImportDbColumns();
foreach ($dbColumns as $column => $label) { foreach ($dbColumns as $column => $label) {
if (!$this->importIsColumnRequired($column)) continue; if (!$this->importIsColumnRequired($column)) {
continue;
}
$found = false; $found = false;
foreach ($matches as $matchedColumns) { foreach ($matches as $matchedColumns) {
@ -577,7 +581,7 @@ class ImportExportController extends ControllerBehavior
$listDefinition = $useList; $listDefinition = $useList;
} }
$this->exportFromList($listDefinition); return $this->exportFromList($listDefinition);
} }
/** /**
@ -603,6 +607,8 @@ class ImportExportController extends ControllerBehavior
$options = array_merge($defaultOptions, $options); $options = array_merge($defaultOptions, $options);
$filename = filter_var($options['fileName'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
/* /*
* Prepare CSV * Prepare CSV
*/ */
@ -629,11 +635,11 @@ class ImportExportController extends ControllerBehavior
$query = $widget->prepareQuery(); $query = $widget->prepareQuery();
$results = $query->get(); $results = $query->get();
if ($event = $widget->fireSystemEvent('backend.list.extendRecords', [&$results])) { if ($event = $widget->fireSystemEvent('backend.list.extendRecords', [&$results])) {
$results = $event; $results = $event;
} }
foreach ($results as $result) { foreach ($results as $result) {
$record = []; $record = [];
foreach ($columns as $column) { foreach ($columns as $column) {
@ -647,10 +653,14 @@ class ImportExportController extends ControllerBehavior
} }
/* /*
* Output * Response
*/ */
$csv->output($options['fileName']); $response = Response::make();
exit; $response->header('Content-Type', 'text/csv');
$response->header('Content-Transfer-Encoding', 'binary');
$response->header('Content-Disposition', sprintf('%s; filename="%s"', 'attachment', $filename));
$response->setContent((string) $csv);
return $response;
} }
// //
@ -666,6 +676,7 @@ class ImportExportController extends ControllerBehavior
public function importExportMakePartial($partial, $params = []) public function importExportMakePartial($partial, $params = [])
{ {
$contents = $this->controller->makePartial('import_export_'.$partial, $params + $this->vars, false); $contents = $this->controller->makePartial('import_export_'.$partial, $params + $this->vars, false);
if (!$contents) { if (!$contents) {
$contents = $this->makePartial($partial, $params); $contents = $this->makePartial($partial, $params);
} }
@ -819,5 +830,4 @@ class ImportExportController extends ControllerBehavior
return $options; return $options;
} }
} }

View File

@ -118,6 +118,11 @@ class Controller extends ControllerBase
*/ */
protected $statusCode = 200; protected $statusCode = 200;
/**
* @var mixed Override the standard controller response.
*/
protected $responseOverride = null;
/** /**
* Constructor. * Constructor.
*/ */
@ -280,6 +285,10 @@ class Controller extends ControllerBase
*/ */
$result = $this->execPageAction($action, $params); $result = $this->execPageAction($action, $params);
if ($this->responseOverride !== null) {
$result = $this->responseOverride;
}
if (!is_string($result)) { if (!is_string($result)) {
return $result; return $result;
} }
@ -684,6 +693,17 @@ class Controller extends ControllerBase
return $this; return $this;
} }
/**
* Sets the response for the current page request cycle, this value takes priority
* over the standard response prepared by the controller.
* @param mixed $response Response object or string
*/
public function setResponse($response)
{
$this->responseOverride = $response;
return $this;
}
// //
// Hints // Hints
// //

View File

@ -410,7 +410,8 @@ class FileUpload extends FormWidgetBase
$parent = $fileRelation->getParent(); $parent = $fileRelation->getParent();
if ($this->attachOnUpload && $parent && $parent->exists) { if ($this->attachOnUpload && $parent && $parent->exists) {
$fileRelation->add($file); $fileRelation->add($file);
} else { }
else {
$fileRelation->add($file, $this->sessionKey); $fileRelation->add($file, $this->sessionKey);
} }
@ -422,14 +423,14 @@ class FileUpload extends FormWidgetBase
'path' => $file->pathUrl 'path' => $file->pathUrl
]; ];
Response::json($result, 200)->send(); $response = Response::make($result, 200);
} }
catch (Exception $ex) { catch (Exception $ex) {
Response::json($ex->getMessage(), 400)->send(); $response = Response::make($ex->getMessage(), 400);
} }
exit; // Override the controller response
$this->controller->setResponse($response);
} }
/** /**

View File

@ -1563,16 +1563,17 @@ class MediaManager extends WidgetBase
*/ */
$this->fireSystemEvent('media.file.upload', [$filePath, $uploadedFile]); $this->fireSystemEvent('media.file.upload', [$filePath, $uploadedFile]);
Response::json([ $response = Response::make([
'link' => MediaLibrary::url($filePath), 'link' => MediaLibrary::url($filePath),
'result' => 'success' 'result' => 'success'
])->send(); ]);
} }
catch (Exception $ex) { catch (Exception $ex) {
Response::json($ex->getMessage(), 400)->send(); $response = Response::make($ex->getMessage(), 400);
} }
exit; // Override the controller response
$this->controller->setResponse($response);
} }
/** /**

View File

@ -6,6 +6,7 @@ use File;
use Lang; use Lang;
use Input; use Input;
use Request; use Request;
use Response;
use Cms\Classes\Theme; use Cms\Classes\Theme;
use Cms\Classes\Asset; use Cms\Classes\Asset;
use Backend\Classes\WidgetBase; use Backend\Classes\WidgetBase;
@ -54,6 +55,7 @@ class AssetList extends WidgetBase
$this->assetExtensions = FileDefinitions::get('assetExtensions'); $this->assetExtensions = FileDefinitions::get('assetExtensions');
parent::__construct($controller, []); parent::__construct($controller, []);
$this->bindToController(); $this->bindToController();
$this->checkUploadPostback(); $this->checkUploadPostback();
@ -96,6 +98,7 @@ class AssetList extends WidgetBase
} }
$this->putSession('currentPath', $path); $this->putSession('currentPath', $path);
return [ return [
'#'.$this->getId('asset-list') => $this->makePartial('items', ['items' => $this->getData()]) '#'.$this->getId('asset-list') => $this->makePartial('items', ['items' => $this->getData()])
]; ];
@ -661,15 +664,18 @@ class AssetList extends WidgetBase
*/ */
$uploadedFile->move($this->getCurrentPath(), $uploadedFile->getClientOriginalName()); $uploadedFile->move($this->getCurrentPath(), $uploadedFile->getClientOriginalName());
die('success'); $response = Response::make('success');
} }
catch (Exception $ex) { catch (Exception $ex) {
$message = $fileName !== null $message = $fileName !== null
? Lang::get('cms::lang.asset.error_uploading_file', ['name' => $fileName, 'error' => $ex->getMessage()]) ? Lang::get('cms::lang.asset.error_uploading_file', ['name' => $fileName, 'error' => $ex->getMessage()])
: $ex->getMessage(); : $ex->getMessage();
die($message); $response = Response::make($message);
} }
// Override the controller response
$this->controller->setResponse($response);
} }
protected function setSearchTerm($term) protected function setSearchTerm($term)

View File

@ -149,9 +149,18 @@
url: window.location, url: window.location,
paramName: 'file_data', paramName: 'file_data',
previewsContainer: $('<div />').get(0), previewsContainer: $('<div />').get(0),
clickable: $link.get(0) clickable: $link.get(0),
headers: {}
} }
/*
* Add CSRF token to headers
*/
var token = $('meta[name="csrf-token"]').attr('content')
if (token) {
uploaderOptions.headers['X-CSRF-TOKEN'] = token
}
var dropzone = new Dropzone($('<div />').get(0), uploaderOptions) var dropzone = new Dropzone($('<div />').get(0), uploaderOptions)
dropzone.on('error', $.proxy(self.onUploadFail, self)) dropzone.on('error', $.proxy(self.onUploadFail, self))
dropzone.on('success', $.proxy(self.onUploadSuccess, self)) dropzone.on('success', $.proxy(self.onUploadSuccess, self))
@ -167,4 +176,4 @@
$(document).ready(function(){ $(document).ready(function(){
new AssetList($('#asset-list-container').closest('form'), $('#asset-list-container').data('alias')) new AssetList($('#asset-list-container').closest('form'), $('#asset-list-container').data('alias'))
}) })
}(window.jQuery); }(window.jQuery);