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

View File

@ -118,6 +118,11 @@ class Controller extends ControllerBase
*/
protected $statusCode = 200;
/**
* @var mixed Override the standard controller response.
*/
protected $responseOverride = null;
/**
* Constructor.
*/
@ -280,6 +285,10 @@ class Controller extends ControllerBase
*/
$result = $this->execPageAction($action, $params);
if ($this->responseOverride !== null) {
$result = $this->responseOverride;
}
if (!is_string($result)) {
return $result;
}
@ -684,6 +693,17 @@ class Controller extends ControllerBase
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
//

View File

@ -410,7 +410,8 @@ class FileUpload extends FormWidgetBase
$parent = $fileRelation->getParent();
if ($this->attachOnUpload && $parent && $parent->exists) {
$fileRelation->add($file);
} else {
}
else {
$fileRelation->add($file, $this->sessionKey);
}
@ -422,14 +423,14 @@ class FileUpload extends FormWidgetBase
'path' => $file->pathUrl
];
Response::json($result, 200)->send();
$response = Response::make($result, 200);
}
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]);
Response::json([
$response = Response::make([
'link' => MediaLibrary::url($filePath),
'result' => 'success'
])->send();
]);
}
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 Input;
use Request;
use Response;
use Cms\Classes\Theme;
use Cms\Classes\Asset;
use Backend\Classes\WidgetBase;
@ -54,6 +55,7 @@ class AssetList extends WidgetBase
$this->assetExtensions = FileDefinitions::get('assetExtensions');
parent::__construct($controller, []);
$this->bindToController();
$this->checkUploadPostback();
@ -96,6 +98,7 @@ class AssetList extends WidgetBase
}
$this->putSession('currentPath', $path);
return [
'#'.$this->getId('asset-list') => $this->makePartial('items', ['items' => $this->getData()])
];
@ -661,15 +664,18 @@ class AssetList extends WidgetBase
*/
$uploadedFile->move($this->getCurrentPath(), $uploadedFile->getClientOriginalName());
die('success');
$response = Response::make('success');
}
catch (Exception $ex) {
$message = $fileName !== null
? Lang::get('cms::lang.asset.error_uploading_file', ['name' => $fileName, 'error' => $ex->getMessage()])
: $ex->getMessage();
die($message);
$response = Response::make($message);
}
// Override the controller response
$this->controller->setResponse($response);
}
protected function setSearchTerm($term)

View File

@ -149,9 +149,18 @@
url: window.location,
paramName: 'file_data',
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)
dropzone.on('error', $.proxy(self.onUploadFail, self))
dropzone.on('success', $.proxy(self.onUploadSuccess, self))
@ -167,4 +176,4 @@
$(document).ready(function(){
new AssetList($('#asset-list-container').closest('form'), $('#asset-list-container').data('alias'))
})
}(window.jQuery);
}(window.jQuery);