Commit 6d8d731e authored by Carsten  Rose's avatar Carsten Rose
Browse files

Feature #4511 / Form: URL Forward - mode dynamic computed - more generic implementation.

parent 64c46a59
...@@ -1753,41 +1753,58 @@ Display or hide the button `new`, `delete`, `close`, `save`. ...@@ -1753,41 +1753,58 @@ Display or hide the button `new`, `delete`, `close`, `save`.
Forward: Save / Close Forward: Save / Close
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
Forward Forward (=forwardMode)
''''''' ''''''''''''''''''''''
After the user presses *Save*, *Close*, *Delete* or *New*, different actions are possible where the browser redirects to. After the user presses *Save*, *Close*, *Delete* or *New*, different actions are possible where the browser redirects to.
* `client` (default) - the QFQ Javascript logic, inside the browser, decides to stay on the page or to force a redirection * `client` (default) - the QFQ browser Javascript logic, decides to stay on the page or to force a redirection
to a previous page. to a previous page.
* *Close* closes the current page and goes back to the previous page. * *Close* closes the current page and goes back to the previous page. Note: if a new tab is opened and the user presses
QFQ close (in any way) - in that new browser tab there is no previous page! QFQ won't close the tab, instead a message
is shown
* *Save* stays on the current page. * *Save* stays on the current page.
* `no` - no change, the browser remains on the current side. Close does not close the page. It just triggers a save if * `no` - no change, the browser remains on the current side. Close does not close the page. It just triggers a save if
there are modified data. there are modified data.
* `url` - the browser redirects to the named URL or T3 page. Independent if the user presses `save` or `close`. * `url` - the browser redirects to the URL or T3 page named in `Forward URL / Page`. Independent if the user presses `save` or `close`.
* `url-skip-history` - same as `url`, but the current location won't saved in the browser history. * `url-skip-history` - same as `url`, but the current location won't saved in the browser history.
Only with `Forward` == `url` | `url-skip-history`, the definition of `Forward URL / Page` becomes active. Only with `Forward` == `url` | `url-skip-history`, the definition of `Forward URL / Page` becomes active.
Forward URL / Page Forward URL / Page (=forwardPage)
'''''''''''''''''' '''''''''''''''''''''''''''''''''
Type: dynamic URL/Page Format: [<url>] or [<mode>|<url>]
^^^^^^^^^^^^^^^^^^^^^^
* `forwardPage=http://john-doe.com` - fix URL. * `<url>`:
* `forwardPage=?thanks` - fix Typo3 alias or page id, inside current Typo3 installation.
* `forwardPage=?id=thanks` - same as above, but more complete notation.
* `forwardPage={{SELECT ... }}` - dynamically calculated, after all processing is done. This is very usefull, to redirect to different
targets, depending on user input or other dependency/ies.
Type: dynamic Mode * `http://www.example.com/index.html?a=123#bottom`
^^^^^^^^^^^^^^^^^^ * `website.html?a=123#bottom`
* `?<T3 Alias pageid>&a=123#bottom, ?id=<T3 page id>&a=123#bottom`
* `{{SELECT ...}}`
* `<mode>|<url>`
* `<mode>` - Valid keywords are as above: `no|client|url|url-skip-history`
Specifying the mode in `forwardPage` overwrites `formMode` (but only if `formMode` is `url...`).
Also regular QFQ statements like {{var}} or {{SELECT ...}} are possible in `forwardPage`. This is useful to dynamically
redirect to different targets, depending on user input or any other dependencies.
If a forwardMode 'url...' is specified and there is no `forwardPage`, QFQ falls down to `client` mode.
On a form, the user might click 'save' or 'save,close' or 'close' (with modified data this leads to 'save,close').
The CLIENT `submit_reason` shows the user action:
* `{{submit_reason:CE:alnumx}}`='save' or 'save,close'
Example forwardPage
^^^^^^^^^^^^^^^^^^^
* Specify in `forwardPage` any of the forward modes: `forwardPage=no | client | url | url-skip-history`, * `{{SELECT IF('{{formModeGlobal:S:anumx}}'='requiredOff', 'no', 'client') }}`
* Or vua an SQL statement: `forwardPage={{SELECT IF('{{formModeGlobal:S:anumx)}}'='requiredOff', 'no', 'client') }}` * `{{SELECT IF('{{submit_reason:CE:alnumx}}'='save', 'no', 'url'), '|http://example.com' }}`
Type: combined dynamic mode & URL/page Type: combined dynamic mode & URL/page
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
...@@ -168,21 +168,7 @@ class QuickFormQuery { ...@@ -168,21 +168,7 @@ class QuickFormQuery {
*/ */
public function getForwardMode() { public function getForwardMode() {
$forwardPage = $this->eval->parse($this->formSpec[F_FORWARD_PAGE]); $forwardPage = $this->formSpec[F_FORWARD_PAGE];
// Format: [mode/url][|url]
$forwardArray = explode('|', $forwardPage, 2);
switch ($forwardArray[0]) {
case F_FORWARD_MODE_CLIENT:
case F_FORWARD_MODE_NO:
case F_FORWARD_MODE_URL:
case F_FORWARD_MODE_URL_SKIP_HISTORY:
case F_FORWARD_MODE_URL_SIP:
$this->formSpec[F_FORWARD_MODE] = $forwardArray[0];
if (isset($forwardArray[1])) {
$forwardPage = $forwardArray[1];
}
}
if ($this->formSpec[F_FORWARD_MODE] == F_FORWARD_MODE_URL_SIP) { if ($this->formSpec[F_FORWARD_MODE] == F_FORWARD_MODE_URL_SIP) {
$forwardPage = store::getSipInstance()->queryStringToSip($forwardPage, RETURN_URL); $forwardPage = store::getSipInstance()->queryStringToSip($forwardPage, RETURN_URL);
...@@ -409,23 +395,25 @@ class QuickFormQuery { ...@@ -409,23 +395,25 @@ class QuickFormQuery {
$formAction->elements($rc, $this->feSpecAction, FE_TYPE_SENDMAIL); $formAction->elements($rc, $this->feSpecAction, FE_TYPE_SENDMAIL);
$getJson = true; $getJson = true;
// Retrieve current STORE_SIP.
$sipArray = $this->store->getStore(STORE_SIP); $customForward = $this->setForwardModePage();
if ($sipArray[SIP_RECORD_ID] == 0 && API_SUBMIT_REASON_SAVE == $this->store->getVar(API_SUBMIT_REASON, STORE_CLIENT . STORE_EMPTY, SANITIZE_ALLOW_ALNUMX)) {
// Logic: If a) r=0 and
if ($this->formSpec[F_FORWARD_MODE] !== F_FORWARD_MODE_URL && // b) User presses only 'save' (not save & close) and
$this->formSpec[F_FORWARD_MODE] !== F_FORWARD_MODE_URL_SKIP_HISTORY && // c) there is no forwardMode=='url...'
$this->formSpec[F_FORWARD_MODE] !== F_FORWARD_MODE_URL_SIP // then the client should reload the current page with the newly created record. A new SIP is necessary!
) { if (0 == $this->store->getVar(SIP_RECORD_ID, STORE_SIP) &&
$this->formSpec = $this->buildNSetReloadUrl($this->formSpec, $rc); API_SUBMIT_REASON_SAVE == $this->store->getVar(API_SUBMIT_REASON, STORE_CLIENT . STORE_EMPTY, SANITIZE_ALLOW_ALNUMX) &&
} $customForward == false
) {
$this->formSpec = $this->buildNSetReloadUrl($this->formSpec, $rc);
$getJson = false; $getJson = false;
} }
if ($getJson) { if ($getJson) {
// Retrieve FE Values as JSON // Retrieve FE Values as JSON
// $data['form-update']=... // $data['form-update']=...
// $data = $build->process($formMode, $htmlElementNameIdZero); // $data = $build->process($formMode, $htmlElementNameIdZero);
$data = $build->process($formMode); $data = $build->process($formMode);
} }
break; break;
...@@ -442,6 +430,72 @@ class QuickFormQuery { ...@@ -442,6 +430,72 @@ class QuickFormQuery {
return $data; return $data;
} }
/**
* Check if forwardMode='url...'.
* yes: process 'forwardPage' and fill $this->formSpec[F_FORWARD_MODE] and $this->formSpec[F_FORWARD_PAGE]
* no: do nothing
*
* '$this->formSpec[F_FORWARD_PAGE]' might give a new forwardMode. If so, set $this->formSpec[F_FORWARD_MODE] to
* it.
*
* '$this->formSpec[F_FORWARD_PAGE]':
* a) url http://www.nzz.ch/index.html?a=123#bottom, website.html?a=123#bottom,
* ?<T3 Alias pageid>&a=123#bottom, ?id=<T3 page id>&a=123#bottom
* b) mode no|client|url|...
* c) mode|url combination of above
*
* @return bool TRUE if F_FORWARD_MODE = 'url..', else FALSE
*
* @throws UserFormException
*/
private function setForwardModePage() {
if ('url' != substr($this->formSpec[F_FORWARD_MODE], 0, 3)) {
return false;
}
$forwardPageTmp = $this->eval->parse($this->formSpec[F_FORWARD_PAGE]);
// Format: [mode/url][|url]
$forwardArray = explode('|', $forwardPageTmp, 2);
$forward = trim($forwardArray[0]);
switch ($forward) {
case F_FORWARD_MODE_CLIENT:
case F_FORWARD_MODE_NO:
case F_FORWARD_MODE_URL:
case F_FORWARD_MODE_URL_SKIP_HISTORY:
case F_FORWARD_MODE_URL_SIP:
$this->formSpec[F_FORWARD_MODE] = $forward;
if (isset($forwardArray[1])) {
$this->formSpec[F_FORWARD_PAGE] = trim($forwardArray[1]);
} else {
$this->formSpec[F_FORWARD_PAGE] = '';
}
break;
default:
$this->formSpec[F_FORWARD_PAGE] = $forward;
break;
}
if ('url' == substr($this->formSpec[F_FORWARD_MODE], 0, 3)) {
if ($this->formSpec[F_FORWARD_PAGE] == '') {
$this->formSpec[F_FORWARD_MODE] = F_FORWARD_MODE_CLIENT;
$customForward = false;
} else {
$customForward = true;
}
} else {
$customForward = false;
}
return $customForward;
}
/** /**
* Iterate over all Clipboard source records and fire for each all FE.type=paste records. * Iterate over all Clipboard source records and fire for each all FE.type=paste records.
* *
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment