Commit 76a15545 authored by Carsten  Rose's avatar Carsten Rose
Browse files

Merge branch 'master' into F9526-RedesignRequired

# Conflicts:
#	javascript/src/QfqForm.js
parents 61f33cfc a4aacbce
Pipeline #2776 passed with stages
in 2 minutes and 41 seconds
......@@ -36,7 +36,52 @@ Features
Bug Fixes
^^^^^^^^^
Version 19.11.0
Version 19.11.2
---------------
Date: 25.11.2019
Notes
^^^^^
* Fantastic new formModeGlobal=skipRequiredCheck: fill's '{{allRequiredGiven:V}}' before save to 1 (all given) else 0.
Offers user to save form, even if not all required data are given and offers application logic to check easily if all
required fields has been fillled.
* formModeGlobal=requiredOff is now deprecated but will still work.
Features
^^^^^^^^
* #9526 / Mark required fields more visible
* #9617 / Improve 'formModeGlobal=requiredOff'.
* New mode name 'skipRequiredCheck'.
* 'requiredOff' is replaced by 'skipRequiredCheck' and now deprecated.
* Add documentation for 'skipRequiredCheck:S' & 'allRequiredGiven:V'
* Feature `Form.formModeGlobal` implemented - STORE_SIP overwrites form definition.
* New STORE_VAR variable 'allRequiredGiven'. Becomes '1' if all required fields are given, else 0.
* Add param 'L' & 'type' automatically to form save.
* Manual.rst: Procedure to find an irreproducible error.
* Change definition of QFQ system tables for 'modified' and 'created'. Use DATETIME instead of TIMESTAMP.
Bug Fixes
^^^^^^^^^
* #7639 / subrecord drag n drop:
* `orderInterval` has not been respected.
* Update Manual.rst
* Fake STORE_SIP so it can be used during processing sql1.
* The record, currently loaded into form, is available via STORE_RECORD.
* Check for id/_id and ord/_ord
* Throw meaningful exception if missing 'id' or 'ord'
* Fixes bug that no mime_type_content is called if there is on file.
* Fix broken regex101 url.
Version 19.11.1
---------------
Date: 11.11.2019
......
......@@ -54,12 +54,12 @@ Neue Versionsnummer
* Update the version number in this document (topic 6)
* Commit & Push new version changes to master branch:
New version 19.11.1
New version 19.11.2
6) **New Tag**:
git tag v19.11.1
git push -u origin v19.11.1
git tag v19.11.2
git push -u origin v19.11.2
7) Tickets:
* Schliessen und der QFQ Version zuweisen.
......
......@@ -1911,6 +1911,9 @@ Store: *VARS* - V
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| slaveId | see `slaveId`_ |
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| allRequiredGiven | Form save - Set during check of all required FE. If every *required* FE is given: *1*. Else: *0*. If there is no required FE: *1*. |
| | Even with 'formModeGlobal=skipRequiredCheck', the variable will be set. |
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
.. _`store_vars_form_element_upload`:
......@@ -2698,11 +2701,29 @@ Optional it might be defined via *Form.parameter* ::
* `skipRequiredCheck`:
* All `FormElement` with `mode=required`, will switch to `mode=show`.
* The user might save the form without providing all necessary data.
* Calling the form without this mode (regular), the form can only be saved with all data given. Than, e.g. an
action-FormElement 'afterSave' can be used to detect the final submit situation and do some extra stuff,
necessary for a final submit.
* All `FormElement` with `mode=required`, will be handled as `mode=show`.
* The user can save the form without providing all necessary data!
* The user will see complains about missing data - but again, the form data is saved!
* Check `STORE_VARS`_ for the variable `{{allRequiredGiven:V}}` - even without forcing the user to fill out all data,
this variable will show if the form has been filled completely.
* Scenario 1:
* A form has one or more FormElement with 'fe.type=required'.
* Calling the form with `formModeGlobal=skipRequiredCheck` will allow the user to save the form, even if not all
FE.type=required elements are given. Name this the 'draft' mode.
* Calling the form without `formModeGlobal=skipRequiredCheck` (this is the default), forces the user to fill out
all FE.type=required fields. Name this the 'final submit' mode.
* Scenario 2:
* A form has one or more FormElement with 'fe.type=required'.
* Calling the form with `formModeGlobal=skipRequiredCheck` will allow the user to save the form, even if not all
FE.type=required elements are given.
* Define an FE-Action 'afterSave', and do some action on `{{allRequiredGiven:V0}}` like::
{{UPDATE <table> SET dataValid={{allRequiredGiven:V0}} WHERE id={{id:R}} }}
* In your report, mark a button green or red, depending on the saved state.
* `requiredOff` is a deprecated synonym of `skipRequiredCheck`.
......@@ -3770,17 +3791,23 @@ The following parameters can be used in the `parameter` field to customize/activ
* *orderColumn*: The dedicated order column in the specified dndTable (needs to match a column in the table definition).
Default is `ord`.
If `dndTable` is an actual table with a column `orderColumn`, QFQ automatically applies drag-and-drop logic
If `dndTable` is a table with a column `orderColumn`, QFQ automatically applies drag-and-drop logic
to the rendered subrecord. It does so by using the subrecord field *sql1*. The `sql1` query should
therefore include both a column id (or _id) and ord (or _ord).
include a column `id` (or `_id`) and a column `ord` (or `_ord`). E.g.::
FE.sql1 = {{!SELECT p.id AS _id, p.ord AS _ord, p.name FROM Person WHERE p.email!='' ORDER BY p.ord}}
Tips:
* If you want to deactivate a drag-and-drop that QFQ automatically renders, set the `orderColumn` to a non-existing column.
E.g., `orderColumn = nonExistingColumn`. This will deactivate drag-and-drop.
* In order to evaluate the `sql1` query dynamically during a drag-and-drop event, the fill store R (with the current form)
is loaded. Currently, SIP parameters and other variables are not supplied to be evaluated during a drag-and-drop event.
This may be added later upon request.
* In order to evaluate the `sql1` query dynamically during a drag-and-drop event, the STORE_RECORD (with the current subrecord)
is loaded.
* The stores STORE_RECORD, STORE_SIP and STORE_SYSTEM are supported during a drag-and-drop event and can be used in FE.sql1 query.
* STORE_SIP: SIP values on form load
* STORE_RECORD: values of the current record loaded in the form.
* If the subrecord is rendered with drag-and-drop active, but the order is not affected upon reload, there is
most likely a problem with evaluating the `sql1` query at runtime.
......@@ -7053,7 +7080,7 @@ Parameter and (element) sources
* *uid*: `uid:<tt-content record id>` - the tt_content.uid of a QFQ PageContent record (shown on hover in the backend). This will render
only the specified QFQ content record, without any Typo3 layout elements (Menu, Body,...)
QFQ will retrieve the tt-content's bodytext from the Typo3 database, parse it, and render it as a PDF. Parameters can be
passed: `uid:<tt-content record id>[?arg1=value1][&arg2=value2][...]` and will be available in the SIP store for the QFQ PageContent,
passed: `uid:<tt-content record id>[&arg1=value1][&arg2=value2][...]` and will be available in the SIP store for the QFQ PageContent,
or passed as wkhtmltopdf arguments, if applicable.
* *WKHTML Options* for `page`, `urlParam` or `url`:
......@@ -7575,6 +7602,8 @@ QFQ CSS Classes
* `qfq-100` - assigned to different tags, makes an element 'width: 100%'.
* `qfq-left`- assigned to different tags, Text align left.
* `qfq-sticky` - assigned to `<thead>`, makes the header sticky.
* `letter-no-break` - assigned to a `div` will protect a paragraph (CSS: page-break-before: avoid;) not to break around
a page border (converted to PDF via wkhtml). Take care that `qfq-letter.css` is included in TypoScript setup.
Bootstrap
---------
......@@ -8676,6 +8705,32 @@ Tips:
* Always check the Javascript console of your browser, see `javascriptProblem`_.
* Always check the Webserver log files.
Procedure to Find an Irreproducible Error
-----------------------------------------
* Find out the date and time on which the error occurred as precisely as possible
* Find out the user-name of the person who experienced the error
* Search the logs at the time of the Error:
* qfq.log
* location: fileadmin/protected/log/qfq.log
* Look for error messages which were sent to the user at that time. (search for user-name in file)
* Look at actions performed during the time of Error
* FormSubmitLog
* location: table named 'FormSubmitLog' in the qfq database
* In the SQL Table FormSubmitLog search the column FEUser for the user-name
* does the data (in the column formData) submitted at the time of the error coincide with the data saved in the database?
* sql.log
* location: fileadmin/protected/log/sql.og
* search for the form that was active when the error occurred:
* e.g.: If the form is named 'requestGreview' search for 'form:requestGreview'
Caching
-------
......
......@@ -36,7 +36,52 @@ Features
Bug Fixes
^^^^^^^^^
Version 19.11.0
Version 19.11.2
---------------
Date: 25.11.2019
Notes
^^^^^
* Fantastic new formModeGlobal=skipRequiredCheck: fill's '{{allRequiredGiven:V}}' before save to 1 (all given) else 0.
Offers user to save form, even if not all required data are given and offers application logic to check easily if all
required fields has been fillled.
* formModeGlobal=requiredOff is now deprecated but will still work.
Features
^^^^^^^^
* #9526 / Mark required fields more visible
* #9617 / Improve 'formModeGlobal=requiredOff'.
* New mode name 'skipRequiredCheck'.
* 'requiredOff' is replaced by 'skipRequiredCheck' and now deprecated.
* Add documentation for 'skipRequiredCheck:S' & 'allRequiredGiven:V'
* Feature `Form.formModeGlobal` implemented - STORE_SIP overwrites form definition.
* New STORE_VAR variable 'allRequiredGiven'. Becomes '1' if all required fields are given, else 0.
* Add param 'L' & 'type' automatically to form save.
* Manual.rst: Procedure to find an irreproducible error.
* Change definition of QFQ system tables for 'modified' and 'created'. Use DATETIME instead of TIMESTAMP.
Bug Fixes
^^^^^^^^^
* #7639 / subrecord drag n drop:
* `orderInterval` has not been respected.
* Update Manual.rst
* Fake STORE_SIP so it can be used during processing sql1.
* The record, currently loaded into form, is available via STORE_RECORD.
* Check for id/_id and ord/_ord
* Throw meaningful exception if missing 'id' or 'ord'
* Fixes bug that no mime_type_content is called if there is on file.
* Fix broken regex101 url.
Version 19.11.1
---------------
Date: 11.11.2019
......
......@@ -22,7 +22,7 @@
project = QFQ - Quick Form Query
version = 19.11
release = 19.11.1
release = 19.11.2
t3author = Carsten Rose
copyright = since 2017 by the author
......
......@@ -12,7 +12,8 @@ require_once(__DIR__ . '/../../vendor/autoload.php');
use IMATHUZH\Qfq\Core\QuickFormQuery;
use IMATHUZH\Qfq\Core\Store\Store;
use IMATHUZH\Qfq\Core\Helper\Support;
/**
......@@ -64,7 +65,7 @@ try {
$arr = $qfq->getForwardMode();
$answer[API_REDIRECT] = $arr[API_REDIRECT];
$answer[API_REDIRECT_URL] = $arr[API_REDIRECT_URL];
$answer[API_REDIRECT_URL] = Support::appendTypo3ParameterToUrl($arr[API_REDIRECT_URL]);
$answer[API_STATUS] = API_ANSWER_STATUS_SUCCESS;
$answer[API_MESSAGE] = 'Saved';
......
......@@ -2810,7 +2810,12 @@ abstract class AbstractBuildForm {
// Handle DragAndDrop
$dndAttributes = '';
if ($hasDragAndDrop) {
$orderInterval = 10;
$orderInterval = $formElement[FE_ORDER_INTERVAL] ?? FE_ORDER_INTERVAL_DEFAULT;
if ($orderInterval == '' || !is_numeric($orderInterval)) {
$orderInterval = FE_ORDER_INTERVAL_DEFAULT;
}
$numColumns = 0;
if (count($formElement[FE_SQL1]) > 0) {
$numColumns = count($formElement[FE_SQL1][0]) + (int)$flagDelete + (int)($flagNew || $flagEdit);
......@@ -2818,6 +2823,7 @@ abstract class AbstractBuildForm {
$dataDndApi = DND_SUBRECORD_ID . '=' . $formElement[FE_ID];
$dataDndApi .= '&' . DND_SUBRECORD_FORM_ID . '=' . $this->store->getVar('id', STORE_RECORD);
$dataDndApi .= '&' . DND_SUBRECORD_FORM_TABLE . '=' . $this->formSpec[F_TABLE_NAME];
$dataDndApi .= '&' . FE_ORDER_INTERVAL . '=' . $orderInterval;
$dataDndApi .= '&' . FE_ORDER_COLUMN . '=' . $orderColumn;
$dataDndApi .= '&' . FE_DND_TABLE . '=' . $dndTable;
......
......@@ -723,7 +723,7 @@ const VAR_FILENAME_BASE = 'filenameBase'; // Original filename of an uploaded fi
const VAR_FILENAME_EXT = 'filenameExt'; // Extension of the original filename of an uploaded file, .
const VAR_FILE_MIME_TYPE = 'mimeType';
const VAR_FILE_SIZE = 'fileSize';
const VAR_ALL_REQUIRED_GIVEN = 'allRequiredGiven'; // 0 if at least one FE is required and value is missing, else 1.
const VAR_ALL_REQUIRED_GIVEN = 'allRequiredGiven'; // If all required FE are given: 1, else: 0. If there is no required FE: 1
// PHP class Typeahead
......@@ -1317,6 +1317,7 @@ const FE_TYPE_PILL = 'pill';
const FE_HTML_ID = 'htmlId'; // Will be dynamically computed during runtime.
const FE_ORDER_INTERVAL = 'orderInterval';
const FE_ORDER_INTERVAL_DEFAULT = '10';
const FE_ORDER_COLUMN = 'orderColumn';
const FE_DND_TABLE = 'dndTable';
......@@ -1888,7 +1889,9 @@ const DND_COLUMN_ORD_NEW = 'ordNew';
const DND_DATA_DND_API = 'data-dnd-api';
const DND_SUBRECORD_ID = 'dnd-subrecord-id'; // Internal qualifier used to communicate with dnd api for subrecord dnd
const DND_SUBRECORD_FORM_ID = 'dnd-subrecord-form-id';
const DND_SUBRECORD_FORM_TABLE = 'dnd-subrecord-form-table';
const DND_ORD_HTML_ID_PREFIX = 'qfq-dnd-ord-id-';
const DND_FORM_SIP_VALUES = '_sipForm';
// Application Test: SELENIUM
const ATTRIBUTE_DATA_REFERENCE = 'data-reference';
......
......@@ -272,6 +272,9 @@ class Evaluate {
private function inlineDataDndApi($arrToken, $dbIndex, &$foundInStore) {
$token = OnString::trimQuote(trim(implode(' ', $arrToken)));
# Include current SIP store, to fetch SIP parameter later.
$token .= '&' . DND_FORM_SIP_VALUES . '=' . $this->store::getVar(SIP_SIP, STORE_SIP);
if (empty($token)) {
throw new \UserReportException('Missing form name for "data-dnd-api"', ERROR_MISSING_FORM);
}
......@@ -358,7 +361,7 @@ class Evaluate {
$type = OnString::stripFirstCharIf('_', $arrToken[$countToken - 1]);
array_pop($arrToken); // remove 'link' | 'data-dnd-api' | 'ablesorter-view-saver'
array_pop($arrToken); // remove 'link' | 'data-dnd-api' | 'tablesorter-view-saver'
array_pop($arrToken); // remove 'as'
switch (strtolower($type)) {
......
......@@ -122,28 +122,35 @@ class DragAndDrop {
$ord = $orderInterval;
$ordDragOld = -1;
$data = array();
$nameId = false;
$nameOrd = false;
// Reorder. Get index for 'drag' and 'hover'
foreach ($rows as $key => $row) {
// the dragged element: skip old position.
if ($row[DND_COLUMN_ID] == $dragId) {
$ordDragOld = $row[DND_COLUMN_ORD];
if ($nameId === false) {
$nameId = $this->getFinalColumnName(DND_COLUMN_ID, $row);
$nameOrd = $this->getFinalColumnName(DND_COLUMN_ORD, $row);
}
// The dragged element: skip old position.
if ($row[$nameId] == $dragId) {
$ordDragOld = $row[$nameOrd];
continue;
}
// the dragged element: new position.
if ($row[DND_COLUMN_ID] == $hoverId) {
// The dragged element: new position.
if ($row[$nameId] == $hoverId) {
switch ($setTo) {
case DND_SET_TO_BEFORE:
$data = $this->setNewOrder($tableName, $orderColumn, $dragId, $ordDragOld, $ord, $data);
$ord += $orderInterval;
$data = $this->setNewOrder($tableName, $orderColumn, $row[DND_COLUMN_ID], $row[DND_COLUMN_ORD], $ord, $data);
$data = $this->setNewOrder($tableName, $orderColumn, $row[$nameId], $row[$nameOrd], $ord, $data);
break;
case DND_SET_TO_AFTER:
$data = $this->setNewOrder($tableName, $orderColumn, $row[DND_COLUMN_ID], $row[DND_COLUMN_ORD], $ord, $data);
$data = $this->setNewOrder($tableName, $orderColumn, $row[$nameId], $row[$nameOrd], $ord, $data);
$ord += $orderInterval;
$data = $this->setNewOrder($tableName, $orderColumn, $dragId, $ordDragOld, $ord, $data);
break;
......@@ -152,7 +159,7 @@ class DragAndDrop {
throw new \CodeException(json_encode([ERROR_MESSAGE_TO_USER => 'Unknown "setTo" string', ERROR_MESSAGE_TO_DEVELOPER => "Token found: " . $setTo]), ERROR_UNKNOWN_TOKEN);
}
} else {
$data = $this->setNewOrder($tableName, $orderColumn, $row[DND_COLUMN_ID], $row[DND_COLUMN_ORD], $ord, $data);
$data = $this->setNewOrder($tableName, $orderColumn, $row[$nameId], $row[$nameOrd], $ord, $data);
}
$ord += $orderInterval;
}
......@@ -160,6 +167,25 @@ class DragAndDrop {
return $data;
}
/**
* Check if there is a column called '_' . $name. If yes, return that name, else return $name.
* If none is found, throw an exception.
*
* @param $name
* @param $row
* @return string
* @throws \UserFormException
*/
private function getFinalColumnName($name, $row) {
if (!isset($row[$name]) && !isset($row['_' . $name])) {
throw new \UserFormException(json_encode([ERROR_MESSAGE_TO_USER => "Missing column '$name' or '_$name'", ERROR_MESSAGE_TO_DEVELOPER => "Check your DND SQL statement"]),
ERROR_MISSING_REQUIRED_PARAMETER);
}
return isset($row['_' . $name]) ? '_' . $name : $name;
}
/**
* @param string $tableName
* @param string $orderColumn
......
......@@ -39,7 +39,7 @@ class HelperFile {
}
/**
* Returns a uniqe (use for temporary) filename, prefixed with QFQ TMP_FILE_PREFIX
* Returns a uniq (use for temporary) filename, prefixed with QFQ TMP_FILE_PREFIX
*
* @return bool|string
*/
......
......@@ -8,7 +8,7 @@
namespace IMATHUZH\Qfq\Core\Helper;
use IMATHUZH\Qfq\Core\Store\Store;
const LONG_CURLY_OPEN = '#/+open+/#';
......@@ -55,6 +55,44 @@ class Support {
}
}
/**
* Check $uri if 'type' and/or 'L' is missing. If yes, append it.
*
* Do nothing if $uri is empty.
* Do nothing if $uri is absolute (=starts with http)
*
* @param $uri
* @return string
* @throws \CodeException
* @throws \UserFormException
*/
public static function appendTypo3ParameterToUrl($uri) {
if ($uri == '') {
return '';
}
// Full URL: no processing
$protocol = explode(':', $uri, 2);
if ($protocol[0] == 'http' || $protocol[0] == 'https') {
return $uri;
}
$arr = KeyValueStringParser::parse($uri, '=', '&');
$type = self::$store->getVar(TYPO3_PAGE_TYPE, STORE_TYPO3);
$language = self::$store->getVar(TYPO3_PAGE_LANGUAGE, STORE_TYPO3);
if ($type != 0 && $type !== false && !isset($arr['type'])) {
$uri .= '&type=' . $type;
}
if ($language != 0 && $language !== false && !isset($arr['L'])) {
$uri .= '&L=' . $language;
}
return $uri;
}
/**
* Build the form log filename. Depending on $formLog=FORM_LOG_ALL one file for all BE_USER, or $formLog=FORM_LOG_SESSION one file per BE_USER.
*
......
......@@ -1802,20 +1802,35 @@ class QuickFormQuery {
$json = "";
$dndSubrecordId = $this->store->getVar(DND_SUBRECORD_ID, STORE_SIP . STORE_CLIENT . STORE_ZERO);
$dndSubrecordId = $this->store::getVar(DND_SUBRECORD_ID, STORE_SIP . STORE_CLIENT . STORE_ZERO);
if ($dndSubrecordId > 0) {
// Subrecord DragAndDrop
$subrecord = $this->dbArray[$this->dbIndexQfq]->sql(SQL_FORM_ELEMENT_BY_ID, ROW_REGULAR, [$dndSubrecordId]);
$recordId = $this->store->getVar(DND_SUBRECORD_FORM_ID, STORE_SIP . STORE_ZERO);
$this->store->fillStoreWithRecord('Form', $recordId, $this->dbArray[$this->dbIndexQfq]);
$recordId = $this->store::getVar(DND_SUBRECORD_FORM_ID, STORE_SIP . STORE_ZERO);
$tableName = $this->store::getVar(DND_SUBRECORD_FORM_TABLE, STORE_SIP);
// $this->store->fillStoreWithRecord('form', $recordId, $this->dbArray[$this->dbIndexQfq]);
$this->store->fillStoreWithRecord($tableName, $recordId, $this->dbArray[$this->dbIndexQfq]);
$formSip = $this->store::getVar(DND_FORM_SIP_VALUES, STORE_SIP);
// Backup STORE_SIP
$save = $this->store::getStore(STORE_SIP);
// Fake STORE_SIP
$this->store::fillStoreSip($formSip);
// Fire query, which might use SIP Vars
$dndOrderSql = $this->evaluate->parse($subrecord[0][FE_SQL1]);
foreach ($dndOrderSql as $i => $row) {
foreach ($row as $key => $value) {
if (substr($key, 0, 1) === '_') {
$dndOrderSql[$i][substr($key, 1)] = $value;
}
}
}
// Restore STORE_SIP
$this->store::setStore($save, STORE_SIP, true);
// Copy all '_...' columns to '...' (without the dash)
// foreach ($dndOrderSql as $i => $row) {
// foreach ($row as $key => $value) {
// if (substr($key, 0, 1) === '_') {
// $dndOrderSql[$i][substr($key, 1)] = $value;
// }
// }
// }
$dummyFormSpec = [
F_ORDER_INTERVAL => $this->store->getVar(FE_ORDER_INTERVAL, STORE_SIP . STORE_ZERO),
......
......@@ -222,19 +222,19 @@ class Download {
/**
* Get the mimetype of $filename and store them in $rcMimetype.
* Checks if the extension of $outputFilename fit's to the mimetype. If not, append the mimetype extension.
*
* @param string $filename
* @param string $pathFileName
* @param string $outputFilename
* @param string $rcMimetype
*
* @return string possible updated $outputFilename, according the mimetype.
*/
private
function targetFilenameExtension($filename, $outputFilename, &$rcMimetype) {
private function targetFilenameExtension($pathFileName, $outputFilename, &$rcMimetype) {
$rcMimetype = mime_content_type($filename);
if ($pathFileName != '' && file_exists($pathFileName)) {
$rcMimetype = mime_content_type($pathFileName);
}
return $outputFilename;
}
......@@ -245,8 +245,7 @@ class Download {
* @param $outputFilename
* @throws \DownloadException
*/
private
function outputFile($file, $outputFilename) {
private function outputFile($file, $outputFilename) {
$json = '';
$flagJson = ($this->getOutputFormat() === DOWNLOAD_OUTPUT_FORMAT_JSON);
......@@ -295,14 +294,16 @@ class Download {
* @throws \CodeException
* @throws \DbException
* @throws \DownloadException
* @throws \UserFormException
* @throws \UserReportException
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
* @throws \UserFormException
* @throws \UserReportException
*/
private
function getElement($element, $downloadMode, &$rcData) {
private function getElement($element, $downloadMode, &$rcData) {
$filename = '';
$rcArgs = array();
......@@ -391,8 +392,7 @@ class Download {
* @throws \UserFormException
* @throws \UserReportException
*/
private
function getEvaluatedBodyText($uid, $urlParam) {
private function getEvaluatedBodyText($uid, $urlParam) {
foreach ($urlParam as $key => $paramValue) {
$this->store->setVar($key, $paramValue, STORE_SIP);
}
......@@ -415,8 +415,7 @@ class Download {
* @return string ZIP filename - has to be deleted later.
* @throws \DownloadException
*/
private
function zipFiles(array $files) {
private function zipFiles(array $files) {
$zipFile = HelperFile::tempnam();
if (false === $zipFile) {
......@@ -462,14 +461,16 @@ class Download {