Commit 4d46add8 authored by Carsten  Rose's avatar Carsten Rose
Browse files

Manual.rst: test some markup styles

parent f7034a82
Pipeline #1543 passed with stage
in 2 minutes and 19 seconds
......@@ -12,6 +12,9 @@
.. External Links: `Bootstrap <http://getbootstrap.com/>`_:
.. Add Images: https://wiki.typo3.org/ReST_Syntax#Images ...
..
.. Admonitions (https://docs.typo3.org/typo3cms/drafts/github/xperseguers/RstPrimer/#admonitions)
.. .. note:: .. important:: .. tip:: .. warning::
..
.. -*- coding: utf-8 -*- with BOM.
......@@ -384,7 +387,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| formSubmitLogMode | all | | *all*: every form submission will be logged. |
| | | | *none*: no logging. |
| | | | See `Form Submit Log page`_ for example QFQ code to display the log. |
| | | | See `form-submit-log-page`_ for example QFQ code to display the log. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| redirectAllMailTo | john@doe.com | If set, redirect all QFQ generated mails (Form, Report) to the specified. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
......@@ -610,7 +613,8 @@ To get the name and current period: ::
Typically, it's necessary to offer a 'previous' / 'next' link. In this example, the STORE SIP holds the new periodId: ::
SELECT CONCAT('p:{{pageAlias:T}}&periodId=', {{periodId:SY0}}-1, '|Next') AS _page, ' ', name, ' ', CONCAT('p:{{pageAlias:T}}&periodId=', {{periodId:SY0}}+1, '|Next') AS _page FROM Period AS s WHERE s.id={{periodId:SY0}}
SELECT CONCAT('p:{{pageAlias:T}}&periodId=', {{periodId:SY0}}-1, '|Next') AS _page, ' ', name, ' ',
CONCAT('p:{{pageAlias:T}}&periodId=', {{periodId:SY0}}+1, '|Next') AS _page FROM Period AS s WHERE s.id={{periodId:SY0}}
Take care for minimum and maximum indexes (do not render the links if out of range).
......@@ -823,7 +827,7 @@ System tables
| Split | Persistent | Data |
+---------------+------------+------------+
See `Mail Log page`_ and `Form Submit Log page`_ for some Frontend views for these tables.
See `mail-log-page`_ and `form-submit-log-page`_ for some Frontend views for these tables.
* Check Bug #5459 - support of system tables in different DBs not supported.
......@@ -922,7 +926,7 @@ Debug
SQL Logging
-----------
configuration_
Setup in configuration_
.. _SQL_LOG:
......@@ -970,14 +974,14 @@ configuration_
* *download*:
* During a download (especially by using wkhtml), temporary files are not deleted automatically. Also the
`wkhtmltopdf` and `pdftk` commandlines will be logged to `SQL_LOG`_. Use this only to debug problems on download.
``wkhtmltopdf`` and ``pdftk`` commandlines will be logged to `SQL_LOG`_. Use this only to debug problems on download.
.. _REDIRECT_ALL_MAIL_TO:
Redirect all mail to (catch all)
--------------------------------
configuration_
Setup in configuration_
* *redirectAllMailTo=john@doe.com*
......@@ -990,7 +994,7 @@ configuration_
* Clear 'CC' and 'Bcc'
* Write a note and the original configured receiver at the top of the email body.
_`Mail Log page`
_`mail-log-page`
Mail Log page
-------------
......@@ -1008,7 +1012,8 @@ The following QFQ code could be used for that purpose (put it in a QFQ PageConte
FROM gGroup AS gr
INNER JOIN MailLog AS ml ON ml.grId = gr.id
GROUP BY gr.id
head = <form onchange='this.submit();' class='form-inline'><input type='hidden' name='id' value='{{pageAlias:T0}}'>Filter By Group: <select name='grId' class='form-control'><option value=''></option>
head = <form onchange='this.submit();' class='form-inline'><input type='hidden' name='id' value='{{pageAlias:T0}}'>
Filter By Group: <select name='grId' class='form-control'><option value=''></option>
rbeg = <option value='
rend = </option>
tail = </select>
......@@ -1024,17 +1029,20 @@ The following QFQ code could be used for that purpose (put it in a QFQ PageConte
sql = SELECT id, '</td><td>', grId, '</td><td>', xId, '</td><td>',
REPLACE(receiver, ',', '<br>'), '</td><td>', REPLACE(sender, ',', '<br>'), '</td><td>',
DATE_FORMAT(modified, '%d.%m.%Y<br>%H:%i:%s'), '</td><td style="word-break:break-word;">',
CONCAT('<b>', subject, '</b><br>', IF(@summary = 'true', CONCAT(SUBSTR(body, 1, LEAST(IF(INSTR(body, '\n') = 0, 50, INSTR(body, '\n')), IF(INSTR(body, '<br>') = 0, 50, INSTR(body, '<br>')))-1), ' ...'), CONCAT('<br>', REPLACE(body, '\n', '<br>'))) )
CONCAT('<b>', subject, '</b><br>', IF(@summary = 'true', CONCAT(SUBSTR(body, 1,
LEAST(IF(INSTR(body, '\n') = 0, 50, INSTR(body, '\n')), IF(INSTR(body, '<br>') = 0, 50,
INSTR(body, '<br>')))-1), ' ...'), CONCAT('<br>', REPLACE(body, '\n', '<br>'))) )
FROM MailLog WHERE (grId = @grId OR @grId = 0)
ORDER BY modified DESC
LIMIT 100
head = <table class="table table-condensed table-hover"><tr><th>Id</th><th>grId</th><th>xId</th><th>To</th><th>From</th><th>Date</th><th>E-Mail</th></tr>
head = <table class="table table-condensed table-hover"><tr>
<th>Id</th><th>grId</th><th>xId</th><th>To</th><th>From</th><th>Date</th><th>E-Mail</th></tr>
tail = </table>
rbeg = <tr><td>
rend = </td></tr>
}
_`Form Submit Log page`
_`form-submit-log-page`
Form Submit Log page
--------------------
......@@ -7464,7 +7472,8 @@ to edit `AutoCron` jobs: ::
10 {
# Table header.
sql = SELECT CONCAT('p:{{pageAlias:T}}&form=cron') AS _pagen, 'id', 'Next run','Frequency','Comment','Last run','In progress', 'Status' FROM (SELECT 1) AS fake WHERE '{{form:SE}}'=''
sql = SELECT CONCAT('p:{{pageAlias:T}}&form=cron') AS _pagen, 'id', 'Next run','Frequency','Comment',
'Last run','In progress', 'Status' FROM (SELECT 1) AS fake WHERE '{{form:SE}}'=''
head = <table class='table table-hover qfq-table-50'>
tail = </table>
rbeg = <thead><tr>
......@@ -7605,31 +7614,31 @@ QFQ offers an API endpoint for GET (and later POST,PUT,DELETE) operations. ::
<domain>/typo3conf/ext/qfq/Source/api/rest.php/<level1>/<id1>/<level2>/<id2>/.../?<var1>=<value1>&...
Append level names and ids after 'rest.php/...', separated by '/' each.
Append level names and ids after `rest.php/...`, separated by '/' each.
E.g.:
a) List of all persons: <domain>/typo3conf/ext/qfq/Source/api/rest.php/person
b) Data of person 123: <domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123
c) Adresses of person 123: <domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123/address
d) Adress details of address 45 from person 123: <domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123/address/45
1. List of all persons: `<domain>/typo3conf/ext/qfq/Source/api/rest.php/person`
2. Data of person 123: `<domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123`
3. Adresses of person 123: `<domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123/address`
4. Adress details of address 45 from person 123: `<domain>/typo3conf/ext/qfq/Source/api/rest.php/person/123/address/45`
QFQ 'Forms' are used as a 'container' to configure all necessary export/import details per 'level'.
Each 'level' is represented by a QFQ Form.
Only the last <level> of an URI will be processed. The former ones are just to fullfil a good looking REST API.
Only the last <level> of an URI will be processed. The former ones are just to fulfil a good looking REST API.
Important: the level name is the QFQ form name.
Each level name (=form name) is available via STORE_CLIENT and name '_formX'. E.g. in example
d) '{{_form1:C:alnumx}}'='person' and '{{_form2:C:alnumx}}'='address'.
Each level name (=form name) is available via STORE_CLIENT and name `_formX`. E.g. in example
(1) `{{_form1:C:alnumx}}=person` and `{{_form2:C:alnumx}}=address`.
Each level id is available via STORE_CLIENT and name '_idX'. E.g. in example
d) '{{_id1:C}}'='123' and '{{_id2:C}}'='45'.
Each level id is available via STORE_CLIENT and name `_idX`. E.g. in example
(2) `{{_id1:C}}=123` and `{{_id2:C}}=45`.
Also the 'id' after the last 'level' in the URI path (123 in example b), and 45 in example d) ) is copied to
variable 'r' in STORE_TYPO3, access it via '{{r:T}}'.
Also the `id` after the last `level` in the URI path, 123 in example (2) and 45 in example (4), is copied to
variable `r` in STORE_TYPO3, access it via `{{r:T}}`.
Export (GET)
......@@ -7639,17 +7648,19 @@ All data is exported in JSON notation.
A REST (GET) form has two modes: ::
a) data: specific content to a given id. Defined via 'form.parameter.restSqlData'. This mode is selected
if there is an id>0 given.
data
Specific content to a given id. Defined via 'form.parameter.restSqlData'. This mode is selected if there is an
id>0 given.
b) list: a list of records will be exported. Defined via 'form.parameter.restSqlList'. This mode is selected if there
is no id or id=0.
list
A list of records will be exported. Defined via 'form.parameter.restSqlList'. This mode is selected if there is no
id or id=0.
There are *no* FormElements.
To simplify access to id parameter of the URI, a mapping is possible via 'form.parameter.restParam'.
E.g. 'restParam=pId,adrId' with example d) makes '{{pId:C}}=123' and '{{adrId:C}}=45'. The order of variable
names corresponds to the position in the URI. _id1 is always mapped to the first parameter name, _id2 to
E.g. `restParam=pId,adrId` with example d) makes `{{pId:C}}=123` and `{{adrId:C}}=45`. The order of variable
names corresponds to the position in the URI. `_id1` is always mapped to the first parameter name, `_id2` to
the second one and so on.
GET Variables provided via URL are available via STORE_CLIENT as usual.
......@@ -7673,18 +7684,18 @@ Form.parameter:
| Attribute | Description |
+===================+==============================================================================+
| restSqlData | SQL query selects content shown in data mode. |
| | restSqlData={{!SELECT id, name, gender FROM Person WHERE id='{{r:T0}}'' }} |
| | `restSqlData={{!SELECT id, name, gender FROM Person WHERE id='{{r:T0}}'' }}` |
+-------------------+------------------------------------------------------------------------------+
| restSqlList | SQL query selects content shown in data mode. |
| | restSqlData={{!SELECT id, name FROM Person }} |
| | `restSqlData={{!SELECT id, name FROM Person }}` |
+-------------------+------------------------------------------------------------------------------+
| restParam | Optional. CSV list of variable names. E.g.: restParam=pId,adrId |
| restParam | Optional. CSV list of variable names. E.g.: `restParam=pId,adrId` |
+-------------------+------------------------------------------------------------------------------+
| restToken | Optional. User defined string. For dynamic token see below. |
+-------------------+------------------------------------------------------------------------------+
There are no `special-column-names`_ available in 'restSqlData' or 'restSqlList'. Also there are no
There are no `special-column-names`_ available in `restSqlData` or `restSqlList`. Also there are no
SIPs possible, cause REST typically does not offer sessions/cookies (which are necessary for SIPs).
Authorization
......@@ -7698,8 +7709,8 @@ QFQ internal 'HTTP header token based authorization'.
Token based authorization
'''''''''''''''''''''''''
A form will require a 'token based authorization', as soon as there is a 'form.parameter.restToken' defined.
Therefore the HTTP Header 'Authorization' has to be set with 'token=<secret token>'. The 'secret token' will
A form will require a 'token based authorization', as soon as there is a `form.parameter.restToken` defined.
Therefore the HTTP Header 'Authorization' has to be set with `token=<secret token>`. The 'secret token' will
be checked against the server. Using HTTPS, such token can't be sniffed and will typically not be logged in
any server logs.
......@@ -7709,17 +7720,19 @@ Example: ::
Test via commandline: curl -X GET -H 'Authorization: Token token=myCrypticString0123456789' "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/person/123/address/"
The static setup with 'form.parameter.restToken=myCrypticString0123456789' is fine, as long as only one token
The static setup with `form.parameter.restToken=myCrypticString0123456789 is fine, as long as only one token
exist. In case of multiple tokens, replace the static string against a SQL query.
General: The HTML Header Authorization token is available in STORE_CLIENT via '{{Authorization:C:alnumx}}'.
General: The HTML Header Authorization token is available in STORE_CLIENT via '`{{Authorization:C:alnumx}}`.
For example all created tokens are saved in a table 'Auth' with a column 'token'. Define: ::
form.parameter.restToken={{SELECT a.token FROM Auth AS a WHERE a.token='{{Authorization:C:alnumx}}' }}
To restrict access to a subset of data, just save the limitations inside the Auth record and update the query
to check it: ::
to check it:
.. code-block:: pmysql
form.parameter.restToken={{SELECT a.token FROM Auth AS a WHERE a.token='{{Authorization:C:alnumx}}'}}
form.parameter.restSqlList={{!SELECT p.id, p.name, p.email FROM Person AS p, Auth AS a WHERE a.token='{{Authorization:C:alnumx}}' AND a.attribute=p.attribute}}
......@@ -7748,7 +7761,9 @@ Report
------
Any HTML output can be extended by a tag - that's done by the webmaster. For QFQ generated links, an attribute like
'data-reference' might be injected via token 'A' (attribute). ::
'data-reference' might be injected via token 'A' (attribute).
.. code-block:: mysql
SELECT 'p:personedit&form=person&r=1|b|s|A:data-reference="person-edit"|t:Edit person' AS _link
......
Markdown is supported
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