From 4b373d523f7fd615cf7f59bf7c21b1b05023bbe8 Mon Sep 17 00:00:00 2001 From: "lina.wolf" Date: Tue, 15 Oct 2024 08:05:08 +0200 Subject: [PATCH 001/125] [TASK] Version for 13.4 Releases: 13.4 --- Documentation/guides.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/guides.xml b/Documentation/guides.xml index e151a98fa..1aed95559 100644 --- a/Documentation/guides.xml +++ b/Documentation/guides.xml @@ -3,19 +3,19 @@ xsi:schemaLocation="https://www.phpdoc.org/guides ../vendor/phpdocumentor/guides-cli/resources/schema/guides.xsd" links-are-relative="true"> From 8b7bbedcd23ed3ddd3d73a775307284a88e2860f Mon Sep 17 00:00:00 2001 From: "lina.wolf" Date: Tue, 15 Oct 2024 08:20:12 +0200 Subject: [PATCH 002/125] [TASK] 13.4 Release --- Documentation/TSconfig/Documentation/guides.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/TSconfig/Documentation/guides.xml b/Documentation/TSconfig/Documentation/guides.xml index 659f14eb9..b64505469 100644 --- a/Documentation/TSconfig/Documentation/guides.xml +++ b/Documentation/TSconfig/Documentation/guides.xml @@ -7,16 +7,16 @@ project-contact="https://typo3.slack.com/archives/C028JEPJL" project-repository="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" project-issues="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/issues" - edit-on-github-branch="main" + edit-on-github-branch="13.4" edit-on-github="TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" - typo3-core-preferred="main" + typo3-core-preferred="13" interlink-shortcode="t3tsconfig" confval-default="TSconfig" /> From dbc66995aea590af1bbdcbf8fda8bae68c68e248 Mon Sep 17 00:00:00 2001 From: "lina.wolf" Date: Thu, 17 Oct 2024 08:23:21 +0200 Subject: [PATCH 003/125] [TASK] Require TYPO3 13.4 Releases: 13.4 --- composer.json | 68 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/composer.json b/composer.json index 6b86abd0c..a6a69f459 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "description": "The TypoScript Reference (TSref) is a true reference describing the core Content Objects and functions available for Template building using the TypoScript template engine.", "license": "OPL-1.0", "require": { - "typo3/cms-core": "dev-main" + "typo3/cms-core": "^13.4" }, "minimum-stability": "dev", "prefer-stable": true, @@ -29,39 +29,39 @@ "friendsofphp/php-cs-fixer": "^3.46", "symfony/yaml": "^7.0", "t3docs/codesnippet": "dev-main", - "typo3/cms-adminpanel": "dev-main", - "typo3/cms-backend": "dev-main", - "typo3/cms-belog": "dev-main", - "typo3/cms-beuser": "dev-main", - "typo3/cms-dashboard": "dev-main", - "typo3/cms-extbase": "dev-main", - "typo3/cms-extensionmanager": "dev-main", - "typo3/cms-felogin": "dev-main", - "typo3/cms-filelist": "dev-main", - "typo3/cms-filemetadata": "dev-main", - "typo3/cms-fluid": "dev-main", - "typo3/cms-fluid-styled-content": "dev-main", - "typo3/cms-form": "dev-main", - "typo3/cms-frontend": "dev-main", - "typo3/cms-impexp": "dev-main", - "typo3/cms-indexed-search": "dev-main", - "typo3/cms-info": "dev-main", - "typo3/cms-install": "dev-main", - "typo3/cms-linkvalidator": "dev-main", - "typo3/cms-lowlevel": "dev-main", - "typo3/cms-opendocs": "dev-main", - "typo3/cms-recycler": "dev-main", - "typo3/cms-redirects": "dev-main", - "typo3/cms-reports": "dev-main", - "typo3/cms-rte-ckeditor": "dev-main", - "typo3/cms-scheduler": "dev-main", - "typo3/cms-seo": "dev-main", - "typo3/cms-setup": "dev-main", - "typo3/cms-sys-note": "dev-main", - "typo3/cms-t3editor": "dev-main", - "typo3/cms-tstemplate": "dev-main", - "typo3/cms-viewpage": "dev-main", - "typo3/cms-workspaces": "dev-main", + "typo3/cms-adminpanel": "^13.4", + "typo3/cms-backend": "^13.4", + "typo3/cms-belog": "^13.4", + "typo3/cms-beuser": "^13.4", + "typo3/cms-dashboard": "^13.4", + "typo3/cms-extbase": "^13.4", + "typo3/cms-extensionmanager": "^13.4", + "typo3/cms-felogin": "^13.4", + "typo3/cms-filelist": "^13.4", + "typo3/cms-filemetadata": "^13.4", + "typo3/cms-fluid": "^13.4", + "typo3/cms-fluid-styled-content": "^13.4", + "typo3/cms-form": "^13.4", + "typo3/cms-frontend": "^13.4", + "typo3/cms-impexp": "^13.4", + "typo3/cms-indexed-search": "^13.4", + "typo3/cms-info": "^13.4", + "typo3/cms-install": "^13.4", + "typo3/cms-linkvalidator": "^13.4", + "typo3/cms-lowlevel": "^13.4", + "typo3/cms-opendocs": "^13.4", + "typo3/cms-recycler": "^13.4", + "typo3/cms-redirects": "^13.4", + "typo3/cms-reports": "^13.4", + "typo3/cms-rte-ckeditor": "^13.4", + "typo3/cms-scheduler": "^13.4", + "typo3/cms-seo": "^13.4", + "typo3/cms-setup": "^13.4", + "typo3/cms-sys-note": "^13.4", + "typo3/cms-t3editor": "^13.4", + "typo3/cms-tstemplate": "^13.4", + "typo3/cms-viewpage": "^13.4", + "typo3/cms-workspaces": "^13.4", "t3docs/examples": "dev-main", "t3docs/site-package": "dev-main" }, From aa5c583ef59e29321d0956abb99d04f437959bf0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:25:07 +0200 Subject: [PATCH 004/125] [TASK] Display data processor aliases more prominent (#1356) * Move versionadded directive for alias to top. Will be removed from main and 13.4 in a follow up. * Mention FQN when introducing the data processor * Restructure menu and headlines for easier readability Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf --- .../CommaSeparatedValueProcessor.rst | 19 ++++++----- .../DataProcessing/CustomDataProcessors.rst | 5 --- .../DataProcessing/DatabaseQueryProcessor.rst | 21 ++++++------ .../DataProcessing/FilesProcessor.rst | 21 ++++++------ .../DataProcessing/FlexFormProcessor.rst | 20 ++++++------ .../DataProcessing/GalleryProcessor.rst | 19 ++++++----- Documentation/DataProcessing/Index.rst | 6 ++-- .../DataProcessing/LanguageMenuProcessor.rst | 20 ++++++------ .../DataProcessing/MenuProcessor.rst | 20 ++++++------ .../PageContentFetchingProcessor.rst | 12 ++++--- .../RecordTransformationProcessor.rst | 16 ++++------ .../DataProcessing/SiteLanguageProcessor.rst | 20 ++++++------ .../DataProcessing/SiteProcessor.rst | 20 ++++++------ .../DataProcessing/SplitProcessor.rst | 21 ++++++------ Documentation/TopLevelObjects/Config.rst | 32 +++++++++++++++++++ 15 files changed, 159 insertions(+), 113 deletions(-) diff --git a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst index 7b56dba1c..8daf07fe3 100644 --- a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst +++ b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: comma-separated-value .. include:: /Includes.rst.txt .. _CommaSeparatedValueProcessor: -============================ -CommaSeparatedValueProcessor -============================ +====================================== +`comma-separated-value` data processor +====================================== -The :php:`CommaSeparatedValueProcessor` allows to split values into a +.. versionadded:: 12.1 + One can use the alias :typoscript:`comma-separated-value` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor`, +alias `comma-separated-value`, allows to split values into a two-dimensional array used for :abbr:`CSV (Comma-separated values)` files or :sql:`tt_content` records of CType `table`. @@ -134,10 +141,6 @@ We define the :typoscript:`dataProcessing` property to use the .. include:: /CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`comma-separated-value` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor`. The Fluid template ------------------ diff --git a/Documentation/DataProcessing/CustomDataProcessors.rst b/Documentation/DataProcessing/CustomDataProcessors.rst index 8a69cfbeb..13cca9b51 100644 --- a/Documentation/DataProcessing/CustomDataProcessors.rst +++ b/Documentation/DataProcessing/CustomDataProcessors.rst @@ -17,11 +17,6 @@ data processor: The available configuration depends on the implementation of the specific custom data processor, of course. -.. versionadded:: 12.1 - One can configure a custom alias in :file:`Configuration/Services.yaml` - and use it in TypoScript instead of the fully-qualified class name. - - Example output ============== diff --git a/Documentation/DataProcessing/DatabaseQueryProcessor.rst b/Documentation/DataProcessing/DatabaseQueryProcessor.rst index 85fba8c83..93f854a29 100644 --- a/Documentation/DataProcessing/DatabaseQueryProcessor.rst +++ b/Documentation/DataProcessing/DatabaseQueryProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: database-query .. include:: /Includes.rst.txt .. _DatabaseQueryProcessor: -====================== -DatabaseQueryProcessor -====================== +=============================== +`database-query` data processor +=============================== -The :php:`DatabaseQueryProcessor` fetches records from the database, using +.. versionadded:: 12.1 + One can use the alias :typoscript:`database-query` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor`, +alias `database-query`, fetches records from the database, using standard TypoScript :ref:`select` semantics. The result is then passed to the :ref:`cobj-fluidtemplate` as an array. @@ -13,7 +20,7 @@ This way a :ref:`cobj-fluidtemplate` cObject can iterate over the array of records. .. versionadded:: 13.2 - The :php:`DatabaseQueryProcessor` can be used in combination with the + The :typoscript:`database-query` processor can be used in combination with the :ref:`RecordTransformationProcessor` to use additional computed information. .. _DatabaseQueryProcessor-options: @@ -118,10 +125,6 @@ We define the :typoscript:`dataProcessing` property to use the .. include:: /CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`database-query` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor`. The Fluid template diff --git a/Documentation/DataProcessing/FilesProcessor.rst b/Documentation/DataProcessing/FilesProcessor.rst index b80cf394b..c19b4215a 100644 --- a/Documentation/DataProcessing/FilesProcessor.rst +++ b/Documentation/DataProcessing/FilesProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: files .. include:: /Includes.rst.txt .. _FilesProcessor: -============== -FilesProcessor -============== +====================== +`files` data processor +====================== -This data processor can be used for processing file information: +.. versionadded:: 12.1 + One can use the alias :typoscript:`files` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\FilesProcessor`. + +This data processor :php:`\TYPO3\CMS\Frontend\DataProcessing\FilesProcessor`, +alias `files`, can be used for processing file information: * relations to file records (:sql:`sys_file_reference`) * fetch files records by their uids in table (:sql:`sys_file`) @@ -225,12 +232,6 @@ Using the :php:`FilesProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`files` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\FilesProcessor`. - - The Fluid template ------------------ diff --git a/Documentation/DataProcessing/FlexFormProcessor.rst b/Documentation/DataProcessing/FlexFormProcessor.rst index c5757ae76..4aa925189 100644 --- a/Documentation/DataProcessing/FlexFormProcessor.rst +++ b/Documentation/DataProcessing/FlexFormProcessor.rst @@ -1,14 +1,21 @@ +:navigation-title: flex-form .. include:: /Includes.rst.txt .. _FlexFormProcessor: .. index:: FlexForm, DataProcessing -================= -FlexFormProcessor -================= +========================== +`flex-form` data processor +========================== + +.. versionadded:: 12.1 + One can use the alias :typoscript:`flex-form` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor`. TYPO3 offers :ref:`FlexForms ` which can be used to store data within an XML structure inside a single database column. The data processor -:php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor` converts the +:php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor`, +alias `flex-form`, converts the FlexForm data of a given field into a Fluid-readable array. .. _FlexFormProcessor-options: @@ -84,11 +91,6 @@ Example of a minimal TypoScript configuration # Since TYPO3 v12.1 one can also use the available alias 10 = flex-form -.. versionadded:: 12.1 - One can use the alias :typoscript:`flex-form` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor`. - The converted array can be accessed within the Fluid template with the :html:`{flexFormData}` variable. diff --git a/Documentation/DataProcessing/GalleryProcessor.rst b/Documentation/DataProcessing/GalleryProcessor.rst index d871d778a..8570f18e5 100644 --- a/Documentation/DataProcessing/GalleryProcessor.rst +++ b/Documentation/DataProcessing/GalleryProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: gallery .. include:: /Includes.rst.txt .. _GalleryProcessor: -================ -GalleryProcessor -================ +======================== +`gallery` data processor +======================== -The :php:`GalleryProcessor` provides the logic for working with galleries and +.. versionadded:: 12.1 + One can use the alias :typoscript:`gallery` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor`, +alias `gallery`, provides the logic for working with galleries and calculates the maximum asset size. It uses the files already present in the `processedData` array for its calculations. The :ref:`FilesProcessor` can be used to fetch the files. @@ -254,10 +261,6 @@ in the :php:`GalleryProcessor` has to be equal to the content of .. include:: /CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`gallery` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor`. The Fluid template ------------------ diff --git a/Documentation/DataProcessing/Index.rst b/Documentation/DataProcessing/Index.rst index f138a8081..27e3e7b83 100644 --- a/Documentation/DataProcessing/Index.rst +++ b/Documentation/DataProcessing/Index.rst @@ -3,9 +3,9 @@ .. _cobj-fluidtemplate-properties-dataprocessing: .. _dataProcessing: -============== -dataProcessing -============== +=============== +Data processors +=============== :ref:`dataProcessing ` is a property of :ref:`cobj-fluidtemplate` and :ref:`cobj-pageview`. diff --git a/Documentation/DataProcessing/LanguageMenuProcessor.rst b/Documentation/DataProcessing/LanguageMenuProcessor.rst index ef543d10a..e08d5124a 100644 --- a/Documentation/DataProcessing/LanguageMenuProcessor.rst +++ b/Documentation/DataProcessing/LanguageMenuProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: language-menu .. include:: /Includes.rst.txt .. _LanguageMenuProcessor: -===================== -LanguageMenuProcessor -===================== +============================ +language-menu data processor +============================ -This menu processor generates a list of language menu items which can be +.. versionadded:: 12.1 + One can use the alias :typoscript:`language-menu` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`. + +The processor :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`, +alias `language-menu`, generates a list of language menu items which can be assigned to the :typoscript:`FLUIDTEMPLATE` as a variable. .. hint:: @@ -97,11 +104,6 @@ Using the :php:`LanguageMenuProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`language-menu` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`. - The Fluid template ------------------ diff --git a/Documentation/DataProcessing/MenuProcessor.rst b/Documentation/DataProcessing/MenuProcessor.rst index d53d92653..91ec22265 100644 --- a/Documentation/DataProcessing/MenuProcessor.rst +++ b/Documentation/DataProcessing/MenuProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: menu .. include:: /Includes.rst.txt .. _MenuProcessor: -============= -MenuProcessor -============= +===================== +`menu` data processor +===================== -The :php:`MenuProcessor` utilizes :ref:`HMENU ` to generate a list +.. versionadded:: 12.1 + One can use the alias :typoscript:`menu` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`, +alias `menu`, utilizes :ref:`HMENU ` to generate a list of menu items which can be assigned to :typoscript:`FLUIDTEMPLATE` as a variable. @@ -117,11 +124,6 @@ Using the :php:`MenuProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`menu` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`. - The Fluid template ------------------ diff --git a/Documentation/DataProcessing/PageContentFetchingProcessor.rst b/Documentation/DataProcessing/PageContentFetchingProcessor.rst index a53986017..0eb19ecb2 100644 --- a/Documentation/DataProcessing/PageContentFetchingProcessor.rst +++ b/Documentation/DataProcessing/PageContentFetchingProcessor.rst @@ -1,11 +1,15 @@ +:navigation-title: page-content .. include:: /Includes.rst.txt .. _PageContentFetchingProcessor: -============================ -PageContentFetchingProcessor -============================ +============================= +`page-content` data processor +============================= -This Data Processor loads all :sql:`tt_content` records from the current +.. versionadded:: 13.2 + +This data processor :php:`\TYPO3\CMS\Frontend\DataProcessing\PageContentFetchingProcessor`, +alias `page-content`, loads all :sql:`tt_content` records from the current :ref:`backend layout ` into the template with a given identifier for each :sql:`colPos`, also respecting slideMode or collect options based on the page layouts content columns. diff --git a/Documentation/DataProcessing/RecordTransformationProcessor.rst b/Documentation/DataProcessing/RecordTransformationProcessor.rst index 1fd7790d6..0b7548ebb 100644 --- a/Documentation/DataProcessing/RecordTransformationProcessor.rst +++ b/Documentation/DataProcessing/RecordTransformationProcessor.rst @@ -1,15 +1,17 @@ +:navigation-title: record-transformation .. include:: /Includes.rst.txt .. _RecordTransformationProcessor: -============================= -RecordTransformationProcessor -============================= +====================================== +`record-transformation` data processor +====================================== .. versionadded:: 13.2 A new TypoScript data processor for :ref:`FLUIDTEMPLATE ` and :typoscript:`PAGEVIEW` has been added. -The :typoscript:`record-transformation` Data Processor can typically be used in +The :php:`\TYPO3\CMS\Frontend\DataProcessing\RecordTransformationProcessor`, +alias `record-transformation`, can typically be used in conjunction with the DatabaseQuery Data Processor. The DatabaseQuery Data Processor typically fetches records from the database, and the :typoscript:`record-transformation` will take the result, and transforms @@ -26,12 +28,6 @@ addressed in a unified way. The `type` property contains the database table name and the actual type based on the record, such `tt_content.textmedia` for Content Elements. -.. note:: - - The Record object is available but details are still to be finalized in - the API until TYPO3 v13 LTS. Right now only the usage in Fluid is public - API. - .. _RecordTransformationProcessor-databasequeryprocessor-example: Example: Usage with the DatabaseQueryProcessor diff --git a/Documentation/DataProcessing/SiteLanguageProcessor.rst b/Documentation/DataProcessing/SiteLanguageProcessor.rst index a7db07c03..40223a4a1 100644 --- a/Documentation/DataProcessing/SiteLanguageProcessor.rst +++ b/Documentation/DataProcessing/SiteLanguageProcessor.rst @@ -1,13 +1,18 @@ +:navigation-title: site-language .. include:: /Includes.rst.txt .. _SiteLanguageProcessor: -===================== -SiteLanguageProcessor -===================== +============================== +`site-language` data processor +============================== -.. versionadded:: 12.0 +.. versionadded:: 12.1 + One can use the alias :typoscript:`site-language` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor`. -The :php:`SiteLanguageProcessor` fetches language-related data from the +The :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor`, +alias `site-language`, fetches language-related data from the :ref:`site configuration`. .. _SiteLanguageProcessor-options: @@ -43,11 +48,6 @@ Using the :php:`SiteLanguageProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`site-language` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor`. - The Fluid template ------------------ diff --git a/Documentation/DataProcessing/SiteProcessor.rst b/Documentation/DataProcessing/SiteProcessor.rst index f5e4c48ea..1e3d284cc 100644 --- a/Documentation/DataProcessing/SiteProcessor.rst +++ b/Documentation/DataProcessing/SiteProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: site .. include:: /Includes.rst.txt .. _SiteProcessor: -============= -SiteProcessor -============= +===================== +`site` data processor +===================== -The :php:`SiteProcessor` fetches data from the :ref:`site configuration +.. versionadded:: 12.1 + One can use the alias :typoscript:`site` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`, +alias `site`, fetches data from the :ref:`site configuration `. @@ -42,11 +49,6 @@ Using the :php:`SiteProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt -.. versionadded:: 12.1 - One can use the alias :typoscript:`site` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`. - The Fluid template ------------------ diff --git a/Documentation/DataProcessing/SplitProcessor.rst b/Documentation/DataProcessing/SplitProcessor.rst index ba760c560..e9601b683 100644 --- a/Documentation/DataProcessing/SplitProcessor.rst +++ b/Documentation/DataProcessing/SplitProcessor.rst @@ -1,11 +1,18 @@ +:navigation-title: split .. include:: /Includes.rst.txt .. _splitProcessor: -============== -SplitProcessor -============== +====================== +`split` data processor +====================== -The :php:`SplitProcessor` allows to split values separated with a delimiter +.. versionadded:: 12.1 + One can use the alias :typoscript:`split` instead + of the fully-qualified class name + :php:`\TYPO3\CMS\Frontend\DataProcessing\SplitProcessor`. + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\SplitProcessor`, +alias `split`, allows to split values separated with a delimiter from a single database field. The result is an array that can be iterated over. Whitespaces are automatically trimmed. @@ -130,12 +137,6 @@ With the help of the :php:`SplitProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt - -.. versionadded:: 12.1 - One can use the alias :typoscript:`split` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SplitProcessor`. - The Fluid template ------------------ diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index e8295070c..caf52bf43 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -885,6 +885,38 @@ Properties of 'config' both browser- and reverse-proxy caches and even make TYPO3 regenerate the page. Teach them that trick! + .. confval:: sendCacheHeadersForSharedCaches + :name: config-sendCacheHeadersForSharedCaches + :type: `auto`, `force`, or empty + + .. versionadded:: 13.3 + + When working with proxies, it is much helpful to take load + off of TYPO3 / the webserver by keeping a cached version for a period of + time and answering requests from the client, while still telling the + client to not cache the response inside the browser cache. + + This is achieved by setting + :typoscript:`config.sendCacheHeadersForSharedCaches = auto`. + + With this option enabled, TYPO3 evaluates if the current TYPO3 Frontend + request is executed behind a reverse proxy, and if so, TYPO3 sends the following + HTTP Response Headers at a cached response: + + .. code-block:: plaintext + + Expires: Thu, 26 Aug 2024 08:52:00 GMT + ETag: "d41d8cd98f00b204ecs00998ecf8427e" + Cache-Control: max-age=0, s-maxage=86400 + Pragma: public + + With :typoscript:`config.sendCacheHeadersForSharedCaches = force` the reverse + proxy evaluation can be omitted, which can be used for local webserver internal + caches. + + See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + for details and if your reverse proxy supports this directive. + .. confval:: showWebsiteTitle :name: config-showWebsiteTitle :type: :ref:`data-type-boolean` From 93344a747d835eeaeeff5740e1fe8bb8241b16cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:15:37 +0200 Subject: [PATCH 005/125] [TASK] Introduce confval menues for processor options (#1359) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf --- .../CommaSeparatedValueProcessor.rst | 127 ++++---- .../DataProcessing/DatabaseQueryProcessor.rst | 105 +++--- .../DataProcessing/FilesProcessor.rst | 276 +++++++--------- .../DataProcessing/FlexFormProcessor.rst | 68 ++-- .../DataProcessing/GalleryProcessor.rst | 304 ++++++++---------- .../DataProcessing/LanguageMenuProcessor.rst | 96 +++--- .../DataProcessing/MenuProcessor.rst | 117 +++---- .../PageContentFetchingProcessor.rst | 29 +- .../RecordTransformationProcessor.rst | 57 ++-- .../DataProcessing/SiteLanguageProcessor.rst | 32 +- .../DataProcessing/SiteProcessor.rst | 33 +- .../DataProcessing/SplitProcessor.rst | 149 ++++----- 12 files changed, 611 insertions(+), 782 deletions(-) diff --git a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst index 8daf07fe3..9d625cb7b 100644 --- a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst +++ b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst @@ -19,93 +19,81 @@ two-dimensional array used for :abbr:`CSV (Comma-separated values)` files or The table data is transformed to a multi-dimensional array, taking the delimiter and enclosure into account, before it is passed to the view. +.. contents:: Table of contents + .. _CommaSeparatedValueProcessor-options: Options: ======== -.. _CommaSeparatedValueProcessor-if: - -if --- - -.. confval:: if - :name: CommaSeparatedValueProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' - - If the condition is met, the data processor is processed. - -.. _CommaSeparatedValueProcessor-fieldName: +.. confval-menu:: + :display: table + :type: + :Default: -fieldName ---------- + .. _CommaSeparatedValueProcessor-if: -.. confval:: fieldName - :name: CommaSeparatedValueProcessor-fieldName - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: '' + .. confval:: if + :name: CommaSeparatedValueProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' - Name of the field in the processed ContentObjectRenderer. + If the condition is met, the data processor is processed. + .. _CommaSeparatedValueProcessor-fieldName: -.. _CommaSeparatedValueProcessor-as: + .. confval:: fieldName + :name: CommaSeparatedValueProcessor-fieldName + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: '' -as --- + Name of the field in the processed ContentObjectRenderer. -.. confval:: as - :name: CommaSeparatedValueProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: defaults to the fieldName - The variable's name to be used in the Fluid template. + .. _CommaSeparatedValueProcessor-as: -.. _CommaSeparatedValueProcessor-maximumColumns: + .. confval:: as + :name: CommaSeparatedValueProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: defaults to the fieldName -maximumColumns --------------- + The variable's name to be used in the Fluid template. -.. confval:: maximumColumns - :name: CommaSeparatedValueProcessor-maximumColumns - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: :typoscript:`0` + .. _CommaSeparatedValueProcessor-maximumColumns: - Maximal number of columns to be transformed. Surplus columns will be - silently dropped. When set to :typoscript:`0` (default) all columns will be - transformed. + .. confval:: maximumColumns + :name: CommaSeparatedValueProcessor-maximumColumns + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: :typoscript:`0` + Maximal number of columns to be transformed. Surplus columns will be + silently dropped. When set to :typoscript:`0` (default) all columns will be + transformed. -.. _CommaSeparatedValueProcessor-fieldDelimiter: + .. _CommaSeparatedValueProcessor-fieldDelimiter: -fieldDelimiter --------------- + .. confval:: fieldDelimiter + :name: CommaSeparatedValueProcessor-fieldDelimiter + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: :typoscript:`,` -.. confval:: fieldDelimiter - :name: CommaSeparatedValueProcessor-fieldDelimiter - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: :typoscript:`,` + The field delimiter, a character separating the values. - The field delimiter, a character separating the values. + .. _CommaSeparatedValueProcessor-fieldEnclosure: -.. _CommaSeparatedValueProcessor-fieldEnclosure: + .. confval:: fieldEnclosure + :name: CommaSeparatedValueProcessor-fieldEnclosure + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: :typoscript:`"` -fieldEnclosure --------------- - -.. confval:: fieldEnclosure - :name: CommaSeparatedValueProcessor-fieldEnclosure - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: :typoscript:`"` - - The field enclosure, a character surrounding the values. + The field enclosure, a character surrounding the values. .. _CommaSeparatedValueProcessor-examples: @@ -121,8 +109,7 @@ the values can be specified. This example is also described in-depth in :ref:`TYPO3 Explained: Extended content element example `. -Example data in the field :php:`bodytext` ------------------------------------------ +.. rubric:: Example data in the field :php:`bodytext` Field :sql:`bodytext` in table :sql:`tt_content`: @@ -132,27 +119,21 @@ Field :sql:`bodytext` in table :sql:`tt_content`: "This is row 2 column 1","This is row 2 column 2","This is row 2 column 3" "This is row 3 column 1","This is row 3 column 2","This is row 3 column 3" - -TypoScript ----------- +.. rubric:: TypoScript We define the :typoscript:`dataProcessing` property to use the :php:`CommaSeparatedValueProcessor`: .. include:: /CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid template In the Fluid template, you can iterate over the processed data. "myContentTable" can be used as a variable :html:`{myContentTable}` inside Fluid for iteration. .. include:: /CodeSnippets/DataProcessing/Template/DataProcCsv.rst.txt - -Output ------- +.. rubric:: Output Using :typoscript:`maximumColumns` limits the amount of columns in the multi dimensional array. In this example, the field data of the last column will be stripped off. Therefore the output would be: diff --git a/Documentation/DataProcessing/DatabaseQueryProcessor.rst b/Documentation/DataProcessing/DatabaseQueryProcessor.rst index 93f854a29..8c02322dd 100644 --- a/Documentation/DataProcessing/DatabaseQueryProcessor.rst +++ b/Documentation/DataProcessing/DatabaseQueryProcessor.rst @@ -19,6 +19,8 @@ standard TypoScript :ref:`select` semantics. The result is then passed to the This way a :ref:`cobj-fluidtemplate` cObject can iterate over the array of records. +.. contents:: Table of contents + .. versionadded:: 13.2 The :typoscript:`database-query` processor can be used in combination with the :ref:`RecordTransformationProcessor` to use additional computed information. @@ -28,70 +30,63 @@ array of records. Options: ======== -.. _DatabaseQueryProcessor-if: - -if --- - -.. confval:: if - :name: DatabaseQueryProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' - - Only if the condition is met the data processor is executed. +.. confval-menu:: + :display: table + :type: + :Default: + .. _DatabaseQueryProcessor-if: -.. _DatabaseQueryProcessor-table: + .. confval:: if + :name: DatabaseQueryProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' -table ------ + Only if the condition is met the data processor is executed. -.. confval:: table - :name: DatabaseQueryProcessor-table - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: '' - Name of the table from which the records should be fetched. + .. _DatabaseQueryProcessor-table: -.. _DatabaseQueryProcessor-as: + .. confval:: table + :name: DatabaseQueryProcessor-table + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: '' -as --- + Name of the table from which the records should be fetched. -.. confval:: as - :name: DatabaseQueryProcessor-as - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: 'records' + .. _DatabaseQueryProcessor-as: - The variable's name to be used in the Fluid template. + .. confval:: as + :name: DatabaseQueryProcessor-as + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: 'records' -.. _DatabaseQueryProcessor-dataProcessing: + The variable's name to be used in the Fluid template. -dataProcessing --------------- + .. _DatabaseQueryProcessor-dataProcessing: -.. confval:: dataProcessing - :name: DatabaseQueryProcessor-dataProcessing - :Required: false - :type: array of :ref:`dataProcessing` - :Default: [] + .. confval:: dataProcessing + :name: DatabaseQueryProcessor-dataProcessing + :Required: false + :type: array of :ref:`dataProcessing` + :Default: [] - Array of data processors to be applied to all fetched records. + Array of data processors to be applied to all fetched records. -.. note:: - All other options will be interpreted as in the TypoScript function - :typoscript:`select`, including :typoscript:`pidInList`, - :typoscript:`orderBy`, :typoscript:`where`, etc. See the reference of - :ref:`select`. + .. note:: + All other options will be interpreted as in the TypoScript function + :typoscript:`select`, including :typoscript:`pidInList`, + :typoscript:`orderBy`, :typoscript:`where`, etc. See the reference of + :ref:`select`. -.. warning:: - When using the DatabaseQueryProcessor, you may encounter issues with - language and/or versioning overlays, that currently can not be resolved. - See `here `__ for more - information. + .. warning:: + When using the DatabaseQueryProcessor, you may encounter issues with + language and/or versioning overlays, that currently can not be resolved. + See `here `__ for more + information. .. _DatabaseQueryProcessor-example-record-transformation: @@ -117,18 +112,14 @@ Example: Display haiku records Please see also :ref:`dataProcessing-about-examples`. -TypoScript ----------- +.. rubric:: TypoScript We define the :typoscript:`dataProcessing` property to use the :php:`DatabaseQueryProcessor`: .. include:: /CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt - - -The Fluid template ------------------- +.. rubric:: The Fluid template In the Fluid template then iterate over the records. As we used the recursive data processor :ref:`FilesProcessor` on the image records, we can also output @@ -136,9 +127,7 @@ the images. .. include:: /CodeSnippets/DataProcessing/Template/DataProcDb.rst.txt - -Output ------- +.. rubric:: Output Each entry of the records array contains the data of the table in :php:`data` and the data of the images in :php:`files`. diff --git a/Documentation/DataProcessing/FilesProcessor.rst b/Documentation/DataProcessing/FilesProcessor.rst index c19b4215a..53848a55f 100644 --- a/Documentation/DataProcessing/FilesProcessor.rst +++ b/Documentation/DataProcessing/FilesProcessor.rst @@ -22,200 +22,163 @@ alias `files`, can be used for processing file information: A :typoscript:`FLUIDTEMPLATE` can then iterate over processed data automatically. +.. contents:: Table of contents + .. _FilesProcessor-options: Options: ======== -.. _FilesProcessor-if: - -if --- - -.. confval:: if - :name: FilesProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' - - Only, if the condition is met the data processor is executed. - - -.. _FilesProcessor-references: - -references ----------- - -.. confval:: references - :name: FilesProcessor-references - :Required: false - :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` - :Default: '' - :Example: '1,303,42' - - If this option contains a comma-separated list of integers, these are - treated as uids of file references (:sql:`sys_file_reference`). - - The corresponding file records are added to the output array. - - :ref:`stdWrap` properties can also be used, see - :ref:`FilesProcessor-stdWrap-on-references`. - +.. confval-menu:: + :display: table + :type: + :Default: -.. _FilesProcessor-references-fieldName: + .. _FilesProcessor-if: -references.fieldName -~~~~~~~~~~~~~~~~~~~~ + .. confval:: if + :name: FilesProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' -.. confval:: references.fieldName - :name: FilesProcessor-references-fieldName - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: '' - :Example: 'media' + Only, if the condition is met the data processor is executed. - If both :typoscript:`references.fieldName` and - :typoscript:`references.table` are set, the file records are fetched from - the referenced table and field, for example the :sql:`media` field of a - :sql:`tt_content` record. + .. _FilesProcessor-references: + .. confval:: references + :name: FilesProcessor-references + :Required: false + :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` + :Default: '' + :Example: '1,303,42' -.. _FilesProcessor-references-table: + If this option contains a comma-separated list of integers, these are + treated as uids of file references (:sql:`sys_file_reference`). -references.table -~~~~~~~~~~~~~~~~ + The corresponding file records are added to the output array. -.. confval:: references.table - :name: FilesProcessor-references.table - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: '' - :Example: 'tt_content' + :ref:`stdWrap` properties can also be used, see + :ref:`FilesProcessor-stdWrap-on-references`. - If :typoscript:`references` should be interpreted as TypoScript - :ref:`select` function, :typoscript:`references.fieldName` must be set to - the desired field name of the table to be queried. + .. _FilesProcessor-references-fieldName: + .. confval:: references.fieldName + :name: FilesProcessor-references-fieldName + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: '' + :Example: 'media' -.. _FilesProcessor-files: + If both :typoscript:`references.fieldName` and + :typoscript:`references.table` are set, the file records are fetched from + the referenced table and field, for example the :sql:`media` field of a + :sql:`tt_content` record. -files ------ + .. _FilesProcessor-references-table: -.. confval:: files - :name: FilesProcessor-files - :Required: false - :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` - :Default: '' - :Example: '1,303,42' + .. confval:: references.table + :name: FilesProcessor-references.table + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: '' + :Example: 'tt_content' - If this option contains a comma-separated list of integers, - these are treated as uids of files (:sql:`sys_file`). + If :typoscript:`references` should be interpreted as TypoScript + :ref:`select` function, :typoscript:`references.fieldName` must be set to + the desired field name of the table to be queried. + .. _FilesProcessor-files: -.. _FilesProcessor-collections: + .. confval:: files + :name: FilesProcessor-files + :Required: false + :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` + :Default: '' + :Example: '1,303,42' -collections ------------ + If this option contains a comma-separated list of integers, + these are treated as uids of files (:sql:`sys_file`). -.. confval:: collections - :name: FilesProcessor-collections - :Required: false - :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` - :Default: '' - :Example: '1,303,42' + .. _FilesProcessor-collections: - If this option contains a comma-separated list of integers, - these are treated as uids of collections. The file records in each - collection are then being added to the output array. + .. confval:: collections + :name: FilesProcessor-collections + :Required: false + :type: :ref:`data-type-string` (comma-separated integers) / :ref:`stdWrap` + :Default: '' + :Example: '1,303,42' + If this option contains a comma-separated list of integers, + these are treated as uids of collections. The file records in each + collection are then being added to the output array. -.. _FilesProcessor-folders: + .. _FilesProcessor-folders: -folders -------- + .. confval:: folders + :name: FilesProcessor-folders + :Required: false + :type: :ref:`data-type-string` (comma-separated folders), :ref:`stdWrap` + :Default: "" + :Example: "23:/other/folder/" -.. confval:: folders - :name: FilesProcessor-folders - :Required: false - :type: :ref:`data-type-string` (comma-separated folders), :ref:`stdWrap` - :Default: "" - :Example: "23:/other/folder/" + Fetches all files from the referenced folders. The following syntax is + possible: - Fetches all files from the referenced folders. The following syntax is - possible: + `t3://folder?storage=2&identifier=/my/folder/` + Folder :file:`/my/folder/` from storage with uid `2` - `t3://folder?storage=2&identifier=/my/folder/` - Folder :file:`/my/folder/` from storage with uid `2` + `23:/other/folder/` + Folder :file:`/other/folder/` from storage with uid `23` - `23:/other/folder/` - Folder :file:`/other/folder/` from storage with uid `23` + `/folderInMyFileadmin/something/`: + Folder :file:`/folderInMyFileadmin/something/` from the default storage + `0` (:file:`fileadmin`) - `/folderInMyFileadmin/something/`: - Folder :file:`/folderInMyFileadmin/something/` from the default storage - `0` (:file:`fileadmin`) + .. _FilesProcessor-folders-recursive: + .. confval:: folders.recursive + :name: FilesProcessor-folders-recursive + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "" + :Example: "1" -.. _FilesProcessor-folders-recursive: + If set to a non-empty value file, records will be added from folders + recursively. -folders.recursive -~~~~~~~~~~~~~~~~~ + .. _FilesProcessor-sorting: -.. confval:: folders.recursive - :name: FilesProcessor-folders-recursive - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "" - :Example: "1" + .. confval:: sorting + :name: FilesProcessor-sorting + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "" + :Example: "filesize" - If set to a non-empty value file, records will be added from folders - recursively. + The property of the file records by which they should be sorted. + For example, filesize or title. + .. _FilesProcessor-sorting-direction: -.. _FilesProcessor-sorting: + .. confval:: sorting.direction + :name: FilesProcessor-sorting-direction + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "ascending" + :Example: "descending" -sorting -------- + The sorting direction (:typoscript:`ascending` or :typoscript:`descending`). -.. confval:: sorting - :name: FilesProcessor-sorting - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "" - :Example: "filesize" + .. _FilesProcessor-as: - The property of the file records by which they should be sorted. - For example, filesize or title. - - -.. _FilesProcessor-sorting-direction: - -sorting.direction -~~~~~~~~~~~~~~~~~ - -.. confval:: sorting.direction - :name: FilesProcessor-sorting-direction - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "ascending" - :Example: "descending" - - The sorting direction (:typoscript:`ascending` or :typoscript:`descending`). - - -.. _FilesProcessor-as: - -as --- - -.. confval:: as - :name: FilesProcessor-as - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "files" - - The variable name to be used in the Fluid template. + .. confval:: as + :name: FilesProcessor-as + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "files" + The variable name to be used in the Fluid template. .. _FilesProcessor-example-render-image: @@ -224,24 +187,19 @@ Example 1: Render the images stored in field image Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript Using the :php:`FilesProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt -The Fluid template ------------------- +.. rubric:: The Fluid template Then iterate over the files in the :ref:`Fluid ` template: .. include:: /CodeSnippets/DataProcessing/Template/DataProcFiles.rst.txt - -Output ------- +.. rubric:: Output The array :php:`images` contains the data of the files now: diff --git a/Documentation/DataProcessing/FlexFormProcessor.rst b/Documentation/DataProcessing/FlexFormProcessor.rst index 4aa925189..95cb084ed 100644 --- a/Documentation/DataProcessing/FlexFormProcessor.rst +++ b/Documentation/DataProcessing/FlexFormProcessor.rst @@ -18,60 +18,58 @@ data within an XML structure inside a single database column. The data processor alias `flex-form`, converts the FlexForm data of a given field into a Fluid-readable array. +.. contents:: Table of contents + .. _FlexFormProcessor-options: Options ======= -.. _FlexFormProcessor-fieldname: - -fieldname ---------- - -.. confval:: fieldname - :name: FlexFormProcessor-fieldname - :Required: false - :type: :ref:`data-type-string` - :Default: 'pi_flexform' +.. confval-menu:: + :display: table + :type: + :Default: - Field name of the column the FlexForm data is stored in. + .. _FlexFormProcessor-fieldname: + .. confval:: fieldname + :name: FlexFormProcessor-fieldname + :Required: false + :type: :ref:`data-type-string` + :Default: 'pi_flexform' -.. _FlexFormProcessor-references: + Field name of the column the FlexForm data is stored in. -references ----------- -.. confval:: references - :name: FlexFormProcessor-references + .. _FlexFormProcessor-references: - .. versionadded:: 13.0 - :Required: false - :type: array + .. confval:: references + :name: FlexFormProcessor-references - Associative array of FlexForm fields (key) and the according database field - (value). + .. versionadded:: 13.0 + :Required: false + :type: array - Each FlexForm field, which should be resolved, needs a reference definition - to the :ref:`foreign_match_fields `. - This reference is used in the :ref:`FilesProcessor ` to - resolve the correct :ref:`FAL ` resource. + Associative array of FlexForm fields (key) and the according database field + (value). - See :ref:`FlexFormProcessor-resolving-fal`. + Each FlexForm field, which should be resolved, needs a reference definition + to the :ref:`foreign_match_fields `. + This reference is used in the :ref:`FilesProcessor ` to + resolve the correct :ref:`FAL ` resource. + See :ref:`FlexFormProcessor-resolving-fal`. -.. _FlexFormProcessor-as: -as --- + .. _FlexFormProcessor-as: -.. confval:: as - :name: FlexFormProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: 'flexFormData' + .. confval:: as + :name: FlexFormProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: 'flexFormData' - Name for the variable in the Fluid template. + Name for the variable in the Fluid template. .. _FlexFormProcessor-examples: diff --git a/Documentation/DataProcessing/GalleryProcessor.rst b/Documentation/DataProcessing/GalleryProcessor.rst index 8570f18e5..01a270af9 100644 --- a/Documentation/DataProcessing/GalleryProcessor.rst +++ b/Documentation/DataProcessing/GalleryProcessor.rst @@ -17,226 +17,183 @@ calculates the maximum asset size. It uses the files already present in the `processedData` array for its calculations. The :ref:`FilesProcessor` can be used to fetch the files. +.. contents:: Table of contents + .. _GalleryProcessor-options: Options: ======== -.. _GalleryProcessor-if: - -if --- - -.. confval:: if - :name: GalleryProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' - - Only if the condition is met the data processor is executed. - - -.. _GalleryProcessor-filesProcessedDataKey: - -filesProcessedDataKey ---------------------- - -.. confval:: filesProcessedDataKey - :name: GalleryProcessor-filesProcessedDataKey - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: 'files' - :Example: 'myImages' - - Key of the array previously processed by the :php:`FilesProcessor`. - - -.. _GalleryProcessor-numberOfColumns: - -numberOfColumns ---------------- +.. confval-menu:: + :display: table + :type: + :Default: -.. confval:: numberOfColumns - :name: GalleryProcessor-numberOfColumns - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: field:imagecols - :Example: 4 + .. _GalleryProcessor-if: - Expects the desired number of columns. Defaults to the value of the field - `imagecols` (:guilabel:`Number of Columns`) if used with content elements. + .. confval:: if + :name: GalleryProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' + Only if the condition is met the data processor is executed. -.. _GalleryProcessor-mediaOrientation: -mediaOrientation ----------------- + .. _GalleryProcessor-filesProcessedDataKey: -.. confval:: mediaOrientation - :name: GalleryProcessor-mediaOrientation - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: field:imageorient - :Example: 2 + .. confval:: filesProcessedDataKey + :name: GalleryProcessor-filesProcessedDataKey + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: 'files' + :Example: 'myImages' - Expects the image orientation as used in the field `imageorient` in content - elements such as text with images. Defaults to the value of the field - `imageorient` (:guilabel:`Position and Alignment`) if used with content - elements. + Key of the array previously processed by the :php:`FilesProcessor`. - .. include:: /Images/AutomaticScreenshots/Fluidtemplate/ImageOrientation.rst.txt + .. _GalleryProcessor-numberOfColumns: -.. _GalleryProcessor-maxGalleryWidth: + .. confval:: numberOfColumns + :name: GalleryProcessor-numberOfColumns + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: field:imagecols + :Example: 4 -maxGalleryWidth ---------------- + Expects the desired number of columns. Defaults to the value of the field + `imagecols` (:guilabel:`Number of Columns`) if used with content elements. -.. confval:: maxGalleryWidth - :name: GalleryProcessor-maxGalleryWidth - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 600 + .. _GalleryProcessor-mediaOrientation: - Maximal gallery width in pixels. + .. confval:: mediaOrientation + :name: GalleryProcessor-mediaOrientation + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: field:imageorient + :Example: 2 + Expects the image orientation as used in the field `imageorient` in content + elements such as text with images. Defaults to the value of the field + `imageorient` (:guilabel:`Position and Alignment`) if used with content + elements. -.. _GalleryProcessor-maxGalleryWidthInText: + .. include:: /Images/AutomaticScreenshots/Fluidtemplate/ImageOrientation.rst.txt -maxGalleryWidthInText ---------------------- + .. _GalleryProcessor-maxGalleryWidth: -.. confval:: maxGalleryWidthInText - :name: GalleryProcessor-maxGalleryWidthInText - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 300 + .. confval:: maxGalleryWidth + :name: GalleryProcessor-maxGalleryWidth + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 600 - Maximal gallery width in pixels if displayed in a text. + Maximal gallery width in pixels. -.. _GalleryProcessor-equalMediaHeight: -.. _GalleryProcessor-equalMediaWidth: + .. _GalleryProcessor-maxGalleryWidthInText: -equalMediaHeight, equalMediaWidth ---------------------------------- + .. confval:: maxGalleryWidthInText + :name: GalleryProcessor-maxGalleryWidthInText + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 300 -.. confval:: equalMediaHeight, equalMediaWidth - :name: GalleryProcessor-equalMediaHeight - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: field:imageheight, field:imagewidth - :Example: 300 + Maximal gallery width in pixels if displayed in a text. - If set all images get scaled to a uniform height / width. Defaults - to the value of the fields `imageheight` (:guilabel:`Height of each element - (px)`), `imagewidth` (:guilabel:`Width of each element (px)`) if used with - content elements. + .. _GalleryProcessor-equalMediaHeight: + .. _GalleryProcessor-equalMediaWidth: - .. include:: /Images/AutomaticScreenshots/Fluidtemplate/MediaHeight.rst.txt + .. confval:: equalMediaHeight, equalMediaWidth + :name: GalleryProcessor-equalMediaHeight + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: field:imageheight, field:imagewidth + :Example: 300 + If set all images get scaled to a uniform height / width. Defaults + to the value of the fields `imageheight` (:guilabel:`Height of each element + (px)`), `imagewidth` (:guilabel:`Width of each element (px)`) if used with + content elements. -.. _GalleryProcessor-columnSpacing: + .. include:: /Images/AutomaticScreenshots/Fluidtemplate/MediaHeight.rst.txt -columnSpacing -------------- + .. _GalleryProcessor-columnSpacing: -.. confval:: columnSpacing - :name: GalleryProcessor-columnSpacing - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 0 - :Example: 4 + .. confval:: columnSpacing + :name: GalleryProcessor-columnSpacing + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 0 + :Example: 4 - Space between columns in pixels + Space between columns in pixels + .. _GalleryProcessor-borderEnabled: -.. _GalleryProcessor-borderEnabled: + .. confval:: borderEnabled + :name: GalleryProcessor-borderEnabled + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: field:imageborder + :Example: 1 -borderEnabled -------------- + Should there be a border around the images? Defaults to the value of the + fields `imageborder` (:guilabel:`Number of Columns`) if used with content + elements. -.. confval:: borderEnabled - :name: GalleryProcessor-borderEnabled - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: field:imageborder - :Example: 1 + .. _GalleryProcessor-borderWidth: - Should there be a border around the images? Defaults to the value of the - fields `imageborder` (:guilabel:`Number of Columns`) if used with content - elements. + .. confval:: borderWidth + :name: GalleryProcessor-borderWidth + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 0 + :Example: 2 -.. _GalleryProcessor-borderWidth: + Width of the border in pixels. -borderWidth ------------ + .. _GalleryProcessor-borderPadding: -.. confval:: borderWidth - :name: GalleryProcessor-borderWidth - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 0 - :Example: 2 + .. confval:: borderPadding + :name: GalleryProcessor-borderPadding + :Required: false + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 0 + :Example: 20 - Width of the border in pixels. + Padding around the border in pixels. -.. _GalleryProcessor-borderPadding: + .. _GalleryProcessor-cropVariant: -borderPadding -------------- + .. confval:: cropVariant + :name: GalleryProcessor-cropVariant + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "default" + :Example: "mobile" -.. confval:: borderPadding - :name: GalleryProcessor-borderPadding - :Required: false - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 0 - :Example: 20 + See :ref:`crop variants in the TCA reference ` - Padding around the border in pixels. + .. _GalleryProcessor-as: + .. confval:: as + :name: GalleryProcessor-as + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "files" -.. _GalleryProcessor-cropVariant: + The variable name to be used in the Fluid template. -cropVariant ------------ + .. _GalleryProcessor-dataProcessing: -.. confval:: cropVariant - :name: GalleryProcessor-cropVariant - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "default" - :Example: "mobile" + .. confval:: dataProcessing + :name: GalleryProcessor-dataProcessing + :Required: false + :type: array of :ref:`dataProcessing` + :Default: [] - See :ref:`crop variants in the TCA reference ` - - -.. _GalleryProcessor-as: - -as --- - -.. confval:: as - :name: GalleryProcessor-as - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "files" - - The variable name to be used in the Fluid template. - - -.. _GalleryProcessor-dataProcessing: - -dataProcessing --------------- - -.. confval:: dataProcessing - :name: GalleryProcessor-dataProcessing - :Required: false - :type: array of :ref:`dataProcessing` - :Default: [] - - Array of data processors to be applied to all fetched records. + Array of data processors to be applied to all fetched records. .. _GalleryProcessor-example-rows-columns: @@ -245,9 +202,7 @@ Example: display images in rows and columns Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript As the :php:`GalleryProcessor` expects the data of the files to be present in the the `processedData` array, the :php:`FilesProcessor` @@ -261,14 +216,11 @@ in the :php:`GalleryProcessor` has to be equal to the content of .. include:: /CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid template .. include:: /CodeSnippets/DataProcessing/Template/DataProcGallery.rst.txt -Output ------- +.. rubric:: Output The array now contains the images ordered in rows and columns. For each image there is a desired width and height supplied. diff --git a/Documentation/DataProcessing/LanguageMenuProcessor.rst b/Documentation/DataProcessing/LanguageMenuProcessor.rst index e08d5124a..ba66683aa 100644 --- a/Documentation/DataProcessing/LanguageMenuProcessor.rst +++ b/Documentation/DataProcessing/LanguageMenuProcessor.rst @@ -15,6 +15,8 @@ The processor :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`, alias `language-menu`, generates a list of language menu items which can be assigned to the :typoscript:`FLUIDTEMPLATE` as a variable. +.. contents:: Table of contents + .. hint:: The third-party extension `b13/menus `__ also provides @@ -24,70 +26,60 @@ assigned to the :typoscript:`FLUIDTEMPLATE` as a variable. `__ for more information. - .. _LanguageMenuProcessor-options: Options: ======== -.. _LanguageMenuProcessor-if: - -if --- - -.. confval:: if - :name: LanguageMenuProcessor-if - :Required: false - :type: :ref:`if` condition - - Only if the condition is met the data processor is executed. +.. confval-menu:: + :display: table + :type: + :Default: + .. _LanguageMenuProcessor-if: -.. _LanguageMenuProcessor-languages: + .. confval:: if + :name: LanguageMenuProcessor-if + :Required: false + :type: :ref:`if` condition -languages ---------- + Only if the condition is met the data processor is executed. -.. confval:: languages - :name: LanguageMenuProcessor-languages - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "auto" - :Example: "0,1,2" + .. _LanguageMenuProcessor-languages: - A list of comma-separated language IDs (e.g. 0,1,2) to use for the menu - creation or `auto` to load from the :ref:`site configuration - `. + .. confval:: languages + :name: LanguageMenuProcessor-languages + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "auto" + :Example: "0,1,2" + A list of comma-separated language IDs (e.g. 0,1,2) to use for the menu + creation or `auto` to load from the :ref:`site configuration + `. -.. _LanguageMenuProcessor-addQueryString-exclude: -addQueryString.exclude ----------------------- + .. _LanguageMenuProcessor-addQueryString-exclude: -.. confval:: addQueryString.exclude - :name: LanguageMenuProcessor-addQueryString-exclude - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "" - :Example: "gclid,contrast" + .. confval:: addQueryString.exclude + :name: LanguageMenuProcessor-addQueryString-exclude + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "" + :Example: "gclid,contrast" - A list of comma-separated parameter names to be excluded from the language - menu URLs. + A list of comma-separated parameter names to be excluded from the language + menu URLs. + .. _LanguageMenuProcessor-as: -.. _LanguageMenuProcessor-as: + .. confval:: as + :name: LanguageMenuProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: defaults to the fieldName -as --- - -.. confval:: as - :name: LanguageMenuProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: defaults to the fieldName - - The variable name to be used in the Fluid template. + The variable name to be used in the Fluid template. .. _LanguageMenuProcessor-example: @@ -96,25 +88,19 @@ Example: Menu of all language from site configuration Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript Using the :php:`LanguageMenuProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid template This generated menu can be used in Fluid like this: .. include:: /CodeSnippets/DataProcessing/Template/DataProcLangMenu.rst.txt - -Output ------- +.. rubric:: Output The array now contains information on all languages as defined in the site configuration. As the current page is not translated into German, the diff --git a/Documentation/DataProcessing/MenuProcessor.rst b/Documentation/DataProcessing/MenuProcessor.rst index 91ec22265..046acf1e9 100644 --- a/Documentation/DataProcessing/MenuProcessor.rst +++ b/Documentation/DataProcessing/MenuProcessor.rst @@ -18,6 +18,8 @@ variable. Additional data processing is supported and will be applied to each record. +.. contents:: Table of contents + .. hint:: The third party extension `b13/menus `__ also provides menu @@ -33,81 +35,68 @@ Additional data processing is supported and will be applied to each record. Options ======= -.. _MenuProcessor-levels: - -levels ------- - -.. confval:: levels - :name: MenuProcessor-levels - :Required: true - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 1 - :Example: 5 - - Maximal number of levels to be included in the output array. - - -.. _MenuProcessor-expandAll: +.. confval-menu:: + :display: table + :type: + :Default: -expandAll ---------- + .. _MenuProcessor-levels: -.. confval:: expandAll - :name: MenuProcessor-expandAll - :Required: true - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 1 - :Example: 0 + .. confval:: levels + :name: MenuProcessor-levels + :Required: true + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 1 + :Example: 5 - Include all submenus (`1`) or only those of the active pages (`0`). + Maximal number of levels to be included in the output array. + .. _MenuProcessor-expandAll: -.. _MenuProcessor-includeSpacer: + .. confval:: expandAll + :name: MenuProcessor-expandAll + :Required: true + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 1 + :Example: 0 -includeSpacer -------------- + Include all submenus (`1`) or only those of the active pages (`0`). -.. confval:: includeSpacer - :name: MenuProcessor-includeSpacer - :Required: true - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 0 - :Example: 1 + .. _MenuProcessor-includeSpacer: - Include pages with type "spacer". + .. confval:: includeSpacer + :name: MenuProcessor-includeSpacer + :Required: true + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 0 + :Example: 1 + Include pages with type "spacer". -.. _MenuProcessor-titleField: + .. _MenuProcessor-titleField: -titleField ----------- + .. confval:: titleField + :name: MenuProcessor-titleField + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "nav_title // title" + :Example: "subtitle" -.. confval:: titleField - :name: MenuProcessor-titleField - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "nav_title // title" - :Example: "subtitle" + Fields to be used as title. - Fields to be used as title. + .. _MenuProcessor-as: -.. _MenuProcessor-as: + .. confval:: as + :name: MenuProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: "menu" -as --- + Name for the variable in the Fluid template. -.. confval:: as - :name: MenuProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: "menu" - - Name for the variable in the Fluid template. - -.. hint:: - Additionally, all :ref:`HMENU options ` are available. + .. hint:: + Additionally, all :ref:`HMENU options ` are available. .. _MenuProcessor-example-two-levels: @@ -116,25 +105,19 @@ Example: Two level menu of the web page Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript Using the :php:`MenuProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid template This generated menu can be used in Fluid like this: .. include:: /CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt - -Output ------- +.. rubric:: Output The array now contains the menu items on level one. Each item in return has the menu items of level 2 in an array called :php:`children`. diff --git a/Documentation/DataProcessing/PageContentFetchingProcessor.rst b/Documentation/DataProcessing/PageContentFetchingProcessor.rst index 0eb19ecb2..6ceb183a7 100644 --- a/Documentation/DataProcessing/PageContentFetchingProcessor.rst +++ b/Documentation/DataProcessing/PageContentFetchingProcessor.rst @@ -14,28 +14,33 @@ alias `page-content`, loads all :sql:`tt_content` records from the current the template with a given identifier for each :sql:`colPos`, also respecting slideMode or collect options based on the page layouts content columns. +.. contents:: Table of contents + .. _PageContentFetchingProcessor-options: Options ======= .. confval-menu:: + :display: table + :type: + :Default: -.. confval:: as - :name: PageContentFetchingProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: "content" + .. confval:: as + :name: PageContentFetchingProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: "content" - Name for the variable in the Fluid template. + Name for the variable in the Fluid template. -.. confval:: if - :name: PageContentFetchingProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' + .. confval:: if + :name: PageContentFetchingProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' - Only if the condition is met the data processor is executed. + Only if the condition is met the data processor is executed. .. _PageContentFetchingProcessor-example: diff --git a/Documentation/DataProcessing/RecordTransformationProcessor.rst b/Documentation/DataProcessing/RecordTransformationProcessor.rst index 0b7548ebb..de3352f64 100644 --- a/Documentation/DataProcessing/RecordTransformationProcessor.rst +++ b/Documentation/DataProcessing/RecordTransformationProcessor.rst @@ -75,42 +75,49 @@ Overview of all possibilities: .. literalinclude:: _RecordTransformationProcessor/_FluidUsage.html :caption: Demonstration of available variables in Fluid +.. contents:: Table of contents + .. _RecordTransformationProcessor-options: Options: ======== -.. confval:: as - :name: RecordTransformationProcessor-as - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: 'record' or 'records' +.. confval-menu:: + :display: table + :type: + :Default: + + .. confval:: as + :name: RecordTransformationProcessor-as + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: 'record' or 'records' - The target variable containing the resolved record objects. - If empty, 'record' or 'records' (if multiple records are given) is used. + The target variable containing the resolved record objects. + If empty, 'record' or 'records' (if multiple records are given) is used. -.. confval:: if - :name: RecordTransformationProcessor-if - :type: :ref:`if` condition - :Default: '' + .. confval:: if + :name: RecordTransformationProcessor-if + :type: :ref:`if` condition + :Default: '' - Only if the condition is met the Data Processor is executed. + Only if the condition is met the Data Processor is executed. -.. confval:: table - :name: RecordTransformationProcessor-table - :type: :ref:`data-type-string` - :Default: auto-resolved + .. confval:: table + :name: RecordTransformationProcessor-table + :type: :ref:`data-type-string` + :Default: auto-resolved - The name of the database table of the records. Leave empty to auto-resolve - the table from context. + The name of the database table of the records. Leave empty to auto-resolve + the table from context. - If you are dealing with a custom data source you can adjust it here. + If you are dealing with a custom data source you can adjust it here. -.. confval:: variableName - :name: RecordTransformationProcessor-variableName - :type: :ref:`data-type-string` - :Default: 'data' + .. confval:: variableName + :name: RecordTransformationProcessor-variableName + :type: :ref:`data-type-string` + :Default: 'data' - The variable that contains the record(s) from a previous Data Processor, - or from a :ref:`FLUIDTEMPLATE ` view. + The variable that contains the record(s) from a previous Data Processor, + or from a :ref:`FLUIDTEMPLATE ` view. - If you are dealing with a custom data source you can adjust it here. + If you are dealing with a custom data source you can adjust it here. diff --git a/Documentation/DataProcessing/SiteLanguageProcessor.rst b/Documentation/DataProcessing/SiteLanguageProcessor.rst index 40223a4a1..6af942c9f 100644 --- a/Documentation/DataProcessing/SiteLanguageProcessor.rst +++ b/Documentation/DataProcessing/SiteLanguageProcessor.rst @@ -20,18 +20,20 @@ alias `site-language`, fetches language-related data from the Options ======= -.. _SiteLanguageProcessor-as: +.. confval-menu:: + :display: table + :type: + :Default: -as --- + .. _SiteLanguageProcessor-as: -.. confval:: as - :name: SiteLanguageProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: "site" + .. confval:: as + :name: SiteLanguageProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: "site" - The variable name to be used in the Fluid template. + The variable name to be used in the Fluid template. .. _SiteLanguageProcessor-example: @@ -40,26 +42,20 @@ Example: Output some data from the site language configuration Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript Using the :php:`SiteLanguageProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid template In the Fluid template the properties of the site language configuration can be accessed: .. include:: /CodeSnippets/DataProcessing/Template/DataProcSiteLanguage.rst.txt - -Output ------- +.. rubric:: Output The array now contains the information from the site language configuration: diff --git a/Documentation/DataProcessing/SiteProcessor.rst b/Documentation/DataProcessing/SiteProcessor.rst index 1e3d284cc..10f7bbf56 100644 --- a/Documentation/DataProcessing/SiteProcessor.rst +++ b/Documentation/DataProcessing/SiteProcessor.rst @@ -15,24 +15,27 @@ The :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`, alias `site`, fetches data from the :ref:`site configuration `. +.. contents:: Table of contents .. _SiteProcessor-options: Options ======= -.. _SiteProcessor-as: +.. confval-menu:: + :display: table + :type: + :Default: -as --- + .. _SiteProcessor-as: -.. confval:: as - :name: SiteProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: "site" + .. confval:: as + :name: SiteProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: "site" - The variable name to be used in the Fluid template. + The variable name to be used in the Fluid template. .. _SiteProcessor-examples: @@ -41,25 +44,19 @@ Example: Output some data from the site configuration Please see also :ref:`dataProcessing-about-examples`. - -TypoScript ----------- +.. rubric:: TypoScript Using the :php:`SiteProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt - -The Fluid template ------------------- +.. rubric:: The Fluid templat In the Fluid template the properties of the site configuration can be accessed: .. include:: /CodeSnippets/DataProcessing/Template/DataProcSite.rst.txt - -Output ------- +.. rubric:: Output The array now contains the information from the site configuration: diff --git a/Documentation/DataProcessing/SplitProcessor.rst b/Documentation/DataProcessing/SplitProcessor.rst index e9601b683..4026fd1ea 100644 --- a/Documentation/DataProcessing/SplitProcessor.rst +++ b/Documentation/DataProcessing/SplitProcessor.rst @@ -16,111 +16,91 @@ alias `split`, allows to split values separated with a delimiter from a single database field. The result is an array that can be iterated over. Whitespaces are automatically trimmed. +.. contents:: Table of contents + .. _splitProcessor-options: Options ======= -.. _splitProcessor-if: - -if --- - -.. confval:: if - :name: splitProcessor-if - :Required: false - :type: :ref:`if` condition - :Default: '' - - Only if the condition is met the data processor is executed. - - -.. _splitProcessor-fieldName: - -fieldName ---------- - -.. confval:: fieldName - :name: splitProcessor-fieldName - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: '' +.. confval-menu:: + :display: table + :type: + :Default: - Name of the field to be used. + .. _splitProcessor-if: + .. confval:: if + :name: splitProcessor-if + :Required: false + :type: :ref:`if` condition + :Default: '' -.. _splitProcessor-as: + Only if the condition is met the data processor is executed. -as --- + .. _splitProcessor-fieldName: -.. confval:: as - :name: splitProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: defaults to the fieldName + .. confval:: fieldName + :name: splitProcessor-fieldName + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: '' - The variable name to be used in the Fluid template. + Name of the field to be used. + .. _splitProcessor-as: -.. _splitProcessor-delimiter: + .. confval:: as + :name: splitProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: defaults to the fieldName -delimiter ---------- + The variable name to be used in the Fluid template. -.. confval:: delimiter - :name: splitProcessor-delimiter - :Required: false - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: Line Feed - :Example: "," + .. _splitProcessor-delimiter: - The field delimiter, a character separating the values. + .. confval:: delimiter + :name: splitProcessor-delimiter + :Required: false + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: Line Feed + :Example: "," + The field delimiter, a character separating the values. -.. _splitProcessor-filterIntegers: + .. _splitProcessor-filterIntegers: -filterIntegers --------------- + .. confval:: filterIntegers + :name: splitProcessor-filterIntegers + :Required: false + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 0 + :Example: 1 -.. confval:: filterIntegers - :name: splitProcessor-filterIntegers - :Required: false - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 0 - :Example: 1 + If set to `1`, all values are being cast to int. - If set to `1`, all values are being cast to int. + .. _splitProcessor-filterUnique: + .. confval:: filterUnique + :name: splitProcessor-filterUnique + :Required: false + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 0 + :Example: 1 -.. _splitProcessor-filterUnique: + If set to `1`, all duplicates will be removed. -filterUnique ------------- + .. _splitProcessor-removeEmptyEntries: -.. confval:: filterUnique - :name: splitProcessor-filterUnique - :Required: false - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 0 - :Example: 1 + .. confval:: removeEmptyEntries + :name: splitProcessor-removeEmptyEntries + :Required: false + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 0 + :Example: 1 - If set to `1`, all duplicates will be removed. - - -.. _splitProcessor-removeEmptyEntries: - -removeEmptyEntries ------------------- - -.. confval:: removeEmptyEntries - :name: splitProcessor-removeEmptyEntries - :Required: false - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 0 - :Example: 1 - - If set to `1`, all empty values will be removed. + If set to `1`, all empty values will be removed. .. _splitProcessor-example-split-url: @@ -130,23 +110,20 @@ Example: Splitting a URL Please see also :ref:`dataProcessing-about-examples`. -TypoScript ----------- +.. rubric:: TypoScript With the help of the :php:`SplitProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt -The Fluid template ------------------- + +.. rubric:: The Fluid template In the Fluid template then iterate over the split data: .. include:: /CodeSnippets/DataProcessing/Template/DataProcSplit.rst.txt - -Output ------- +.. rubric:: Output The array now contains the split strings: From a0476de7d12d676bf1f87de459ca503f44cdb778 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:19:45 +0200 Subject: [PATCH 006/125] [TASK] Use Core .editorconfig (#1362) With additional Makefile setting Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf --- .editorconfig | 67 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/.editorconfig b/.editorconfig index 25e24d98a..2913db533 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,25 +1,68 @@ -# EditorConfig is awesome: https://EditorConfig.org -# -# Use as master: https://github.com/TYPO3-Documentation/T3DocTeam/blob/main/.editorconfig +# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true -[{*.rst,*.rst.txt}] +# Unix-style newlines with a newline ending every file +[*] charset = utf-8 end_of_line = lf +indent_style = space +indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true -indent_style = space + +# TS/JS-Files +[*.{ts,js,mjs}] +indent_size = 2 + +# JSON-Files +[*.json] +indent_style = tab + +# ReST-Files +[*.{rst,rst.txt}] indent_size = 4 max_line_length = 80 -# MD-Files +# Markdown-Files [*.md] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 max_line_length = 80 + +# YAML-Files +[*.{yaml,yml}] +indent_size = 2 + +# NEON-Files +[*.neon] +indent_size = 2 +indent_style = tab + +# stylelint +[.stylelintrc] +indent_size = 2 + +# package.json +[package.json] +indent_size = 2 + +# TypoScript +[*.{typoscript,tsconfig}] +indent_size = 2 + +# XLF-Files +[*.xlf] +indent_style = tab + +# SQL-Files +[*.sql] +indent_style = tab +indent_size = 2 + +# .htaccess +[{_.htaccess,.htaccess}] +indent_style = tab + +[Makefile] +# Use tabs for indentation (Makefiles require tabs) +indent_style = tab From 3fd458ecd3421311ad2eaa3280ae18c5386a5d25 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:28:31 +0200 Subject: [PATCH 007/125] [TASK] Update codesnippets (#1364) Releases: main, 13.4 Co-authored-by: lina.wolf --- Documentation/CodeSnippets/Config/Menus.php | 26 ------------ .../DataProcessingTemplates.rst.txt | 7 ++-- .../Template/DataProcCsv.rst.txt | 1 - .../Template/DataProcCustom.rst.txt | 1 - .../Template/DataProcDb.rst.txt | 1 - .../Template/DataProcFiles.rst.txt | 1 - .../Template/DataProcGallery.rst.txt | 1 - .../Template/DataProcLangMenu.rst.txt | 1 - .../Template/DataProcMenu.rst.txt | 1 - .../Template/DataProcSite.rst.txt | 1 - .../Template/DataProcSiteLanguage.rst.txt | 1 - .../Template/DataProcSplit.rst.txt | 1 - .../CommaSeparatedValueProcessor.rst.txt | 4 -- .../CustomCategoryProcessor.rst.txt | 4 -- .../TypoScript/DatabaseQueryProcessor.rst.txt | 4 -- .../TypoScript/FilesProcessor.rst.txt | 4 -- .../TypoScript/GalleryProcessor.rst.txt | 7 ---- .../TypoScript/LanguageMenuProcessor.rst.txt | 4 -- .../TypoScript/MenuProcessor.rst.txt | 7 ---- .../TypoScript/SiteLanguageProcessor.rst.txt | 4 -- .../TypoScript/SiteProcessor.rst.txt | 4 -- .../TypoScript/SplitProcessor.rst.txt | 4 -- .../Template/BreadcrumbDataProcessor.rst.txt | 37 +++++++++-------- .../Template/MenuCategorizedPages.rst.txt | 1 - .../Menu/Template/MenuPages.rst.txt | 1 - .../Menu/Template/MenuRecentlyUpdated.rst.txt | 1 - .../Menu/Template/MenuRelatedPages.rst.txt | 1 - .../Menu/Template/MenuSubpages.rst.txt | 1 - .../BreadcrumbDataProcessor.rst.txt | 25 ------------ .../Menu/TypoScript/BreadcrumbLib.rst.txt | 25 ------------ .../Menu/TypoScript/LanguageMenuLib.rst.txt | 40 ------------------- .../TypoScript/MenuCategorizedPages.rst.txt | 1 - .../Menu/TypoScript/MenuPages.rst.txt | 1 - .../TypoScript/MenuRecentlyUpdated.rst.txt | 1 - .../Menu/TypoScript/MenuRelatedPages.rst.txt | 1 - .../Menu/TypoScript/MenuSubpages.rst.txt | 1 - .../Menu/TypoScript/RelPrevNextMenu.rst.txt | 32 --------------- Documentation/ContentObjects/Hmenu/Browse.rst | 3 +- .../ContentObjects/Hmenu/Language.rst | 7 ++-- .../ContentObjects/Hmenu/Rootline.rst | 6 ++- .../_BreadcrumbDataProcessor.typoscript | 14 +++++++ .../_code-snippets/_BreadcrumbLib.typoscript | 18 +++++++++ .../_LanguageMenuLib.typoscript | 35 ++++++++++++++++ .../_RelPrevNextMenu.typoscript | 26 ++++++++++++ 44 files changed, 126 insertions(+), 241 deletions(-) delete mode 100644 Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt delete mode 100644 Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt delete mode 100644 Documentation/CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt delete mode 100644 Documentation/CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt create mode 100644 Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript create mode 100644 Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript create mode 100644 Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript create mode 100644 Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript diff --git a/Documentation/CodeSnippets/Config/Menus.php b/Documentation/CodeSnippets/Config/Menus.php index b02176f13..929d48fcb 100644 --- a/Documentation/CodeSnippets/Config/Menus.php +++ b/Documentation/CodeSnippets/Config/Menus.php @@ -68,37 +68,11 @@ 'sourceFile' => 'EXT:fluid_styled_content/Resources/Private/Templates/MenuCategorizedPages.html', 'targetFileName' => 'CodeSnippets/Menu/Template/MenuCategorizedPages.rst.txt', ], - // special = browse - [ - 'action' => 'createCodeSnippet', - 'caption' => 'EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript', - 'sourceFile' => 'EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript', - 'targetFileName' => 'CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt', - ], // special = rootline - [ - 'action' => 'createCodeSnippet', - 'caption' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbLib.typoscript', - 'sourceFile' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbLib.typoscript', - 'targetFileName' => 'CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt', - ], - [ - 'action' => 'createCodeSnippet', - 'caption' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbDataProcessor.typoscript', - 'sourceFile' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbDataProcessor.typoscript', - 'targetFileName' => 'CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt', - ], [ 'action' => 'createCodeSnippet', 'caption' => 'EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html', 'sourceFile' => 'EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html', 'targetFileName' => 'CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt', ], - // special = language - [ - 'action' => 'createCodeSnippet', - 'caption' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript', - 'sourceFile' => 'EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript', - 'targetFileName' => 'CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt', - ], ]; diff --git a/Documentation/CodeSnippets/DataProcessing/DataProcessingTemplates.rst.txt b/Documentation/CodeSnippets/DataProcessing/DataProcessingTemplates.rst.txt index 47b3278d5..9ae07f452 100644 --- a/Documentation/CodeSnippets/DataProcessing/DataProcessingTemplates.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/DataProcessingTemplates.rst.txt @@ -5,8 +5,7 @@ :caption: EXT:examples/Configuration/TypoScript/DataProcessors/General.typoscript lib.contentElement { - templateRootPaths.200 = EXT:examples/Resources/Private/Templates/ContentElements/ - partialRootPaths.200 = EXT:examples/Resources/Private/Partials/ContentElements/ - layoutRootPaths.200 = EXT:examples/Resources/Private/Layout/ + templateRootPaths.200 = EXT:examples/Resources/Private/Templates/ContentElements/ + partialRootPaths.200 = EXT:examples/Resources/Private/Partials/ContentElements/ + layoutRootPaths.200 = EXT:examples/Resources/Private/Layout/ } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcCsv.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcCsv.rst.txt index c5e3362a4..d8d671410 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcCsv.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcCsv.rst.txt @@ -20,4 +20,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcCustom.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcCustom.rst.txt index 97579d0c3..40fa455ae 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcCustom.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcCustom.rst.txt @@ -18,4 +18,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcDb.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcDb.rst.txt index 3dadf821c..84d8dd184 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcDb.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcDb.rst.txt @@ -26,4 +26,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcFiles.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcFiles.rst.txt index 7440a8b5f..04f29681f 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcFiles.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcFiles.rst.txt @@ -25,4 +25,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcGallery.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcGallery.rst.txt index cc0d773c9..e731d05c8 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcGallery.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcGallery.rst.txt @@ -25,4 +25,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcLangMenu.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcLangMenu.rst.txt index 5dfd13fbd..ea4293699 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcLangMenu.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcLangMenu.rst.txt @@ -31,4 +31,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt index baf242f20..eabbc5b90 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt @@ -49,4 +49,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSite.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSite.rst.txt index 28b194d06..5d3f7994d 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSite.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSite.rst.txt @@ -13,4 +13,3 @@

Base url: {site.configuration.base}

- \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSiteLanguage.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSiteLanguage.rst.txt index 4c21ad9e7..faef9527d 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSiteLanguage.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSiteLanguage.rst.txt @@ -13,4 +13,3 @@

language id: {language.languageId}

- \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSplit.rst.txt b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSplit.rst.txt index 202b977ed..f757b5f04 100644 --- a/Documentation/CodeSnippets/DataProcessing/Template/DataProcSplit.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/Template/DataProcSplit.rst.txt @@ -15,4 +15,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt index 1e7edcdf6..1f9f38c35 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/CommaSeparatedValueProcessor.rst.txt @@ -8,9 +8,6 @@ examples_newcontentcsv =< lib.contentElement examples_newcontentcsv { templateName = DataProcCsv - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = comma-separated-value dataProcessing.10 { if.isTrue.field = bodytext @@ -22,4 +19,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/CustomCategoryProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/CustomCategoryProcessor.rst.txt index c18956094..cff35d0ea 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/CustomCategoryProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/CustomCategoryProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataproccustom =< lib.contentElement examples_dataproccustom { templateName = DataProcCustom - # Before TYPO3 v12.1 you have to give the fully-qualified class name of the processor - # dataProcessing.10 = T3docs\Examples\DataProcessing\CustomCategoryProcessor - # Since TYPO3 v12.1 one can also use a (in Services.yaml) configured alias dataProcessing.10 = custom-category dataProcessing.10 { as = categories @@ -18,4 +15,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt index 113be1ae5..d04fc21ba 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataprocdb =< lib.contentElement examples_dataprocdb { templateName = DataProcDb - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = database-query dataProcessing.10 { if.isTrue.field = pages @@ -28,4 +25,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt index 6c68fd394..74f4dfa26 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/FilesProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataprocfiles =< lib.contentElement examples_dataprocfiles { templateName = DataProcFiles - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = files dataProcessing.10 { as = images @@ -21,4 +18,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt index b62e9bac3..7a6fc82cd 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/GalleryProcessor.rst.txt @@ -10,9 +10,6 @@ templateName = DataProcGallery dataProcessing { # Process files - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor - # Since TYPO3 v12.1 one can also use the available alias 10 = files 10 { as = images @@ -23,9 +20,6 @@ } # Calculate gallery info - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # 20 = TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor - # Since TYPO3 v12.1 one can also use the available alias 20 = gallery 20 { filesProcessedDataKey = images @@ -44,4 +38,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt index 6b576449b..5655698a5 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/LanguageMenuProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataproclang =< lib.contentElement examples_dataproclang { templateName = DataProcLangMenu - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = language-menu dataProcessing.10 { languages = auto @@ -18,4 +15,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt index 730577e75..90b33b25c 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataprocmenu =< lib.contentElement examples_dataprocmenu { templateName = DataProcMenu - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = menu dataProcessing.10 { levels = 2 @@ -19,9 +16,6 @@ includeSpacer = 1 titleField = nav_title // title dataProcessing { - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor - # Since TYPO3 v12.1 one can also use the available alias 10 = files 10 { references.fieldName = media @@ -30,4 +24,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt index 63c0bdc7e..a9168572d 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteLanguageProcessor.rst.txt @@ -8,13 +8,9 @@ examples_dataprocsitelanguage =< lib.contentElement examples_dataprocsitelanguage { templateName = DataProcSiteLanguage - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = site-language dataProcessing.10 { as = language } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt index 69da9a0e0..25593869c 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt @@ -8,13 +8,9 @@ examples_dataprocsite =< lib.contentElement examples_dataprocsite { templateName = DataProcSite - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\SiteProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = site dataProcessing.10 { as = site } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt index 7ade1bf1f..1b33b3d94 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/SplitProcessor.rst.txt @@ -8,9 +8,6 @@ examples_dataprocsplit =< lib.contentElement examples_dataprocsplit { templateName = DataProcSplit - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\SplitProcessor - # Since TYPO3 v12.1 one can also use the available alias dataProcessing.10 = split dataProcessing.10 { as = urlParts @@ -22,4 +19,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt b/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt index d2b9a3cb4..363342b8d 100644 --- a/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt @@ -5,21 +5,24 @@ :caption: EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html - +
+ +
- \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/MenuCategorizedPages.rst.txt b/Documentation/CodeSnippets/Menu/Template/MenuCategorizedPages.rst.txt index b80c04427..56f39a7c6 100644 --- a/Documentation/CodeSnippets/Menu/Template/MenuCategorizedPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/MenuCategorizedPages.rst.txt @@ -22,4 +22,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/MenuPages.rst.txt b/Documentation/CodeSnippets/Menu/Template/MenuPages.rst.txt index 7f3550f74..c894d5ab0 100644 --- a/Documentation/CodeSnippets/Menu/Template/MenuPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/MenuPages.rst.txt @@ -21,4 +21,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/MenuRecentlyUpdated.rst.txt b/Documentation/CodeSnippets/Menu/Template/MenuRecentlyUpdated.rst.txt index e8dd28c80..4cfdf1696 100644 --- a/Documentation/CodeSnippets/Menu/Template/MenuRecentlyUpdated.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/MenuRecentlyUpdated.rst.txt @@ -22,4 +22,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/MenuRelatedPages.rst.txt b/Documentation/CodeSnippets/Menu/Template/MenuRelatedPages.rst.txt index 4233312f0..458eeae81 100644 --- a/Documentation/CodeSnippets/Menu/Template/MenuRelatedPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/MenuRelatedPages.rst.txt @@ -22,4 +22,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/Template/MenuSubpages.rst.txt b/Documentation/CodeSnippets/Menu/Template/MenuSubpages.rst.txt index 9b74b0873..33d84fd46 100644 --- a/Documentation/CodeSnippets/Menu/Template/MenuSubpages.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/MenuSubpages.rst.txt @@ -22,4 +22,3 @@ - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt deleted file mode 100644 index ef7d3f845..000000000 --- a/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbDataProcessor.typoscript - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbDataProcessor.typoscript - - // include this breadcrumb menu in your Fluid template: - // - - page { - 10 = FLUIDTEMPLATE - 10 { - dataProcessing { - 1657927210 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 1657927210 { - special = rootline - special.range = 0|-1 - includeNotInMenu = 0 - as = breadcrumb - } - } - } - } - - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt deleted file mode 100644 index acb0b6c9a..000000000 --- a/Documentation/CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbLib.typoscript - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbLib.typoscript - - // include this breadcrumb menu in your Fluid template: - // - - lib.breadcrumb = HMENU - lib.breadcrumb { - wrap = - special = rootline - special.range = 1|-1 - // render the menu - 1 = TMENU - 1 { - NO.wrapItemAndSub =
  • |
  • - // render the current page without link and with additional classs - CUR = 1 - CUR.doNotLinkIt = 1 - CUR.wrapItemAndSub =
  • |
  • - } - } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt deleted file mode 100644 index cc9f57cdb..000000000 --- a/Documentation/CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt +++ /dev/null @@ -1,40 +0,0 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript - - lib.langMenu = HMENU - lib.langMenu { - special = language - special.value = 0,1,2 - wrap =
      |
    - 1 = TMENU - 1 { - NO = 1 - NO { - linkWrap =
  • |
  • - doNotLinkIt = 1 - stdWrap.override = en || de || fr - stdWrap.typolink { - parameter.data = page:uid - additionalParams = &L=0 || &L=1 || &L=2 - addQueryString = 1 - addQueryString.exclude = L,id - - } - } - // We are in the current language - ACT < .NO - ACT { - linkWrap =
  • |
  • - } - // No translation available - USERDEF1 < .NO - USERDEF1 { - linkWrap =
  • |
  • - stdWrap.typolink > - } - } - } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/MenuCategorizedPages.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/MenuCategorizedPages.rst.txt index 78b1f3ac0..6200ffa2b 100644 --- a/Documentation/CodeSnippets/Menu/TypoScript/MenuCategorizedPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/TypoScript/MenuCategorizedPages.rst.txt @@ -31,4 +31,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/MenuPages.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/MenuPages.rst.txt index cd8543a56..9dd3dc978 100644 --- a/Documentation/CodeSnippets/Menu/TypoScript/MenuPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/TypoScript/MenuPages.rst.txt @@ -26,4 +26,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/MenuRecentlyUpdated.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/MenuRecentlyUpdated.rst.txt index bcbbf9a4a..ee1ff00da 100644 --- a/Documentation/CodeSnippets/Menu/TypoScript/MenuRecentlyUpdated.rst.txt +++ b/Documentation/CodeSnippets/Menu/TypoScript/MenuRecentlyUpdated.rst.txt @@ -30,4 +30,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/MenuRelatedPages.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/MenuRelatedPages.rst.txt index e35207a3f..5a279aa95 100644 --- a/Documentation/CodeSnippets/Menu/TypoScript/MenuRelatedPages.rst.txt +++ b/Documentation/CodeSnippets/Menu/TypoScript/MenuRelatedPages.rst.txt @@ -30,4 +30,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/MenuSubpages.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/MenuSubpages.rst.txt index 3648670b4..6f32c6f0a 100644 --- a/Documentation/CodeSnippets/Menu/TypoScript/MenuSubpages.rst.txt +++ b/Documentation/CodeSnippets/Menu/TypoScript/MenuSubpages.rst.txt @@ -26,4 +26,3 @@ } } } - \ No newline at end of file diff --git a/Documentation/CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt b/Documentation/CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt deleted file mode 100644 index e77de0dbe..000000000 --- a/Documentation/CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript - - page { - headerData { - // https://developers.google.com/search/blog/2011/09/pagination-with-relnext-and-relprev - 10 = HMENU - 10 { - special = browse - special { - items = prev|next - items.prevnextToSection = 1 - excludeNoSearchPages = 1 - } - 1 = TMENU - 1.NO { - allWrap = |*| - doNotLinkIt = 1 - stdWrap { - typolink { - parameter.data = field:uid - returnLast = url - } - } - } - } - } - } - \ No newline at end of file diff --git a/Documentation/ContentObjects/Hmenu/Browse.rst b/Documentation/ContentObjects/Hmenu/Browse.rst index d62920dfc..a6fa53a8b 100644 --- a/Documentation/ContentObjects/Hmenu/Browse.rst +++ b/Documentation/ContentObjects/Hmenu/Browse.rst @@ -215,4 +215,5 @@ The following snippet uses a :ref:`HMENU ` with The menu excludes pages with the flag :guilabel:`Include in Search` removed and jumps to the next section when the last of subpages is reached. -.. include:: /CodeSnippets/Menu/TypoScript/RelPrevNextMenu.rst.txt +.. literalinclude:: _code-snippets/_RelPrevNextMenu.typoscript + :caption: EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript diff --git a/Documentation/ContentObjects/Hmenu/Language.rst b/Documentation/ContentObjects/Hmenu/Language.rst index a4b33dd26..0cd6f3250 100644 --- a/Documentation/ContentObjects/Hmenu/Language.rst +++ b/Documentation/ContentObjects/Hmenu/Language.rst @@ -53,11 +53,12 @@ Properties Example: Create a language menu with pure TypoScript ==================================================== -.. include:: /CodeSnippets/Menu/TypoScript/LanguageMenuLib.rst.txt +.. literalinclude:: _code-snippets/_LanguageMenuLib.typoscript + :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript .. seealso:: - For a language menu styled by Fluid see - :ref:`LanguageMenuProcessor `. + For a language menu styled by Fluid see + :ref:`LanguageMenuProcessor `. Note on item states ==================== diff --git a/Documentation/ContentObjects/Hmenu/Rootline.rst b/Documentation/ContentObjects/Hmenu/Rootline.rst index c684894e6..43c2f222b 100644 --- a/Documentation/ContentObjects/Hmenu/Rootline.rst +++ b/Documentation/ContentObjects/Hmenu/Rootline.rst @@ -84,7 +84,8 @@ Breadcrumb styled with Fluid The following breadcrumb menu is created with the :ref:`MenuProcessor `, based on the HMENU. It is styled via Fluid: -.. include:: /CodeSnippets/Menu/TypoScript/BreadcrumbDataProcessor.rst.txt +.. literalinclude:: _code-snippets/_BreadcrumbDataProcessor.typoscript + :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbDataProcessor.typoscript The following Fluid partial can be used to style the breadcrumb menu: @@ -97,7 +98,8 @@ Breadcrumb with pure TypoScript The following breadcrumb menu is styled with pure Typoscript: -.. include:: /CodeSnippets/Menu/TypoScript/BreadcrumbLib.rst.txt +.. literalinclude:: _code-snippets/_BreadcrumbLib.typoscript + :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/BreadcrumbLib.typoscript .. _hmenu-special-rootline-range-example: diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript b/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript new file mode 100644 index 000000000..396877f8b --- /dev/null +++ b/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript @@ -0,0 +1,14 @@ +page { + 10 = FLUIDTEMPLATE + 10 { + dataProcessing { + 1657927210 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 1657927210 { + special = rootline + special.range = 0|-1 + includeNotInMenu = 0 + as = breadcrumb + } + } + } +} diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript b/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript new file mode 100644 index 000000000..3ab1e26d9 --- /dev/null +++ b/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript @@ -0,0 +1,18 @@ +// include this breadcrumb menu in your Fluid template: +// + +lib.breadcrumb = HMENU +lib.breadcrumb { + wrap = + special = rootline + special.range = 1|-1 + // render the menu + 1 = TMENU + 1 { + NO.wrapItemAndSub =
  • |
  • + // render the current page without link and with additional classs + CUR = 1 + CUR.doNotLinkIt = 1 + CUR.wrapItemAndSub =
  • |
  • + } +} diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript b/Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript new file mode 100644 index 000000000..36cbef931 --- /dev/null +++ b/Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript @@ -0,0 +1,35 @@ +lib.langMenu = HMENU +lib.langMenu { + special = language + special.value = 0,1,2 + wrap =
      |
    + 1 = TMENU + 1 { + NO = 1 + NO { + linkWrap =
  • |
  • + doNotLinkIt = 1 + stdWrap.override = en || de || fr + stdWrap.typolink { + parameter.data = page:uid + additionalParams = &L=0 || &L=1 || &L=2 + addQueryString = 1 + addQueryString.exclude = L,id + + } + } + + // We are in the current language + ACT < .NO + ACT { + linkWrap =
  • |
  • + } + + // No translation available + USERDEF1 < .NO + USERDEF1 { + linkWrap =
  • |
  • + stdWrap.typolink > + } + } +} diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript b/Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript new file mode 100644 index 000000000..33f328765 --- /dev/null +++ b/Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript @@ -0,0 +1,26 @@ +page { + headerData { + // https://developers.google.com/search/blog/2011/09/pagination-with-relnext-and-relprev + 10 = HMENU + 10 { + special = browse + special { + items = prev|next + items.prevnextToSection = 1 + excludeNoSearchPages = 1 + } + + 1 = TMENU + 1.NO { + allWrap = |*| + doNotLinkIt = 1 + stdWrap { + typolink { + parameter.data = field:uid + returnLast = url + } + } + } + } + } +} From fdd1480518ef2062f486d0a5adfbc0aa884dd60b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 06:51:49 +0200 Subject: [PATCH 008/125] [TASK] Remove outdated warning from FLUIDTEMPLATE.template (#1370) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/ContentObjects/Fluidtemplate/Index.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Documentation/ContentObjects/Fluidtemplate/Index.rst b/Documentation/ContentObjects/Fluidtemplate/Index.rst index 851249b42..a3545ef84 100644 --- a/Documentation/ContentObjects/Fluidtemplate/Index.rst +++ b/Documentation/ContentObjects/Fluidtemplate/Index.rst @@ -292,14 +292,6 @@ Properties a template file. It is an alternative to ".file"; if ".template" is set, it takes precedence. - .. warning:: - - The :typoscript:`FILE` object type has been removed in TYPO3 v10. As the :typoscript:`.template` - property used :typoscript:`FILE`, you should generally check your code to see if - this is used and switch to using :ref:`.templateName ` - with :ref:`.templateRootPaths ` or use - :ref:`.file `. - .. _cobj-fluidtemplate-properties-templatename: .. confval:: templateName From 5f075aaf8f26cdb4a33a7973aa7fc5b0af164797 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 08:13:58 +0200 Subject: [PATCH 009/125] [TASK] #105230 - Declare TypoScriptFrontendController deprecated (#1367) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Related: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1074 Releases: main, 13.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/AppendixA/Index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/AppendixA/Index.rst b/Documentation/AppendixA/Index.rst index 8b5b6b9e7..74fff9867 100644 --- a/Documentation/AppendixA/Index.rst +++ b/Documentation/AppendixA/Index.rst @@ -57,6 +57,11 @@ This will stdWrap the content with the properties of `.stdWrap` of the TypoScriptFrontendController, TSFE ================================== +.. deprecated:: 13.4 + The class :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` + and its global instance :php:`$GLOBALS['TSFE']` have been marked as + deprecated. The class will be removed with TYPO3 v14. + You can retrieve the :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController` via the :ref:`request ` attribute :ref:`frontend.controller `. From aef030a0103a47d02a0f52dd1fa4c30801df85ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 08:37:50 +0200 Subject: [PATCH 010/125] [TASK] Remove TYPO3 v12.4 related version hints (#1371) Releases: main, 13.4 Co-authored-by: lina.wolf --- Documentation/Conditions/Index.rst | 9 ++---- .../ContentObjects/Extbaseplugin/Index.rst | 30 +------------------ .../ContentObjects/Fluidtemplate/Index.rst | 18 ----------- .../ContentObjects/Hmenu/Tmenu/Index.rst | 10 ------- .../CommaSeparatedValueProcessor.rst | 5 ---- .../DataProcessing/DatabaseQueryProcessor.rst | 5 ---- .../DataProcessing/FilesProcessor.rst | 5 ---- .../DataProcessing/FlexFormProcessor.rst | 14 --------- .../DataProcessing/GalleryProcessor.rst | 5 ---- .../DataProcessing/LanguageMenuProcessor.rst | 5 ---- .../DataProcessing/MenuProcessor.rst | 5 ---- .../DataProcessing/SiteLanguageProcessor.rst | 5 ---- .../DataProcessing/SiteProcessor.rst | 5 ---- .../DataProcessing/SplitProcessor.rst | 5 ---- Documentation/Functions/Data.rst | 12 +++----- Documentation/Functions/If.rst | 6 ---- Documentation/Functions/Stdwrap.rst | 2 -- Documentation/Functions/Typolink.rst | 5 ---- Documentation/TopLevelObjects/Config.rst | 6 ---- Documentation/TopLevelObjects/Module.rst | 8 ++--- Documentation/TopLevelObjects/Page/Index.rst | 6 ---- Documentation/TopLevelObjects/Plugin.rst | 2 -- Documentation/UsingSetting/Constants.rst | 15 +--------- Documentation/UsingSetting/Debugging.rst | 20 ------------- Documentation/UsingSetting/Entering.rst | 26 +--------------- .../UsingSetting/TheConstantEditor.rst | 11 ++----- 26 files changed, 17 insertions(+), 228 deletions(-) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 44cf5518d..811153567 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -940,18 +940,15 @@ ip() request() ========= -.. deprecated:: 12.3 - Using this function in **page TSconfig** or **user TSconfig** conditions is - deprecated. Such conditions will stop working with TYPO3 v13 and will then - always evaluate to false. For migration hints see the - :ref:`changelog `. - .. confval:: request() :name: condition-request :type: Mixed Allows to fetch information from current request. + .. note:: This function cannot be used in **page TSconfig** or + **user TSconfig** conditions. They always evaluate to false. + .. tip:: Checking for the :ref:`request object ` before using in a condition may be necessary, for example, when using diff --git a/Documentation/ContentObjects/Extbaseplugin/Index.rst b/Documentation/ContentObjects/Extbaseplugin/Index.rst index 1953d5074..6d54f3f05 100644 --- a/Documentation/ContentObjects/Extbaseplugin/Index.rst +++ b/Documentation/ContentObjects/Extbaseplugin/Index.rst @@ -1,13 +1,12 @@ .. include:: /Includes.rst.txt .. index:: Content objects; EXTBASEPLUGIN +.. _cobj-extbaseplugin-history: .. _cobj-extbaseplugin: ============= EXTBASEPLUGIN ============= -.. versionadded:: 12.3 - The content object :typoscript:`EXTBASEPLUGIN` allows to render :ref:`Extbase ` plugins. @@ -98,30 +97,3 @@ action by getting the currentContentObject from the request: :php-short:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer` as potential user input. Do not use it unescaped and do not trust to receive certain types. - -.. _cobj-extbaseplugin-history: - -History -======= - -The :typoscript:`EXTBASEPLUGIN` allows Extbase authors to not reference the -Extbase Bootstrap class anymore, like for previous TYPO3 versions below version -12. - -Previously, TypoScript code for Extbase plugins looked like this: - -.. code-block:: typoscript - - page.10 = USER - page.10 { - userFunc = TYPO3\\CMS\\Extbase\\Core\\Bootstrap->run - extensionName = MyExtension - pluginName = MyPlugin - } - -This way still works, but it is recommended to use the -:typoscript:`EXTBASEPLUGIN` content object, as the direct reference to a PHP -class (Bootstrap) might be optimized in future versions. - -For extension that need to remain compatible with TYPO3 v11 and v12, the -Bootstrap way should be used. diff --git a/Documentation/ContentObjects/Fluidtemplate/Index.rst b/Documentation/ContentObjects/Fluidtemplate/Index.rst index a3545ef84..189e080e2 100644 --- a/Documentation/ContentObjects/Fluidtemplate/Index.rst +++ b/Documentation/ContentObjects/Fluidtemplate/Index.rst @@ -115,24 +115,6 @@ Properties Sets the extension name of the controller. - .. warning:: - Up to TYPO3 v11, this property could be used as an alternative to the `extensionName` - argument in the :ref:`f:translate ` - and :ref:`f:uri.resource ` ViewHelpers, - provided that translations and public images were stored in the usual paths in your extension. - - Since TYPO3 v12 this is no longer supported and it is recommended to either use absolute keys: - - .. code-block:: html - - - - or the `extensionName` argument plus `key` argument in the ViewHelper: - - .. code-block:: html - - - .. _cobj-fluidtemplate-properties-extbase-controllername: .. confval:: extbase.controllerName diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst index 8c7b8cf0f..c2bd98b39 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst @@ -171,14 +171,6 @@ Properties has clicked a menu item and the menu folds out the next level. This can enable that to happen on all items as default. - .. confval:: collapse (removed) - :name: menu-common-properties-collapse - - .. versionchanged:: 12.0 - The property was removed with TYPO3 v12.0. Use a custom user function or - the PSR-14 event :ref:`t3coreapi:FilterMenuItemsEvent` to modify the menu - items. - .. confval:: sectionIndex :name: menu-common-properties-sectionIndex :type: :ref:`data-type-boolean` @@ -466,8 +458,6 @@ Properties holding the page ID of the page coming from (could be used to look up which fe\_groups was required for access. - .. versionadded:: 12.3 - **.ATagParams**: Add custom attributes to the anchor tag. .. rubric:: Example diff --git a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst index 9d625cb7b..0fbbb3204 100644 --- a/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst +++ b/Documentation/DataProcessing/CommaSeparatedValueProcessor.rst @@ -6,11 +6,6 @@ `comma-separated-value` data processor ====================================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`comma-separated-value` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor`, alias `comma-separated-value`, allows to split values into a two-dimensional array used for :abbr:`CSV (Comma-separated values)` files or diff --git a/Documentation/DataProcessing/DatabaseQueryProcessor.rst b/Documentation/DataProcessing/DatabaseQueryProcessor.rst index 8c02322dd..acad1d342 100644 --- a/Documentation/DataProcessing/DatabaseQueryProcessor.rst +++ b/Documentation/DataProcessing/DatabaseQueryProcessor.rst @@ -6,11 +6,6 @@ `database-query` data processor =============================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`database-query` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor`, alias `database-query`, fetches records from the database, using standard TypoScript :ref:`select` semantics. The result is then passed to the diff --git a/Documentation/DataProcessing/FilesProcessor.rst b/Documentation/DataProcessing/FilesProcessor.rst index 53848a55f..9b5598e07 100644 --- a/Documentation/DataProcessing/FilesProcessor.rst +++ b/Documentation/DataProcessing/FilesProcessor.rst @@ -6,11 +6,6 @@ `files` data processor ====================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`files` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\FilesProcessor`. - This data processor :php:`\TYPO3\CMS\Frontend\DataProcessing\FilesProcessor`, alias `files`, can be used for processing file information: diff --git a/Documentation/DataProcessing/FlexFormProcessor.rst b/Documentation/DataProcessing/FlexFormProcessor.rst index 95cb084ed..705ef324d 100644 --- a/Documentation/DataProcessing/FlexFormProcessor.rst +++ b/Documentation/DataProcessing/FlexFormProcessor.rst @@ -7,11 +7,6 @@ `flex-form` data processor ========================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`flex-form` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor`. - TYPO3 offers :ref:`FlexForms ` which can be used to store data within an XML structure inside a single database column. The data processor :php:`\TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor`, @@ -84,9 +79,6 @@ Example of a minimal TypoScript configuration .. code-block:: typoscript :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor - # Since TYPO3 v12.1 one can also use the available alias 10 = flex-form The converted array can be accessed within the Fluid template with the @@ -100,9 +92,6 @@ Example of an advanced TypoScript configuration .. code-block:: typoscript :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor - # Since TYPO3 v12.1 one can also use the available alias 10 = flex-form 10 { fieldName = my_flexform_field @@ -120,9 +109,6 @@ Example with a custom sub-processor .. code-block:: typoscript :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript - # Before TYPO3 v12.1 you have to specify the fully-qualified class name of the processor - # dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FlexFormProcessor - # Since TYPO3 v12.1 one can also use the available alias 10 = flex-form 10 { fieldName = my_flexform_field diff --git a/Documentation/DataProcessing/GalleryProcessor.rst b/Documentation/DataProcessing/GalleryProcessor.rst index 01a270af9..9742739f7 100644 --- a/Documentation/DataProcessing/GalleryProcessor.rst +++ b/Documentation/DataProcessing/GalleryProcessor.rst @@ -6,11 +6,6 @@ `gallery` data processor ======================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`gallery` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\GalleryProcessor`, alias `gallery`, provides the logic for working with galleries and calculates the maximum asset size. It uses the files already present in diff --git a/Documentation/DataProcessing/LanguageMenuProcessor.rst b/Documentation/DataProcessing/LanguageMenuProcessor.rst index ba66683aa..3acbe292d 100644 --- a/Documentation/DataProcessing/LanguageMenuProcessor.rst +++ b/Documentation/DataProcessing/LanguageMenuProcessor.rst @@ -6,11 +6,6 @@ language-menu data processor ============================ -.. versionadded:: 12.1 - One can use the alias :typoscript:`language-menu` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`. - The processor :php:`\TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor`, alias `language-menu`, generates a list of language menu items which can be assigned to the :typoscript:`FLUIDTEMPLATE` as a variable. diff --git a/Documentation/DataProcessing/MenuProcessor.rst b/Documentation/DataProcessing/MenuProcessor.rst index 046acf1e9..6864c7908 100644 --- a/Documentation/DataProcessing/MenuProcessor.rst +++ b/Documentation/DataProcessing/MenuProcessor.rst @@ -6,11 +6,6 @@ `menu` data processor ===================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`menu` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`, alias `menu`, utilizes :ref:`HMENU ` to generate a list of menu items which can be assigned to :typoscript:`FLUIDTEMPLATE` as a diff --git a/Documentation/DataProcessing/SiteLanguageProcessor.rst b/Documentation/DataProcessing/SiteLanguageProcessor.rst index 6af942c9f..9c2c4e170 100644 --- a/Documentation/DataProcessing/SiteLanguageProcessor.rst +++ b/Documentation/DataProcessing/SiteLanguageProcessor.rst @@ -6,11 +6,6 @@ `site-language` data processor ============================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`site-language` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteLanguageProcessor`, alias `site-language`, fetches language-related data from the :ref:`site configuration`. diff --git a/Documentation/DataProcessing/SiteProcessor.rst b/Documentation/DataProcessing/SiteProcessor.rst index 10f7bbf56..653465d50 100644 --- a/Documentation/DataProcessing/SiteProcessor.rst +++ b/Documentation/DataProcessing/SiteProcessor.rst @@ -6,11 +6,6 @@ `site` data processor ===================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`site` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\SiteProcessor`, alias `site`, fetches data from the :ref:`site configuration `. diff --git a/Documentation/DataProcessing/SplitProcessor.rst b/Documentation/DataProcessing/SplitProcessor.rst index 4026fd1ea..58b4095e9 100644 --- a/Documentation/DataProcessing/SplitProcessor.rst +++ b/Documentation/DataProcessing/SplitProcessor.rst @@ -6,11 +6,6 @@ `split` data processor ====================== -.. versionadded:: 12.1 - One can use the alias :typoscript:`split` instead - of the fully-qualified class name - :php:`\TYPO3\CMS\Frontend\DataProcessing\SplitProcessor`. - The :php:`\TYPO3\CMS\Frontend\DataProcessing\SplitProcessor`, alias `split`, allows to split values separated with a delimiter from a single database field. The result is an array that can be iterated over. diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index a124c6b51..7ec5f0eef 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -994,13 +994,11 @@ siteLanguage configuration setting. :typoscript:`hreflang` - .. versionchanged:: 12.4 - This option is not relevant anymore for regular websites without - rendering hreflang tag, but is now customizable, and has a proper - fallback. - The language tag for this language defined by RFC 1766 / 3066 for - :html:`hreflang` attributes + :html:`hreflang` attributes. + + This option is not relevant for regular websites without + rendering hreflang tag. :typoscript:`languageId` The language mapped to the ID of the site language. @@ -1048,8 +1046,6 @@ Example: Get values from the current site language siteSettings ------------ -.. versionadded:: 12.1 - .. confval:: siteSettings :name: data-siteSettings diff --git a/Documentation/Functions/If.rst b/Documentation/Functions/If.rst index ba68eb5a0..adbbe298f 100644 --- a/Documentation/Functions/If.rst +++ b/Documentation/Functions/If.rst @@ -70,8 +70,6 @@ bitAnd contains -------- -.. versionadded:: 12.1 - .. confval:: contains :name: if-contains :type: value / :ref:`stdwrap` @@ -119,8 +117,6 @@ directReturn endsWith -------- -.. versionadded:: 12.1 - .. confval:: endsWith :name: if-endsWith :type: value / :ref:`stdwrap` @@ -302,8 +298,6 @@ negate startsWith ---------- -.. versionadded:: 12.1 - .. confval:: startsWith :name: if-startsWith :type: value / :ref:`stdwrap` diff --git a/Documentation/Functions/Stdwrap.rst b/Documentation/Functions/Stdwrap.rst index f032fb9e5..075dbd1d4 100644 --- a/Documentation/Functions/Stdwrap.rst +++ b/Documentation/Functions/Stdwrap.rst @@ -867,8 +867,6 @@ strftime formattedDate ~~~~~~~~~~~~~ -.. versionadded:: 12.3 - .. confval:: formattedDate :name: stdwrap-formattedDate :type: :ref:`data-type-string` diff --git a/Documentation/Functions/Typolink.rst b/Documentation/Functions/Typolink.rst index 333f1374a..2fd769f73 100644 --- a/Documentation/Functions/Typolink.rst +++ b/Documentation/Functions/Typolink.rst @@ -165,12 +165,7 @@ addQueryString query arguments are never added by default. This is the recommended behaviour. - .. versionchanged:: 12.0 - Before TYPO3 v12 this setting added all query parameters. To ensure - the previous behaviour use :typoscript:`untrusted`. - :typoscript:`untrusted` - .. versionadded:: 12.0 Any given query parameters of the current request are added. diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index caf52bf43..a5ae0999a 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -484,8 +484,6 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: `0` - .. versionadded:: 12.1 - If this option is set, all links, reference to images or assets previously built with a relative or absolute path (for example, :file:`/fileadmin/my-pdf.pdf`) will be rendered as absolute URLs @@ -922,8 +920,6 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: 1 - .. versionadded:: 12.0 - The option can be used to specify whether the website title defined in the :ref:`site configuration ` should be added to the page title (used for the :html:`` tag, for example). @@ -1002,8 +998,6 @@ Properties of 'config' :type: :ref:`data-type-string` :Example: :ref:`setup-config-typolinklinkaccessrestrictedpages` - .. versionadded:: 12.3 - `typolinkLinkAccessRestrictedPages.ATagParams` Add custom attributes to the anchor tag. diff --git a/Documentation/TopLevelObjects/Module.rst b/Documentation/TopLevelObjects/Module.rst index 30147f20a..1088049bc 100644 --- a/Documentation/TopLevelObjects/Module.rst +++ b/Documentation/TopLevelObjects/Module.rst @@ -18,9 +18,9 @@ settings should be done globally and not changed on a per-page basis. Therefore they are usually done in the file :ref:`EXT:my_extension/ext_typoscript_setup.typoscript <t3coreapi:ext_typoscript_setup_typoscript>`. -.. versionchanged:: 12.0 +.. note:: All Core extensions, and in general all extensions - that switch to the :ref:`simplified backend templating <changelog:feature-96812>` + that switched to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been superseded by a general override strategy based on TSconfig: :ref:`templates <t3tsconfig:pagetemplates>`. @@ -77,7 +77,7 @@ view.templateRootPaths :name: module-view-templateRootPaths :type: file path with :ref:`stdWrap <stdwrap>` - .. versionchanged:: 12.0 + .. note:: All Core extensions, and in general all extensions that switch to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been @@ -115,7 +115,7 @@ view.partialRootPaths :name: module-view-partialRootPaths :type: file path with :ref:`stdWrap <stdwrap>` - .. versionchanged:: 12.0 + .. note:: All Core extensions, and in general all extensions that switch to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index 58750d548..a84f4d2c5 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -326,8 +326,6 @@ Properties `title` Setting the title of the :html:`<style>` tag. - .. versionadded:: 12.1 - Additional data attributes can be configured using a key-value list. .. confval:: includeCSSLibs.[array] @@ -374,8 +372,6 @@ Properties `title` Setting the title of the :html:`<style>` tag. - .. versionadded:: 12.1 - Additional data attributes can be configured using a key-value list. .. confval:: includeJS.[array] @@ -444,8 +440,6 @@ Properties resources externalized to CDN's. See `SRI <https://www.w3.org/TR/SRI/>`_ for more details. Integrity hashes may be generated using `<https://srihash.org/>`_. - .. versionadded:: 12.1 - `data` Array with key/value for additional attributes to be added to the script tag. diff --git a/Documentation/TopLevelObjects/Plugin.rst b/Documentation/TopLevelObjects/Plugin.rst index a5606a8fd..1707e7029 100644 --- a/Documentation/TopLevelObjects/Plugin.rst +++ b/Documentation/TopLevelObjects/Plugin.rst @@ -102,8 +102,6 @@ plugins. :type: :ref:`data-type-string` :Example: :ref:`Ignore certain FlexForm settings if empty <setup-plugin-configuration-ignoreFlexFormSettingsIfEmpty-example>` - .. versionadded:: 12.3 - Define :ref:`FlexForm <t3coreapi:flexforms>` settings that will be ignored in the extension settings merge process, if their value is considered empty (either an empty string or a string containing `0`). diff --git a/Documentation/UsingSetting/Constants.rst b/Documentation/UsingSetting/Constants.rst index 5ff334d53..f825db637 100644 --- a/Documentation/UsingSetting/Constants.rst +++ b/Documentation/UsingSetting/Constants.rst @@ -7,17 +7,12 @@ Constants ========= -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - .. figure:: /Images/ManualScreenshots/TypoScriptModule/ConstantEditor.png :alt: Screenshot of the TYPO3 Backend showing the constant editor The :ref:`Constant Editor <constant-editor>` in the TYPO3 backend -Constants are values defined in the :guilabel:`Constants` field of a template. They +Constants are values defined in the :guilabel:`Constants` field of a template. They follow the :ref:`syntax of ordinary TypoScript <t3coreapi:typoscript-syntax-syntax>` and are case sensitive! They are used to manage *in a single place* values, which are later used in *several places*. @@ -145,14 +140,6 @@ replacement in green: .. figure:: /Images/ManualScreenshots/TypoScriptModule/ConstantsInActiveTypoScript.png :alt: Screenshot of the Active TypoScript with constants substituted -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Active TypoScript` was renamed from - "TypoScript Object Browser". - .. note:: The TypoScript constants are evaluated in this order: diff --git a/Documentation/UsingSetting/Debugging.rst b/Documentation/UsingSetting/Debugging.rst index df1a829f2..fe8c0c64a 100644 --- a/Documentation/UsingSetting/Debugging.rst +++ b/Documentation/UsingSetting/Debugging.rst @@ -19,14 +19,6 @@ to find errors within TypoScript. Analyzing defined constants =========================== -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Active TypoScript` was renamed from - "TypoScript Object Browser". - The backend submodule :guilabel:`Site Management > TypoScript > Active TypoScript` provides a tree view to all defined TypoScript Constants on the currently active page. @@ -41,18 +33,6 @@ provides a tree view to all defined TypoScript Constants on the currently active Finding errors ============== -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Active TypoScript` was renamed from - "TypoScript Object Browser". It does not display syntax warnings anymore, - those are displayed in the submodule :guilabel:`Included TypoScript` only. - - The submodule :guilabel:`Included TypoScript` was renamed from - "TypoScript Analyzer". - There are no tools that will tell whether the given TypoScript code is 100% correct. The :guilabel:`Included TypoScript` will warn about syntax errors though: diff --git a/Documentation/UsingSetting/Entering.rst b/Documentation/UsingSetting/Entering.rst index 60d5e3f42..86be072e5 100644 --- a/Documentation/UsingSetting/Entering.rst +++ b/Documentation/UsingSetting/Entering.rst @@ -48,14 +48,6 @@ If TypoScript was added by a record, it is linked. Submodule "Edit TypoScript Record" ================================== -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Edit TypoScript Record` was previously named - "Info / Modify". - This can be done in the :guilabel:`Site Management > TypoScript` module in the submodule :guilabel:`Edit TypoScript Record`. @@ -84,7 +76,7 @@ edited from the list module: Include TypoScript files ------------------------ -.. versionchanged:: 12.0 +.. note:: Only the import of files ending on '.typoscript' or '.tsconfig' are supported. Importing legacy files with the legacy endings '.txt' or '.ts' **does not work**, even if their names are explicitly used in the import. @@ -117,14 +109,6 @@ Include TypoScript from extensions already supports site sets, those should be used instead of TypoScript includes in the record. -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Edit TypoScript Record` was previously named - "Info / Modify". - It is also possible to "Include TypoScript sets" from extensions in the TypoScript record. @@ -166,14 +150,6 @@ records (in the field called :guilabel:`Include TypoScript records`). Submodule "Included TypoScript" =============================== -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - - The submodule :guilabel:`Included TypoScript` was renamed from - "TypoScript Analyzer". - With all those inclusions, it may happen that you lose the overview of the template structure. The submodule :guilabel:`Included TypoScript` provides an overview of this structure. It shows all the TypoScript files that apply to diff --git a/Documentation/UsingSetting/TheConstantEditor.rst b/Documentation/UsingSetting/TheConstantEditor.rst index efe84cee8..e897d6e63 100644 --- a/Documentation/UsingSetting/TheConstantEditor.rst +++ b/Documentation/UsingSetting/TheConstantEditor.rst @@ -6,11 +6,6 @@ The constant editor =================== -.. versionchanged:: 12.0 - The TypoScript management tools are now found in backend module - :guilabel:`Site Management > TypoScript`. It was formerly found in - "Page > Template". - It's possible to add comments in TypoScript. Comments are always ignored by the parser when the TypoScript is processed. But the backend module :guilabel:`Site Management > TypoScript` @@ -102,7 +97,7 @@ cat Predefined categories --------------------- -.. versionchanged:: 12.0 +.. note:: While the predefined categories still exist for backward compatibility reasons they are not used anymore by the TYPO3 Core except for "content". It is suggested to use one or several @@ -138,7 +133,7 @@ has to be added. Example: #cat=mySitePackage/basic/100; type=boolean; label=Something tx_my_site_package.basic.enableSomething = 0 -.. versionchanged:: 12.0 +.. note:: There has to be a newline after the definition of a custom category or it will not be considered. See also https://forge.typo3.org/issues/100936. @@ -227,7 +222,7 @@ using the :typoscript:`customsubcategory` parameter. Example: #cat=mySitePackage/something/a; type=boolean; label=Turn something on tx_my_site_package.basic.enableSomething = 0 -.. versionchanged:: 12.0 +.. note:: There has to be a newline after the definition of a custom subcategory or it will not be considered. See also https://forge.typo3.org/issues/100936. From 198c89505bede3d9066d76303b8ea2932aba97a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:57:05 +0100 Subject: [PATCH 011/125] Use confval-menu for user TSconfig options (#550) releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../Documentation/UserTsconfig/Options.rst | 1682 +++++++---------- 1 file changed, 721 insertions(+), 961 deletions(-) diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst b/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst index da58be184..d4254d349 100644 --- a/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst +++ b/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst @@ -21,1265 +21,1025 @@ upper right toolbar cache menu for non-admin users: Properties ========== -.. contents:: - :depth: 2 - :local: +.. confval-menu:: + :name: confval-group-1 + :display: table + :type: + :Default: + .. _useroptions-additionalPreviewLanguages: -.. todo:: How does this work with site configurations? -.. index:: Localization; preview languages -.. _useroptions-additionalPreviewLanguages: + .. confval:: additionalPreviewLanguages + :name: useroptions-additionalPreviewLanguages + :type: list of sys_language IDs -additionalPreviewLanguages --------------------------- + .. todo:: How does this work with site configurations? -.. confval:: additionalPreviewLanguages - :name: useroptions-additionalPreviewLanguages - :type: list of sys_language IDs + The user will see these additional languages when localizing stuff in + TCEforms. The list are IDs of site languages, as defined in the + :yaml:`languageId` property of the + :ref:`site configuration <t3coreapi:sitehandling-addingLanguages>`. - The user will see these additional languages when localizing stuff in - TCEforms. The list are IDs of site languages, as defined in the - :yaml:`languageId` property of the - :ref:`site configuration <t3coreapi:sitehandling-addingLanguages>`. + .. _useroptions-alertPopups: -.. index:: Backend; Alert popups -.. _useroptions-alertPopups: + .. confval:: alertPopups + :name: useroptions-alertPopups + :type: bitmask + :Default: 255 (show all warnings) -alertPopups ------------ + Configure which Javascript popup alerts have to be displayed and which not: -.. confval:: alertPopups - :name: useroptions-alertPopups - :type: bitmask - :Default: 255 (show all warnings) + * 1 – onTypeChange + * 2 – copy / move / paste + * 4 – delete + * 8 – FE editing + * 128 – other (not used yet) - Configure which Javascript popup alerts have to be displayed and which not: - * 1 – onTypeChange - * 2 – copy / move / paste - * 4 – delete - * 8 – FE editing - * 128 – other (not used yet) + .. _useroptions-bookmarkGroups: + .. confval:: bookmarkGroups + :name: useroptions-bookmarkGroups + :type: Array of integers / strings -.. index:: Backend; Bookmark groups -.. _useroptions-bookmarkGroups: + Set groups of bookmarks that can be accessed by the user. This affects the + bookmarks toolbar item in the top right of the backend. -bookmarkGroups --------------- + By default, 5 default groups will be defined globally (shared, can + only be set by admins) and also for each user (personal bookmarks): -.. confval:: bookmarkGroups - :name: useroptions-bookmarkGroups - :type: Array of integers / strings + 1. Pages + 2. Records + 3. Files + 4. Tools + 5. Miscellaneous - Set groups of bookmarks that can be accessed by the user. This affects the - bookmarks toolbar item in the top right of the backend. + Set 0 to disable one of these group IDs, 1 to enable it (this is the + default) or "string" to change the label accordingly. - By default, 5 default groups will be defined globally (shared, can - only be set by admins) and also for each user (personal bookmarks): + Example: - 1. Pages - 2. Records - 3. Files - 4. Tools - 5. Miscellaneous + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - Set 0 to disable one of these group IDs, 1 to enable it (this is the - default) or "string" to change the label accordingly. + bookmarkGroups { + 1 = 1 + 2 = My Group + 3 = 0 + 4 = + } - Example: + Bookmark group 1 is loaded with the default label (Pages), group 2 is + loaded and labeled as "My Group" and groups 3 and 4 are disabled. + Group 5 has not been set, so it will be displayed by default, just + like group 1. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. versionadded:: 11.0 - bookmarkGroups { - 1 = 1 - 2 = My Group - 3 = 0 - 4 = - } + Custom language labels can also be used instead of a fixed label: - Bookmark group 1 is loaded with the default label (Pages), group 2 is - loaded and labeled as "My Group" and groups 3 and 4 are disabled. - Group 5 has not been set, so it will be displayed by default, just - like group 1. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. versionadded:: 11.0 + bookmarkGroups { + 2 = LLL:EXT:sitepackage/Resources/Private/Language/locallang_be.xlf:bookmarkGroups.2 + } - Custom language labels can also be used instead of a fixed label: + .. _useroptions-clearCache: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. confval:: clearCache + :name: useroptions-clearCache - bookmarkGroups { - 2 = LLL:EXT:sitepackage/Resources/Private/Language/locallang_be.xlf:bookmarkGroups.2 - } + .. _useroptions-clearCache-all: -.. _useroptions-clearCache: + .. confval:: all + :name: useroptions-clearCache-all + :type: boolean + :Default: 0 + :Path: options.clearCache.all -clearCache ----------- + This will allow a non-admin user to clear frontend and page-related caches, + plus some backend-related caches (that is everything including templates); + if it is explicitly set to 0 for an admin user, it will remove the clear all + option on toolbar for that user. -.. index:: Clear cache; Clear all button for non admins -.. _useroptions-clearCache-all: + .. _useroptions-clearCache-pages: -clearCache.all -~~~~~~~~~~~~~~ + .. confval:: pages + :name: useroptions-clearCache-pages + :type: boolean + :Default: 0 + :Path: options.clearCache.pages -.. confval:: clearCache.all - :name: useroptions-clearCache-all - :type: boolean - :Default: 0 + If set to 1, this will allow a non-admin user to clear frontend and + page-related caches. + .. _useroptions-clipboardNumberPads: - This will allow a non-admin user to clear frontend and page-related caches, - plus some backend-related caches (that is everything including templates); - if it is explicitly set to 0 for an admin user, it will remove the clear all - option on toolbar for that user. + .. confval:: clipboardNumberPads + :name: useroptions-clipboardNumberPads + :type: integer (0-20) + :Default: 3 + This allows you to enter how many pads you want on the clipboard. -.. index:: Clear cache; Clear pages button for non admins -.. _useroptions-clearCache-pages: + .. _useroptions-contextMenu-key-disableItems: -clearCache.pages -~~~~~~~~~~~~~~~~ + .. confval:: contextMenu.table.[tableName][.context].disableItems + :name: useroptions-contextMenu-key-disableItems + :type: list of items -.. confval:: clearCache.pages - :name: useroptions-clearCache-pages - :type: boolean - :Default: 0 + List of :ref:`context menu <t3coreapi:context-menu>` ("clickmenu") items to + disable. - If set to 1, this will allow a non-admin user to clear frontend and - page-related caches. + .. figure:: /Images/ManualScreenshots/List/PagesContextMenu.png + :alt: Context menu of the page tree + :class: with-shadow + Context menu of the page tree -.. index:: Clipboard; Number of pads -.. _useroptions-clipboardNumberPads: + The :typoscript:`[tableName]` refers to the type of the record (database + table name) the context menu is shown for, for example, :sql:`pages`, + :sql:`sys_file`, :sql:`tt_content`, etc. -clipboardNumberPads -------------------- + The optional key :typoscript:`[.context]` refers to the place from which the + context menu is triggered. The Core uses just one context called `tree` for + context menus triggered from page tree and folder tree. This way you can + disable certain options for one context, but keep them for another. -.. confval:: clipboardNumberPads - :name: useroptions-clipboardNumberPads - :type: integer (0-20) - :Default: 3 + Items to disable for "page" type are: - This allows you to enter how many pads you want on the clipboard. + * :typoscript:`view` + * :typoscript:`edit` + * :typoscript:`new` + * :typoscript:`info` + * :typoscript:`copy` + * :typoscript:`copyRelease` + * :typoscript:`cut` + * :typoscript:`cutRelease` + * :typoscript:`pasteAfter` + * :typoscript:`pasteInto` + * :typoscript:`newWizard` + * :typoscript:`pagesSort` + * :typoscript:`pagesNewMultiple` + * :typoscript:`openListModule` + * :typoscript:`mountAsTreeRoot` + * :typoscript:`hideInMenus` + * :typoscript:`showInMenus` + * :typoscript:`permissions` + * :typoscript:`enable` + * :typoscript:`disable` + * :typoscript:`delete` + * :typoscript:`history` + * :typoscript:`clearCache` + Items to disable for "sys_file" type (that is files/folders) are: -.. index:: ContextMenu; Disable items -.. _useroptions-contextMenu-key-disableItems: + * :typoscript:`edit` + * :typoscript:`rename` + * :typoscript:`upload` + * :typoscript:`new` + * :typoscript:`info` + * :typoscript:`copy` + * :typoscript:`copyRelease` + * :typoscript:`cut` + * :typoscript:`cutRelease` + * :typoscript:`pasteInto` + * :typoscript:`delete` -contextMenu disableItems ------------------------- + When the system extension Import/Export (EXT:impexp) is installed then two + more options become available: -.. confval:: contextMenu.table.[tableName][.context].disableItems - :name: useroptions-contextMenu-key-disableItems - :type: list of items + * :typoscript:`exportT3d` + * :typoscript:`importT3d` - List of :ref:`context menu <t3coreapi:context-menu>` ("clickmenu") items to - disable. + Example: - .. figure:: /Images/ManualScreenshots/List/PagesContextMenu.png - :alt: Context menu of the page tree - :class: with-shadow + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - Context menu of the page tree + # Remove "New" and "Create New wizard" for pages context menu (list module) + options.contextMenu.table.pages.disableItems = new,newWizard - The :typoscript:`[tableName]` refers to the type of the record (database - table name) the context menu is shown for, for example, :sql:`pages`, - :sql:`sys_file`, :sql:`tt_content`, etc. + # Remove "New" and "Create New wizard" in page tree context menu + options.contextMenu.table.pages.tree.disableItems = new,newWizard - The optional key :typoscript:`[.context]` refers to the place from which the - context menu is triggered. The Core uses just one context called `tree` for - context menus triggered from page tree and folder tree. This way you can - disable certain options for one context, but keep them for another. + # Remove the "More options" item in the page tree context menu and all its subelements + options.contextMenu.table.pages.tree.disableItems = newWizard, pagesSort, pagesNewMultiple, openListModule, mountAsTreeRoot, exportT3d, importT3d, hideInMenus, showInMenus, permissions - Items to disable for "page" type are: + .. _useroptions-dashboard: - * :typoscript:`view` - * :typoscript:`edit` - * :typoscript:`new` - * :typoscript:`info` - * :typoscript:`copy` - * :typoscript:`copyRelease` - * :typoscript:`cut` - * :typoscript:`cutRelease` - * :typoscript:`pasteAfter` - * :typoscript:`pasteInto` - * :typoscript:`newWizard` - * :typoscript:`pagesSort` - * :typoscript:`pagesNewMultiple` - * :typoscript:`openListModule` - * :typoscript:`mountAsTreeRoot` - * :typoscript:`hideInMenus` - * :typoscript:`showInMenus` - * :typoscript:`permissions` - * :typoscript:`enable` - * :typoscript:`disable` - * :typoscript:`delete` - * :typoscript:`history` - * :typoscript:`clearCache` + .. confval:: dashboard + :name: useroptions-dashboard - Items to disable for "sys_file" type (that is files/folders) are: + .. _useroptions-dashboard-dashboardPresetsForNewUsers: - * :typoscript:`edit` - * :typoscript:`rename` - * :typoscript:`upload` - * :typoscript:`new` - * :typoscript:`info` - * :typoscript:`copy` - * :typoscript:`copyRelease` - * :typoscript:`cut` - * :typoscript:`cutRelease` - * :typoscript:`pasteInto` - * :typoscript:`delete` + .. confval:: dashboardPresetsForNewUsers + :name: useroptions-dashboard-dashboardPresetsForNewUsers + :type: list of dashboard identifiers + :Default: default + :Path: options.dashboard.dashboardPresetsForNewUsers - When the system extension Import/Export (EXT:impexp) is installed then two - more options become available: + List of dashboard identifiers to be used on initial dashboard module access. - * :typoscript:`exportT3d` - * :typoscript:`importT3d` + Example: - Example: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + options.dashboard.dashboardPresetsForNewUsers := addToList(customDashboard) - # Remove "New" and "Create New wizard" for pages context menu (list module) - options.contextMenu.table.pages.disableItems = new,newWizard + .. _useroptions-defaultResourcesViewMode: - # Remove "New" and "Create New wizard" in page tree context menu - options.contextMenu.table.pages.tree.disableItems = new,newWizard + .. confval:: defaultResourcesViewMode + :name: useroptions-defaultResourcesViewMode + :type: `list` or `tiles` + :Default: `tiles` - # Remove the "More options" item in the page tree context menu and all its subelements - options.contextMenu.table.pages.tree.disableItems = newWizard, pagesSort, pagesNewMultiple, openListModule, mountAsTreeRoot, exportT3d, importT3d, hideInMenus, showInMenus, permissions + The option :typoscript:`options.defaultResourcesViewMode` has + been introduced, which allows to define the initial display mode. Valid + values are therefore `list` and `tiles`, e.g.: + The listing of resources in the TYPO3 Backend, e.g. in the + :guilabel:`File > Filelist` module or the `FileBrowser` can be changed + between `list` and `tiles`. TYPO3 serves by default `tiles`, if the user + has not already made a choice. -.. index:: Element browser; Create Folders -.. _useroptions-createFoldersInEB: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -createFoldersInEB ------------------ + options.defaultResourcesViewMode = list -.. versionchanged:: 12.4 - With the :ref:`migration of the "Create folder" view into a separate modal <ext_core:feature-99191-1669906308>` - used in EXT:filelist, which is based on the element browser as well, this - option became useless and is not evaluated anymore. + .. _useroptions-defaultUploadFolder: -.. _useroptions-dashboard: + .. confval:: defaultUploadFolder + :name: useroptions-defaultUploadFolder + :type: string -dashboard ---------- + When a user uploads files they are stored in the default upload folder + of the first file storage that user may access. The folder is used for + uploads in the TCEforms fields. In general, this will be + :file:`fileadmin/user_upload/`. -.. index:: Dashboard; Presets -.. _useroptions-dashboard-dashboardPresetsForNewUsers: + With this property it is possible to set a specific upload folder. -dashboard.dashboardPresetsForNewUsers -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + The syntax is "storage_uid:file_path". -.. confval:: dashboard.dashboardPresetsForNewUsers - :name: useroptions-dashboard-dashboardPresetsForNewUsers - :type: list of dashboard identifiers - :Default: default + .. note:: + It is also possible to set a default upload folder for a page via + :ref:`page TSconfig <pagedefaultuploadfolder>`. - List of dashboard identifiers to be used on initial dashboard module access. + Example: - Example: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + options.defaultUploadFolder = 2:user_folders/my_folder/ - options.dashboard.dashboardPresetsForNewUsers := addToList(customDashboard) + .. _useroptions-disableDelete: -.. _useroptions-defaultResourcesViewMode: + .. confval:: disableDelete + :name: useroptions-disableDelete + :type: boolean -defaultResourcesViewMode ------------------------- + Disables the :guilabel:`Delete` button in TCEFORMs. -.. confval:: defaultResourcesViewMode - :name: useroptions-defaultResourcesViewMode - :type: `list` or `tiles` - :Default: `tiles` + Note, it is possible to set this for single tables using + :typoscript:`options.disableDelete.<tableName>`. Any value set for a single + table will override the default value set for :typoscript:`disableDelete`. - The option :typoscript:`options.defaultResourcesViewMode` has - been introduced, which allows to define the initial display mode. Valid - values are therefore `list` and `tiles`, e.g.: + Example: - The listing of resources in the TYPO3 Backend, e.g. in the - :guilabel:`File > Filelist` module or the `FileBrowser` can be changed - between `list` and `tiles`. TYPO3 serves by default `tiles`, if the user - has not already made a choice. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + options.disableDelete.tt_content = 1 - options.defaultResourcesViewMode = list + .. _useroptions-dontMountAdminMounts: + .. confval:: dontMountAdminMounts + :name: useroptions-dontMountAdminMounts + :type: boolean -.. index:: Upload folder; Default -.. _useroptions-defaultUploadFolder: + This options prevents the root to be mounted for an admin user. -defaultUploadFolder -------------------- + .. note:: + Only for admin users. For other users it has no effect. -.. confval:: defaultUploadFolder - :name: useroptions-defaultUploadFolder - :type: string + .. _useroptions-enableBookmarks: - When a user uploads files they are stored in the default upload folder - of the first file storage that user may access. The folder is used for - uploads in the TCEforms fields. In general, this will be - :file:`fileadmin/user_upload/`. + .. confval:: enableBookmarks + :name: useroptions-enableBookmarks + :type: boolean + :Default: 1 - With this property it is possible to set a specific upload folder. + Enables the usage of bookmarks in the backend. - The syntax is "storage_uid:file_path". + .. _useroptions-file_list: - .. note:: - It is also possible to set a default upload folder for a page via - :ref:`page TSconfig <pagedefaultuploadfolder>`. + .. confval:: file_list + :name: useroptions-file_list - Example: + .. _useroptions-file_list-enableClipBoard: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. confval:: enableClipBoard + :name: useroptions-enableClipBoard + :type: list of keywords + :Default: selectable + :Path: options.file_list.enableClipBoard - options.defaultUploadFolder = 2:user_folders/my_folder/ + Determines whether the checkbox :guilabel:`Show clipboard` in the file list + module is shown or hidden. If it is hidden, you can predefine it to be + always activated or always deactivated. + The following values are possible: -.. index:: Records; Delete disabled -.. _useroptions-disableDelete: + :typoscript:`activated` + The option is activated and the checkbox is hidden. -disableDelete -------------- + :typoscript:`deactivated` + The option is deactivated and the checkbox is hidden. -.. confval:: disableDelete - :name: useroptions-disableDelete - :type: boolean + :typoscript:`selectable` + The checkbox is shown so that the option can be selected by the user. - Disables the :guilabel:`Delete` button in TCEFORMs. + .. _useroptions-file_list-displayColumnSelector: - Note, it is possible to set this for single tables using - :typoscript:`options.disableDelete.<tableName>`. Any value set for a single - table will override the default value set for :typoscript:`disableDelete`. + .. confval:: displayColumnSelector + :name: useroptions-file_list-displayColumnSelector + :type: boolean + :Default: true + :Path: options.file_list.displayColumnSelector - Example: + The column selector is enabled by default and can be disabled with this + option. The column selector is displayed at the top of each file list. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + It can be used to manage the fields displayed for each file / folder, + while containing convenience actions such as "filter", "check all / none" + and "toggle selection". - options.disableDelete.tt_content = 1 + The fields to be selected are a combination of special fields, such as + `references` or `read/write` permissions, the corresponding :sql:`sys_file` + record fields, as well as all available :sql:`sys_file_metadata` fields. + Example: -.. index:: DB mounts; Hide root from admins -.. _useroptions-dontMountAdminMounts: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -dontMountAdminMounts --------------------- + # Disable the column selector + file_list.displayColumnSelector = 0 -.. confval:: dontMountAdminMounts - :name: useroptions-dontMountAdminMounts - :type: boolean + .. _useroptions-file_list-enableDisplayThumbnails: - This options prevents the root to be mounted for an admin user. + .. confval:: file_list.enableDisplayThumbnails + :name: useroptions-file_list-enableDisplayThumbnails + :type: list of keywords + :Default: selectable - .. note:: - Only for admin users. For other users it has no effect. + Determines whether the checkbox :guilabel:`Display thumbnails` in the + file list module is shown or hidden. If it is hidden, you can predefine it + to be always activated or always deactivated. + The following values are possible: -.. index:: Bookmarks; enable -.. _useroptions-enableBookmarks: + :typoscript:`activated` + The option is activated and the checkbox is hidden. -enableBookmarks ---------------- + :typoscript:`deactivated` + The option is deactivated and the checkbox is hidden. -.. confval:: enableBookmarks - :name: useroptions-enableBookmarks - :type: boolean - :Default: 1 + :typoscript:`selectable` + The checkbox is shown so that the option can be selected by the user. - Enables the usage of bookmarks in the backend. + .. _useroptions-file_list-filesPerPage: + .. confval:: filesPerPage + :name: useroptions-file_list-filesPerPage + :type: integer + :Default: 40 + :Path: options.file_list.filesPerPage -.. index:: File list + The maximum number of files shown per page in the :guilabel:`File > List` + module. -.. _useroptions-file_list: + .. _useroptions-file_list-primaryActions: -file_list ---------- -.. index:: File list; Clipboard enable -.. _useroptions-file_list-enableClipBoard: + .. confval:: primaryActions + :name: useroptions-useroptions-file_list-primaryActions + :type: string + :Default: :typoscript:`view,metadata,translations,delete` + :Path: options.file_list.primaryActions -file_list.enableClipBoard -~~~~~~~~~~~~~~~~~~~~~~~~~ + Option to add more primary actions to the list view, + which are otherwise only accessible through the "..." menu in the file list + module. -.. confval:: file_list.enableClipBoard - :name: useroptions-enableClipBoard - :type: list of keywords - :Default: selectable + The list of actions to be displayed can be given in the TSConfig of + the backend user. The actions that can be set are - Determines whether the checkbox :guilabel:`Show clipboard` in the file list - module is shown or hidden. If it is hidden, you can predefine it to be - always activated or always deactivated. + * :typoscript:`copy` + * :typoscript:`cut` + * :typoscript:`delete` + * :typoscript:`download` + * :typoscript:`edit` + * :typoscript:`info` + * :typoscript:`metadata` + * :typoscript:`paste` + * :typoscript:`rename` + * :typoscript:`replace` + * :typoscript:`translations` (always active) + * :typoscript:`updateOnlineMedia` + * :typoscript:`upload` + * :typoscript:`view` - The following values are possible: + Example: - :typoscript:`activated` - The option is activated and the checkbox is hidden. + .. code-block:: tsconfig + :caption: EXT:site_package/Configuration/user.tsconfig - :typoscript:`deactivated` - The option is deactivated and the checkbox is hidden. + # This will add "copy", "cut" and "replace" buttons in addition to the three default + # buttons. "translations" can be omitted, as it will be added by default, + # if a TYPO3 site is set up multilingual. + options.file_list.primaryActions = view,metadata,delete,copy,cut,replace - :typoscript:`selectable` - The checkbox is shown so that the option can be selected by the user. + .. figure:: /Images/ManualScreenshots/List/FileListPrimaryActions.png + :alt: Show primary action with additional copy, cut and replace buttons + :class: with-shadow + See option `primaryActions` with three default buttons and the three + additional buttons "copy", "cut" and "replace". As there is no TYPO3 + site set up multilingual the button "translations" is not rendered in + that TYPO3 environment. -.. index:: File list; Column Selector -.. _useroptions-file_list-displayColumnSelector: + .. _useroptions-file_list-thumbnail-height: -file_list.displayColumnSelector -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. confval:: thumbnail.height + :name: useroptions-file_list-thumbnail-height + :type: integer + :Default: 64 + :Path: options.file_list.thumbnail.height -.. confval:: file_list.displayColumnSelector - :name: useroptions-file_list-displayColumnSelector - :type: boolean - :Default: true + All preview images in the file list will be rendered with the configured + thumbnail height. - The column selector is enabled by default and can be disabled with this - option. The column selector is displayed at the top of each file list. + .. _useroptions-file_list-thumbnail-width: - It can be used to manage the fields displayed for each file / folder, - while containing convenience actions such as "filter", "check all / none" - and "toggle selection". + .. confval:: thumbnail.width + :name: useroptions-file_list-thumbnail-width + :type: integer + :Default: 64 + :Path: options.file_list.thumbnail.width - The fields to be selected are a combination of special fields, such as - `references` or `read/write` permissions, the corresponding :sql:`sys_file` - record fields, as well as all available :sql:`sys_file_metadata` fields. + All preview images in the file list will be rendered with the configured + thumbnail width. - Example: + .. _useroptions-file_list-uploader-defaultaction: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. confval:: uploader.defaultAction + :name: useroptions-file_list-uploader-defaultaction + :type: string + :Default: :typoscript:`Cancel` + :Path: options.file_list.uploader.defaultAction - # Disable the column selector - file_list.displayColumnSelector = 0 + Default action for the modal that appears when during file upload a name + collision occurs. Possible values: + :typoscript:`cancel` + Abort the action. -.. index:: File list; Extended view enable -.. _useroptions-file_list-enableDisplayBigControlPanel: + :typoscript:`rename` + Append the file name with a numerical index. -file_list.enableDisplayBigControlPanel -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + :typoscript:`replace` + Override the file with the uploaded one. -.. versionchanged:: 11.3 - The checkbox :guilabel:`Extended view` was removed with TYPO3 v11.3. - Therefore the option :typoscript:`file_list.enableDisplayBigControlPanel` - has no effect anymore. + .. confval:: folderTree + :name: useroptions-folderTree + .. _useroptions-folderTree-altElementBrowserMountPoints: -.. index:: File list; Thumbnails enable -.. _useroptions-file_list-enableDisplayThumbnails: + .. confval:: altElementBrowserMountPoints + :name: useroptions-folderTree-altElementBrowserMountPoints + :type: list of "storageUid:folderName" items + :Path: options.folderTree.altElementBrowserMountPoints -file_list.enableDisplayThumbnails -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Sets alternative filemounts for use in any folder tree, including in the + :guilabel:`File > List` module, in the element browser and in file + selectors. -.. confval:: file_list.enableDisplayThumbnails - :name: useroptions-file_list-enableDisplayThumbnails - :type: list of keywords - :Default: selectable + Each item consists of storage UID followed by a colon + and the folder name inside that storage. Separate multiple items by + a comma. - Determines whether the checkbox :guilabel:`Display thumbnails` in the - file list module is shown or hidden. If it is hidden, you can predefine it - to be always activated or always deactivated. + For backwards compatibility, defining only a folder name but no + storage uid and colon prepended is still supported. Folders + without a storage UID prepended are assumed to be located in the default + storage, which by default is the :file:`fileadmin/` folder. If a folder + you specify does not exist it will not get mounted. - The following values are possible: + Settings this option is effective in + :ref:`workspaces <t3coreapi:workspaces>` too. - :typoscript:`activated` - The option is activated and the checkbox is hidden. + The alternative file mounts are added to the existing ones defined in + the user or group configuration. - :typoscript:`deactivated` - The option is deactivated and the checkbox is hidden. + Example: - :typoscript:`selectable` - The checkbox is shown so that the option can be selected by the user. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig + options.folderTree.altElementBrowserMountPoints = _temp_/, 2:/templates, 1:/files/images -.. index:: File list; Files per page -.. _useroptions-file_list-filesPerPage: + .. _useroptions-folderTree-uploadFieldsInLinkBrowser: -file_list.filesPerPage -~~~~~~~~~~~~~~~~~~~~~~ + .. confval:: uploadFieldsInLinkBrowser + :name: useroptions-folderTree-uploadFieldsInLinkBrowser + :type: integer + :Default: 3 + :Path: options.folderTree.uploadFieldsInLinkBrowser -.. confval:: file_list.filesPerPage - :name: useroptions-file_list-filesPerPage - :type: integer - :Default: 40 + This value defines the number of upload fields in the element browser. + Default value is 3, if set to 0, no upload form will be shown. - The maximum number of files shown per page in the :guilabel:`File > List` - module. + .. _useroptions-hideModules: + .. confval:: hideModules + :name: useroptions-hideModules + :type: list of module groups or modules -.. index:: - File list; Primary actions - File list; Allowed actions -.. _useroptions-file_list-primaryActions: + Configure which module groups or modules should be hidden from the main menu. -file_list.primaryActions -~~~~~~~~~~~~~~~~~~~~~~~~ + .. attention:: + It is not an access restriction but makes defined modules invisible. + This means that in principle these modules can still be accessed if the + rights allow this. -.. confval:: file_list.primaryActions - :name: useroptions-useroptions-file_list-primaryActions - :type: string - :Default: :typoscript:`view,metadata,translations,delete` + .. hint:: + A list of all available module groups and modules can be found in in the + backend module :guilabel:`System > Configuration > Backend Modules`. The + system extension "lowlevel" has to be available for accessing this list. - Option to add more primary actions to the list view, - which are otherwise only accessible through the "..." menu in the file list - module. + Example: - The list of actions to be displayed can be given in the TSConfig of - the backend user. The actions that can be set are + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - * :typoscript:`copy` - * :typoscript:`cut` - * :typoscript:`delete` - * :typoscript:`download` - * :typoscript:`edit` - * :typoscript:`info` - * :typoscript:`metadata` - * :typoscript:`paste` - * :typoscript:`rename` - * :typoscript:`replace` - * :typoscript:`translations` (always active) - * :typoscript:`updateOnlineMedia` - * :typoscript:`upload` - * :typoscript:`view` + # Hide only module groups "file" and "help" + options.hideModules = file, help - Example: + # Hide additional modules "info" and "ts" from the "web" group + options.hideModules := addToList(web_info, web_ts) - .. code-block:: tsconfig - :caption: EXT:site_package/Configuration/user.tsconfig + # Hide only module BeLogLog from "system" group + options.hideModules = system_BelogLog - # This will add "copy", "cut" and "replace" buttons in addition to the three default - # buttons. "translations" can be omitted, as it will be added by default, - # if a TYPO3 site is set up multilingual. - options.file_list.primaryActions = view,metadata,delete,copy,cut,replace + .. _useroptions-hideRecords: - .. figure:: /Images/ManualScreenshots/List/FileListPrimaryActions.png - :alt: Show primary action with additional copy, cut and replace buttons - :class: with-shadow + .. confval:: hideRecords - See option `primaryActions` with three default buttons and the three - additional buttons "copy", "cut" and "replace". As there is no TYPO3 - site set up multilingual the button "translations" is not rendered in - that TYPO3 environment. + .. _useroptions-hideRecords-pages: -.. index:: File list; Thumbnails height -.. _useroptions-file_list-thumbnail-height: + .. confval:: pages + :name: useroptions-hideRecords-pages + :type: list of page IDs + :Path: options.hideRecords.pages -file_list.thumbnail.height -~~~~~~~~~~~~~~~~~~~~~~~~~~ + This setting hides records in the backend user interface. It is not an + access restriction but makes defined records invisible. That means in + principle those records can still be edited if the user rights allow. + This makes sense if only a specialized module should be used to edit those + otherwise hidden records. -.. confval:: file_list.thumbnail.height - :name: useroptions-file_list-thumbnail-height - :type: integer - :Default: 64 + This option is currently implemented for the pages table only and has an + effect in the following places: - All preview images in the file list will be rendered with the configured - thumbnail height. + * Page tree navigation frame + * :guilabel:`Web > List` module + * New record wizard + Example: -.. index:: File list; Thumbnails width -.. _useroptions-file_list-thumbnail-width: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -file_list.thumbnail.width -~~~~~~~~~~~~~~~~~~~~~~~~~ + options.hideRecords.pages = 12,45 -.. confval:: file_list.thumbnail.width - :name: useroptions-file_list-thumbnail-width - :type: integer - :Default: 64 + .. _useroptions-impexp: - All preview images in the file list will be rendered with the configured - thumbnail width. + .. confval:: impexp + :name: useroptions-impexp + .. _useroptions-impexp-enableExportForNonAdminUser: -.. index:: Uploader; Name collision default action -.. _useroptions-file_list-uploader-defaultaction: + .. confval:: enableExportForNonAdminUser + :name: useroptions-impexp-enableExportForNonAdminUser + :type: boolean + :Default: 0 + :Path: options.impexp.enableExportForNonAdminUser -file_list.uploader.defaultAction -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. note:: + This option was introduced to avoid `information disclosure + <https://typo3.org/security/advisory/typo3-core-sa-2022-001>`__. -.. confval:: file_list.uploader.defaultAction - :name: useroptions-file_list-uploader-defaultaction - :type: string - :Default: :typoscript:`Cancel` + The import/export module of `EXT:impexp` is disabled by default for + non-admin users. Enable this option, if non-admin users need to use the + module and export data. This should only be enabled for trustworthy + backend users, as it might impose a security risk. - Default action for the modal that appears when during file upload a name - collision occurs. Possible values: + .. _useroptions-impexp-enableImportForNonAdminUser: - :typoscript:`cancel` - Abort the action. + .. confval:: enableImportForNonAdminUser + :name: useroptions-impexp-enableImportForNonAdminUser + :type: boolean + :Default: 0 + :Path: options.impexp.enableImportForNonAdminUser - :typoscript:`rename` - Append the file name with a numerical index. + .. note:: + This option was introduced to avoid `information disclosure <https://typo3.org/article/typo3-core-sa-2016-015>`__. - :typoscript:`replace` - Override the file with the uploaded one. + The import/export module of `EXT:impexp` is disabled by default for + non-admin users. Enable this option, if non-admin users need to use the + module and import data. This should only be enabled for trustworthy + backend users, as it might impose a security risk. + .. _useroptions-mayNotCreateEditBookmarks: -.. index:: Folder tree + .. confval:: mayNotCreateEditBookmarks + :name: useroptions-mayNotCreateEditBookmarks + :type: boolean -folderTree ----------- + If set, the user can not create or edit bookmarks. -.. index:: Folder tree; File mounts in element browser -.. _useroptions-folderTree-altElementBrowserMountPoints: -folderTree.altElementBrowserMountPoints -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. _useroptions-noThumbsInEB: -.. confval:: folderTree.altElementBrowserMountPoints - :name: useroptions-folderTree-altElementBrowserMountPoints - :type: list of "storageUid:folderName" items + .. confval:: noThumbsInEB + :name: useroptions-noThumbsInEB + :type: boolean - Sets alternative filemounts for use in any folder tree, including in the - :guilabel:`File > List` module, in the element browser and in file - selectors. + If set, then image thumbnails are not shown in the element browser. - Each item consists of storage UID followed by a colon - and the folder name inside that storage. Separate multiple items by - a comma. + .. _useroptions-overridePageModule: - For backwards compatibility, defining only a folder name but no - storage uid and colon prepended is still supported. Folders - without a storage UID prepended are assumed to be located in the default - storage, which by default is the :file:`fileadmin/` folder. If a folder - you specify does not exist it will not get mounted. - Settings this option is effective in - :ref:`workspaces <t3coreapi:workspaces>` too. + .. _useroptions-pageTree: - The alternative file mounts are added to the existing ones defined in - the user or group configuration. + .. confval:: pageTree + :name: useroptions-pageTree - Example: + .. confval:: overridePageModule + :name: useroptions-pageTree-overridePageModule - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. versionchanged:: 13.0 + This setting has been removed. - options.folderTree.altElementBrowserMountPoints = _temp_/, 2:/templates, 1:/files/images + In order to replace the :guilabel:`Web > Page` module within a third-party + extension, such as TemplaVoila, it is possible to create a custom module entry + in an extension's :file:`Configuration/Backend/Modules.php` with the following + entry: + .. code-block:: php + :caption: EXT:my_extension/Configuration/Backend/Modules.php -.. index:: Folder tree; Create folder; hide -.. _useroptions-folderTree-hideCreateFolder: + return [ + 'my_module' => [ + 'parent' => 'web', + 'position' => ['before' => '*'], + 'access' => 'user', + 'aliases' => ['web_layout'], + 'path' => '/module/my_module', + 'iconIdentifier' => 'module-page', + 'labels' => 'LLL:EXT:backend/Resources/Private/Language/locallang_mod.xlf', + 'routes' => [ + '_default' => [ + 'target' => \MyVendor\MyExtension\Controller\MyController::class . '::mainAction', + ], + ], + ], + ]; -folderTree.hideCreateFolder -~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. _useroptions-pageTree-altElementBrowserMountPoints: -.. versionchanged:: 12.4 - With the :ref:`migration of the "Create folder" view into a separate modal <ext_core:feature-99191-1669906308>` - used in EXT:filelist, which is based on the element browser as well, this - option became useless and is not evaluated anymore. + .. confval:: altElementBrowserMountPoints + :name: useroptions-pageTree-altElementBrowserMountPoints + :type: list of integers + :Path: options.pageTree.altElementBrowserMountPoints + Sets alternative webmounts for use in the element browser. You + separate page IDs by a comma. Non-existing page IDs are ignored. If + you insert a non-integer it will evaluate to "0" (zero) and the root + of the page tree is mounted. Effective in + :ref:`workspaces <t3coreapi:workspaces>` too. -.. index:: - Uploader; File number - Uploader; Hide -.. _useroptions-folderTree-uploadFieldsInLinkBrowser: + These alternative webmounts **replace** configured DB mount points + unless you use the + :ref:`altElementBrowserMountPoints.append <useroptions-pageTree-altElementBrowserMountPoints-append>` + option. -folderTree.uploadFieldsInLinkBrowser -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Example: -.. confval:: folderTree.uploadFieldsInLinkBrowser - :name: useroptions-folderTree-uploadFieldsInLinkBrowser - :type: integer - :Default: 3 + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - This value defines the number of upload fields in the element browser. - Default value is 3, if set to 0, no upload form will be shown. + options.pageTree.altElementBrowserMountPoints = 34,123 -.. index:: Modules; Hide -.. _useroptions-hideModules: + .. _useroptions-pageTree-altElementBrowserMountPoints-append: -hideModules ------------ + .. confval:: altElementBrowserMountPoints.append + :name: useroptions-pageTree-altElementBrowserMountPoints-append + :type: boolean + :Path: options.pageTree.altElementBrowserMountPoints.append -.. versionchanged:: 12.0 - In TYPO3 versions before 12.0 the :typoscript:`hideModules` option was - appended with the module group. This changed with the introduction of the - new :ref:`module registration API <t3coreapi:backend-modules-configuration>` - in TYPO3 v12. If you are using an older version of TYPO3 please use the - version switcher on the top left of this document to go to the respective - version. + This option allows administrators to add additional mount points + in the RTE and the wizard element browser instead of replacing + the configured database mount points of the user when using the + existing user TSconfig option. -.. confval:: hideModules - :name: useroptions-hideModules - :type: list of module groups or modules + Example: - Configure which module groups or modules should be hidden from the main menu. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. attention:: - It is not an access restriction but makes defined modules invisible. - This means that in principle these modules can still be accessed if the - rights allow this. + options.pageTree.altElementBrowserMountPoints = 34,123 + options.pageTree.altElementBrowserMountPoints.append = 1 - .. hint:: - A list of all available module groups and modules can be found in in the - backend module :guilabel:`System > Configuration > Backend Modules`. The - system extension "lowlevel" has to be available for accessing this list. + .. _useroptions-pageTree-backgroundColor: - Example: + .. confval:: backgroundColor + :name: useroptions-pageTree-backgroundColor + :type: string + :Path: options.pageTree.backgroundColor - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. deprecated:: 13.1 + This setting has been deprecated and will be removed in TYPO3 v14 due to its + lack of accessibility. It is being replaced with a + :ref:`new label system <useroptions-pageTree-label>` for tree nodes. - # Hide only module groups "file" and "help" - options.hideModules = file, help + In TYPO3 v13 the setting will be migrated to the new label system. Since the + use case is unknown, the generated label will be "Color: <value>". This + information will be displayed on all affected nodes. - # Hide additional modules "info" and "ts" from the "web" group - options.hideModules := addToList(web_info, web_ts) + Set background colors for tree branches. - # Hide only module BeLogLog from "system" group - options.hideModules = system_BelogLog + The color can be any valid CSS color value. The best results can be achieved + by using RGBa values. -.. _useroptions-hideRecords: + Example: -hideRecords ------------ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -.. index:: Records; Hide on pages -.. _useroptions-hideRecords-pages: + # The syntax is: + # options.pageTree.backgroundColor.<pageId> = <color> + options.pageTree.backgroundColor.147 = orange + options.pageTree.backgroundColor.148 = #AFAFAF + options.pageTree.backgroundColor.151 = rgba(0, 255, 0, 0.1) -hideRecords.pages -~~~~~~~~~~~~~~~~~ + .. figure:: /Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png + :alt: Tree branches with configured background colors + :class: with-shadow -.. confval:: hideRecords.pages - :name: useroptions-hideRecords-pages - :type: list of page IDs + Tree branches with configured background colors - This setting hides records in the backend user interface. It is not an - access restriction but makes defined records invisible. That means in - principle those records can still be edited if the user rights allow. - This makes sense if only a specialized module should be used to edit those - otherwise hidden records. + .. _useroptions-pageTree-doktypesToShowInNewPageDragArea: - This option is currently implemented for the pages table only and has an - effect in the following places: + .. confval:: doktypesToShowInNewPageDragArea + :name: useroptions-pageTree-doktypesToShowInNewPageDragArea + :type: string + :Default: 1,6,4,7,3,254,255,199 + :Path: options.pageTree.doktypesToShowInNewPageDragArea - * Page tree navigation frame - * :guilabel:`Web > List` module - * New record wizard + If set, the node top panel feature can be configured by a comma-separated + list. Each number stands for a :ref:`doktype ID <t3coreapi:list-of-page-types>` + that should be added to the node top panel. - Example: + .. figure:: /Images/ManualScreenshots/List/PanelNormal.png + :alt: Top panel in normal mode + :class: with-shadow - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + Top panel in normal mode - options.hideRecords.pages = 12,45 + .. figure:: /Images/ManualScreenshots/List/PanelModified.png + :alt: Top panel modified + :class: with-shadow -.. _useroptions-impexp: + Top panel modified -impexp ------- + .. _useroptions-pageTree-excludeDoktypes: -.. index:: Import export; Enable for non admins -.. _useroptions-impexp-enableExportForNonAdminUser: + .. confval:: excludeDoktypes + :name: useroptions-pageTree-excludeDoktypes + :type: list of integers + :Path: options.pageTree.excludeDoktypes -impexp.enableExportForNonAdminUser -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Excludes nodes (pages) with one of the defined + :ref:`doktypes <t3coreapi:list-of-page-types>` from the page tree. + Can be used, for example, for hiding + :ref:`custom doktypes <t3coreapi:page-types-example>`. -.. versionadded:: 10.4.29/11.5.11 - This option was introduced to avoid `information disclosure - <https://typo3.org/security/advisory/typo3-core-sa-2022-001>`__. + Example: -.. confval:: impexp.enableExportForNonAdminUser - :name: useroptions-impexp-enableExportForNonAdminUser - :type: boolean - :Default: 0 + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - The import/export module of `EXT:impexp` is disabled by default for - non-admin users. Enable this option, if non-admin users need to use the - module and export data. This should only be enabled for trustworthy - backend users, as it might impose a security risk. + options.pageTree.excludeDoktypes = 254,1 + .. _useroptions-pageTree-label: -.. index:: Import export; Enable for non admins -.. _useroptions-impexp-enableImportForNonAdminUser: + .. confval:: label.<page-id> + :name: useroptions-pageTree-label + :type: list of page IDs + :Path: options.pageTree.label.<page-id> -impexp.enableImportForNonAdminUser -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. versionadded:: 13.1 + This setting is the successor of :ref:`useroptions-pageTree-backgroundColor`. -This option was introduced to avoid `information disclosure -<https://typo3.org/article/typo3-core-sa-2016-015>`__. + Labels offer customizable color markings for tree nodes and require an + associated label for accessibility. -.. confval:: impexp.enableImportForNonAdminUser - :name: useroptions-impexp-enableImportForNonAdminUser - :type: boolean - :Default: 0 + Example: - The import/export module of `EXT:impexp` is disabled by default for - non-admin users. Enable this option, if non-admin users need to use the - module and import data. This should only be enabled for trustworthy - backend users, as it might impose a security risk. + .. code-block:: typoscript + :caption: EXT:my_extension/Configuration/user.tsconfig + options.pageTree.label.296 { + label = Campaign A + color = #ff8700 + } -.. index:: Bookmarks; Create and delete disabled -.. _useroptions-mayNotCreateEditBookmarks: + Display: -mayNotCreateEditBookmarks -------------------------- + .. figure:: /Images/ManualScreenshots/List/optionsPageTreeLabel.png + :alt: Page with configured color and label + :class: with-shadow -.. confval:: mayNotCreateEditBookmarks - :name: useroptions-mayNotCreateEditBookmarks - :type: boolean + Page with configured color and label - If set, the user can not create or edit bookmarks. + .. note:: + Only one label per page can be set through this method. Use the + PSR-14 event :ref:`t3coreapi:AfterPageTreeItemsPreparedEvent` to assign + multiple labels to a page. + .. todo:: does this still work with site configuration? + .. _useroptions-pageTree-showDomainNameWithTitle: -.. index:: - Thumbnails; Disable in element browser - Element browser; Disable thumbnails -.. _useroptions-noThumbsInEB: + .. confval:: showDomainNameWithTitle + :name: useroptions-pageTree-showDomainNameWithTitle + :type: boolean + :Path: options.pageTree.showDomainNameWithTitle -noThumbsInEB ------------- + If set, the domain name will be appended to the page title for + pages that have :guilabel:`Is root of web site?` checked in the page properties. + Useful if there are several domains in one page tree. -.. confval:: noThumbsInEB - :name: useroptions-noThumbsInEB - :type: boolean - If set, then image thumbnails are not shown in the element browser. + .. _useroptions-pageTree-showNavTitle: + .. confval:: showNavTitle + :name: useroptions-pageTree-showNavTitle + :type: boolean + :Path: options.pageTree.showNavTitle -.. _useroptions-overridePageModule: + If set, the navigation title is displayed in the page navigation tree + instead of the normal page title. The page title is shown in a + tooltip if the mouse hovers the navigation title. -overridePageModule ------------------- -.. versionchanged:: 13.0 - This setting has been removed. + .. _useroptions-pageTree-showPageIdWithTitle: -Migration -~~~~~~~~~ + .. confval:: showPageIdWithTitle + :name: useroptions-pageTree-showPageIdWithTitle + :type: boolean + :Path: options.pageTree.showPageIdWithTitle -In order to replace the :guilabel:`Web > Page` module within a third-party -extension, such as TemplaVoila, it is possible to create a custom module entry -in an extension's :file:`Configuration/Backend/Modules.php` with the following -entry: + If set, the titles in the page tree will have their ID numbers printed + before the title. -.. code-block:: php - :caption: EXT:my_extension/Configuration/Backend/Modules.php - return [ - 'my_module' => [ - 'parent' => 'web', - 'position' => ['before' => '*'], - 'access' => 'user', - 'aliases' => ['web_layout'], - 'path' => '/module/my_module', - 'iconIdentifier' => 'module-page', - 'labels' => 'LLL:EXT:backend/Resources/Private/Language/locallang_mod.xlf', - 'routes' => [ - '_default' => [ - 'target' => \MyVendor\MyExtension\Controller\MyController::class . '::mainAction', - ], - ], - ], - ]; + .. _useroptions-pageTree-showPathAboveMounts: + .. confval:: showPathAboveMounts + :name: useroptions-pageTree-showPathAboveMounts + :type: boolean + :Path: options.pageTree.showPathAboveMounts -.. index:: Page tree + If set, the user db mount path above the mount itself is shown. + This is useful if you work a lot with user db mounts. -.. _useroptions-pageTree: + .. figure:: /Images/ManualScreenshots/List/PanelUserDB.png + :alt: Active user db mount + :class: with-shadow -pageTree --------- + Active user db mount -.. index:: Page tree; Webmounts replace -.. _useroptions-pageTree-altElementBrowserMountPoints: + .. _useroptions-passwordReset: -pageTree.altElementBrowserMountPoints -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. confval:: passwordReset + :name: useroptions-passwordReset + :type: boolean + :Default: 1 -.. confval:: pageTree.altElementBrowserMountPoints - :name: useroptions-pageTree-altElementBrowserMountPoints - :type: list of integers + If set to `0` the initiating of the password reset in the backend + will be disabled. This does not affect the password reset by + CLI command. - Sets alternative webmounts for use in the element browser. You - separate page IDs by a comma. Non-existing page IDs are ignored. If - you insert a non-integer it will evaluate to "0" (zero) and the root - of the page tree is mounted. Effective in - :ref:`workspaces <t3coreapi:workspaces>` too. + To completely disable the password reset in the backend for all users, you + can set the user TSconfig globally in your :file:`Configuration/user.tsconfig`: - These alternative webmounts **replace** configured DB mount points - unless you use the - :ref:`altElementBrowserMountPoints.append <useroptions-pageTree-altElementBrowserMountPoints-append>` - option. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - Example: + options.passwordReset = 0 - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + If required, this setting can be overridden on a per user basis + in the corresponding :guilabel:`TSconfig` field of the backend + usergroup or user. - options.pageTree.altElementBrowserMountPoints = 34,123 + The password reset functionality can also be disabled globally by setting: + .. code-block:: php + :caption: config/system/settings.php | typo3conf/system/settings.php -.. index:: Page tree; Webmounts append -.. _useroptions-pageTree-altElementBrowserMountPoints-append: + $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordReset'] = false -pageTree.altElementBrowserMountPoints.append -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. _useroptions-saveClipboard: -.. confval:: pageTree.altElementBrowserMountPoints.append - :name: useroptions-pageTree-altElementBrowserMountPoints-append - :type: boolean + .. confval:: saveClipboard + :name: useroptions-saveClipboard + :type: boolean - This option allows administrators to add additional mount points - in the RTE and the wizard element browser instead of replacing - the configured database mount points of the user when using the - existing user TSconfig option. + If set, the clipboard content will be preserved for the next login. + Normally the clipboard content lasts only during the session. - Example: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. _useroptions-saveDocNew: - options.pageTree.altElementBrowserMountPoints = 34,123 - options.pageTree.altElementBrowserMountPoints.append = 1 + .. confval:: saveDocNew + :name: useroptions-saveDocNew + :type: boolean / "top" + :Default: 1 + If set, a button :guilabel:`Save and create new` will appear in TCEFORMs. -.. index:: Page tree; Background colors -.. _useroptions-pageTree-backgroundColor: + Note, it is possible to set this for single tables using + :typoscript:`options.saveDocNew.[tableName]`. + Any value set for a single table will override the default value set for + :typoscript:`saveDocNew`. -pageTree.backgroundColor -~~~~~~~~~~~~~~~~~~~~~~~~ + Example: -.. deprecated:: 13.1 - This setting has been deprecated and will be removed in TYPO3 v14 due to its - lack of accessibility. It is being replaced with a - :ref:`new label system <useroptions-pageTree-label>` for tree nodes. + In this example the button is disabled for all tables, except + :sql:`tt_content` where it will appear, and in addition create the records + in the top of the page (default is after instead of top). - In TYPO3 v13 the setting will be migrated to the new label system. Since the - use case is unknown, the generated label will be "Color: <value>". This - information will be displayed on all affected nodes. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -.. confval:: pageTree.backgroundColor - :name: useroptions-pageTree-backgroundColor - :type: string + options.saveDocNew = 0 + options.saveDocNew.tt_content = top - Set background colors for tree branches. + .. _useroptions-saveDocView: - The color can be any valid CSS color value. The best results can be achieved - by using RGBa values. + .. confval:: saveDocView + :name: useroptions-saveDocView + :type: boolean + :Default: 1 - Example: + If set, a button :guilabel:`Save and view` will appear in TCEFORMs. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + Note, it is possible to set this for single tables using + :typoscript:`options.saveDocView.[tableName]`. + Any value set for a single table will override the default value set for + :typoscript:`saveDocView`. - # The syntax is: - # options.pageTree.backgroundColor.<pageId> = <color> - options.pageTree.backgroundColor.147 = orange - options.pageTree.backgroundColor.148 = #AFAFAF - options.pageTree.backgroundColor.151 = rgba(0, 255, 0, 0.1) + .. _useroptions-showDuplicate: - .. figure:: /Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png - :alt: Tree branches with configured background colors - :class: with-shadow + .. confval:: showDuplicate + :name: useroptions-showDuplicate + :type: boolean + :Default: 0 - Tree branches with configured background colors + If set, a button :guilabel:`Duplicate` will appear in TCEFORMs. + Note, that it is possible to set this for single tables using + :typoscript:`options.showDuplicate.[tableName]`. + Any value set for a single table will override the default value set for + :typoscript:`showDuplicate`. -.. index:: Page tree; Doktypes for new pages -.. _useroptions-pageTree-doktypesToShowInNewPageDragArea: -pageTree.doktypesToShowInNewPageDragArea -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. _useroptions-showHistory: -.. confval:: pageTree.doktypesToShowInNewPageDragArea - :name: useroptions-pageTree-doktypesToShowInNewPageDragArea - :type: string - :Default: 1,6,4,7,3,254,255,199 + .. confval:: showHistory + :name: useroptions-showHistory + :type: boolean - If set, the node top panel feature can be configured by a comma-separated - list. Each number stands for a :ref:`doktype ID <t3coreapi:list-of-page-types>` - that should be added to the node top panel. + Shows link to the history for the record in TCEFORMs. - .. figure:: /Images/ManualScreenshots/List/PanelNormal.png - :alt: Top panel in normal mode - :class: with-shadow - - Top panel in normal mode - - .. figure:: /Images/ManualScreenshots/List/PanelModified.png - :alt: Top panel modified - :class: with-shadow - - Top panel modified - - -.. index:: Page tree; Exclude doktypes -.. _useroptions-pageTree-excludeDoktypes: - -pageTree.excludeDoktypes -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. confval:: pageTree.excludeDoktypes - :name: useroptions-pageTree-excludeDoktypes - :type: list of integers - - Excludes nodes (pages) with one of the defined - :ref:`doktypes <t3coreapi:list-of-page-types>` from the page tree. - Can be used, for example, for hiding - :ref:`custom doktypes <t3coreapi:page-types-example>`. - - Example: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig - - options.pageTree.excludeDoktypes = 254,1 - - -.. index:: Page tree; Node labels -.. _useroptions-pageTree-label: - -pageTree.label -~~~~~~~~~~~~~~ - -.. versionadded:: 13.1 - This setting is the successor of :ref:`useroptions-pageTree-backgroundColor`. - -.. confval:: pageTree.label.<page-id> - :name: useroptions-pageTree-label - :type: list of page IDs - - Labels offer customizable color markings for tree nodes and require an - associated label for accessibility. - - Example: - - .. code-block:: typoscript - :caption: EXT:my_extension/Configuration/user.tsconfig - - options.pageTree.label.296 { - label = Campaign A - color = #ff8700 - } - - Display: - - .. figure:: /Images/ManualScreenshots/List/optionsPageTreeLabel.png - :alt: Page with configured color and label - :class: with-shadow - - Page with configured color and label - - .. note:: - Only one label per page can be set through this method. Use the - PSR-14 event :ref:`t3coreapi:AfterPageTreeItemsPreparedEvent` to assign - multiple labels to a page. - -.. todo:: does this still work with site configuration? -.. index:: Page tree; Show domain names -.. _useroptions-pageTree-showDomainNameWithTitle: - -pageTree.showDomainNameWithTitle -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. confval:: pageTree.showDomainNameWithTitle - :name: useroptions-pageTree-showDomainNameWithTitle - :type: boolean - - If set, the domain name will be appended to the page title for - pages that have :guilabel:`Is root of web site?` checked in the page properties. - Useful if there are several domains in one page tree. - - -.. index:: Page tree; Show navigation title -.. _useroptions-pageTree-showNavTitle: - -pageTree.showNavTitle -~~~~~~~~~~~~~~~~~~~~~ - -.. confval:: pageTree.showNavTitle - :name: useroptions-pageTree-showNavTitle - :type: boolean - - If set, the navigation title is displayed in the page navigation tree - instead of the normal page title. The page title is shown in a - tooltip if the mouse hovers the navigation title. - - -.. index:: Page tree; Show page id -.. _useroptions-pageTree-showPageIdWithTitle: - -pageTree.showPageIdWithTitle -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. confval:: pageTree.showPageIdWithTitle - :name: useroptions-pageTree-showPageIdWithTitle - :type: boolean - - If set, the titles in the page tree will have their ID numbers printed - before the title. - - -.. index:: Page tree; Show path above mounts -.. _useroptions-pageTree-showPathAboveMounts: - -pageTree.showPathAboveMounts -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. confval:: pageTree.showPathAboveMounts - :name: useroptions-pageTree-showPathAboveMounts - :type: boolean - - If set, the user db mount path above the mount itself is shown. - This is useful if you work a lot with user db mounts. - - .. figure:: /Images/ManualScreenshots/List/PanelUserDB.png - :alt: Active user db mount - :class: with-shadow - - Active user db mount - - -.. index:: Password; Reset -.. _useroptions-passwordReset: - -passwordReset -------------- - -.. confval:: passwordReset - :name: useroptions-passwordReset - :type: boolean - :Default: 1 - - If set to `0` the initiating of the password reset in the backend - will be disabled. This does not affect the password reset by - CLI command. - - To completely disable the password reset in the backend for all users, you - can set the user TSconfig globally in your :file:`Configuration/user.tsconfig`: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig - - options.passwordReset = 0 - - If required, this setting can be overridden on a per user basis - in the corresponding :guilabel:`TSconfig` field of the backend - usergroup or user. - - The password reset functionality can also be disabled globally by setting: - - .. code-block:: php - :caption: config/system/settings.php | typo3conf/system/settings.php - - $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordReset'] = false - - -.. index:: Clipboard; Save for next login -.. _useroptions-saveClipboard: - -saveClipboard -------------- - -.. confval:: saveClipboard - :name: useroptions-saveClipboard - :type: boolean - - If set, the clipboard content will be preserved for the next login. - Normally the clipboard content lasts only during the session. - - -.. index:: Buttons; Save and create new -.. _useroptions-saveDocNew: - -saveDocNew ----------- - -.. confval:: saveDocNew - :name: useroptions-saveDocNew - :type: boolean / "top" - :Default: 1 - - If set, a button :guilabel:`Save and create new` will appear in TCEFORMs. - - Note, it is possible to set this for single tables using - :typoscript:`options.saveDocNew.[tableName]`. - Any value set for a single table will override the default value set for - :typoscript:`saveDocNew`. - - Example: - - In this example the button is disabled for all tables, except - :sql:`tt_content` where it will appear, and in addition create the records - in the top of the page (default is after instead of top). - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig - - options.saveDocNew = 0 - options.saveDocNew.tt_content = top - - -.. index:: Buttons; Save and view -.. _useroptions-saveDocView: - -saveDocView ------------ - -.. confval:: saveDocView - :name: useroptions-saveDocView - :type: boolean - :Default: 1 - - If set, a button :guilabel:`Save and view` will appear in TCEFORMs. - - Note, it is possible to set this for single tables using - :typoscript:`options.saveDocView.[tableName]`. - Any value set for a single table will override the default value set for - :typoscript:`saveDocView`. - - -.. index:: Buttons; Duplicate record -.. _useroptions-showDuplicate: - -showDuplicate -------------- - -.. confval:: showDuplicate - :name: useroptions-showDuplicate - :type: boolean - :Default: 0 - - If set, a button :guilabel:`Duplicate` will appear in TCEFORMs. - - Note, that it is possible to set this for single tables using - :typoscript:`options.showDuplicate.[tableName]`. - Any value set for a single table will override the default value set for - :typoscript:`showDuplicate`. - - -.. index:: Buttons; History of record -.. _useroptions-showHistory: - -showHistory ------------ - -.. confval:: showHistory - :name: useroptions-showHistory - :type: boolean - - Shows link to the history for the record in TCEFORMs. - - Note, it is possible to set this for single tables using - :typoscript:`options.showHistory.[tableName]`. - Any value set for a single table will override the default value set for - :typoscript:`showHistory`. + Note, it is possible to set this for single tables using + :typoscript:`options.showHistory.[tableName]`. + Any value set for a single table will override the default value set for + :typoscript:`showHistory`. From b6bab01c680ae2d20d45622f50f0ac1b2b880fa4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:02:01 +0100 Subject: [PATCH 012/125] [TASK] Move TypoScript 45 Guide into TypoScript reference (#1376) The content is unchanged, it can be improved in follow-ups Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Guide/CreateAMenu/Index.rst | 85 +++++++ Documentation/Guide/HtmlTemplate/Index.rst | 53 +++++ Documentation/Guide/Index.rst | 32 +++ Documentation/Guide/NextSteps/Index.rst | 21 ++ .../ContentElements/Index.rst | 114 ++++++++++ .../Guide/ReadingContentRecords/Index.rst | 102 +++++++++ .../Guide/TypoScriptFunctions/If/Index.rst | 61 +++++ .../TypoScriptFunctions/ImgResource/Index.rst | 45 ++++ .../Guide/TypoScriptFunctions/Index.rst | 33 +++ .../TypoScriptFunctions/ParseFunc/Index.rst | 26 +++ .../TypoScriptFunctions/Select/Index.rst | 41 ++++ .../Guide/TypoScriptFunctions/Split/Index.rst | 49 ++++ .../TypoScriptFunctions/Typolink/Index.rst | 93 ++++++++ .../DatabaseQueries/Index.rst | 41 ++++ .../FurtherObjects/Index.rst | 43 ++++ .../Guide/TypoScriptObjects/Index.rst | 25 +++ .../RenderingContent/Index.rst | 56 +++++ .../BackendConfiguration/Index.rst | 17 ++ .../TypoScriptOverview/FirstSteps/Index.rst | 210 ++++++++++++++++++ .../Guide/TypoScriptOverview/Index.rst | 41 ++++ .../TypoScriptOverview/MainTemplate/Index.rst | 30 +++ .../Prerequisites/Index.rst | 30 +++ .../TheTermTemplate/Index.rst | 56 +++++ .../TypoScriptAnArray/Index.rst | 67 ++++++ .../WhyTypoScript/Index.rst | 30 +++ .../Guide/UsingFluidStyledContent/Index.rst | 37 +++ Documentation/Guide/UsingGetText/Index.rst | 51 +++++ .../Guide/UsingStdWrap/CObject/Index.rst | 17 ++ .../Guide/UsingStdWrap/HeedTheOrder/Index.rst | 31 +++ Documentation/Guide/UsingStdWrap/Index.rst | 26 +++ .../UsingStdWrap/ModifyTheOrder/Index.rst | 35 +++ .../Guide/UsingStdWrap/TheDataType/Index.rst | 15 ++ .../AutomaticScreenshots/RootlevelFlag.png | Bin 0 -> 20833 bytes .../RootlevelFlag.rst.txt | 7 + .../TemplateAnalyzerStructure.png | Bin 0 -> 111031 bytes .../TemplateAnalyzerStructure.rst.txt | 7 + .../NoTypoScriptTemplateFound.png | Bin 0 -> 45177 bytes .../NoTypoScriptTemplateFoundDebuggingOff.png | Bin 0 -> 21136 bytes .../ThePageIsNotConfigured.png | Bin 0 -> 39538 bytes Documentation/Index.rst | 1 + 40 files changed, 1628 insertions(+) create mode 100644 Documentation/Guide/CreateAMenu/Index.rst create mode 100644 Documentation/Guide/HtmlTemplate/Index.rst create mode 100644 Documentation/Guide/Index.rst create mode 100644 Documentation/Guide/NextSteps/Index.rst create mode 100644 Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst create mode 100644 Documentation/Guide/ReadingContentRecords/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/If/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/Select/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/Split/Index.rst create mode 100644 Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst create mode 100644 Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst create mode 100644 Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst create mode 100644 Documentation/Guide/TypoScriptObjects/Index.rst create mode 100644 Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst create mode 100644 Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst create mode 100644 Documentation/Guide/UsingFluidStyledContent/Index.rst create mode 100644 Documentation/Guide/UsingGetText/Index.rst create mode 100644 Documentation/Guide/UsingStdWrap/CObject/Index.rst create mode 100644 Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst create mode 100644 Documentation/Guide/UsingStdWrap/Index.rst create mode 100644 Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst create mode 100644 Documentation/Guide/UsingStdWrap/TheDataType/Index.rst create mode 100644 Documentation/Images/AutomaticScreenshots/RootlevelFlag.png create mode 100644 Documentation/Images/AutomaticScreenshots/RootlevelFlag.rst.txt create mode 100644 Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png create mode 100644 Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt create mode 100644 Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFound.png create mode 100644 Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png create mode 100644 Documentation/Images/ManualScreenshots/ThePageIsNotConfigured.png diff --git a/Documentation/Guide/CreateAMenu/Index.rst b/Documentation/Guide/CreateAMenu/Index.rst new file mode 100644 index 000000000..29e52ebc4 --- /dev/null +++ b/Documentation/Guide/CreateAMenu/Index.rst @@ -0,0 +1,85 @@ +.. include:: /Includes.rst.txt + + +.. _menu: +.. _create-a-menu: + +Create a menu +------------- + +Until now, we learned how the page *content* is rendered; however, the +page *navigation* is missing. + +TYPO3 CMS offers a special menu object called +:ref:`HMENU <cobj-hmenu>` ("H" stands for hierarchical) to easily build +different kinds of menus. + +We want our menu to be built like a nested list: + +.. code-block:: html + + <ul class="level1"> + <li>first level</li> + <li>first level + <ul class="level2"> + <li>second level</li> + </ul> + </li> + <li>first level</li> + </ul> + +It is customary to declare new objects as sub-properties of the +`lib` top-level object. We can give it any name that hasn't +been assigned yet:: + + lib.textmenu = HMENU + lib.textmenu { + + # We define the first level as text menu. + 1 = TMENU + + # We define the normal state ("NO"). + 1.NO = 1 + 1.NO.allWrap = <li>|</li> + + # We define the active state ("ACT"). + 1.ACT = 1 + 1.ACT.wrapItemAndSub = <li>|</li> + + # Wrap the whole first level. + 1.wrap = <ul class="level1">|</ul> + + # The second and third level should be configured exactly + # the same way. + # In between the curly brackets, objects can be copied. + # With the dot "." we define that the object can be found + # in the brackets. + # With 2.wrap and 3.wrap we overwrite the wrap, which was + # copied from 1.wrap. + 2 < .1 + 2.wrap = <ul class="level2">|</ul> + 3 < .1 + 3.wrap = <ul class="level3">|</ul> + } + +The :ref:`HMENU <cobj-hmenu>` object allows us to create a diversity of menus. +The main properties are numbers and correspond to the menu level. + +The :ref:`TMENU <tmenu>` object renders a menu level as +text. A different +rendering can be chosen for each menu level. + +On every menu level, we can configure various states for the single +menu items – see :ref:`menu items <menu-common-properties>`, +e.g. `NO` for "normal", `ACT` for "pages in the root line" +(i.e. the current page, its parent, grandparent, and so forth) or +`CUR` for "the current page". + +.. important:: + + Except for the normal state (`NO`), other states have to be activated + before they get displayed (i.e. `ACT = 1`). + +Now that our menu is defined, we can use it with:: + + page.5 < lib.textmenu diff --git a/Documentation/Guide/HtmlTemplate/Index.rst b/Documentation/Guide/HtmlTemplate/Index.rst new file mode 100644 index 000000000..0e0791217 --- /dev/null +++ b/Documentation/Guide/HtmlTemplate/Index.rst @@ -0,0 +1,53 @@ +.. include:: /Includes.rst.txt + + +.. _insert-content-in-a-template: + +================================= +Insert content in a HTML template +================================= + +Although we now know how to render content, and how to build a menu, we do not +have a real website yet. + +Again everything could be done using TypoScript. That would be pretty complex +and error prone. Furthermore if a HTML template file is prepared by a designer +for the website, it would be a shame not to reuse it as is as much as +possible. It would also make further corrections to the HTML template much +harder to apply. + +TYPO3 CMS provides the :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` +object, with which we can use Fluid template and render our website with it:: + + 10 = FLUIDTEMPLATE + 10 { + templateName = TEXT + templateName.value = Default + + templateRootPaths { + 0 = EXT:sitepackage/Resources/Private/Templates/Page/ + } + partialRootPaths { + 0 = EXT:sitepackage/Resources/Private/Partials/Page/ + } + layoutRootPaths { + 0 = EXT:sitepackage/Resources/Private/Layouts/Page/ + } + } + + +In your template file you can now replace the parts that should be filled by +TYPO3 with references to the TypoScript configuration objects you defined +earlier. + +For example to render a template with the menu we defined add: + +.. code-block:: html + + <nav> + <f:cObject typoscriptObjectPath="lib.textmenu" /> + </nav> + + <div class="container"> + <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '{data.uid}', colPos: '0'}" /> + </div> diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst new file mode 100644 index 000000000..1f5ab9910 --- /dev/null +++ b/Documentation/Guide/Index.rst @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +.. _guide: + +================ +TypoScript guide +================ + +Learn the fundamentals of TypoScript in just 45 minutes. + +Furthermore, you can find a full reference of all object types and properties of +TypoScript in the :doc:`TypoScript Reference <Index>`, insights into TYPO3 +backend configuration with TypoScript in the :doc:`TSconfig <t3tsconfig:Index>` +documentation and explanations of TypoScript syntax in the +":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" chapter of TYPO3 +Explained. + +---- + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + TypoScriptOverview/Index + ReadingContentRecords/Index + CreateAMenu/Index + HtmlTemplate/Index + UsingFluidStyledContent/Index + TypoScriptObjects/Index + TypoScriptFunctions/Index + UsingStdWrap/Index + UsingGetText/Index + NextSteps/Index diff --git a/Documentation/Guide/NextSteps/Index.rst b/Documentation/Guide/NextSteps/Index.rst new file mode 100644 index 000000000..09f18df2b --- /dev/null +++ b/Documentation/Guide/NextSteps/Index.rst @@ -0,0 +1,21 @@ +.. include:: /Includes.rst.txt + + +.. _next-steps: + +Next steps +---------- + +Armed with this basic knowledge of TypoScript, you may want +to continue your exploration of TYPO3 CMS by following the +:doc:`Sitepackage Tutorial <t3sitepackage:Index>`, which will +guide you through the creation of a whole website template +using TypoScript. + +To learn more about the structure and syntax of TypoScript, +you can refer to the :ref:`TypoScript Syntax and In-depth Study<t3coreapi:typoscript-syntax-start>` +reference. + +Finally - as was mentioned again and again throughout this tutorial - +the ultimate resource about TypoScript objects, functions and +data types is the :doc:`TypoScript Reference <Index>`. diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst new file mode 100644 index 000000000..c39336eb8 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst @@ -0,0 +1,114 @@ +.. include:: /Includes.rst.txt + + +.. _content-objects: +.. _content-elements: +.. _the-various-content-objects: + +============================ +The various content elements +============================ + +The setup we just defined is pretty basic and will work only for content +elements containing text. But the content elements are varied and we also need +to render images, forms, etc. and we do not want to define everything in +TypoScript - using HTML templates would be more convenient. + +The type of a content element is stored in the column +`CType` of table "tt\_content". We can use this information +with a :ref:`CASE <cobj-case>` object, which makes it possible to +differentiate how the individual content element types are rendered. + +The following code is the default TypoScript rendering definition as taken from +the TYPO3 Core. The default `renderObj` of a table is a TypoScript +definition named after that table. In case of content in TYPO3 the table is +called `tt_content` therefore the default `renderObj` is also called +`tt_content`:: + + # Content element rendering taken from typo3/sysext/frontend/ext_localconf.php + tt_content = CASE + tt_content { + key { + # The field CType will be used to differentiate. + field = CType + } + # Render a error message in case no specific rendering definition is found + default = TEXT + default { + field = CType + htmlSpecialChars = 1 + wrap = <p style="background-color: yellow; padding: 0.5em 1em;"><strong>ERROR:</strong> Content Element with uid "{field:uid}" and type "|" has no rendering definition!</p> + wrap.insertData = 1 + } + } + +The basic extension for rendering content in TYPO3 since TYPO3 v8 is +`fluid_styled_content`. The example shows how +`fluid_styled_content` is setup: It defines a basic content element based +on the content object `FLUIDTEMPLATE` which is able to render html +templates using the `fluid` templating engine. For every content element, +the basic template, layout and partial parts are defined. As you can see by +looking at the lines starting with `10 =` there is the possibility to +add your own templates by setting the corresponding `constant` (in the +`Constants` section of a TypoScript template):: + + # Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.txt + lib.contentElement = FLUIDTEMPLATE + lib.contentElement { + templateName = Default + templateRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Templates/ + 10 = {$styles.templates.templateRootPath} + } + partialRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Partials/ + 10 = {$styles.templates.partialRootPath} + } + layoutRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Layouts/ + 10 = {$styles.templates.layoutRootPath} + } + # ... + } + + +Each content element inherits that configuration. As an example take a look at +the content element definition of the content element of type `header`:: + + # Header Only: + # Adds a header only. + # + # CType: header + # Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/ContentElement/Header.txt + tt_content.header =< lib.contentElement + tt_content.header { + templateName = Header + } + +First, all configuration options defined in `lib.contentElement` are +referenced. Then the `templateName` for rendering a content element of +type `header` is set - in this case `Header`. This tells fluid to +look for a +`Header.html` in the defined template path(s) (see above, by default in +`EXT:fluid_styled_content/Resources/Private/Templates/`). + +To adjust how the default elements are rendered you can overwrite the templates +in your own site package extension and set the TypoScript constants defining +the paths (see above). In your own templates you have the data of the currently +rendered content element available in the {data} fluid variable. For example +take a look at how the text element is rendered: + +.. code-block:: html + + # Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html + <f:layout name="Default" /> + <f:section name="Main"> + <f:format.html>{data.bodytext}</f:format.html> + </f:section> + </html> + +The database field `bodytext` from the `tt_content` table (which is +the main text input field for content elements of type `text`) is +available as `{data.bodytext}` in the fluid template. For more +information about `fluid_styled_content` see its :doc:`manual +<typo3/cms-fluid-styled-content:Index>`. diff --git a/Documentation/Guide/ReadingContentRecords/Index.rst b/Documentation/Guide/ReadingContentRecords/Index.rst new file mode 100644 index 000000000..2ff384c9e --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/Index.rst @@ -0,0 +1,102 @@ +.. include:: /Includes.rst.txt + + +.. _reading-content-records: + +======================= +Reading content records +======================= + +.. note:: + + The following chapter aims at explaining the relationship between database + content and frontend output via TypoScript. The TYPO3 Core and system + extension `fluid_styled_content` already contain definitions for the TYPO3 + Core content element rendering. You do not have to add anything yourself. + + If you wish a content element to be rendered differently or if you program + an extension with new content elements, it will be necessary to understand + this relationship to be able to design your own TypoScript properly. + +Obviously entering all content for the website would be terribly tiresome, +although possible from a theoretical point of view. + +What we want is to have a TypoScript which gathers the content automatically. +The example below creates a page on which, for each content element on that +page, the headline and the text is displayed. + +After creating the :ref:`PAGE <page>` object, we use the :ref:`CONTENT +<cobj-content>` object to retrieve content from the database. For each +content element we use the :ref:`TEXT <cobj-text>` object to perform +the actual rendering:: + + page = PAGE + page.typeNum = 0 + + # The CONTENT object executes a database query and loads the content. + page.10 = CONTENT + page.10.table = tt_content + page.10.select { + + # "sorting" is a column from the tt_content table and + # keeps track of the sorting order, which was specified in + # the backend. + orderBy = sorting + + # Only select content from column "0" (the column called + # "normal") and quote the database identifier (column name) + # "colPos" (indicated by wrapping with {#}) + where = {#colPos}=0 + } + + # For every result line from the database query (that means for every content + # element) the renderObj is executed and the internal data array is filled + # with the content. This ensures that we can call the .field property and we + # get the according value. + page.10.renderObj = COA + page.10.renderObj { + + 10 = TEXT + + # The field tt_content.header normally holds the headline. + 10.stdWrap.field = header + + 10.stdWrap.wrap = <h1>|</h1> + + 20 = TEXT + + # The field tt_content.bodytext holds the content text. + 20.stdWrap.field = bodytext + + 20.stdWrap.wrap = <p>|</p> + } + +The :ref:`CONTENT <cobj-content>` object executes an SQL query on the +database. The query is controlled by the `select` property, which - in +our case - defines that we want all records from the column 0 (which is the +column called "NORMAL" in the backend), and that the result should be sorted +according to the field called "sorting". + +The `select` property has a `pidInList` which can be used to +retrieve elements from a specific page. If it is not defined +- as in our example - elements are taken from the current page. + +The `renderObj` property defines how each record gets rendered. It is +defined as :ref:`COA (Content Object Array) <cobj-coa>`, which can hold +an arbitrary number of TypoScript objects. In this case, two :ref:`TEXT +<cobj-text>` objects are used, which are rendered one after the other +(remember that the order of the rendering is not controlled by the order in +TypoScript, but by the numbers with which they are defined). The :ref:`TEXT +<cobj-text>` object "10" will be created first and the :ref:`TEXT +<cobj-text>` object "20" will be rendered after it. + +The challenge is to render all content elements like the web designer +predetermined. Therefore, we have to create TypoScript definitions for every +single database field (e.g. for images, image size, image position, link to +top, index, etc.). + + +.. toctree:: + :hidden: + + ContentElements/Index diff --git a/Documentation/Guide/TypoScriptFunctions/If/Index.rst b/Documentation/Guide/TypoScriptFunctions/If/Index.rst new file mode 100644 index 000000000..3050576da --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/If/Index.rst @@ -0,0 +1,61 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-if: + +if +^^ + +The :ref:`if <if>` function is perhaps the most difficult +of all TypoScript functions. It does not work like the "if" construct +known from most programming language and is thus very open to misuse. +Hopefully the examples below will help you get it right. + +Generally the `if` function returns `true`, +if **all** conditions are fulfilled. This resembles a boolean AND combination. +If what we would like returned is a `false` value, +we can use the :code:`negate` option to negate the result:: + + 10 = TEXT + 10 { + + # Content of the TEXT object. + value = The L parameter is passed as GET variable. + + # Results in "true" and leads to rendering of the upper value, if the + # GET/POST parameter is passed with a value, which is not 0. + stdWrap.if.isTrue.data = GP:L + } + +With the use of `if` it is also possible to compare values. For this +purpose we use `value` property:: + + 10 = TEXT + 10 { + + # WARNING: This value resembles the value of the TEXT object, not that of the "if"! + value = 3 is bigger than 2. + + # Compare parameter of the "if" function. + stdWrap.if.value = 2 + + # Please note: The sorting order is "backwards", + # returning the sentence "3 is bigger than 2". + stdWrap.if.isGreaterThan = 3 + } + +Because the properties of the `if` function implement +:ref:`stdWrap functions <guide-using-stdwrap>`, all kinds of variables can be compared:: + + 10 = TEXT + 10 { + # Value of the TEXT object. + value = The record can be shown, because the starting date has passed. + + # Condition of the if clause (number of seconds since January 1st, 1970). + stdWrap.if.value.data = date:U + + # Condition backwards again: Start time isLessThan date:U. + stdWrap.if.isLessThan.field = starttime + } + diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst new file mode 100644 index 000000000..fff59c802 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst @@ -0,0 +1,45 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-imgresource: + +imgResource +^^^^^^^^^^^ + +The :ref:`imgResource <imgresource>` function relates to modifications of +pictures. Its main usage is the property `file` of the +:ref:`IMAGE <cobj-image>` object. + +This, for example, allows an image to be resized:: + + temp.myImage = IMAGE + temp.myImage { + file = toplogo.gif + file.width = 200 + file.height = 300 + } + +It is also possible to set minimum or maximum dimensions:: + + temp.myImage = IMAGE + temp.myImage { + file = toplogo.gif + + # maximum size + file.maxW = 200 + file.maxH = 300 + + # minimum size + file.minW = 100 + file.minH = 120 + } + +`imgResource` also provides direct access to +ImageMagick/GraphicsMagick features:: + + temp.myImage = IMAGE + temp.myImage { + file = toplogo.gif + file.params = -rotate 90 + } + diff --git a/Documentation/Guide/TypoScriptFunctions/Index.rst b/Documentation/Guide/TypoScriptFunctions/Index.rst new file mode 100644 index 000000000..dd167c5af --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Index.rst @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + + +.. _guide-functions: + +==================== +TypoScript functions +==================== + +TypoScript functions can be considered as a set of common properties. Whenever +an object has a property corresponding to a given function, you are assured to +have that set of properties available. + +This chapter gives you a brief overview of the most common functions available +in TypoScript. As always the :doc:`TypoScript Reference <Index>` is the +ultimate source of knowledge on the matter. For each object property, it +indicates whether it is a simple data type or a function. + +The most used function is the "standard wrap", usually known as "stdWrap". Due +to its importance, it is entitled to +:ref:`its very own chapter <guide-using-stdwrap>`. + +**The functions:** + +.. toctree:: + + ImgResource/Index + Select/Index + Split/Index + If/Index + Typolink/Index + ParseFunc/Index + diff --git a/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst b/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst new file mode 100644 index 000000000..772278e61 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst @@ -0,0 +1,26 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-parsefunc: + +========= +parseFunc +========= + +This function parses the main part of the content, i.e., the content which has +been entered in the Rich Text Editor. The function is responsible for the fact +that the content is not rendered exactly as it was entered in the RTE. Some +default parsing rules are implemented in the core, like parsing link tags via +:ref:`typolink` function. + +You can also use :typoscript:`parseFunc` for your own processing. In the following +example, every occurrence of "COMP" is replaced by "My company name":: + + page.stdWrap.parseFunc.short { + COMP = My company name + } + +The various possibilities of changing the default behavior can be found by +using the TypoScript object browser. All possibilities of how parseFunc can +alter the rendering can be found in the +:ref:`TypoScript Reference <parsefunc>`. diff --git a/Documentation/Guide/TypoScriptFunctions/Select/Index.rst b/Documentation/Guide/TypoScriptFunctions/Select/Index.rst new file mode 100644 index 000000000..51a5e64b8 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Select/Index.rst @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-select: + +====== +select +====== + +The :ref:`select <select>` function generates a SQL SELECT query, which +is used to read records from the database. `select` automatically checks +whether the records might be "hidden", "deleted", or if they have a "start and +end date". If `pidInList` is used (meaning a list of pages is rendered), +the function also checks if the current user is allowed to see all records. + +With the help of the select function, it is possible to show the content of a +page on all pages. For example:: + + temp.leftContent = CONTENT + temp.leftContent { + + table = tt_content + select { + + # The page with ID = 123 is the source. + pidInList = 123 + + # Sorting is the same as in the backend. + orderBy = sorting + + # Only select the content of the left column. + where = {#colPos}=1 + + # Define the field with the language ID in tt_content. + languageField = sys_language_uid + } + } + + # Replace the mark ###LEFT### with the output of temp.leftContent. + marks.LEFT < temp.leftContent + diff --git a/Documentation/Guide/TypoScriptFunctions/Split/Index.rst b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst new file mode 100644 index 000000000..0b9e2646b --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-split: + +split +^^^^^ + +The :ref:`split <split>` function can be used to split given data at a predefined +character and process the single pieces afterwards. At every +iteration, the current index key `SPLIT-COUNT` is stored (starting +with 0). + +By using `split`, we could, for example, read a table field and wrap +every single line with a certain code (e.g. generate an HTML table, +which can be used to show the same content on more than one page):: + + 20 = TEXT + + # The content of the field "bodytext" is imported (from $cObj->data-array). + 20.stdWrap.field = bodytext + 20.stdWrap.split { + + # The separation character is defined (char = 10 is the newline character). + token.char = 10 + + # We define which element will be used. + # By using optionSplit we can distinguish between elements. + # Corresponding elements with the numbers must be defined! + # For rendering, the numbers 1 and 2 are used in alternation. + # In this example, the classes "odd" and "even" are used so we + # can zebra style a table. + cObjNum = |*|1||2|*| + + # The first element is defined (which is referenced by cObjNum). + # The content is imported using stdWrap->current. + 1.current = 1 + + # The element is wrapped. + 1.wrap = <tr class="odd"><td> | </td></tr> + + # The 2nd element is determined and wrapped. + 2.current = 1 + 2.wrap = <tr class="even"><td> | </td></tr> + } + + # A general wrap to create a valid table markup. + 20.stdWrap.wrap = <table> | </table> + diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst new file mode 100644 index 000000000..0b85bfd46 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst @@ -0,0 +1,93 @@ +.. include:: /Includes.rst.txt + + +.. _guide-function-typolink: + +======== +typolink +======== + +:ref:`typolink <typolink>` is the TYPO3 CMS function +that allows us to generate all kinds of links. +If possible one should always use this function to generate links +as they will be processed by TYPO3 CMS. This is a prerequisite, +for example, for the "realurl" extension to generate speaking URLs +or for the anti-spam protection of email addresses. + +Please resist the urge to a straight `<a href="...">...</a>` construct +in your templates. + +Basically `typolink` links the specified text according to +the defined parameters. One example:: + + temp.link = TEXT + temp.link { + + # This is the defined text. + value = Example link + + # Here comes the typolink function. + typolink { + + # This is the destination of the link... + parameter = http://www.example.com/ + + # with a target ("_blank" opens a new window)... + extTarget = _blank + + # and add a class to the link so we can style it. + ATagParams = class="linkclass" + } + } + +The example above will generate this HTML code: + +.. code-block:: html + + <a class="linkclass" target="\_blank" href="http://www.example.com/">Example link</a> + +`typolink`, in a way, almost works like a wrap: the content which is +defined for example by the `value` property, will be wrapped by the HTML anchor tag. +If no content is defined, it will be generated automatically. With a +link to a page, the page title will be used. With an external URL, the +URL will be shown. + +The above example can actually be shortened, because the +`parameter` property can take a series of values separated +by a white space:: + + temp.link2 = TEXT + temp.link2 { + + # Again the defined text. + value = Example link + + # The parameter with the summary of the parameters of the first + # example (explanation follows below). + typolink.parameter = www.example.com _blank linkclass + } + +The exact syntax for `parameter` property is fully described, +as usual, in the :ref:`TypoScript Reference <typolink>`. + +It is even possible to define links that open in JavaScript popups:: + + temp.link = TEXT + temp.link { + + # The link text. + value = Open a popup window. + + stdWrap.typolink { + # The first parameter is the page ID of the target page, + # second parameter is the size of the popup window. + parameter = 10 500x400 + + # The title attribute of the link. + title = Click here to open a popup window. + + # The parameters of the popup window. + JSwindow_params = menubar=0, scrollbars=0, toolbar=0, resizable=1 + + } + } diff --git a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst new file mode 100644 index 000000000..9457381e9 --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt + + +.. _guide-cobjects-database-queries: + +================================== +Objects executing database queries +================================== + +- :ref:`CONTENT <cobj-content>` can be used to access arbitrary tables + of TYPO3 CMS internals. This does not only include table "tt\_content", but + extension tables can also be referenced. The :ref:`select <select>` + function makes it possible to generate complex SQL queries. + +- :ref:`RECORDS <cobj-records>` can be used to reference specific data + records. This is very helpful if the same text has to be present on all + pages. By using RECORDS, a single content element can be defined and shown. + Thus, an editor can edit the content without having to copy the element + repetitively. This object is also used by the content element type "Insert + records". + + In the following example, the email address from an address record is + rendered and linked as email at the same time:: + + page.80 = RECORDS + page.80 { + source = 1 + tables = tt_address + conf.tt_address = COA + conf.tt_address { + 20 = TEXT + 20.stdWrap.field = email + 20.stdWrap.typolink.parameter.field = email + } + } + +- :ref:`HMENU <cobj-hmenu>` imports the page tree and offers + comfortable ways to generate a menu of pages or a sitemap. Special menus + include the breadcrumb trail, simple list of pages or subpages, a page + browser (providing "Previous" and "Next" buttons for a set of pages) and a + language selector. diff --git a/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst new file mode 100644 index 000000000..ebad4594e --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt + + +.. _guide-cobjects-further-cobjects: + +=============== +Further objects +=============== + +- :ref:`CASE <cobj-case>` allows case differentiation. In the core this + object is used for rendering different content elements according to their + type. + +- :ref:`COA <cobj-coa>` (content object array) allows us to combine an + arbitrary number of objects. + +- :ref:`COA\_INT <cobj-coa-int>` is a COA object, but non-cached. This + element will be regenerated upon each call. This is useful with time and date + or user-dependent data, for example. + +- :ref:`LOAD\_REGISTER <cobj-load-register>` / + :ref:`RESTORE\_REGISTER <cobj-restore-register>` objects allow us to + fill the global array `$GLOBALS['TSFE']->register[]` with content. + These objects return nothing. Single values and complete TypoScript + objects can be used. In doing so, the register works as a stack: With + every call, a further element is stacked. With + `RESTORE_REGISTER`, the element on top can be removed. + Values in the register can be used with the + :ref:`getText <data-type-gettext-register>` data type. + +- :ref:`USER <cobj-user>` and USER\_INT are for user-defined functions. + Every frontend plugin from a TYPO3 CMS extension is such an object. + :ref:`USER\_INT <cobj-user-int>` is the non-cached variant. + +- :ref:`IMG\_RESOURCE <cobj-img-resource>` is used by the + :ref:`IMAGE <cobj-image>` object. The resource returned is + normally the `src` attribute of the `<img>` tag. + If images are scaled, this object serves as + a calculation basis for the new files, which are stored in the + :file:`_processed_` folder of each file storage. + +- :ref:`GIFBUILDER <gifbuilder>` is used for generating image files + dynamically. Various texts and images can be combined, and much more. diff --git a/Documentation/Guide/TypoScriptObjects/Index.rst b/Documentation/Guide/TypoScriptObjects/Index.rst new file mode 100644 index 000000000..25c28c0fb --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/Index.rst @@ -0,0 +1,25 @@ +.. include:: /Includes.rst.txt + +.. _guide-cobjects: + +================== +TypoScript objects +================== + +As we already saw there is quite a variety of TypoScript objects. Each object +has a number of properties. These can be simple data types or functions, which +have their own set of properties. Using properties that don't exist will have +no effect. + +The :doc:`TypoScript Reference <Index>` lists all data types, functions +and objects with their properties. This chapter offers a short overview of the +most common objects to give you an idea of what is available. + + +**Some most common objects:** + +.. toctree:: + + DatabaseQueries/Index + RenderingContent/Index + FurtherObjects/Index diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst new file mode 100644 index 000000000..edfb1003b --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst @@ -0,0 +1,56 @@ +.. include:: /Includes.rst.txt + + +.. _guide-cobjects-rendering-content: + +========================= +Objects rendering content +========================= + +- :ref:`IMAGE <cobj-image>` for the rendering of an image:: + + lib.logo = IMAGE + lib.logo { + file = fileadmin/logo.gif + file.width = 200 + stdWrap.typolink.parameter = 1 + } + + The result is an image based on file :file:`logo.gif` with width of 200 + pixels and a link to the page 1. + +- :ref:`TEXT <cobj-text>` is for the rendering of standard text or the + content of fields:: + + lib.motto = TEXT + lib.motto.value = Inspiring people to share + lib.motto.wrap = <div class="highlight">|</div> + +- :ref:`FILES <cobj-files>` is used to retrieve information about one + or more files and perform some rendering with it:: + + lib.banner = FILES + lib.banner { + references { + table = pages + fieldName = media + uid.data = page:uid + } + renderObj = IMAGE + renderObj { + file.import.data = file:current:uid + file.treatIdAsReference = 1 + file.width = 500 + wrap = <div class="banner">|</div> + } + } + + This code will probably look pretty abstract to you right now. What it does + is to reference the images that were related to a given page in the "media" + field. It takes each of these images and resizes them to a maximum width of + 500 pixels. Each image is wrapped in a `<div>` tag. + +- :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` renders a template with the + template engine Fluid with variables and data that you define - as previously + discussed in the ":ref:`insert-content-in-a-template`" chapter. + diff --git a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst new file mode 100644 index 000000000..73f5f6a36 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst @@ -0,0 +1,17 @@ +.. include:: /Includes.rst.txt + + +.. _guide-backend-configuration: + +Backend configuration +^^^^^^^^^^^^^^^^^^^^^ + +TypoScript influences many aspects of a TYPO3 site: + +TypoScript can be used in the TSconfig field of a backend user or a +backend user group or in the TSconfig field of a page. It will then +change the look and behavior of forms in the *backend*. + +The *frontend* rendering in contrast is defined by the TypoScript +used in TypoScript templates. This document covers only frontend +rendering. diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst new file mode 100644 index 000000000..968a2ea05 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst @@ -0,0 +1,210 @@ +.. include:: /Includes.rst.txt + + +.. _guide-first-steps: + +First steps +^^^^^^^^^^^ + +The basic rendering is defined in the "Setup" field of the main template. + +TypoScript essentially consists of objects, which have certain +properties. Some of these properties can accept other objects, others +stand for functions or simple values. + +The :ref:`PAGE <page>` object is responsible for the +rendering of a website page in the frontend:: + + # The object mypage is defined as PAGE object. + mypage = PAGE + + # PAGE objects have the property typeNum. + mypage.typeNum = 0 + + # mypage has an object "10" of type TEXT. It is a TEXT object. + mypage.10 = TEXT + + # TEXT objects in turn have a property called "value". + mypage.10.value = Hello World + +The :ref:`PAGE <page>` object on the one hand offers numerous named properties +(like :typoscript:`typeNum`). On the other hand it also has an endless number of +numbered objects (a so-called content array). The names of these +objects only consist of numbers and the objects are sorted +accordingly when they are rendered, from the smallest number to the +largest. The order of the lines in the TypoScript template is +irrelevant:: + + # Create a PAGE object. + mypage = PAGE + mypage.typeNum = 0 + + mypage.30 = TEXT + mypage.30.value = This gets rendered last. + + # Rendering will first output object number 10, then 20 and 30. + # An object with number 25 would logically be output between 20 and 30. + mypage.20 = TEXT + mypage.20.value = This is rendered in the middle. + + # This is the first output object + mypage.10 = TEXT + mypage.10.value = This is rendered first. + + # Here we create a second PAGE object, which we can use for the + # print view. + print = PAGE + print.typeNum = 98 + print.10 = TEXT + print.10.value = This is the print version. + +Every entry is stored in a multidimensional PHP array. Every object +and every property, therefore, is unique. We could define an arbitrary +number of PAGE objects; however, the :typoscript:`typeNum` has to be unique. For +every :typoscript:`typeNum`, there can be only one :ref:`PAGE <page>` object. + +In the example, for the parameter :typoscript:`typeNum = 98`, a different output +mode is created. By using :typoscript:`typeNum`, various output types can be +defined. If :typoscript:`typeNum` is not set explicitly, it defaults to "0". +Typically, :typoscript:`typeNum = 0` is used for the HTML output. + +When a page is requested with just :code:`index.php?id=1`, :typoscript:`typeNum = 0` +will be assumed and the output will be HTML. To get the print output, the request +will have to pass a "type" attribute, i.e. :code:`index.php?id=1&type=98`. + +It is thus possible to generate many different outputs depending on one's +needs (XML, JSON, PDF, etc.). TypoScript configuration can be copied between +those various views, changing only what's specific for each of them. + +The previous example would look like this as a PHP array: + +.. code-block:: php + + $TypoScript['mypage'] = 'PAGE'; + $TypoScript['mypage.']['typeNum'] = 0; + $TypoScript['mypage.']['10'] = 'TEXT'; + $TypoScript['mypage.']['10.']['value'] = 'This is rendered first.'; + $TypoScript['mypage.']['20'] = 'TEXT'; + $TypoScript['mypage.']['20.']['value'] = 'This is rendered in the middle.'; + $TypoScript['mypage.']['30'] = 'TEXT'; + $TypoScript['mypage.']['30.']['value'] = 'This gets rendered last.'; + + $TypoScript['print'] = 'PAGE'; + $TypoScript['print.']['typeNum'] = 98; + $TypoScript['print.']['10'] = 'TEXT'; + $TypoScript['print.']['10.']['value'] = 'This is the print version.'; + + +Empty spaces at the start and end of values are removed by TYPO3 CMS +automatically (using the PHP :php:`trim()` function). + +The :typoscript:`=` sign corresponds to a simple assignment. Here is an +overview of the various operators:: + + # The object test is an object of type TEXT. + # "=" means "set value". + test = TEXT + test.value = Holla + + # "<" means "copy object". + # mypage.10 returns "Holla" + mypage.10 < test + + # Change the original object. + # The change has no effect on mypage.10; it still returns "Holla". + test.value = Hello world + + # "=<" means "create an object reference (link the object)". + test.value = Holla + mypage.10 =< test + + # Change the object which is referenced. + # Changes DO have an effect on mypage.10. + # mypage.10 will return "Hello world". + test.value = Hello world + + +Object types are always written with capital letters; parameters and +functions typically in camel case (first word lower case, next word +starts with a capital letter, no space between words). There are some +exceptions to this. + +With the :typoscript:`.` as a separator parameter, functions and child objects are +referenced and can be assigned values accordingly:: + + mypage.10.stdWrap.wrap = <h1>|</h1> + +The :doc:`TypoScript Reference (TSref) <Index>` is the ultimate +resource to find out which objects, functions and properties exist. + +Things can get more complicated when objects are nested inside +each other and many properties are used:: + + mypage = PAGE + mypage.typeNum = 0 + mypage.10 = TEXT + mypage.10.value = Hello world + mypage.10.stdWrap.typolink.parameter = http://www.typo3.org/ + mypage.10.stdWrap.typolink.additionalParams = ¶meter=value + + # The function name "ATagParams" does not use the standardized + # "camelCase". + mypage.10.stdWrap.typolink.ATagParams = class="externalwebsite" + mypage.10.stdWrap.typolink.extTarget = _blank + mypage.10.stdWrap.typolink.title = The website of TYPO3 + mypage.10.stdWrap.postCObject = TEXT + mypage.10.stdWrap.postCObject.value = This text also appears in the link text + mypage.10.stdWrap.postCObject.stdWrap.wrap = |, because the postCObject is executed before the typolink function. + + +To make things clearer, TypoScript code can be structured using curly braces +(:typoscript:`{}`) at each nesting level:: + + mypage = PAGE + mypage { + + typeNum = 0 + + 10 = TEXT + 10 { + + value = Hello world + stdWrap { + typolink { + + parameter = http://www.typo3.org/ + additionalParams = ¶meter=value + + # The function name "ATagParams" does not use the standardized + # "camelCase". + ATagParams = class="externalwebsite" + + extTarget = _blank + title = The website of TYPO3 + } + + postCObject = TEXT + postCObject { + + value = This text also appears in the link text + stdWrap.wrap ( + |, because the postCObject is executed before the typolink function. + ) + } + } + } + } + +.. important:: + + The opening curly brace must always be on the same line as the property. + +Parenthesis (:typoscript:`()`) are used for writing text values on more +than one line. + +Using this style of notation reduces the danger of typographic errors +and makes the script easier to read. In addition it reduces the repetition +of variable names making it easier to rename an object. + +The full reference for the syntax is found in the +:ref:`TypoScript Syntax and In-depth Study<t3coreapi:typoscript-syntax-start>`. diff --git a/Documentation/Guide/TypoScriptOverview/Index.rst b/Documentation/Guide/TypoScriptOverview/Index.rst new file mode 100644 index 000000000..1209a8d7a --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/Index.rst @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt + + +.. _guide-overview: + +TypoScript - A quick overview +----------------------------- + +This introduction is designed to give you a +comprehensive understanding of how TypoScript works. +In other words the goal is not to just help you make it work, +but to make sure that you end up knowing why and how +it works. + +At the end of this tutorial, you will not have a complete +TYPO3 CMS-powered website, but you should feel confident about +how to get there. + +A common workflow used by beginners is to try arbitrary +properties on objects until things somehow begin to work. +However understanding how TypoScript really works +allows you to proceed more efficiently and waste less time +in painful trial and error. + +Going through this tutorial is helpful for understanding +other tutorials, like the :doc:`Sitepackage <t3sitepackage:Index>`. + + +.. toctree:: + :maxdepth: 5 + :titlesonly: + :glob: + + BackendConfiguration/Index + Prerequisites/Index + WhyTypoScript/Index + MainTemplate/Index + TheTermTemplate/Index + TypoScriptAnArray/Index + FirstSteps/Index + diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst new file mode 100644 index 000000000..a3c7a1fb1 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt + + +.. _guide-main-template: + +The main template +^^^^^^^^^^^^^^^^^ + +The TypoScript code used to define how pages are rendered is +located in the "main" template. In this template a so-called +"rootlevel flag" is set. + +.. include:: /Images/AutomaticScreenshots/RootlevelFlag.rst.txt + +When the frontend renders a page, TYPO3 CMS searches along the page tree up +to the root page to find a "main" template. Normally, there are +additional templates besides the "main" template. +For now, we will assume we are only using the "main" template. + +TypoScript syntax is very straightforward. On the left side, objects +and properties are defined. On the right side are the assigned values. +Both objects and properties can contain other objects. Object properties +are defined by using the dot "." notation. + +The following is a typical example of TypoScript syntax:: + + page = PAGE + page.10 = TEXT + page.10.value = Hello World + diff --git a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst new file mode 100644 index 000000000..69431f4c0 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt + + +.. _guide-prerequisites: + +Prerequisites +^^^^^^^^^^^^^ + +It is assumed that you have a running TYPO3 installation. +See :ref:`TYPO3 Getting Started Tutorial, installing TYPO3 with DDEV <t3start:installation-ddev-tutorial>`. + +and that you have been through the +:ref:`TYPO3 - Getting Started Tutorial <t3start:start>` in order +to have a general idea of how the TYPO3 CMS backend operates. + +A few more elements that you need to know before starting: + +* all content elements are stored in a database table called `tt_content` + +* each content element has a database field called `CType` in which + the type of the content element is stored + +* the `tt_content` table also has a field called `pid` which refers + to the page the content element is on + +* in general, each TYPO3 CMS table has a field called `uid` which + contains the primary key (unique id for each record) + +* you will probably find useful to have a database access to check + how information is stored as we proceed along this tutorial diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst new file mode 100644 index 000000000..7e6b3f0bb --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst @@ -0,0 +1,56 @@ +.. include:: /Includes.rst.txt + + +.. _guide-template: +.. _the-term-template: + +================= +The term template +================= + +The term template has a double meaning in TYPO3 CMS. On the one hand, +there is the *HTML template file*, which serves as the skeletal +structure in which the content, provided by the CMS, +will be rendered. On the other hand, there is the *TypoScript template*, +which is created in the template module in the TYPO3 CMS +Backend and can exist on any page. + +The :doc:`Sitepackage Tutorial <t3sitepackage:Index>` shows how the two are related +together. This manual is purely about TypoScript templates. + + +.. _guide-troubleshooting: + +Troubleshooting +=============== + +Common mistakes made with TypoScript templates can cause a message like this: + +.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png + :alt: Error message "No TypoScript template found! Without debug mode" + +If you turn on the :ref:`debug mode <t3coreapi:troubleshooting-debug-mode>` +you will get more detailed information: + +.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFound.png + :alt: Error message "No TypoScript template found!" + +"No TypoScript template found": This warning appears if no template, +with the root level flag enabled, is found in the page tree. + +.. figure:: /Images/ManualScreenshots/ThePageIsNotConfigured.png + :alt: Error message "The page is not configured!" + + +"The page is not configured! [type=0][]. This means that there is no TypoScript +object of type PAGE with typeNum=0 configured.": This warning appears if the +rootlevel flag of a template in the page tree is enabled (i.e. this template +is used), but no :ref:`PAGE <page>` Object can be found. + +The following TypoScript setup code is enough to remove this warning:: + + page = PAGE + page.10 = TEXT + page.10.value = Hello World + +Do not worry about this code for now, it will be explained later. diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst new file mode 100644 index 000000000..c14129dcf --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst @@ -0,0 +1,67 @@ +.. include:: /Includes.rst.txt + + +.. _guide-typoscript-array: + +TypoScript is just an array +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Internally, TypoScript is parsed and stored as a PHP array. +For example:: + + page = PAGE + page.10 = TEXT + page.10.value = Hello World + page.10.stdWrap.wrap = <h2>|</h2> + +will be converted to the following PHP array: + +.. code-block:: php + + $data = [ + 'page' => 'PAGE', + 'page.' => [ + '10' => 'TEXT', + '10.' => [ + 'value' => 'Hello World', + 'stdWrap.' => [ + 'wrap' => '<h2>|</h2>', + ], + ], + ], + ], + +Upon evaluation, a ":ref:`PAGE <page>`" object will be created +first, and the parameter :php:`$data['page.']` will be assigned to it. +The ":ref:`PAGE <page>`" object will then search for all properties, which +it knows about. In this case, it will find a numeric entry ("10"), which +has to be evaluated. A new object of type ":ref:`TEXT <cobj-text>`" +with the parameter :php:`$data['page.']['10.']` will be created. +The ":ref:`TEXT <cobj-text>`" object knows the parameters :typoscript:`value` and +:typoscript:`stdWrap`. It will set the content of :typoscript:`value` accordingly. The +parameters from :typoscript:`stdWrap` will be passed to the ":ref:`stdWrap <stdwrap>`" function. +There the property 'wrap' is known, and the text "Hello world" will be inserted +at the pipe (`|`) position and returned. + +It is important to be aware of this relationship in order to +understand the behaviour of TypoScript. +For example, if the above TypoScript is extended +with the following line:: + + page.10.myFunction = Magic! + +the following entry will be added to the PHP array: + +.. code-block:: php + + $data['page.']['10.']['myFunction'] = 'Magic!'; + +However, the ":ref:`TEXT <cobj-text>`" object does not know +any property called "myFunction". Consequently, the entry will have no effect. + +.. important:: + + No semantic error checking is done. If you define objects or + properties which do not exist, you will not see any error message. + Instead, those specific lines of TypoScript simply do nothing. This + should be considered, especially while troubleshooting. diff --git a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst new file mode 100644 index 000000000..f6489eba4 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt + + +.. _guide-why-typoscript: + +Why TypoScript? +^^^^^^^^^^^^^^^ + +Strictly speaking, TypoScript is a configuration language. We cannot +program with it, but can configure a TYPO3 CMS website in a +very comprehensive way. With TypoScript, we define the rendering of the +website, including navigation, generic content, and how individual +content elements are rendered on a page. + +TYPO3 CMS is a content management system that clearly separates content +and design. TypoScript is the glue that joins these two together again. +TypoScript reads content which is stored in the database, prepares it +for display and then renders it in the frontend. + +To render a website, we only need to define what content to display and +how it will be rendered. + +- The "what" is controlled by the backend - where pages and content + are generated. + +- The "how" is controlled by TypoScript. + +With TypoScript, we define how the individual content elements are +rendered in the frontend. For example, we use TypoScript to add a +:html:`<div>` tag to an element, or the :html:`<h1>` tag to a headline. diff --git a/Documentation/Guide/UsingFluidStyledContent/Index.rst b/Documentation/Guide/UsingFluidStyledContent/Index.rst new file mode 100644 index 000000000..0ddd8f95b --- /dev/null +++ b/Documentation/Guide/UsingFluidStyledContent/Index.rst @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + + +.. _using-fluid-styled-content: + +============================ +Using fluid\_styled\_content +============================ + +It is worth taking a deeper look at "fluid\_styled\_content". It comes with +more than 600 lines of TypoScript code containing definitions for each type of +content element. + +Although it may seem daunting, it is very instructive to review all this code, +as there is much to learn by example. To view the raw code, place yourself on +the root page of your website and move to the **WEB > Template** module. Then +choose the *Template Analyzer* function. + +You should see a list of all used TypoScript templates and how they possibly +include one another. All templates are evaluated by TYPO3 CMS from top to +bottom. + +.. include:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt + +With a click on "EXT:fluid\_styled\_content/static/", you can view the content +of that template (below the hierarchical view), first the constants, then the +setup (scroll down). + +You will see that "fluid\_styled\_content" adds rendering definitions for all +content elements. When rendering special content like file relations or menus +the concept of data processors is used. You can find out more about data +processors in the :doc:`manual of fluid_styled_content +<typo3/cms-fluid-styled-content:Index>`. + +HTML purists may find that "fluid\_styled\_content" generates too much markup. +It is perfectly possible to trim down this setup or write one's own entirely. +However this is not recommended for beginners. diff --git a/Documentation/Guide/UsingGetText/Index.rst b/Documentation/Guide/UsingGetText/Index.rst new file mode 100644 index 000000000..ba25d3c0e --- /dev/null +++ b/Documentation/Guide/UsingGetText/Index.rst @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt + + +.. _using-gettext: + +=========================== +Using the getText data type +=========================== + +There's one particular data type which might leave you wondering, because it +may seem to behave rather like a function. This is +:ref:`getText <data-type-gettext>`. + +The `data` property of :ref:`stdWrap <stdwrap>` has this +particular data type. It makes it possible retrieve values from a large number +of sources, including: + +- global TYPO3 CMS arrays +- GET/POST vars +- database +- localized strings +- page rootline + +Here are some examples:: + + 10 = TEXT + 10.data = field:abstract + +Creates a text object that contains the value of the "abstract" field from the +current page:: + + 10 = TEXT + 10.data = leveltitle:0 + +Creates a text object that contains the title of the page on level 0 of the +current branch, i.e. the website root for that branch:: + + 10 = TEXT + 10.data = LLL:EXT:myext/Resources/Private/Language/locallang.xlf:siteTitle + +Creates a text object that contains the value of the "siteTitle" string in the +given localization, appropriately translated for the current language. + +As you can see, the base syntax is a keyword, then a colon (`:`) and then some +values that makes with regards to the chosen keyword. Although such a tool may +appear to be a function, it is not considered one as it is entirely defined on +the right side of the assignment and is thus not a property of any given +TypoScript object. + +This is just a very quick overview. As usual, the :ref:`TypoScript Reference +<data-type-gettext>` is your friend. diff --git a/Documentation/Guide/UsingStdWrap/CObject/Index.rst b/Documentation/Guide/UsingStdWrap/CObject/Index.rst new file mode 100644 index 000000000..a1b4c27f5 --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/CObject/Index.rst @@ -0,0 +1,17 @@ +.. include:: /Includes.rst.txt + + +.. _guide-stdwrap-cobject: + +cObject +^^^^^^^ + +The `stdWrap` property ":ref:`cObject <stdwrap-cobject>`" can be +used to replace the content with a TypoScript object. This can be a +:ref:`COA <cobj-coa>`, a plugin or a text like in this +example:: + + 10.typolink.title.cObject = TEXT + 10.typolink.title.cObject.value = Copyright + 10.typolink.title.cObject.case = upper + diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst new file mode 100644 index 000000000..26456fbe3 --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + + +.. _guide-stdwrap-order: + + +============== +Heed the order +============== + +The single most important thing to know about `stdWrap` is that all +properties are parsed/executed exactly in the order in which they appear in the +:ref:`TypoScript Reference <stdwrap>`, no matter in which order you +have set them in your TypoScript template. + +Let's consider this example:: + + 10 = TEXT + 10.value = typo3 + 10.noTrimWrap = |<strong>Tool: |</strong>| + 10.case = upper + +It results in the following: + +.. code-block:: html + + <strong>Tool: TYPO3</strong> + +The `case` property is executed before the `noTrimWrap` property. +Hence only "typo3" was changed to uppercase and not the "Tool:" with which it +is wrapped. diff --git a/Documentation/Guide/UsingStdWrap/Index.rst b/Documentation/Guide/UsingStdWrap/Index.rst new file mode 100644 index 000000000..bb7a80d76 --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/Index.rst @@ -0,0 +1,26 @@ +.. include:: /Includes.rst.txt + + +.. _guide-using-stdwrap: + +======================= +Using stdWrap correctly +======================= + +The :ref:`stdWrap <stdwrap>` function is one of the most powerful and +most widely used of all TypoScript. Most properties actually support `stdWrap` +turning each of them into some kind of Swiss army knife. + +`stdWrap` is very rich, having itself a large number of properties. This +chapter is intended to give you a feel for `stdWrap` so that you may get +familiar with it and be ready to explore it in greater depth using the +:ref:`TypoScript Reference <stdwrap>`. + +**Details of stdWrap:** + +.. toctree:: + + HeedTheOrder/Index + ModifyTheOrder/Index + TheDataType/Index + CObject/Index diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst new file mode 100644 index 000000000..2e783697f --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + + +.. _guide-stdwrap-recursively: + +================ +Modify the order +================ + +There is a way around this ordering restriction. `stdWrap` has a property +called `orderedStdWrap` in which several `stdWrap` properties can +be called in numerical order. Thus:: + + 10 = TEXT + 10 { + value = typo3 + orderedStdWrap { + 10.noTrimWrap = |<strong>Tool: |</strong>| + 20.case = upper + } + } + +results in: + +.. code-block:: html + + <strong>TOOL: TYPO3</strong> + +because we explicitly specified that `noTrimWrap` should happen before +`case`. + +It should be noted that `stdWrap` itself has a `stdWrap` property, +meaning that it can be called recursively. In most case `orderedStdWrap` +will do the job and is much easier to understand making code easier to +maintain. diff --git a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst new file mode 100644 index 000000000..278da4982 --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst @@ -0,0 +1,15 @@ +.. include:: /Includes.rst.txt + +.. _guide-data-types: + +The data type +^^^^^^^^^^^^^ + +While writing TypoScript, it is crucial to know what kind of data type +you are handling. It is common to see beginners try to combine functions +arbitrarily, until the anticipated result is finally achieved by accident. + +The :ref:`TypoScript reference <stdWrap>` is very clear about +which properties exist and what their data type is, so please refer +to that essential resource while developing your templates. + diff --git a/Documentation/Images/AutomaticScreenshots/RootlevelFlag.png b/Documentation/Images/AutomaticScreenshots/RootlevelFlag.png new file mode 100644 index 0000000000000000000000000000000000000000..db41db30962be2be75c9a5ca34477db6daf75d2e GIT binary patch literal 20833 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/Documentation/Images/AutomaticScreenshots/RootlevelFlag.rst.txt b/Documentation/Images/AutomaticScreenshots/RootlevelFlag.rst.txt new file mode 100644 index 000000000..90de54e87 --- /dev/null +++ b/Documentation/Images/AutomaticScreenshots/RootlevelFlag.rst.txt @@ -0,0 +1,7 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. figure:: /Images/AutomaticScreenshots/RootlevelFlag.png + :alt: The Rootlevel flag in the tab Options a template record + :class: with-shadow + + The :guilabel:`Rootlevel` flag in the tab :guilabel:`Options` a template record \ No newline at end of file diff --git a/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png b/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png new file mode 100644 index 0000000000000000000000000000000000000000..c54acb2261415b75ea93947b79cee3448aa29e93 GIT binary patch literal 111031 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�jbfA72fw~veZxQ@78KRa5OZUlaqhj{>&@IVn9 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 literal 0 HcmV?d00001 diff --git a/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt b/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt new file mode 100644 index 000000000..a4b912d89 --- /dev/null +++ b/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt @@ -0,0 +1,7 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. figure:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.png + :alt: The template structure as seen with the Template Analyzer + :class: with-shadow + + The template structure as seen with the Template Analyzer \ No newline at end of file diff --git a/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFound.png b/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFound.png new file mode 100644 index 0000000000000000000000000000000000000000..0d92981eda6fc511722b22e796b80a0059bfb8bb GIT binary patch literal 45177 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 literal 0 HcmV?d00001 diff --git a/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png b/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png new file mode 100644 index 0000000000000000000000000000000000000000..3001d23ab74e942159cd1188bf06778c416c322b GIT binary patch literal 21136 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 literal 0 HcmV?d00001 diff --git a/Documentation/Images/ManualScreenshots/ThePageIsNotConfigured.png b/Documentation/Images/ManualScreenshots/ThePageIsNotConfigured.png new file mode 100644 index 0000000000000000000000000000000000000000..17981ce9a249d6e16bb1f5a4efad34cd7b84cf02 GIT binary patch literal 39538 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 Gp$PzS`e^U~ literal 0 HcmV?d00001 diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 5f6b9a5af..705857991 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -49,6 +49,7 @@ chapter of TYPO3 Explained. DataProcessing/Index Functions/Index Conditions/Index + Guide/Index AppendixA/Index .. Meta Menu From 6278aea54c5f54d8c7abb0fbf2efe5b4b1bc8fc8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:05:21 +0100 Subject: [PATCH 013/125] [BUGFIX] Fix links to the TypoScript Guide (#1382) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/About.rst | 2 +- Documentation/Index.rst | 4 ++-- Documentation/Introduction/Index.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/About.rst b/Documentation/About.rst index d11dcaed2..252b69695 100644 --- a/Documentation/About.rst +++ b/Documentation/About.rst @@ -17,7 +17,7 @@ TypoScript as used in frontend TypoScript configuration, and not in please refer to the :ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>` chapter in "TYPO3 Explained" - * For an introduction to TypoScript configuration, see :ref:`t3ts45:start` + * For an introduction to TypoScript configuration, see :ref:`guide` .. _credits: diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 705857991..c77589301 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -27,8 +27,8 @@ TypoScript Reference This document is a complete reference of all object types and properties of TypoScript as used in frontend TypoScript configuration. -Furthermore, you can find a quick guide to TypoScript configuration at -:ref:`t3ts45:start`, insights into TYPO3 backend configuration with +You can find a quick guide to TypoScript configuration at +:ref:`guide`, insights into TYPO3 backend configuration with TypoScript in the :ref:`TSconfig <t3tsconfig:start>` documentation and explanations of TypoScript syntax in the ":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" chapter of TYPO3 Explained. diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 6ff837678..3d1c28f9f 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -48,7 +48,7 @@ Please read the following for an introduction: * :ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>` chapter in "TYPO3 Explained" for an introduction to the TypoScript syntax -* :ref:`t3ts45:start` for an introduction to TypoScript Templating +* :ref:`guide` for an introduction to TypoScript Templating * The chapter :ref:`using-and-setting` describes how to use, set and extend TypoScript. From 9a9ef0cd8e0cab0baa530f42d6bf722e29651c4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:07:23 +0100 Subject: [PATCH 014/125] [TASK] Improve `page-content` data processor description (#1383) Resolves: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1140 Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../PageContentFetchingProcessor.rst | 20 ++++++++++++++++++- .../_Default.html | 20 +++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Documentation/DataProcessing/PageContentFetchingProcessor.rst b/Documentation/DataProcessing/PageContentFetchingProcessor.rst index 6ceb183a7..423e03ea3 100644 --- a/Documentation/DataProcessing/PageContentFetchingProcessor.rst +++ b/Documentation/DataProcessing/PageContentFetchingProcessor.rst @@ -14,6 +14,11 @@ alias `page-content`, loads all :sql:`tt_content` records from the current the template with a given identifier for each :sql:`colPos`, also respecting slideMode or collect options based on the page layouts content columns. +An array of :ref:`Record objects <t3coreapi:record_objects>` will be passed to +the Fluid template. You can use the +:ref:`CObject ViewHelper <f:cObject> <t3viewhelper:typo3-fluid-cobject>` to +display the content elements. + .. contents:: Table of contents .. _PageContentFetchingProcessor-options: @@ -55,7 +60,20 @@ Use the identifiers of the columns in the Fluid template: .. literalinclude:: _PageContentFetchingProcessor/_Default.html :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html -.. todo: Use new viewhelper once https://review.typo3.org/c/Packages/TYPO3.CMS/+/83718/2 is merged +You can use the :ref:`CObject ViewHelper <f:cObject> <t3viewhelper:typo3-fluid-cobject>` +to render the content element using :composer:`typo3/cms-fluid-styled-content` +or render it your self. + +`{contentElement.mainType}` + Is always "tt_content" for content elements. +`{contentElement.fullType}` + Is composed of "tt_content.[CType]". For a content element of type text it + contains "tt_content.text". +`{contentElement.rawRecord}` + Contains an array with the raw row from the database. As the + :typoscript:`tt_content` TypoScript object expects the raw data as input + you should use `{contentElement.rawRecord}` in combination with the + CObject ViewHelper. The :ref:`backend layout <t3coreapi:be-layout>` is defined like this: diff --git a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html index 6b8c2d636..50285dac8 100644 --- a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html +++ b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html @@ -1,10 +1,22 @@ -<f:render partial="Jumbotron" arguments="{jumbotronContent: myContent.jumbotron}"/> <main> + <f:for each="{myContent.jumbotrong.records}" as="contentElement"> + <f:if condition="{contentElement.fullType} = 'tt_content.my_extension_jumbotron'"> + <h2>{contentElement.header}</h2> + <f:format.html>{contentElement.bodytext}</f:format.html> + </f:if> + </f:for> <f:for each="{myContent.left.records}" as="contentElement"> - <h3>{contentElement.header}</h3> - <p>{contentElement.bodytext -> f:format.html()}</p> + <f:cObject + typoscriptObjectPath="{contentElement.mainType}" + table="{contentElement.mainType}" + data="{contentElement.rawRecord}" + /> </f:for> </main> <aside> - <f:render partial="Aside" arguments="{content: myContent.right}"/> + <f:for each="{myContent.right.records}" as="contentElement"> + <f:if condition="{contentElement.fullType} = 'tt_content.header'"> + <h2>{contentElement.header}</h2> + </f:if> + </f:for> </aside> From 26754d98e2a6356a9c56a050e8d02c2ae8253eb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:35:30 +0100 Subject: [PATCH 015/125] [Backport 13.4] [TASK] Make TypoScript documentation clearer and more consistent (#1386) * [TASK] Make TypoScript documentation clearer and more consistent By @PKuhlmay, See https://github.com/TYPO3-Documentation/TYPO3CMS-Tutorial-Typoscript45Minutes/pull/86 I had to move this after the merging. Releases: main, 13.4, 12.4 * [TASK] Make TypoScript documentation clearer and more consistent By @PKuhlmay, See https://github.com/TYPO3-Documentation/TYPO3CMS-Tutorial-Typoscript45Minutes/pull/86 I had to move this after the merging. Releases: main, 13.4, 12.4 --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../AutomaticScreenshots/RootlevelFlag.png | Bin 0 -> 20833 bytes .../RootlevelFlag.rst.txt | 7 +++++++ .../TemplateAnalyzerStructure.png | Bin 0 -> 111031 bytes .../TemplateAnalyzerStructure.rst.txt | 7 +++++++ .../ModuleNameTypoScript.png | Bin 0 -> 2221 bytes .../NoTypoScriptTemplateFound.png | Bin 0 -> 45177 bytes .../NoTypoScriptTemplateFoundDebuggingOff.png | Bin 0 -> 21136 bytes .../ThePageIsNotConfigured.png | Bin 0 -> 39538 bytes .../ContentElements/Index.rst | 3 ++- .../TypoScriptFunctions/ImgResource/Index.rst | 2 +- .../TypoScriptFunctions/Typolink/Index.rst | 5 ++--- .../RenderingContent/Index.rst | 18 +++++++++--------- .../TypoScriptOverview/FirstSteps/Index.rst | 6 +----- .../TheTermTemplate/Index.rst | 10 +++++----- .../WhyTypoScript/Index.rst | 9 ++++----- .../Guide/UsingStdWrap/CObject/Index.rst | 6 ++++-- .../Guide/UsingStdWrap/HeedTheOrder/Index.rst | 8 +++++--- 17 files changed, 47 insertions(+), 34 deletions(-) create mode 100644 Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.png create mode 100644 Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt create mode 100644 Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png create mode 100644 Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt create mode 100644 Documentation/Guide/Images/ManualScreenshots/ModuleNameTypoScript.png create mode 100644 Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFound.png create mode 100644 Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png create mode 100644 Documentation/Guide/Images/ManualScreenshots/ThePageIsNotConfigured.png diff --git a/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.png b/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.png new file mode 100644 index 0000000000000000000000000000000000000000..db41db30962be2be75c9a5ca34477db6daf75d2e GIT binary patch literal 20833 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt b/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt new file mode 100644 index 000000000..90de54e87 --- /dev/null +++ b/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt @@ -0,0 +1,7 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. figure:: /Images/AutomaticScreenshots/RootlevelFlag.png + :alt: The Rootlevel flag in the tab Options a template record + :class: with-shadow + + The :guilabel:`Rootlevel` flag in the tab :guilabel:`Options` a template record \ No newline at end of file diff --git a/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png b/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png new file mode 100644 index 0000000000000000000000000000000000000000..c54acb2261415b75ea93947b79cee3448aa29e93 GIT binary patch literal 111031 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�jbfA72fw~veZxQ@78KRa5OZUlaqhj{>&@IVn9 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 literal 0 HcmV?d00001 diff --git a/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt b/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt new file mode 100644 index 000000000..a4b912d89 --- /dev/null +++ b/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt @@ -0,0 +1,7 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. figure:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.png + :alt: The template structure as seen with the Template Analyzer + :class: with-shadow + + The template structure as seen with the Template Analyzer \ No newline at end of file diff --git a/Documentation/Guide/Images/ManualScreenshots/ModuleNameTypoScript.png b/Documentation/Guide/Images/ManualScreenshots/ModuleNameTypoScript.png new file mode 100644 index 0000000000000000000000000000000000000000..38cd585dd5cd9946703a8dbbd1760d2d936d1858 GIT binary patch literal 2221 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 literal 0 HcmV?d00001 diff --git a/Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFound.png b/Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFound.png new file mode 100644 index 0000000000000000000000000000000000000000..0d92981eda6fc511722b22e796b80a0059bfb8bb GIT binary patch literal 45177 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 literal 0 HcmV?d00001 diff --git a/Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png b/Documentation/Guide/Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png new file mode 100644 index 0000000000000000000000000000000000000000..3001d23ab74e942159cd1188bf06778c416c322b GIT binary patch literal 21136 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 literal 0 HcmV?d00001 diff --git a/Documentation/Guide/Images/ManualScreenshots/ThePageIsNotConfigured.png b/Documentation/Guide/Images/ManualScreenshots/ThePageIsNotConfigured.png new file mode 100644 index 0000000000000000000000000000000000000000..17981ce9a249d6e16bb1f5a4efad34cd7b84cf02 GIT binary patch literal 39538 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 Gp$PzS`e^U~ literal 0 HcmV?d00001 diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst index c39336eb8..ee8f2c019 100644 --- a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst @@ -44,7 +44,7 @@ called `tt_content` therefore the default `renderObj` is also called The basic extension for rendering content in TYPO3 since TYPO3 v8 is `fluid_styled_content`. The example shows how -`fluid_styled_content` is setup: It defines a basic content element based +`fluid_styled_content` is set up: It defines a basic content element based on the content object `FLUIDTEMPLATE` which is able to render html templates using the `fluid` templating engine. For every content element, the basic template, layout and partial parts are defined. As you can see by @@ -101,6 +101,7 @@ take a look at how the text element is rendered: .. code-block:: html # Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html + <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <f:layout name="Default" /> <f:section name="Main"> <f:format.html>{data.bodytext}</f:format.html> diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst index fff59c802..ba450524f 100644 --- a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst @@ -1,7 +1,7 @@ .. include:: /Includes.rst.txt -.. _guide-function-imgresource: +.. _guide-imgresource: imgResource ^^^^^^^^^^^ diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst index 0b85bfd46..1f174f5de 100644 --- a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst @@ -11,8 +11,7 @@ typolink that allows us to generate all kinds of links. If possible one should always use this function to generate links as they will be processed by TYPO3 CMS. This is a prerequisite, -for example, for the "realurl" extension to generate speaking URLs -or for the anti-spam protection of email addresses. +for example, for the anti-spam protection of email addresses. Please resist the urge to a straight `<a href="...">...</a>` construct in your templates. @@ -44,7 +43,7 @@ The example above will generate this HTML code: .. code-block:: html - <a class="linkclass" target="\_blank" href="http://www.example.com/">Example link</a> + <a href="http://www.example.com/" target="_blank" class="linkclass" rel="noreferrer">Example link</a> `typolink`, in a way, almost works like a wrap: the content which is defined for example by the `value` property, will be wrapped by the HTML anchor tag. diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst index edfb1003b..9f8e7d8c9 100644 --- a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst @@ -16,15 +16,15 @@ Objects rendering content stdWrap.typolink.parameter = 1 } - The result is an image based on file :file:`logo.gif` with width of 200 - pixels and a link to the page 1. +The result is an image based on file :file:`logo.gif` with width of 200 pixels +and a link to the page 1. - :ref:`TEXT <cobj-text>` is for the rendering of standard text or the content of fields:: - lib.motto = TEXT - lib.motto.value = Inspiring people to share - lib.motto.wrap = <div class="highlight">|</div> + lib.slogan = TEXT + lib.slogan.value = Inspiring people to share + lib.slogan.wrap = <div class="highlight">|</div> - :ref:`FILES <cobj-files>` is used to retrieve information about one or more files and perform some rendering with it:: @@ -45,10 +45,10 @@ Objects rendering content } } - This code will probably look pretty abstract to you right now. What it does - is to reference the images that were related to a given page in the "media" - field. It takes each of these images and resizes them to a maximum width of - 500 pixels. Each image is wrapped in a `<div>` tag. +This code will probably look pretty abstract to you right now. What it does +is to reference the images that were related to a given page in the "media" +field. It takes each of these images and resizes them to a maximum width of +500 pixels. Each image is wrapped in a `<div>` tag. - :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` renders a template with the template engine Fluid with variables and data that you define - as previously diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst index 968a2ea05..edc262b7a 100644 --- a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst @@ -162,16 +162,13 @@ To make things clearer, TypoScript code can be structured using curly braces mypage = PAGE mypage { - typeNum = 0 10 = TEXT 10 { - value = Hello world stdWrap { typolink { - parameter = http://www.typo3.org/ additionalParams = ¶meter=value @@ -185,10 +182,9 @@ To make things clearer, TypoScript code can be structured using curly braces postCObject = TEXT postCObject { - value = This text also appears in the link text stdWrap.wrap ( - |, because the postCObject is executed before the typolink function. + |, because the postCObject is executed before the typolink function. ) } } diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst index 7e6b3f0bb..3241189a4 100644 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst @@ -35,16 +35,16 @@ you will get more detailed information: .. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFound.png :alt: Error message "No TypoScript template found!" -"No TypoScript template found": This warning appears if no template, -with the root level flag enabled, is found in the page tree. +`No TypoScript template found`: This warning appears if no template, +with the `root level` flag enabled, is found in the page tree. .. figure:: /Images/ManualScreenshots/ThePageIsNotConfigured.png :alt: Error message "The page is not configured!" -"The page is not configured! [type=0][]. This means that there is no TypoScript -object of type PAGE with typeNum=0 configured.": This warning appears if the -rootlevel flag of a template in the page tree is enabled (i.e. this template +`The page is not configured! [type=0][]. This means that there is no TypoScript +object of type PAGE with typeNum=0 configured.`: This warning appears if the +root level flag of a template in the page tree is enabled (i.e. this template is used), but no :ref:`PAGE <page>` Object can be found. The following TypoScript setup code is enough to remove this warning:: diff --git a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst index f6489eba4..1ba3afed2 100644 --- a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst @@ -20,11 +20,10 @@ for display and then renders it in the frontend. To render a website, we only need to define what content to display and how it will be rendered. -- The "what" is controlled by the backend - where pages and content +* The "what" is controlled by the backend - where pages and content are generated. +* The "how" is controlled by TypoScript. -- The "how" is controlled by TypoScript. - -With TypoScript, we define how the individual content elements are -rendered in the frontend. For example, we use TypoScript to add a +With TypoScript, we can define how the individual content elements are +rendered in the frontend. For example, we can use TypoScript to add a :html:`<div>` tag to an element, or the :html:`<h1>` tag to a headline. diff --git a/Documentation/Guide/UsingStdWrap/CObject/Index.rst b/Documentation/Guide/UsingStdWrap/CObject/Index.rst index a1b4c27f5..5842e9188 100644 --- a/Documentation/Guide/UsingStdWrap/CObject/Index.rst +++ b/Documentation/Guide/UsingStdWrap/CObject/Index.rst @@ -12,6 +12,8 @@ used to replace the content with a TypoScript object. This can be a example:: 10.typolink.title.cObject = TEXT - 10.typolink.title.cObject.value = Copyright - 10.typolink.title.cObject.case = upper + 10.typolink.title.cObject { + value = Copyright + case = upper + } diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst index 26456fbe3..5cc970dc6 100644 --- a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst @@ -16,9 +16,11 @@ have set them in your TypoScript template. Let's consider this example:: 10 = TEXT - 10.value = typo3 - 10.noTrimWrap = |<strong>Tool: |</strong>| - 10.case = upper + 10 { + value = typo3 + noTrimWrap = |<strong>Tool: |</strong>| + case = upper + } It results in the following: From 80a55c7bc00a03716f0f686875d998940e3a01fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 15:35:09 +0100 Subject: [PATCH 016/125] [TASK] Unify headlines (#1389) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Guide/CreateAMenu/Index.rst | 7 +++---- Documentation/Guide/NextSteps/Index.rst | 7 +++---- .../Guide/ReadingContentRecords/ContentElements/Index.rst | 5 +---- Documentation/Guide/ReadingContentRecords/Index.rst | 3 +-- Documentation/Guide/TypoScriptFunctions/If/Index.rst | 4 ++-- .../Guide/TypoScriptFunctions/ImgResource/Index.rst | 3 ++- Documentation/Guide/TypoScriptFunctions/Index.rst | 1 - Documentation/Guide/TypoScriptFunctions/Split/Index.rst | 4 ++-- Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst | 1 - .../Guide/TypoScriptObjects/DatabaseQueries/Index.rst | 1 - .../Guide/TypoScriptObjects/FurtherObjects/Index.rst | 1 - .../Guide/TypoScriptObjects/RenderingContent/Index.rst | 1 - .../TypoScriptOverview/BackendConfiguration/Index.rst | 5 ++--- .../Guide/TypoScriptOverview/FirstSteps/Index.rst | 3 ++- Documentation/Guide/TypoScriptOverview/Index.rst | 4 ++-- .../Guide/TypoScriptOverview/MainTemplate/Index.rst | 5 ++--- .../Guide/TypoScriptOverview/Prerequisites/Index.rst | 5 ++--- .../Guide/TypoScriptOverview/TheTermTemplate/Index.rst | 3 --- .../Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst | 5 ++--- .../Guide/TypoScriptOverview/WhyTypoScript/Index.rst | 3 ++- Documentation/Guide/UsingFluidStyledContent/Index.rst | 2 -- Documentation/Guide/UsingGetText/Index.rst | 2 -- Documentation/Guide/UsingStdWrap/CObject/Index.rst | 5 ++--- Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst | 3 --- Documentation/Guide/UsingStdWrap/Index.rst | 2 -- Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst | 2 -- 26 files changed, 30 insertions(+), 57 deletions(-) diff --git a/Documentation/Guide/CreateAMenu/Index.rst b/Documentation/Guide/CreateAMenu/Index.rst index 29e52ebc4..0100ec1bc 100644 --- a/Documentation/Guide/CreateAMenu/Index.rst +++ b/Documentation/Guide/CreateAMenu/Index.rst @@ -1,11 +1,10 @@ .. include:: /Includes.rst.txt +.. _guide-menu: -.. _menu: -.. _create-a-menu: - +============= Create a menu -------------- +============= Until now, we learned how the page *content* is rendered; however, the page *navigation* is missing. diff --git a/Documentation/Guide/NextSteps/Index.rst b/Documentation/Guide/NextSteps/Index.rst index 09f18df2b..0aee59b20 100644 --- a/Documentation/Guide/NextSteps/Index.rst +++ b/Documentation/Guide/NextSteps/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt +.. _guide-next-steps: - -.. _next-steps: - +========== Next steps ----------- +========== Armed with this basic knowledge of TypoScript, you may want to continue your exploration of TYPO3 CMS by following the diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst index ee8f2c019..eeb99431a 100644 --- a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst @@ -1,9 +1,6 @@ .. include:: /Includes.rst.txt - -.. _content-objects: -.. _content-elements: -.. _the-various-content-objects: +.. _guide-content-elements: ============================ The various content elements diff --git a/Documentation/Guide/ReadingContentRecords/Index.rst b/Documentation/Guide/ReadingContentRecords/Index.rst index 2ff384c9e..d1b19e99b 100644 --- a/Documentation/Guide/ReadingContentRecords/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/Index.rst @@ -1,7 +1,6 @@ .. include:: /Includes.rst.txt - -.. _reading-content-records: +.. _guide-content-records: ======================= Reading content records diff --git a/Documentation/Guide/TypoScriptFunctions/If/Index.rst b/Documentation/Guide/TypoScriptFunctions/If/Index.rst index 3050576da..7f94368e5 100644 --- a/Documentation/Guide/TypoScriptFunctions/If/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/If/Index.rst @@ -1,10 +1,10 @@ .. include:: /Includes.rst.txt - .. _guide-function-if: +== if -^^ +== The :ref:`if <if>` function is perhaps the most difficult of all TypoScript functions. It does not work like the "if" construct diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst index ba450524f..a98088b55 100644 --- a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst @@ -3,8 +3,9 @@ .. _guide-imgresource: +=========== imgResource -^^^^^^^^^^^ +=========== The :ref:`imgResource <imgresource>` function relates to modifications of pictures. Its main usage is the property `file` of the diff --git a/Documentation/Guide/TypoScriptFunctions/Index.rst b/Documentation/Guide/TypoScriptFunctions/Index.rst index dd167c5af..cbf6240e2 100644 --- a/Documentation/Guide/TypoScriptFunctions/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Index.rst @@ -1,6 +1,5 @@ .. include:: /Includes.rst.txt - .. _guide-functions: ==================== diff --git a/Documentation/Guide/TypoScriptFunctions/Split/Index.rst b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst index 0b9e2646b..89f7e1719 100644 --- a/Documentation/Guide/TypoScriptFunctions/Split/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst @@ -1,10 +1,10 @@ .. include:: /Includes.rst.txt - .. _guide-function-split: +===== split -^^^^^ +===== The :ref:`split <split>` function can be used to split given data at a predefined character and process the single pieces afterwards. At every diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst index 1f174f5de..6f05dedbd 100644 --- a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst @@ -1,6 +1,5 @@ .. include:: /Includes.rst.txt - .. _guide-function-typolink: ======== diff --git a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst index 9457381e9..8b2d467d8 100644 --- a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst @@ -1,6 +1,5 @@ .. include:: /Includes.rst.txt - .. _guide-cobjects-database-queries: ================================== diff --git a/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst index ebad4594e..6eaa77a08 100644 --- a/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst @@ -1,6 +1,5 @@ .. include:: /Includes.rst.txt - .. _guide-cobjects-further-cobjects: =============== diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst index 9f8e7d8c9..567700bd2 100644 --- a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst @@ -1,6 +1,5 @@ .. include:: /Includes.rst.txt - .. _guide-cobjects-rendering-content: ========================= diff --git a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst index 73f5f6a36..43e7c26c3 100644 --- a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt - - .. _guide-backend-configuration: +===================== Backend configuration -^^^^^^^^^^^^^^^^^^^^^ +===================== TypoScript influences many aspects of a TYPO3 site: diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst index edc262b7a..6dd65f8b1 100644 --- a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst @@ -3,8 +3,9 @@ .. _guide-first-steps: +=========== First steps -^^^^^^^^^^^ +=========== The basic rendering is defined in the "Setup" field of the main template. diff --git a/Documentation/Guide/TypoScriptOverview/Index.rst b/Documentation/Guide/TypoScriptOverview/Index.rst index 1209a8d7a..0994adead 100644 --- a/Documentation/Guide/TypoScriptOverview/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/Index.rst @@ -1,10 +1,10 @@ .. include:: /Includes.rst.txt - .. _guide-overview: +============================= TypoScript - A quick overview ------------------------------ +============================= This introduction is designed to give you a comprehensive understanding of how TypoScript works. diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst index a3c7a1fb1..851fddaed 100644 --- a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt - - .. _guide-main-template: +================= The main template -^^^^^^^^^^^^^^^^^ +================= The TypoScript code used to define how pages are rendered is located in the "main" template. In this template a so-called diff --git a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst index 69431f4c0..6b7fbad6f 100644 --- a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt - - .. _guide-prerequisites: +============= Prerequisites -^^^^^^^^^^^^^ +============= It is assumed that you have a running TYPO3 installation. See :ref:`TYPO3 Getting Started Tutorial, installing TYPO3 with DDEV <t3start:installation-ddev-tutorial>`. diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst index 3241189a4..48629035d 100644 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst @@ -1,8 +1,6 @@ .. include:: /Includes.rst.txt - .. _guide-template: -.. _the-term-template: ================= The term template @@ -18,7 +16,6 @@ Backend and can exist on any page. The :doc:`Sitepackage Tutorial <t3sitepackage:Index>` shows how the two are related together. This manual is purely about TypoScript templates. - .. _guide-troubleshooting: Troubleshooting diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst index c14129dcf..2a1e78491 100644 --- a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt - - .. _guide-typoscript-array: +=========================== TypoScript is just an array -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +=========================== Internally, TypoScript is parsed and stored as a PHP array. For example:: diff --git a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst index 1ba3afed2..997d3b0f2 100644 --- a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst @@ -3,8 +3,9 @@ .. _guide-why-typoscript: +=============== Why TypoScript? -^^^^^^^^^^^^^^^ +=============== Strictly speaking, TypoScript is a configuration language. We cannot program with it, but can configure a TYPO3 CMS website in a diff --git a/Documentation/Guide/UsingFluidStyledContent/Index.rst b/Documentation/Guide/UsingFluidStyledContent/Index.rst index 0ddd8f95b..3c3aeced9 100644 --- a/Documentation/Guide/UsingFluidStyledContent/Index.rst +++ b/Documentation/Guide/UsingFluidStyledContent/Index.rst @@ -1,6 +1,4 @@ .. include:: /Includes.rst.txt - - .. _using-fluid-styled-content: ============================ diff --git a/Documentation/Guide/UsingGetText/Index.rst b/Documentation/Guide/UsingGetText/Index.rst index ba25d3c0e..b83959dcf 100644 --- a/Documentation/Guide/UsingGetText/Index.rst +++ b/Documentation/Guide/UsingGetText/Index.rst @@ -1,6 +1,4 @@ .. include:: /Includes.rst.txt - - .. _using-gettext: =========================== diff --git a/Documentation/Guide/UsingStdWrap/CObject/Index.rst b/Documentation/Guide/UsingStdWrap/CObject/Index.rst index 5842e9188..f964b84fc 100644 --- a/Documentation/Guide/UsingStdWrap/CObject/Index.rst +++ b/Documentation/Guide/UsingStdWrap/CObject/Index.rst @@ -1,10 +1,9 @@ .. include:: /Includes.rst.txt - - .. _guide-stdwrap-cobject: +======= cObject -^^^^^^^ +======= The `stdWrap` property ":ref:`cObject <stdwrap-cobject>`" can be used to replace the content with a TypoScript object. This can be a diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst index 5cc970dc6..59d367134 100644 --- a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst @@ -1,9 +1,6 @@ .. include:: /Includes.rst.txt - - .. _guide-stdwrap-order: - ============== Heed the order ============== diff --git a/Documentation/Guide/UsingStdWrap/Index.rst b/Documentation/Guide/UsingStdWrap/Index.rst index bb7a80d76..514661baa 100644 --- a/Documentation/Guide/UsingStdWrap/Index.rst +++ b/Documentation/Guide/UsingStdWrap/Index.rst @@ -1,6 +1,4 @@ .. include:: /Includes.rst.txt - - .. _guide-using-stdwrap: ======================= diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst index 2e783697f..2079fe684 100644 --- a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst @@ -1,6 +1,4 @@ .. include:: /Includes.rst.txt - - .. _guide-stdwrap-recursively: ================ From 0f8da616158177df1b795f9cfeeb5785b5166365 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 15:48:53 +0100 Subject: [PATCH 017/125] [Backport 13.4] [TASK] Move codesnippets into files (#1392) * [TASK] Move codesnippets into files Releases: main, 13.4, 12.4 * [TASK] Move codesnippets into files Releases: main, 13.4, 12.4 --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Guide/CreateAMenu/Index.rst | 58 ++----- .../CreateAMenu/_lib.textmenu.typoscript | 29 ++++ Documentation/Guide/CreateAMenu/_menu.html | 9 ++ Documentation/Guide/HtmlTemplate/Index.rst | 33 +--- .../HtmlTemplate/_FLUIDTEMPLATE.typoscript | 15 ++ Documentation/Guide/HtmlTemplate/_Fluid.html | 7 + .../RootlevelFlag.rst.txt | 6 +- .../TemplateAnalyzerStructure.rst.txt | 6 +- Documentation/Guide/Index.rst | 2 +- Documentation/Guide/NextSteps/Index.rst | 4 +- .../ContentElements/Index.rst | 71 ++------ .../ContentElements/_Layout.html | 6 + .../_lib.contentElement.typoscript | 17 ++ .../_tt_content.header.typoscript | 8 + .../ContentElements/_tt_content.typoscript | 15 ++ .../Guide/ReadingContentRecords/Index.rst | 70 ++------ .../ReadingContentRecords/_PAGE.typoscript | 40 +++++ .../Guide/TypoScriptFunctions/If/Index.rst | 48 +----- .../TypoScriptFunctions/If/_if.typoscript | 10 ++ .../TypoScriptFunctions/If/_if2.typoscript | 13 ++ .../TypoScriptFunctions/If/_if3.typoscript | 11 ++ .../TypoScriptFunctions/ImgResource/Index.rst | 39 +---- .../ImgResource/_temp.myImage.typoscript | 6 + .../ImgResource/_temp.myImage2.typoscript | 12 ++ .../ImgResource/_temp.myImage3.typoscript | 5 + .../Guide/TypoScriptFunctions/Index.rst | 21 ++- .../TypoScriptFunctions/ParseFunc/Index.rst | 10 +- .../ParseFunc/_parseFunc.typoscript | 3 + .../TypoScriptFunctions/Select/Index.rst | 32 +--- .../Select/_temp.leftContent.typoscript | 22 +++ .../Guide/TypoScriptFunctions/Split/Index.rst | 39 +---- .../Split/_split.typoscript | 31 ++++ .../TypoScriptFunctions/Typolink/Index.rst | 65 ++------ .../Typolink/_temp.link.typoscript | 19 +++ .../Typolink/_temp.link2.typoscript | 10 ++ .../Typolink/_temp.link3.typoscript | 19 +++ .../DatabaseQueries/Index.rst | 50 +++--- .../DatabaseQueries/_RECORDS.typoscript | 11 ++ .../FurtherObjects/Index.rst | 72 ++++----- .../Guide/TypoScriptObjects/Index.rst | 6 +- .../RenderingContent/Index.rst | 75 ++++----- .../RenderingContent/_IMAGE.typoscript | 6 + .../RenderingContent/_lib.banner.typoscript | 15 ++ .../RenderingContent/_lib.slogan.typoscript | 3 + .../BackendConfiguration/Index.rst | 4 +- .../TypoScriptOverview/FirstSteps/Index.rst | 151 +++--------------- .../TypoScriptOverview/FirstSteps/_mypage.php | 15 ++ .../FirstSteps/_mypage.typoscript | 11 ++ .../FirstSteps/_mypage2.typoscript | 22 +++ .../FirstSteps/_mypage3.typoscript | 21 +++ .../FirstSteps/_mypage4.typoscript | 15 ++ .../FirstSteps/_mypage5.typoscript | 30 ++++ .../Guide/TypoScriptOverview/Index.rst | 6 +- .../TypoScriptOverview/MainTemplate/Index.rst | 13 +- .../MainTemplate/_page.typoscript | 3 + .../Prerequisites/Index.rst | 4 +- .../TheTermTemplate/Index.rst | 18 +-- .../TheTermTemplate/_page.typoscript | 3 + .../TypoScriptAnArray/Index.rst | 46 ++---- .../TypoScriptAnArray/_page.php | 14 ++ .../TypoScriptAnArray/_page.typoscript | 4 + .../WhyTypoScript/Index.rst | 4 +- .../Guide/UsingFluidStyledContent/Index.rst | 6 +- Documentation/Guide/UsingGetText/Index.rst | 38 +++-- .../Guide/UsingStdWrap/CObject/Index.rst | 13 +- .../UsingStdWrap/CObject/_cObject.typoscript | 5 + .../Guide/UsingStdWrap/HeedTheOrder/Index.rst | 17 +- .../HeedTheOrder/_order.typoscript | 6 + Documentation/Guide/UsingStdWrap/Index.rst | 14 +- .../UsingStdWrap/ModifyTheOrder/Index.rst | 19 +-- .../ModifyTheOrder/_order.typoscript | 8 + .../Guide/UsingStdWrap/TheDataType/Index.rst | 7 +- 72 files changed, 797 insertions(+), 769 deletions(-) create mode 100644 Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript create mode 100644 Documentation/Guide/CreateAMenu/_menu.html create mode 100644 Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript create mode 100644 Documentation/Guide/HtmlTemplate/_Fluid.html create mode 100644 Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html create mode 100644 Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript create mode 100644 Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript create mode 100644 Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript create mode 100644 Documentation/Guide/ReadingContentRecords/_PAGE.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/If/_if.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/If/_if2.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/If/_if3.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage2.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage3.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/ParseFunc/_parseFunc.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/Select/_temp.leftContent.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/Split/_split.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link2.typoscript create mode 100644 Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link3.typoscript create mode 100644 Documentation/Guide/TypoScriptObjects/DatabaseQueries/_RECORDS.typoscript create mode 100644 Documentation/Guide/TypoScriptObjects/RenderingContent/_IMAGE.typoscript create mode 100644 Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.banner.typoscript create mode 100644 Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.slogan.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript create mode 100644 Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php create mode 100644 Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript create mode 100644 Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript create mode 100644 Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript create mode 100644 Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript diff --git a/Documentation/Guide/CreateAMenu/Index.rst b/Documentation/Guide/CreateAMenu/Index.rst index 0100ec1bc..18ca8e0c7 100644 --- a/Documentation/Guide/CreateAMenu/Index.rst +++ b/Documentation/Guide/CreateAMenu/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-menu: +.. _guide-menu: ============= Create a menu @@ -15,51 +15,13 @@ different kinds of menus. We want our menu to be built like a nested list: -.. code-block:: html - - <ul class="level1"> - <li>first level</li> - <li>first level - <ul class="level2"> - <li>second level</li> - </ul> - </li> - <li>first level</li> - </ul> +.. literalinclude:: _menu.html It is customary to declare new objects as sub-properties of the `lib` top-level object. We can give it any name that hasn't -been assigned yet:: - - lib.textmenu = HMENU - lib.textmenu { - - # We define the first level as text menu. - 1 = TMENU - - # We define the normal state ("NO"). - 1.NO = 1 - 1.NO.allWrap = <li>|</li> - - # We define the active state ("ACT"). - 1.ACT = 1 - 1.ACT.wrapItemAndSub = <li>|</li> - - # Wrap the whole first level. - 1.wrap = <ul class="level1">|</ul> - - # The second and third level should be configured exactly - # the same way. - # In between the curly brackets, objects can be copied. - # With the dot "." we define that the object can be found - # in the brackets. - # With 2.wrap and 3.wrap we overwrite the wrap, which was - # copied from 1.wrap. - 2 < .1 - 2.wrap = <ul class="level2">|</ul> - 3 < .1 - 3.wrap = <ul class="level3">|</ul> - } +been assigned yet: + +.. literalinclude:: _lib.textmenu.typoscript The :ref:`HMENU <cobj-hmenu>` object allows us to create a diversity of menus. The main properties are numbers and correspond to the menu level. @@ -74,11 +36,13 @@ e.g. `NO` for "normal", `ACT` for "pages in the root line" (i.e. the current page, its parent, grandparent, and so forth) or `CUR` for "the current page". -.. important:: +.. important:: Except for the normal state (`NO`), other states have to be activated before they get displayed (i.e. `ACT = 1`). -Now that our menu is defined, we can use it with:: +Now that our menu is defined, we can use it with: + +.. code-block:: typoscript - page.5 < lib.textmenu + page.5 < lib.textmenu diff --git a/Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript b/Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript new file mode 100644 index 000000000..5654a035c --- /dev/null +++ b/Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript @@ -0,0 +1,29 @@ +lib.textmenu = HMENU +lib.textmenu { + + # We define the first level as text menu. + 1 = TMENU + + # We define the normal state ("NO"). + 1.NO = 1 + 1.NO.allWrap = <li>|</li> + + # We define the active state ("ACT"). + 1.ACT = 1 + 1.ACT.wrapItemAndSub = <li>|</li> + + # Wrap the whole first level. + 1.wrap = <ul class="level1">|</ul> + + # The second and third level should be configured exactly + # the same way. + # In between the curly brackets, objects can be copied. + # With the dot "." we define that the object can be found + # in the brackets. + # With 2.wrap and 3.wrap we overwrite the wrap, which was + # copied from 1.wrap. + 2 < .1 + 2.wrap = <ul class="level2">|</ul> + 3 < .1 + 3.wrap = <ul class="level3">|</ul> +} diff --git a/Documentation/Guide/CreateAMenu/_menu.html b/Documentation/Guide/CreateAMenu/_menu.html new file mode 100644 index 000000000..f00147372 --- /dev/null +++ b/Documentation/Guide/CreateAMenu/_menu.html @@ -0,0 +1,9 @@ +<ul class="level1"> + <li>first level</li> + <li>first level + <ul class="level2"> + <li>second level</li> + </ul> + </li> + <li>first level</li> +</ul> diff --git a/Documentation/Guide/HtmlTemplate/Index.rst b/Documentation/Guide/HtmlTemplate/Index.rst index 0e0791217..23df2b2fc 100644 --- a/Documentation/Guide/HtmlTemplate/Index.rst +++ b/Documentation/Guide/HtmlTemplate/Index.rst @@ -1,7 +1,7 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _insert-content-in-a-template: +.. _insert-content-in-a-template: ================================= Insert content in a HTML template @@ -17,24 +17,9 @@ possible. It would also make further corrections to the HTML template much harder to apply. TYPO3 CMS provides the :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` -object, with which we can use Fluid template and render our website with it:: - - 10 = FLUIDTEMPLATE - 10 { - templateName = TEXT - templateName.value = Default - - templateRootPaths { - 0 = EXT:sitepackage/Resources/Private/Templates/Page/ - } - partialRootPaths { - 0 = EXT:sitepackage/Resources/Private/Partials/Page/ - } - layoutRootPaths { - 0 = EXT:sitepackage/Resources/Private/Layouts/Page/ - } - } +object, with which we can use Fluid template and render our website with it: +.. literalinclude:: _FLUIDTEMPLATE.typoscript In your template file you can now replace the parts that should be filled by TYPO3 with references to the TypoScript configuration objects you defined @@ -42,12 +27,4 @@ earlier. For example to render a template with the menu we defined add: -.. code-block:: html - - <nav> - <f:cObject typoscriptObjectPath="lib.textmenu" /> - </nav> - - <div class="container"> - <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '{data.uid}', colPos: '0'}" /> - </div> +.. literalinclude:: _Fluid.html diff --git a/Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript b/Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript new file mode 100644 index 000000000..7e687b101 --- /dev/null +++ b/Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript @@ -0,0 +1,15 @@ +10 = FLUIDTEMPLATE +10 { + templateName = TEXT + templateName.value = Default + + templateRootPaths { + 0 = EXT:sitepackage/Resources/Private/Templates/Page/ + } + partialRootPaths { + 0 = EXT:sitepackage/Resources/Private/Partials/Page/ + } + layoutRootPaths { + 0 = EXT:sitepackage/Resources/Private/Layouts/Page/ + } +} diff --git a/Documentation/Guide/HtmlTemplate/_Fluid.html b/Documentation/Guide/HtmlTemplate/_Fluid.html new file mode 100644 index 000000000..e3e6e07a6 --- /dev/null +++ b/Documentation/Guide/HtmlTemplate/_Fluid.html @@ -0,0 +1,7 @@ +<nav> + <f:cObject typoscriptObjectPath="lib.textmenu" /> +</nav> + +<div class="container"> + <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '{data.uid}', colPos: '0'}" /> +</div> diff --git a/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt b/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt index 90de54e87..13da89691 100644 --- a/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt +++ b/Documentation/Guide/Images/AutomaticScreenshots/RootlevelFlag.rst.txt @@ -1,7 +1,7 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file +.. Automatic screenshot: Remove this line if you want to manually change this file -.. figure:: /Images/AutomaticScreenshots/RootlevelFlag.png +.. figure:: /Images/AutomaticScreenshots/RootlevelFlag.png :alt: The Rootlevel flag in the tab Options a template record :class: with-shadow - The :guilabel:`Rootlevel` flag in the tab :guilabel:`Options` a template record \ No newline at end of file + The :guilabel:`Rootlevel` flag in the tab :guilabel:`Options` a template record diff --git a/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt b/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt index a4b912d89..3c5908f9f 100644 --- a/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt +++ b/Documentation/Guide/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt @@ -1,7 +1,7 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file +.. Automatic screenshot: Remove this line if you want to manually change this file -.. figure:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.png +.. figure:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.png :alt: The template structure as seen with the Template Analyzer :class: with-shadow - The template structure as seen with the Template Analyzer \ No newline at end of file + The template structure as seen with the Template Analyzer diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index 1f5ab9910..93ece2397 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -1,4 +1,4 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt .. _guide: ================ diff --git a/Documentation/Guide/NextSteps/Index.rst b/Documentation/Guide/NextSteps/Index.rst index 0aee59b20..7cefc62ba 100644 --- a/Documentation/Guide/NextSteps/Index.rst +++ b/Documentation/Guide/NextSteps/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-next-steps: +.. include:: /Includes.rst.txt +.. _guide-next-steps: ========== Next steps diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst index eeb99431a..ec294a637 100644 --- a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-content-elements: +.. _guide-content-elements: ============================ The various content elements @@ -20,24 +20,10 @@ The following code is the default TypoScript rendering definition as taken from the TYPO3 Core. The default `renderObj` of a table is a TypoScript definition named after that table. In case of content in TYPO3 the table is called `tt_content` therefore the default `renderObj` is also called -`tt_content`:: +`tt_content`: - # Content element rendering taken from typo3/sysext/frontend/ext_localconf.php - tt_content = CASE - tt_content { - key { - # The field CType will be used to differentiate. - field = CType - } - # Render a error message in case no specific rendering definition is found - default = TEXT - default { - field = CType - htmlSpecialChars = 1 - wrap = <p style="background-color: yellow; padding: 0.5em 1em;"><strong>ERROR:</strong> Content Element with uid "{field:uid}" and type "|" has no rendering definition!</p> - wrap.insertData = 1 - } - } +.. literalinclude:: _tt_content.typoscript + :caption: Content element rendering taken from typo3/sysext/frontend/ext_localconf.php The basic extension for rendering content in TYPO3 since TYPO3 v8 is `fluid_styled_content`. The example shows how @@ -47,40 +33,16 @@ templates using the `fluid` templating engine. For every content element, the basic template, layout and partial parts are defined. As you can see by looking at the lines starting with `10 =` there is the possibility to add your own templates by setting the corresponding `constant` (in the -`Constants` section of a TypoScript template):: - - # Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.txt - lib.contentElement = FLUIDTEMPLATE - lib.contentElement { - templateName = Default - templateRootPaths { - 0 = EXT:fluid_styled_content/Resources/Private/Templates/ - 10 = {$styles.templates.templateRootPath} - } - partialRootPaths { - 0 = EXT:fluid_styled_content/Resources/Private/Partials/ - 10 = {$styles.templates.partialRootPath} - } - layoutRootPaths { - 0 = EXT:fluid_styled_content/Resources/Private/Layouts/ - 10 = {$styles.templates.layoutRootPath} - } - # ... - } +`Constants` section of a TypoScript template): +.. literalinclude:: _lib.contentElement.typoscript + :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.typoscript Each content element inherits that configuration. As an example take a look at -the content element definition of the content element of type `header`:: +the content element definition of the content element of type `header`: - # Header Only: - # Adds a header only. - # - # CType: header - # Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/ContentElement/Header.txt - tt_content.header =< lib.contentElement - tt_content.header { - templateName = Header - } +.. literalinclude:: _tt_content.header.typoscript + :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/ContentElement/Header.typoscript First, all configuration options defined in `lib.contentElement` are referenced. Then the `templateName` for rendering a content element of @@ -95,15 +57,8 @@ the paths (see above). In your own templates you have the data of the currently rendered content element available in the {data} fluid variable. For example take a look at how the text element is rendered: -.. code-block:: html - - # Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html - <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> - <f:layout name="Default" /> - <f:section name="Main"> - <f:format.html>{data.bodytext}</f:format.html> - </f:section> - </html> +.. literalinclude:: _Layout.html + :caption: Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html The database field `bodytext` from the `tt_content` table (which is the main text input field for content elements of type `text`) is diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html b/Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html new file mode 100644 index 000000000..b134ac670 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html @@ -0,0 +1,6 @@ +<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> +<f:layout name="Default" /> +<f:section name="Main"> + <f:format.html>{data.bodytext}</f:format.html> +</f:section> +</html> diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript b/Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript new file mode 100644 index 000000000..9aa24d911 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript @@ -0,0 +1,17 @@ +lib.contentElement = FLUIDTEMPLATE +lib.contentElement { + templateName = Default + templateRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Templates/ + 10 = {$styles.templates.templateRootPath} + } + partialRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Partials/ + 10 = {$styles.templates.partialRootPath} + } + layoutRootPaths { + 0 = EXT:fluid_styled_content/Resources/Private/Layouts/ + 10 = {$styles.templates.layoutRootPath} + } + # ... +} diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript b/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript new file mode 100644 index 000000000..1497d2102 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript @@ -0,0 +1,8 @@ +# Header Only: +# Adds a header only. +# +# CType: header +tt_content.header =< lib.contentElement +tt_content.header { + templateName = Header +} diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript b/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript new file mode 100644 index 000000000..64c88f5f7 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript @@ -0,0 +1,15 @@ +tt_content = CASE +tt_content { + key { + # The field CType will be used to differentiate. + field = CType + } + # Render a error message in case no specific rendering definition is found + default = TEXT + default { + field = CType + htmlSpecialChars = 1 + wrap = <p style="background-color: yellow; padding: 0.5em 1em;"><strong>ERROR:</strong> Content Element with uid "{field:uid}" and type "|" has no rendering definition!</p> + wrap.insertData = 1 + } +} diff --git a/Documentation/Guide/ReadingContentRecords/Index.rst b/Documentation/Guide/ReadingContentRecords/Index.rst index d1b19e99b..3e529c305 100644 --- a/Documentation/Guide/ReadingContentRecords/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/Index.rst @@ -1,21 +1,21 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-content-records: +.. _guide-content-records: ======================= Reading content records ======================= -.. note:: +.. note:: - The following chapter aims at explaining the relationship between database - content and frontend output via TypoScript. The TYPO3 Core and system - extension `fluid_styled_content` already contain definitions for the TYPO3 - Core content element rendering. You do not have to add anything yourself. + The following chapter aims at explaining the relationship between database + content and frontend output via TypoScript. The TYPO3 Core and system + extension `fluid_styled_content` already contain definitions for the TYPO3 + Core content element rendering. You do not have to add anything yourself. - If you wish a content element to be rendered differently or if you program - an extension with new content elements, it will be necessary to understand - this relationship to be able to design your own TypoScript properly. + If you wish a content element to be rendered differently or if you program + an extension with new content elements, it will be necessary to understand + this relationship to be able to design your own TypoScript properly. Obviously entering all content for the website would be terribly tiresome, although possible from a theoretical point of view. @@ -27,48 +27,9 @@ page, the headline and the text is displayed. After creating the :ref:`PAGE <page>` object, we use the :ref:`CONTENT <cobj-content>` object to retrieve content from the database. For each content element we use the :ref:`TEXT <cobj-text>` object to perform -the actual rendering:: +the actual rendering: - page = PAGE - page.typeNum = 0 - - # The CONTENT object executes a database query and loads the content. - page.10 = CONTENT - page.10.table = tt_content - page.10.select { - - # "sorting" is a column from the tt_content table and - # keeps track of the sorting order, which was specified in - # the backend. - orderBy = sorting - - # Only select content from column "0" (the column called - # "normal") and quote the database identifier (column name) - # "colPos" (indicated by wrapping with {#}) - where = {#colPos}=0 - } - - # For every result line from the database query (that means for every content - # element) the renderObj is executed and the internal data array is filled - # with the content. This ensures that we can call the .field property and we - # get the according value. - page.10.renderObj = COA - page.10.renderObj { - - 10 = TEXT - - # The field tt_content.header normally holds the headline. - 10.stdWrap.field = header - - 10.stdWrap.wrap = <h1>|</h1> - - 20 = TEXT - - # The field tt_content.bodytext holds the content text. - 20.stdWrap.field = bodytext - - 20.stdWrap.wrap = <p>|</p> - } +.. literalinclude:: _PAGE.typoscript The :ref:`CONTENT <cobj-content>` object executes an SQL query on the database. The query is controlled by the `select` property, which - in @@ -94,8 +55,7 @@ predetermined. Therefore, we have to create TypoScript definitions for every single database field (e.g. for images, image size, image position, link to top, index, etc.). +.. toctree:: + :hidden: -.. toctree:: - :hidden: - - ContentElements/Index + ContentElements/Index diff --git a/Documentation/Guide/ReadingContentRecords/_PAGE.typoscript b/Documentation/Guide/ReadingContentRecords/_PAGE.typoscript new file mode 100644 index 000000000..476cd60a6 --- /dev/null +++ b/Documentation/Guide/ReadingContentRecords/_PAGE.typoscript @@ -0,0 +1,40 @@ +page = PAGE +page.typeNum = 0 + +# The CONTENT object executes a database query and loads the content. +page.10 = CONTENT +page.10.table = tt_content +page.10.select { + + # "sorting" is a column from the tt_content table and + # keeps track of the sorting order, which was specified in + # the backend. + orderBy = sorting + + # Only select content from column "0" (the column called + # "normal") and quote the database identifier (column name) + # "colPos" (indicated by wrapping with {#}) + where = {#colPos}=0 +} + +# For every result line from the database query (that means for every content +# element) the renderObj is executed and the internal data array is filled +# with the content. This ensures that we can call the .field property and we +# get the according value. +page.10.renderObj = COA +page.10.renderObj { + + 10 = TEXT + + # The field tt_content.header normally holds the headline. + 10.stdWrap.field = header + + 10.stdWrap.wrap = <h1>|</h1> + + 20 = TEXT + + # The field tt_content.bodytext holds the content text. + 20.stdWrap.field = bodytext + + 20.stdWrap.wrap = <p>|</p> +} diff --git a/Documentation/Guide/TypoScriptFunctions/If/Index.rst b/Documentation/Guide/TypoScriptFunctions/If/Index.rst index 7f94368e5..4f25bca4a 100644 --- a/Documentation/Guide/TypoScriptFunctions/If/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/If/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-function-if: +.. _guide-function-if: == if @@ -14,48 +14,16 @@ Hopefully the examples below will help you get it right. Generally the `if` function returns `true`, if **all** conditions are fulfilled. This resembles a boolean AND combination. If what we would like returned is a `false` value, -we can use the :code:`negate` option to negate the result:: +we can use the :code:`negate` option to negate the result: - 10 = TEXT - 10 { - - # Content of the TEXT object. - value = The L parameter is passed as GET variable. - - # Results in "true" and leads to rendering of the upper value, if the - # GET/POST parameter is passed with a value, which is not 0. - stdWrap.if.isTrue.data = GP:L - } +.. literalinclude:: _if.typoscript With the use of `if` it is also possible to compare values. For this -purpose we use `value` property:: - - 10 = TEXT - 10 { - - # WARNING: This value resembles the value of the TEXT object, not that of the "if"! - value = 3 is bigger than 2. +purpose we use `value` property: - # Compare parameter of the "if" function. - stdWrap.if.value = 2 - - # Please note: The sorting order is "backwards", - # returning the sentence "3 is bigger than 2". - stdWrap.if.isGreaterThan = 3 - } +.. literalinclude:: _if2.typoscript Because the properties of the `if` function implement -:ref:`stdWrap functions <guide-using-stdwrap>`, all kinds of variables can be compared:: - - 10 = TEXT - 10 { - # Value of the TEXT object. - value = The record can be shown, because the starting date has passed. - - # Condition of the if clause (number of seconds since January 1st, 1970). - stdWrap.if.value.data = date:U - - # Condition backwards again: Start time isLessThan date:U. - stdWrap.if.isLessThan.field = starttime - } +:ref:`stdWrap functions <guide-using-stdwrap>`, all kinds of variables can be compared: +.. literalinclude:: _if3.typoscript diff --git a/Documentation/Guide/TypoScriptFunctions/If/_if.typoscript b/Documentation/Guide/TypoScriptFunctions/If/_if.typoscript new file mode 100644 index 000000000..983842fcc --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/If/_if.typoscript @@ -0,0 +1,10 @@ +10 = TEXT +10 { + + # Content of the TEXT object. + value = The L parameter is passed as GET variable. + + # Results in "true" and leads to rendering of the upper value, if the + # GET/POST parameter is passed with a value, which is not 0. + stdWrap.if.isTrue.data = GP:L +} diff --git a/Documentation/Guide/TypoScriptFunctions/If/_if2.typoscript b/Documentation/Guide/TypoScriptFunctions/If/_if2.typoscript new file mode 100644 index 000000000..ae87305ce --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/If/_if2.typoscript @@ -0,0 +1,13 @@ +10 = TEXT +10 { + + # WARNING: This value resembles the value of the TEXT object, not that of the "if"! + value = 3 is bigger than 2. + + # Compare parameter of the "if" function. + stdWrap.if.value = 2 + + # Please note: The sorting order is "backwards", + # returning the sentence "3 is bigger than 2". + stdWrap.if.isGreaterThan = 3 +} diff --git a/Documentation/Guide/TypoScriptFunctions/If/_if3.typoscript b/Documentation/Guide/TypoScriptFunctions/If/_if3.typoscript new file mode 100644 index 000000000..8b185372f --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/If/_if3.typoscript @@ -0,0 +1,11 @@ +10 = TEXT +10 { + # Value of the TEXT object. + value = The record can be shown, because the starting date has passed. + + # Condition of the if clause (number of seconds since January 1st, 1970). + stdWrap.if.value.data = date:U + + # Condition backwards again: Start time isLessThan date:U. + stdWrap.if.isLessThan.field = starttime +} diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst index a98088b55..b8e5c3f20 100644 --- a/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/Index.rst @@ -1,7 +1,5 @@ -.. include:: /Includes.rst.txt - - -.. _guide-imgresource: +.. include:: /Includes.rst.txt +.. _guide-imgresource: =========== imgResource @@ -11,36 +9,15 @@ The :ref:`imgResource <imgresource>` function relates to modifications of pictures. Its main usage is the property `file` of the :ref:`IMAGE <cobj-image>` object. -This, for example, allows an image to be resized:: - - temp.myImage = IMAGE - temp.myImage { - file = toplogo.gif - file.width = 200 - file.height = 300 - } +This, for example, allows an image to be resized: -It is also possible to set minimum or maximum dimensions:: +.. literalinclude:: _temp.myImage.typoscript - temp.myImage = IMAGE - temp.myImage { - file = toplogo.gif +It is also possible to set minimum or maximum dimensions: - # maximum size - file.maxW = 200 - file.maxH = 300 - - # minimum size - file.minW = 100 - file.minH = 120 - } +.. literalinclude:: _temp.myImage2.typoscript `imgResource` also provides direct access to -ImageMagick/GraphicsMagick features:: - - temp.myImage = IMAGE - temp.myImage { - file = toplogo.gif - file.params = -rotate 90 - } +ImageMagick/GraphicsMagick features: +.. literalinclude:: _temp.myImage3.typoscript diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage.typoscript b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage.typoscript new file mode 100644 index 000000000..784ad787f --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage.typoscript @@ -0,0 +1,6 @@ +temp.myImage = IMAGE +temp.myImage { + file = toplogo.gif + file.width = 200 + file.height = 300 +} diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage2.typoscript b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage2.typoscript new file mode 100644 index 000000000..9b48a8f2e --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage2.typoscript @@ -0,0 +1,12 @@ +temp.myImage = IMAGE +temp.myImage { + file = toplogo.gif + + # maximum size + file.maxW = 200 + file.maxH = 300 + + # minimum size + file.minW = 100 + file.minH = 120 +} diff --git a/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage3.typoscript b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage3.typoscript new file mode 100644 index 000000000..0bdde67f9 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ImgResource/_temp.myImage3.typoscript @@ -0,0 +1,5 @@ +temp.myImage = IMAGE +temp.myImage { + file = toplogo.gif + file.params = -rotate 90 +} diff --git a/Documentation/Guide/TypoScriptFunctions/Index.rst b/Documentation/Guide/TypoScriptFunctions/Index.rst index cbf6240e2..7431e63ba 100644 --- a/Documentation/Guide/TypoScriptFunctions/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-functions: +.. _guide-functions: ==================== TypoScript functions @@ -19,14 +19,13 @@ The most used function is the "standard wrap", usually known as "stdWrap". Due to its importance, it is entitled to :ref:`its very own chapter <guide-using-stdwrap>`. -**The functions:** +.. toctree:: + :caption: The functions -.. toctree:: - - ImgResource/Index - Select/Index - Split/Index - If/Index - Typolink/Index - ParseFunc/Index + ImgResource/Index + Select/Index + Split/Index + If/Index + Typolink/Index + ParseFunc/Index diff --git a/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst b/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst index 772278e61..e4e2e62e6 100644 --- a/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/ParseFunc/Index.rst @@ -1,7 +1,7 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-function-parsefunc: +.. _guide-function-parsefunc: ========= parseFunc @@ -14,11 +14,9 @@ default parsing rules are implemented in the core, like parsing link tags via :ref:`typolink` function. You can also use :typoscript:`parseFunc` for your own processing. In the following -example, every occurrence of "COMP" is replaced by "My company name":: +example, every occurrence of "COMP" is replaced by "My company name": - page.stdWrap.parseFunc.short { - COMP = My company name - } +.. literalinclude:: _parseFunc.typoscript The various possibilities of changing the default behavior can be found by using the TypoScript object browser. All possibilities of how parseFunc can diff --git a/Documentation/Guide/TypoScriptFunctions/ParseFunc/_parseFunc.typoscript b/Documentation/Guide/TypoScriptFunctions/ParseFunc/_parseFunc.typoscript new file mode 100644 index 000000000..bda961bc2 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/ParseFunc/_parseFunc.typoscript @@ -0,0 +1,3 @@ +page.stdWrap.parseFunc.short { + COMP = My company name +} diff --git a/Documentation/Guide/TypoScriptFunctions/Select/Index.rst b/Documentation/Guide/TypoScriptFunctions/Select/Index.rst index 51a5e64b8..4043d8a48 100644 --- a/Documentation/Guide/TypoScriptFunctions/Select/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Select/Index.rst @@ -1,7 +1,5 @@ -.. include:: /Includes.rst.txt - - -.. _guide-function-select: +.. include:: /Includes.rst.txt +.. _guide-function-select: ====== select @@ -14,28 +12,6 @@ end date". If `pidInList` is used (meaning a list of pages is rendered), the function also checks if the current user is allowed to see all records. With the help of the select function, it is possible to show the content of a -page on all pages. For example:: - - temp.leftContent = CONTENT - temp.leftContent { - - table = tt_content - select { - - # The page with ID = 123 is the source. - pidInList = 123 - - # Sorting is the same as in the backend. - orderBy = sorting - - # Only select the content of the left column. - where = {#colPos}=1 - - # Define the field with the language ID in tt_content. - languageField = sys_language_uid - } - } - - # Replace the mark ###LEFT### with the output of temp.leftContent. - marks.LEFT < temp.leftContent +page on all pages. For example: +.. literalinclude:: _temp.leftContent.typoscript diff --git a/Documentation/Guide/TypoScriptFunctions/Select/_temp.leftContent.typoscript b/Documentation/Guide/TypoScriptFunctions/Select/_temp.leftContent.typoscript new file mode 100644 index 000000000..c8e207f5a --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Select/_temp.leftContent.typoscript @@ -0,0 +1,22 @@ +temp.leftContent = CONTENT +temp.leftContent { + + table = tt_content + select { + + # The page with ID = 123 is the source. + pidInList = 123 + + # Sorting is the same as in the backend. + orderBy = sorting + + # Only select the content of the left column. + where = {#colPos}=1 + + # Define the field with the language ID in tt_content. + languageField = sys_language_uid + } +} + +# Replace the mark ###LEFT### with the output of temp.leftContent. +marks.LEFT < temp.leftContent diff --git a/Documentation/Guide/TypoScriptFunctions/Split/Index.rst b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst index 89f7e1719..4bc8cf60d 100644 --- a/Documentation/Guide/TypoScriptFunctions/Split/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Split/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-function-split: +.. _guide-function-split: ===== split @@ -13,37 +13,6 @@ with 0). By using `split`, we could, for example, read a table field and wrap every single line with a certain code (e.g. generate an HTML table, -which can be used to show the same content on more than one page):: - - 20 = TEXT - - # The content of the field "bodytext" is imported (from $cObj->data-array). - 20.stdWrap.field = bodytext - 20.stdWrap.split { - - # The separation character is defined (char = 10 is the newline character). - token.char = 10 - - # We define which element will be used. - # By using optionSplit we can distinguish between elements. - # Corresponding elements with the numbers must be defined! - # For rendering, the numbers 1 and 2 are used in alternation. - # In this example, the classes "odd" and "even" are used so we - # can zebra style a table. - cObjNum = |*|1||2|*| - - # The first element is defined (which is referenced by cObjNum). - # The content is imported using stdWrap->current. - 1.current = 1 - - # The element is wrapped. - 1.wrap = <tr class="odd"><td> | </td></tr> - - # The 2nd element is determined and wrapped. - 2.current = 1 - 2.wrap = <tr class="even"><td> | </td></tr> - } - - # A general wrap to create a valid table markup. - 20.stdWrap.wrap = <table> | </table> +which can be used to show the same content on more than one page): +.. literalinclude:: _split.typoscript diff --git a/Documentation/Guide/TypoScriptFunctions/Split/_split.typoscript b/Documentation/Guide/TypoScriptFunctions/Split/_split.typoscript new file mode 100644 index 000000000..fd3329a0f --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Split/_split.typoscript @@ -0,0 +1,31 @@ +20 = TEXT + +# The content of the field "bodytext" is imported (from $cObj->data-array). +20.stdWrap.field = bodytext +20.stdWrap.split { + + # The separation character is defined (char = 10 is the newline character). + token.char = 10 + + # We define which element will be used. + # By using optionSplit we can distinguish between elements. + # Corresponding elements with the numbers must be defined! + # For rendering, the numbers 1 and 2 are used in alternation. + # In this example, the classes "odd" and "even" are used so we + # can zebra style a table. + cObjNum = |*|1||2|*| + + # The first element is defined (which is referenced by cObjNum). + # The content is imported using stdWrap->current. + 1.current = 1 + + # The element is wrapped. + 1.wrap = <tr class="odd"><td> | </td></tr> + + # The 2nd element is determined and wrapped. + 2.current = 1 + 2.wrap = <tr class="even"><td> | </td></tr> +} + +# A general wrap to create a valid table markup. +20.stdWrap.wrap = <table> | </table> diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst index 6f05dedbd..93d7f9d45 100644 --- a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-function-typolink: +.. _guide-function-typolink: ======== typolink @@ -16,33 +16,15 @@ Please resist the urge to a straight `<a href="...">...</a>` construct in your templates. Basically `typolink` links the specified text according to -the defined parameters. One example:: +the defined parameters. One example: - temp.link = TEXT - temp.link { - - # This is the defined text. - value = Example link - - # Here comes the typolink function. - typolink { - - # This is the destination of the link... - parameter = http://www.example.com/ - - # with a target ("_blank" opens a new window)... - extTarget = _blank - - # and add a class to the link so we can style it. - ATagParams = class="linkclass" - } - } +.. literalinclude:: _temp.link.typoscript The example above will generate this HTML code: -.. code-block:: html +.. code-block:: html - <a href="http://www.example.com/" target="_blank" class="linkclass" rel="noreferrer">Example link</a> + <a href="http://www.example.com/" target="_blank" class="linkclass" rel="noreferrer">Example link</a> `typolink`, in a way, almost works like a wrap: the content which is defined for example by the `value` property, will be wrapped by the HTML anchor tag. @@ -52,40 +34,13 @@ URL will be shown. The above example can actually be shortened, because the `parameter` property can take a series of values separated -by a white space:: - - temp.link2 = TEXT - temp.link2 { +by a white space: - # Again the defined text. - value = Example link - - # The parameter with the summary of the parameters of the first - # example (explanation follows below). - typolink.parameter = www.example.com _blank linkclass - } +.. literalinclude:: _temp.link2.typoscript The exact syntax for `parameter` property is fully described, as usual, in the :ref:`TypoScript Reference <typolink>`. -It is even possible to define links that open in JavaScript popups:: - - temp.link = TEXT - temp.link { - - # The link text. - value = Open a popup window. - - stdWrap.typolink { - # The first parameter is the page ID of the target page, - # second parameter is the size of the popup window. - parameter = 10 500x400 - - # The title attribute of the link. - title = Click here to open a popup window. - - # The parameters of the popup window. - JSwindow_params = menubar=0, scrollbars=0, toolbar=0, resizable=1 +It is even possible to define links that open in JavaScript popups: - } - } +.. literalinclude:: _temp.link3.typoscript diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link.typoscript b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link.typoscript new file mode 100644 index 000000000..947359cb8 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link.typoscript @@ -0,0 +1,19 @@ +temp.link = TEXT +temp.link { + + # This is the defined text. + value = Example link + + # Here comes the typolink function. + typolink { + + # This is the destination of the link... + parameter = http://www.example.com/ + + # with a target ("_blank" opens a new window)... + extTarget = _blank + + # and add a class to the link so we can style it. + ATagParams = class="linkclass" + } +} diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link2.typoscript b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link2.typoscript new file mode 100644 index 000000000..96b26f2d8 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link2.typoscript @@ -0,0 +1,10 @@ +temp.link2 = TEXT +temp.link2 { + + # Again the defined text. + value = Example link + + # The parameter with the summary of the parameters of the first + # example (explanation follows below). + typolink.parameter = www.example.com _blank linkclass +} diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link3.typoscript b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link3.typoscript new file mode 100644 index 000000000..57922d552 --- /dev/null +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/_temp.link3.typoscript @@ -0,0 +1,19 @@ +temp.link3 = TEXT +temp.link3 { + + # The link text. + value = Open a popup window. + + stdWrap.typolink { + # The first parameter is the page ID of the target page, + # second parameter is the size of the popup window. + parameter = 10 500x400 + + # The title attribute of the link. + title = Click here to open a popup window. + + # The parameters of the popup window. + JSwindow_params = menubar=0, scrollbars=0, toolbar=0, resizable=1 + + } +} diff --git a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst index 8b2d467d8..3b394fb8d 100644 --- a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/Index.rst @@ -1,40 +1,30 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-cobjects-database-queries: +.. _guide-cobjects-database-queries: ================================== Objects executing database queries ================================== -- :ref:`CONTENT <cobj-content>` can be used to access arbitrary tables - of TYPO3 CMS internals. This does not only include table "tt\_content", but - extension tables can also be referenced. The :ref:`select <select>` - function makes it possible to generate complex SQL queries. +* :ref:`CONTENT <cobj-content>` can be used to access arbitrary tables + of TYPO3 CMS internals. This does not only include table "tt\_content", but + extension tables can also be referenced. The :ref:`select <select>` + function makes it possible to generate complex SQL queries. -- :ref:`RECORDS <cobj-records>` can be used to reference specific data - records. This is very helpful if the same text has to be present on all - pages. By using RECORDS, a single content element can be defined and shown. - Thus, an editor can edit the content without having to copy the element - repetitively. This object is also used by the content element type "Insert - records". +* :ref:`RECORDS <cobj-records>` can be used to reference specific data + records. This is very helpful if the same text has to be present on all + pages. By using RECORDS, a single content element can be defined and shown. + Thus, an editor can edit the content without having to copy the element + repetitively. This object is also used by the content element type "Insert + records". - In the following example, the email address from an address record is - rendered and linked as email at the same time:: + In the following example, the email address from an address record is + rendered and linked as email at the same time: - page.80 = RECORDS - page.80 { - source = 1 - tables = tt_address - conf.tt_address = COA - conf.tt_address { - 20 = TEXT - 20.stdWrap.field = email - 20.stdWrap.typolink.parameter.field = email - } - } + .. literalinclude:: _RECORDS.typoscript -- :ref:`HMENU <cobj-hmenu>` imports the page tree and offers - comfortable ways to generate a menu of pages or a sitemap. Special menus - include the breadcrumb trail, simple list of pages or subpages, a page - browser (providing "Previous" and "Next" buttons for a set of pages) and a - language selector. +* :ref:`HMENU <cobj-hmenu>` imports the page tree and offers + comfortable ways to generate a menu of pages or a sitemap. Special menus + include the breadcrumb trail, simple list of pages or subpages, a page + browser (providing "Previous" and "Next" buttons for a set of pages) and a + language selector. diff --git a/Documentation/Guide/TypoScriptObjects/DatabaseQueries/_RECORDS.typoscript b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/_RECORDS.typoscript new file mode 100644 index 000000000..fd1a9ec45 --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/DatabaseQueries/_RECORDS.typoscript @@ -0,0 +1,11 @@ +page.80 = RECORDS +page.80 { + source = 1 + tables = tt_address + conf.tt_address = COA + conf.tt_address { + 20 = TEXT + 20.stdWrap.field = email + 20.stdWrap.typolink.parameter.field = email + } +} diff --git a/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst index 6eaa77a08..1b5a00378 100644 --- a/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/FurtherObjects/Index.rst @@ -1,42 +1,42 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-cobjects-further-cobjects: +.. _guide-cobjects-further-cobjects: =============== Further objects =============== -- :ref:`CASE <cobj-case>` allows case differentiation. In the core this - object is used for rendering different content elements according to their - type. - -- :ref:`COA <cobj-coa>` (content object array) allows us to combine an - arbitrary number of objects. - -- :ref:`COA\_INT <cobj-coa-int>` is a COA object, but non-cached. This - element will be regenerated upon each call. This is useful with time and date - or user-dependent data, for example. - -- :ref:`LOAD\_REGISTER <cobj-load-register>` / - :ref:`RESTORE\_REGISTER <cobj-restore-register>` objects allow us to - fill the global array `$GLOBALS['TSFE']->register[]` with content. - These objects return nothing. Single values and complete TypoScript - objects can be used. In doing so, the register works as a stack: With - every call, a further element is stacked. With - `RESTORE_REGISTER`, the element on top can be removed. - Values in the register can be used with the - :ref:`getText <data-type-gettext-register>` data type. - -- :ref:`USER <cobj-user>` and USER\_INT are for user-defined functions. - Every frontend plugin from a TYPO3 CMS extension is such an object. - :ref:`USER\_INT <cobj-user-int>` is the non-cached variant. - -- :ref:`IMG\_RESOURCE <cobj-img-resource>` is used by the - :ref:`IMAGE <cobj-image>` object. The resource returned is - normally the `src` attribute of the `<img>` tag. - If images are scaled, this object serves as - a calculation basis for the new files, which are stored in the - :file:`_processed_` folder of each file storage. - -- :ref:`GIFBUILDER <gifbuilder>` is used for generating image files - dynamically. Various texts and images can be combined, and much more. +* :ref:`CASE <cobj-case>` allows case differentiation. In the core this + object is used for rendering different content elements according to their + type. + +* :ref:`COA <cobj-coa>` (content object array) allows us to combine an + arbitrary number of objects. + +* :ref:`COA\_INT <cobj-coa-int>` is a COA object, but non-cached. This + element will be regenerated upon each call. This is useful with time and date + or user-dependent data, for example. + +* :ref:`LOAD\_REGISTER <cobj-load-register>` / + :ref:`RESTORE\_REGISTER <cobj-restore-register>` objects allow us to + fill the global array `$GLOBALS['TSFE']->register[]` with content. + These objects return nothing. Single values and complete TypoScript + objects can be used. In doing so, the register works as a stack: With + every call, a further element is stacked. With + `RESTORE_REGISTER`, the element on top can be removed. + Values in the register can be used with the + :ref:`getText <data-type-gettext-register>` data type. + +* :ref:`USER <cobj-user>` and USER\_INT are for user-defined functions. + Every frontend plugin from a TYPO3 CMS extension is such an object. + :ref:`USER\_INT <cobj-user-int>` is the non-cached variant. + +* :ref:`IMG\_RESOURCE <cobj-img-resource>` is used by the + :ref:`IMAGE <cobj-image>` object. The resource returned is + normally the `src` attribute of the `<img>` tag. + If images are scaled, this object serves as + a calculation basis for the new files, which are stored in the + :file:`_processed_` folder of each file storage. + +* :ref:`GIFBUILDER <gifbuilder>` is used for generating image files + dynamically. Various texts and images can be combined, and much more. diff --git a/Documentation/Guide/TypoScriptObjects/Index.rst b/Documentation/Guide/TypoScriptObjects/Index.rst index 25c28c0fb..e83eccd54 100644 --- a/Documentation/Guide/TypoScriptObjects/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-cobjects: +.. _guide-cobjects: ================== TypoScript objects @@ -18,7 +18,7 @@ most common objects to give you an idea of what is available. **Some most common objects:** -.. toctree:: +.. toctree:: DatabaseQueries/Index RenderingContent/Index diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst index 567700bd2..5441c6731 100644 --- a/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/Index.rst @@ -1,55 +1,34 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-cobjects-rendering-content: +.. _guide-cobjects-rendering-content: ========================= Objects rendering content ========================= -- :ref:`IMAGE <cobj-image>` for the rendering of an image:: - - lib.logo = IMAGE - lib.logo { - file = fileadmin/logo.gif - file.width = 200 - stdWrap.typolink.parameter = 1 - } - -The result is an image based on file :file:`logo.gif` with width of 200 pixels -and a link to the page 1. - -- :ref:`TEXT <cobj-text>` is for the rendering of standard text or the - content of fields:: - - lib.slogan = TEXT - lib.slogan.value = Inspiring people to share - lib.slogan.wrap = <div class="highlight">|</div> - -- :ref:`FILES <cobj-files>` is used to retrieve information about one - or more files and perform some rendering with it:: - - lib.banner = FILES - lib.banner { - references { - table = pages - fieldName = media - uid.data = page:uid - } - renderObj = IMAGE - renderObj { - file.import.data = file:current:uid - file.treatIdAsReference = 1 - file.width = 500 - wrap = <div class="banner">|</div> - } - } - -This code will probably look pretty abstract to you right now. What it does -is to reference the images that were related to a given page in the "media" -field. It takes each of these images and resizes them to a maximum width of -500 pixels. Each image is wrapped in a `<div>` tag. - -- :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` renders a template with the - template engine Fluid with variables and data that you define - as previously - discussed in the ":ref:`insert-content-in-a-template`" chapter. +- :ref:`IMAGE <cobj-image>` for the rendering of an image: + + .. literalinclude:: _IMAGE.typoscript + + The result is an image based on file :file:`logo.gif` with width of 200 pixels + and a link to the page 1. + +- :ref:`TEXT <cobj-text>` is for the rendering of standard text or the + content of fields: + + .. literalinclude:: _lib.slogan.typoscript + +- :ref:`FILES <cobj-files>` is used to retrieve information about one + or more files and perform some rendering with it: + + .. literalinclude:: _lib.banner.typoscript + + This code will probably look pretty abstract to you right now. What it does + is to reference the images that were related to a given page in the "media" + field. It takes each of these images and resizes them to a maximum width of + 500 pixels. Each image is wrapped in a `<div>` tag. + +- :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` renders a template with the + template engine Fluid with variables and data that you define - as previously + discussed in the ":ref:`insert-content-in-a-template`" chapter. diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/_IMAGE.typoscript b/Documentation/Guide/TypoScriptObjects/RenderingContent/_IMAGE.typoscript new file mode 100644 index 000000000..81f36bcef --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/_IMAGE.typoscript @@ -0,0 +1,6 @@ +lib.logo = IMAGE +lib.logo { + file = fileadmin/logo.gif + file.width = 200 + stdWrap.typolink.parameter = 1 +} diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.banner.typoscript b/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.banner.typoscript new file mode 100644 index 000000000..bfa9f7bec --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.banner.typoscript @@ -0,0 +1,15 @@ +lib.banner = FILES +lib.banner { + references { + table = pages + fieldName = media + uid.data = page:uid + } + renderObj = IMAGE + renderObj { + file.import.data = file:current:uid + file.treatIdAsReference = 1 + file.width = 500 + wrap = <div class="banner">|</div> + } +} diff --git a/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.slogan.typoscript b/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.slogan.typoscript new file mode 100644 index 000000000..c6de9410e --- /dev/null +++ b/Documentation/Guide/TypoScriptObjects/RenderingContent/_lib.slogan.typoscript @@ -0,0 +1,3 @@ +lib.slogan = TEXT +lib.slogan.value = Inspiring people to share +lib.slogan.wrap = <div class="highlight">|</div> diff --git a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst index 43e7c26c3..d7b69cd42 100644 --- a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-backend-configuration: +.. include:: /Includes.rst.txt +.. _guide-backend-configuration: ===================== Backend configuration diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst index 6dd65f8b1..1da23564d 100644 --- a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst @@ -1,7 +1,7 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-first-steps: +.. _guide-first-steps: =========== First steps @@ -14,19 +14,9 @@ properties. Some of these properties can accept other objects, others stand for functions or simple values. The :ref:`PAGE <page>` object is responsible for the -rendering of a website page in the frontend:: +rendering of a website page in the frontend: - # The object mypage is defined as PAGE object. - mypage = PAGE - - # PAGE objects have the property typeNum. - mypage.typeNum = 0 - - # mypage has an object "10" of type TEXT. It is a TEXT object. - mypage.10 = TEXT - - # TEXT objects in turn have a property called "value". - mypage.10.value = Hello World +.. literalinclude:: _mypage.typoscript The :ref:`PAGE <page>` object on the one hand offers numerous named properties (like :typoscript:`typeNum`). On the other hand it also has an endless number of @@ -34,30 +24,9 @@ numbered objects (a so-called content array). The names of these objects only consist of numbers and the objects are sorted accordingly when they are rendered, from the smallest number to the largest. The order of the lines in the TypoScript template is -irrelevant:: - - # Create a PAGE object. - mypage = PAGE - mypage.typeNum = 0 - - mypage.30 = TEXT - mypage.30.value = This gets rendered last. +irrelevant: - # Rendering will first output object number 10, then 20 and 30. - # An object with number 25 would logically be output between 20 and 30. - mypage.20 = TEXT - mypage.20.value = This is rendered in the middle. - - # This is the first output object - mypage.10 = TEXT - mypage.10.value = This is rendered first. - - # Here we create a second PAGE object, which we can use for the - # print view. - print = PAGE - print.typeNum = 98 - print.10 = TEXT - print.10.value = This is the print version. +.. literalinclude:: _mypage2.typoscript Every entry is stored in a multidimensional PHP array. Every object and every property, therefore, is unique. We could define an arbitrary @@ -79,51 +48,15 @@ those various views, changing only what's specific for each of them. The previous example would look like this as a PHP array: -.. code-block:: php - - $TypoScript['mypage'] = 'PAGE'; - $TypoScript['mypage.']['typeNum'] = 0; - $TypoScript['mypage.']['10'] = 'TEXT'; - $TypoScript['mypage.']['10.']['value'] = 'This is rendered first.'; - $TypoScript['mypage.']['20'] = 'TEXT'; - $TypoScript['mypage.']['20.']['value'] = 'This is rendered in the middle.'; - $TypoScript['mypage.']['30'] = 'TEXT'; - $TypoScript['mypage.']['30.']['value'] = 'This gets rendered last.'; - - $TypoScript['print'] = 'PAGE'; - $TypoScript['print.']['typeNum'] = 98; - $TypoScript['print.']['10'] = 'TEXT'; - $TypoScript['print.']['10.']['value'] = 'This is the print version.'; - +.. literalinclude:: _mypage.php Empty spaces at the start and end of values are removed by TYPO3 CMS automatically (using the PHP :php:`trim()` function). The :typoscript:`=` sign corresponds to a simple assignment. Here is an -overview of the various operators:: - - # The object test is an object of type TEXT. - # "=" means "set value". - test = TEXT - test.value = Holla - - # "<" means "copy object". - # mypage.10 returns "Holla" - mypage.10 < test - - # Change the original object. - # The change has no effect on mypage.10; it still returns "Holla". - test.value = Hello world - - # "=<" means "create an object reference (link the object)". - test.value = Holla - mypage.10 =< test - - # Change the object which is referenced. - # Changes DO have an effect on mypage.10. - # mypage.10 will return "Hello world". - test.value = Hello world +overview of the various operators: +.. literalinclude:: _mypage3.typoscript Object types are always written with capital letters; parameters and functions typically in camel case (first word lower case, next word @@ -131,70 +64,28 @@ starts with a capital letter, no space between words). There are some exceptions to this. With the :typoscript:`.` as a separator parameter, functions and child objects are -referenced and can be assigned values accordingly:: +referenced and can be assigned values accordingly: - mypage.10.stdWrap.wrap = <h1>|</h1> +.. code-block:: typoscript + + mypage.10.stdWrap.wrap = <h1>|</h1> The :doc:`TypoScript Reference (TSref) <Index>` is the ultimate resource to find out which objects, functions and properties exist. Things can get more complicated when objects are nested inside -each other and many properties are used:: +each other and many properties are used: + +.. literalinclude:: _mypage4.typoscript - mypage = PAGE - mypage.typeNum = 0 - mypage.10 = TEXT - mypage.10.value = Hello world - mypage.10.stdWrap.typolink.parameter = http://www.typo3.org/ - mypage.10.stdWrap.typolink.additionalParams = ¶meter=value +To make things clearer, TypoScript code can be structured using curly braces +(:typoscript:`{}`) at each nesting level: - # The function name "ATagParams" does not use the standardized - # "camelCase". - mypage.10.stdWrap.typolink.ATagParams = class="externalwebsite" - mypage.10.stdWrap.typolink.extTarget = _blank - mypage.10.stdWrap.typolink.title = The website of TYPO3 - mypage.10.stdWrap.postCObject = TEXT - mypage.10.stdWrap.postCObject.value = This text also appears in the link text - mypage.10.stdWrap.postCObject.stdWrap.wrap = |, because the postCObject is executed before the typolink function. +.. literalinclude:: _mypage5.typoscript +.. important:: -To make things clearer, TypoScript code can be structured using curly braces -(:typoscript:`{}`) at each nesting level:: - - mypage = PAGE - mypage { - typeNum = 0 - - 10 = TEXT - 10 { - value = Hello world - stdWrap { - typolink { - parameter = http://www.typo3.org/ - additionalParams = ¶meter=value - - # The function name "ATagParams" does not use the standardized - # "camelCase". - ATagParams = class="externalwebsite" - - extTarget = _blank - title = The website of TYPO3 - } - - postCObject = TEXT - postCObject { - value = This text also appears in the link text - stdWrap.wrap ( - |, because the postCObject is executed before the typolink function. - ) - } - } - } - } - -.. important:: - - The opening curly brace must always be on the same line as the property. + The opening curly brace must always be on the same line as the property. Parenthesis (:typoscript:`()`) are used for writing text values on more than one line. diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php new file mode 100644 index 000000000..06df62fdc --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php @@ -0,0 +1,15 @@ +<?php + +$TypoScript['mypage'] = 'PAGE'; +$TypoScript['mypage.']['typeNum'] = 0; +$TypoScript['mypage.']['10'] = 'TEXT'; +$TypoScript['mypage.']['10.']['value'] = 'This is rendered first.'; +$TypoScript['mypage.']['20'] = 'TEXT'; +$TypoScript['mypage.']['20.']['value'] = 'This is rendered in the middle.'; +$TypoScript['mypage.']['30'] = 'TEXT'; +$TypoScript['mypage.']['30.']['value'] = 'This gets rendered last.'; + +$TypoScript['print'] = 'PAGE'; +$TypoScript['print.']['typeNum'] = 98; +$TypoScript['print.']['10'] = 'TEXT'; +$TypoScript['print.']['10.']['value'] = 'This is the print version.'; diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript new file mode 100644 index 000000000..493487809 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript @@ -0,0 +1,11 @@ +# The object mypage is defined as PAGE object. +mypage = PAGE + +# PAGE objects have the property typeNum. +mypage.typeNum = 0 + +# mypage has an object "10" of type TEXT. It is a TEXT object. +mypage.10 = TEXT + +# TEXT objects in turn have a property called "value". +mypage.10.value = Hello World diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript new file mode 100644 index 000000000..572282c82 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript @@ -0,0 +1,22 @@ +# Create a PAGE object. +mypage = PAGE +mypage.typeNum = 0 + +mypage.30 = TEXT +mypage.30.value = This gets rendered last. + +# Rendering will first output object number 10, then 20 and 30. +# An object with number 25 would logically be output between 20 and 30. +mypage.20 = TEXT +mypage.20.value = This is rendered in the middle. + +# This is the first output object +mypage.10 = TEXT +mypage.10.value = This is rendered first. + +# Here we create a second PAGE object, which we can use for the +# print view. +print = PAGE +print.typeNum = 98 +print.10 = TEXT +print.10.value = This is the print version. diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript new file mode 100644 index 000000000..5b23ad339 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript @@ -0,0 +1,21 @@ +# The object test is an object of type TEXT. +# "=" means "set value". +test = TEXT +test.value = Holla + +# "<" means "copy object". +# mypage.10 returns "Holla" +mypage.10 < test + +# Change the original object. +# The change has no effect on mypage.10; it still returns "Holla". +test.value = Hello world + +# "=<" means "create an object reference (link the object)". +test.value = Holla +mypage.10 =< test + +# Change the object which is referenced. +# Changes DO have an effect on mypage.10. +# mypage.10 will return "Hello world". +test.value = Hello world diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript new file mode 100644 index 000000000..8f67cdfa5 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript @@ -0,0 +1,15 @@ +mypage = PAGE +mypage.typeNum = 0 +mypage.10 = TEXT +mypage.10.value = Hello world +mypage.10.stdWrap.typolink.parameter = http://www.typo3.org/ +mypage.10.stdWrap.typolink.additionalParams = ¶meter=value + +# The function name "ATagParams" does not use the standardized +# "camelCase". +mypage.10.stdWrap.typolink.ATagParams = class="externalwebsite" +mypage.10.stdWrap.typolink.extTarget = _blank +mypage.10.stdWrap.typolink.title = The website of TYPO3 +mypage.10.stdWrap.postCObject = TEXT +mypage.10.stdWrap.postCObject.value = This text also appears in the link text +mypage.10.stdWrap.postCObject.stdWrap.wrap = |, because the postCObject is executed before the typolink function. diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript new file mode 100644 index 000000000..102027084 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript @@ -0,0 +1,30 @@ +mypage = PAGE +mypage { + typeNum = 0 + + 10 = TEXT + 10 { + value = Hello world + stdWrap { + typolink { + parameter = http://www.typo3.org/ + additionalParams = ¶meter=value + + # The function name "ATagParams" does not use the standardized + # "camelCase". + ATagParams = class="externalwebsite" + + extTarget = _blank + title = The website of TYPO3 + } + + postCObject = TEXT + postCObject { + value = This text also appears in the link text + stdWrap.wrap ( + |, because the postCObject is executed before the typolink function. + ) + } + } + } +} diff --git a/Documentation/Guide/TypoScriptOverview/Index.rst b/Documentation/Guide/TypoScriptOverview/Index.rst index 0994adead..b97e829d2 100644 --- a/Documentation/Guide/TypoScriptOverview/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-overview: +.. _guide-overview: ============================= TypoScript - A quick overview @@ -26,7 +26,7 @@ Going through this tutorial is helpful for understanding other tutorials, like the :doc:`Sitepackage <t3sitepackage:Index>`. -.. toctree:: +.. toctree:: :maxdepth: 5 :titlesonly: :glob: diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst index 851fddaed..7c4caca9b 100644 --- a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-main-template: +.. include:: /Includes.rst.txt +.. _guide-main-template: ================= The main template @@ -9,7 +9,7 @@ The TypoScript code used to define how pages are rendered is located in the "main" template. In this template a so-called "rootlevel flag" is set. -.. include:: /Images/AutomaticScreenshots/RootlevelFlag.rst.txt +.. include:: /Images/AutomaticScreenshots/RootlevelFlag.rst.txt When the frontend renders a page, TYPO3 CMS searches along the page tree up to the root page to find a "main" template. Normally, there are @@ -21,9 +21,6 @@ and properties are defined. On the right side are the assigned values. Both objects and properties can contain other objects. Object properties are defined by using the dot "." notation. -The following is a typical example of TypoScript syntax:: - - page = PAGE - page.10 = TEXT - page.10.value = Hello World +The following is a typical example of TypoScript syntax: +.. literalinclude:: _page.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript b/Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript new file mode 100644 index 000000000..b043dddf1 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript @@ -0,0 +1,3 @@ +page = PAGE +page.10 = TEXT +page.10.value = Hello World diff --git a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst index 6b7fbad6f..0d3124b15 100644 --- a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-prerequisites: +.. include:: /Includes.rst.txt +.. _guide-prerequisites: ============= Prerequisites diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst index 48629035d..bf251012e 100644 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst @@ -1,6 +1,6 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-template: +.. _guide-template: ================= The term template @@ -16,26 +16,26 @@ Backend and can exist on any page. The :doc:`Sitepackage Tutorial <t3sitepackage:Index>` shows how the two are related together. This manual is purely about TypoScript templates. -.. _guide-troubleshooting: +.. _guide-troubleshooting: Troubleshooting =============== Common mistakes made with TypoScript templates can cause a message like this: -.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png +.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png :alt: Error message "No TypoScript template found! Without debug mode" If you turn on the :ref:`debug mode <t3coreapi:troubleshooting-debug-mode>` you will get more detailed information: -.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFound.png +.. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFound.png :alt: Error message "No TypoScript template found!" `No TypoScript template found`: This warning appears if no template, with the `root level` flag enabled, is found in the page tree. -.. figure:: /Images/ManualScreenshots/ThePageIsNotConfigured.png +.. figure:: /Images/ManualScreenshots/ThePageIsNotConfigured.png :alt: Error message "The page is not configured!" @@ -44,10 +44,8 @@ object of type PAGE with typeNum=0 configured.`: This warning appears if the root level flag of a template in the page tree is enabled (i.e. this template is used), but no :ref:`PAGE <page>` Object can be found. -The following TypoScript setup code is enough to remove this warning:: +The following TypoScript setup code is enough to remove this warning: - page = PAGE - page.10 = TEXT - page.10.value = Hello World +.. literalinclude:: _page.typoscript Do not worry about this code for now, it will be explained later. diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript new file mode 100644 index 000000000..b043dddf1 --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript @@ -0,0 +1,3 @@ +page = PAGE +page.10 = TEXT +page.10.value = Hello World diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst index 2a1e78491..795258959 100644 --- a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst @@ -1,34 +1,18 @@ -.. include:: /Includes.rst.txt -.. _guide-typoscript-array: +.. include:: /Includes.rst.txt +.. _guide-typoscript-array: =========================== TypoScript is just an array =========================== Internally, TypoScript is parsed and stored as a PHP array. -For example:: +For example: - page = PAGE - page.10 = TEXT - page.10.value = Hello World - page.10.stdWrap.wrap = <h2>|</h2> +.. literalinclude:: _page.typoscript will be converted to the following PHP array: -.. code-block:: php - - $data = [ - 'page' => 'PAGE', - 'page.' => [ - '10' => 'TEXT', - '10.' => [ - 'value' => 'Hello World', - 'stdWrap.' => [ - 'wrap' => '<h2>|</h2>', - ], - ], - ], - ], +.. literalinclude:: _page.php Upon evaluation, a ":ref:`PAGE <page>`" object will be created first, and the parameter :php:`$data['page.']` will be assigned to it. @@ -45,22 +29,24 @@ at the pipe (`|`) position and returned. It is important to be aware of this relationship in order to understand the behaviour of TypoScript. For example, if the above TypoScript is extended -with the following line:: +with the following line: + +.. code-block:: typoscript - page.10.myFunction = Magic! + page.10.myFunction = Magic! the following entry will be added to the PHP array: -.. code-block:: php +.. code-block:: php - $data['page.']['10.']['myFunction'] = 'Magic!'; + $data['page.']['10.']['myFunction'] = 'Magic!'; However, the ":ref:`TEXT <cobj-text>`" object does not know any property called "myFunction". Consequently, the entry will have no effect. -.. important:: +.. important:: - No semantic error checking is done. If you define objects or - properties which do not exist, you will not see any error message. - Instead, those specific lines of TypoScript simply do nothing. This - should be considered, especially while troubleshooting. + No semantic error checking is done. If you define objects or + properties which do not exist, you will not see any error message. + Instead, those specific lines of TypoScript simply do nothing. This + should be considered, especially while troubleshooting. diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php new file mode 100644 index 000000000..a740c114d --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php @@ -0,0 +1,14 @@ +<?php + +$data = [ + 'page' => 'PAGE', + 'page.' => [ + '10' => 'TEXT', + '10.' => [ + 'value' => 'Hello World', + 'stdWrap.' => [ + 'wrap' => '<h2>|</h2>', + ], + ], + ], +]; diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript new file mode 100644 index 000000000..8af14356b --- /dev/null +++ b/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript @@ -0,0 +1,4 @@ +page = PAGE +page.10 = TEXT +page.10.value = Hello World +page.10.stdWrap.wrap = <h2>|</h2> diff --git a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst index 997d3b0f2..9515bdddf 100644 --- a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst @@ -1,7 +1,7 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-why-typoscript: +.. _guide-why-typoscript: =============== Why TypoScript? diff --git a/Documentation/Guide/UsingFluidStyledContent/Index.rst b/Documentation/Guide/UsingFluidStyledContent/Index.rst index 3c3aeced9..0f04ca863 100644 --- a/Documentation/Guide/UsingFluidStyledContent/Index.rst +++ b/Documentation/Guide/UsingFluidStyledContent/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _using-fluid-styled-content: +.. include:: /Includes.rst.txt +.. _using-fluid-styled-content: ============================ Using fluid\_styled\_content @@ -18,7 +18,7 @@ You should see a list of all used TypoScript templates and how they possibly include one another. All templates are evaluated by TYPO3 CMS from top to bottom. -.. include:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt +.. include:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt With a click on "EXT:fluid\_styled\_content/static/", you can view the content of that template (below the hierarchical view), first the constants, then the diff --git a/Documentation/Guide/UsingGetText/Index.rst b/Documentation/Guide/UsingGetText/Index.rst index b83959dcf..e1f345726 100644 --- a/Documentation/Guide/UsingGetText/Index.rst +++ b/Documentation/Guide/UsingGetText/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _using-gettext: +.. include:: /Includes.rst.txt +.. _using-gettext: =========================== Using the getText data type @@ -13,28 +13,34 @@ The `data` property of :ref:`stdWrap <stdwrap>` has this particular data type. It makes it possible retrieve values from a large number of sources, including: -- global TYPO3 CMS arrays -- GET/POST vars -- database -- localized strings -- page rootline +* global TYPO3 CMS arrays +* GET/POST vars +* database +* localized strings +* page rootline -Here are some examples:: +Here are some examples: - 10 = TEXT - 10.data = field:abstract +.. code-block:: typoscript + + 10 = TEXT + 10.data = field:abstract Creates a text object that contains the value of the "abstract" field from the -current page:: +current page: + +.. code-block:: typoscript - 10 = TEXT - 10.data = leveltitle:0 + 10 = TEXT + 10.data = leveltitle:0 Creates a text object that contains the title of the page on level 0 of the -current branch, i.e. the website root for that branch:: +current branch, i.e. the website root for that branch: + +.. code-block:: typoscript - 10 = TEXT - 10.data = LLL:EXT:myext/Resources/Private/Language/locallang.xlf:siteTitle + 10 = TEXT + 10.data = LLL:EXT:myext/Resources/Private/Language/locallang.xlf:siteTitle Creates a text object that contains the value of the "siteTitle" string in the given localization, appropriately translated for the current language. diff --git a/Documentation/Guide/UsingStdWrap/CObject/Index.rst b/Documentation/Guide/UsingStdWrap/CObject/Index.rst index f964b84fc..5241da7b8 100644 --- a/Documentation/Guide/UsingStdWrap/CObject/Index.rst +++ b/Documentation/Guide/UsingStdWrap/CObject/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-stdwrap-cobject: +.. include:: /Includes.rst.txt +.. _guide-stdwrap-cobject: ======= cObject @@ -8,11 +8,6 @@ cObject The `stdWrap` property ":ref:`cObject <stdwrap-cobject>`" can be used to replace the content with a TypoScript object. This can be a :ref:`COA <cobj-coa>`, a plugin or a text like in this -example:: - - 10.typolink.title.cObject = TEXT - 10.typolink.title.cObject { - value = Copyright - case = upper - } +example: +.. literalinclude:: _cObject.typoscript diff --git a/Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript b/Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript new file mode 100644 index 000000000..b3f556fcd --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript @@ -0,0 +1,5 @@ +10.typolink.title.cObject = TEXT +10.typolink.title.cObject { + value = Copyright + case = upper +} diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst index 59d367134..05eb3931a 100644 --- a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-stdwrap-order: +.. include:: /Includes.rst.txt +.. _guide-stdwrap-order: ============== Heed the order @@ -10,20 +10,15 @@ properties are parsed/executed exactly in the order in which they appear in the :ref:`TypoScript Reference <stdwrap>`, no matter in which order you have set them in your TypoScript template. -Let's consider this example:: +Let's consider this example: - 10 = TEXT - 10 { - value = typo3 - noTrimWrap = |<strong>Tool: |</strong>| - case = upper - } +.. literalinclude:: _order.typoscript It results in the following: -.. code-block:: html +.. code-block:: html - <strong>Tool: TYPO3</strong> + <strong>Tool: TYPO3</strong> The `case` property is executed before the `noTrimWrap` property. Hence only "typo3" was changed to uppercase and not the "Tool:" with which it diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript b/Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript new file mode 100644 index 000000000..ff923304f --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript @@ -0,0 +1,6 @@ +10 = TEXT +10 { + value = typo3 + noTrimWrap = |<strong>Tool: |</strong>| + case = upper +} diff --git a/Documentation/Guide/UsingStdWrap/Index.rst b/Documentation/Guide/UsingStdWrap/Index.rst index 514661baa..caa60500e 100644 --- a/Documentation/Guide/UsingStdWrap/Index.rst +++ b/Documentation/Guide/UsingStdWrap/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-using-stdwrap: +.. include:: /Includes.rst.txt +.. _guide-using-stdwrap: ======================= Using stdWrap correctly @@ -16,9 +16,9 @@ familiar with it and be ready to explore it in greater depth using the **Details of stdWrap:** -.. toctree:: +.. toctree:: - HeedTheOrder/Index - ModifyTheOrder/Index - TheDataType/Index - CObject/Index + HeedTheOrder/Index + ModifyTheOrder/Index + TheDataType/Index + CObject/Index diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst index 2079fe684..b55530b51 100644 --- a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst @@ -1,5 +1,5 @@ -.. include:: /Includes.rst.txt -.. _guide-stdwrap-recursively: +.. include:: /Includes.rst.txt +.. _guide-stdwrap-recursively: ================ Modify the order @@ -7,22 +7,15 @@ Modify the order There is a way around this ordering restriction. `stdWrap` has a property called `orderedStdWrap` in which several `stdWrap` properties can -be called in numerical order. Thus:: +be called in numerical order. Thus: - 10 = TEXT - 10 { - value = typo3 - orderedStdWrap { - 10.noTrimWrap = |<strong>Tool: |</strong>| - 20.case = upper - } - } +.. literalinclude:: _order.typoscript results in: -.. code-block:: html +.. code-block:: html - <strong>TOOL: TYPO3</strong> + <strong>TOOL: TYPO3</strong> because we explicitly specified that `noTrimWrap` should happen before `case`. diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript new file mode 100644 index 000000000..03d7ced87 --- /dev/null +++ b/Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript @@ -0,0 +1,8 @@ +10 = TEXT +10 { + value = typo3 + orderedStdWrap { + 10.noTrimWrap = |<strong>Tool: |</strong>| + 20.case = upper + } +} diff --git a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst index 278da4982..d766ec257 100644 --- a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst +++ b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst @@ -1,9 +1,10 @@ -.. include:: /Includes.rst.txt +.. include:: /Includes.rst.txt -.. _guide-data-types: +.. _guide-data-types: +============= The data type -^^^^^^^^^^^^^ +============= While writing TypoScript, it is crucial to know what kind of data type you are handling. It is common to see beginners try to combine functions From 1a1c249ae853421eda67ed8ed1c8e1d6592218b2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 17:38:20 +0100 Subject: [PATCH 018/125] Add information on how to access site settings (#1394) Releases: main, 13.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/ContentObjects/Pageview/Index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/ContentObjects/Pageview/Index.rst b/Documentation/ContentObjects/Pageview/Index.rst index 147258856..c86eb0df0 100644 --- a/Documentation/ContentObjects/Pageview/Index.rst +++ b/Documentation/ContentObjects/Pageview/Index.rst @@ -74,7 +74,8 @@ Additional variables can be defined with property The variable :fluid:`{settings}` contains all TypoScript :ref:`constants <typoscript-syntax-constants>` that are set on the current - page. + page. Settings from the site can be accessed via the :confval:`pageview-data-site` with + :fluid:`{site.settings}` .. confval:: site :name: pageview-data-site From 26e35d6d3974f68d891e51d89bbad5d116b77f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20M=C3=BCller?= <2566282+brotkrueml@users.noreply.github.com> Date: Thu, 31 Oct 2024 18:54:46 +0100 Subject: [PATCH 019/125] [TASK] #90522 - Remove TSFE->lastImageInfo in IMAGE cObj chapter (#1377) TSFE->lastImageInfo has been deprecated with TYPO3 v10.3 without a substitution, and mostly removed with TYPO3 v11. Releases: main, 13.4, 12.4 (cherry picked from commit c327c9f9b5571a3f4238823ce4204ac523cfaaeb) --- Documentation/ContentObjects/Image/Index.rst | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Documentation/ContentObjects/Image/Index.rst b/Documentation/ContentObjects/Image/Index.rst index 5cd6817fa..44705911e 100644 --- a/Documentation/ContentObjects/Image/Index.rst +++ b/Documentation/ContentObjects/Image/Index.rst @@ -11,22 +11,6 @@ IMAGE Objects of type IMAGE return an image tag with the image file defined in the property "file" and is processed using the properties that are set on the object. -The array :php:`$GLOBALS['TSFE']->lastImageInfo` is set with the info-array -of the returning image (if any) and contains width, height and other properties: - -============================= ============================================= -Name of the getText property Content -============================= ============================================= -0 width -1 height -2 file extension -3 resource -origFile relative URL pointing to the original file -_mtime modification time of the original file -originalFile The FAL object referencing the original file -processedFile The FAL object referencing the processed file -============================= ============================================= - **Note:** Gifbuilder also has an :ref:`IMAGE object <gifbuilder-image>` - it is not the same as the cObject described here; both are completely different objects. From 602beed30728b5ffc854df48015168ab1df98812 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 06:22:59 +0100 Subject: [PATCH 020/125] [TASK] Avoid the term "template" for TypoScript (#1398) As this PR will be backported to v12, the distinction TypoScript record / TypoScript provided by site will be made in a follow up. Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../ContentElements/Index.rst | 6 +-- .../TypoScriptFunctions/Typolink/Index.rst | 2 +- .../BackendConfiguration/Index.rst | 2 +- .../TypoScriptOverview/FirstSteps/Index.rst | 4 +- .../TypoScriptOverview/MainTemplate/Index.rst | 15 +++--- .../TheTermTemplate/Index.rst | 43 +++++++++--------- .../Guide/UsingFluidStyledContent/Index.rst | 35 +++++++++----- .../Guide/UsingStdWrap/HeedTheOrder/Index.rst | 2 +- .../Guide/UsingStdWrap/TheDataType/Index.rst | 2 +- .../TemplateAnalyzerStructure.png | Bin 111031 -> 0 bytes .../TemplateAnalyzerStructure.rst.txt | 7 --- .../ManualScreenshots/IncludedTypoScript.png | Bin 0 -> 69509 bytes .../NoTypoScriptTemplateFound.png | Bin 45177 -> 33948 bytes 13 files changed, 62 insertions(+), 56 deletions(-) delete mode 100644 Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png delete mode 100644 Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt create mode 100644 Documentation/Images/ManualScreenshots/IncludedTypoScript.png diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst index ec294a637..509b259e3 100644 --- a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst @@ -29,11 +29,11 @@ The basic extension for rendering content in TYPO3 since TYPO3 v8 is `fluid_styled_content`. The example shows how `fluid_styled_content` is set up: It defines a basic content element based on the content object `FLUIDTEMPLATE` which is able to render html -templates using the `fluid` templating engine. For every content element, +templates using the Fluid templating engine. For every content element, the basic template, layout and partial parts are defined. As you can see by looking at the lines starting with `10 =` there is the possibility to add your own templates by setting the corresponding `constant` (in the -`Constants` section of a TypoScript template): +`Constants` section of a TypoScript record): .. literalinclude:: _lib.contentElement.typoscript :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.typoscript @@ -62,6 +62,6 @@ take a look at how the text element is rendered: The database field `bodytext` from the `tt_content` table (which is the main text input field for content elements of type `text`) is -available as `{data.bodytext}` in the fluid template. For more +available as `{data.bodytext}` in the Fluid template. For more information about `fluid_styled_content` see its :doc:`manual <typo3/cms-fluid-styled-content:Index>`. diff --git a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst index 93d7f9d45..b5150101c 100644 --- a/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Typolink/Index.rst @@ -13,7 +13,7 @@ as they will be processed by TYPO3 CMS. This is a prerequisite, for example, for the anti-spam protection of email addresses. Please resist the urge to a straight `<a href="...">...</a>` construct -in your templates. +in your TypoScript and Fluid templates. Basically `typolink` links the specified text according to the defined parameters. One example: diff --git a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst index d7b69cd42..8a8e2262a 100644 --- a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst @@ -12,5 +12,5 @@ backend user group or in the TSconfig field of a page. It will then change the look and behavior of forms in the *backend*. The *frontend* rendering in contrast is defined by the TypoScript -used in TypoScript templates. This document covers only frontend +used in TypoScript records. This document covers only frontend rendering. diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst index 1da23564d..e89cb1873 100644 --- a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst @@ -7,7 +7,7 @@ First steps =========== -The basic rendering is defined in the "Setup" field of the main template. +The basic rendering is defined in the "Setup" field of the main TypoScript record. TypoScript essentially consists of objects, which have certain properties. Some of these properties can accept other objects, others @@ -23,7 +23,7 @@ The :ref:`PAGE <page>` object on the one hand offers numerous named properties numbered objects (a so-called content array). The names of these objects only consist of numbers and the objects are sorted accordingly when they are rendered, from the smallest number to the -largest. The order of the lines in the TypoScript template is +largest. The order of the lines in the TypoScript record is irrelevant: .. literalinclude:: _mypage2.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst index 7c4caca9b..cf4d32146 100644 --- a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst @@ -1,20 +1,21 @@ .. include:: /Includes.rst.txt .. _guide-main-template: +.. _guide-main-typoscript-record: -================= -The main template -================= +========================== +The main TypoScript record +========================== The TypoScript code used to define how pages are rendered is -located in the "main" template. In this template a so-called +located in the "main" TypoScript record. In this record a so-called "rootlevel flag" is set. .. include:: /Images/AutomaticScreenshots/RootlevelFlag.rst.txt When the frontend renders a page, TYPO3 CMS searches along the page tree up -to the root page to find a "main" template. Normally, there are -additional templates besides the "main" template. -For now, we will assume we are only using the "main" template. +to the root page to find a "main" TypoScript record. Normally, there are +additional TypoScript records besides the "main" TypoScript record. +For now, we will assume we are only using the "main" TypoScript record. TypoScript syntax is very straightforward. On the left side, objects and properties are defined. On the right side are the assigned values. diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst index bf251012e..95cf38edf 100644 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst @@ -2,47 +2,48 @@ .. _guide-template: -================= -The term template -================= - -The term template has a double meaning in TYPO3 CMS. On the one hand, -there is the *HTML template file*, which serves as the skeletal -structure in which the content, provided by the CMS, -will be rendered. On the other hand, there is the *TypoScript template*, -which is created in the template module in the TYPO3 CMS -Backend and can exist on any page. - -The :doc:`Sitepackage Tutorial <t3sitepackage:Index>` shows how the two are related -together. This manual is purely about TypoScript templates. +=================== +The term "template" +=================== + +Sometimes the term "template" is used as a synonym for the TypoScript record +or the combined TypoScript configuration from all sources. This has historic +reasons. Until TYPO3 v11 TypoScript could be edited in a backend module +called "Template". In the beginning of TYPO3 sites were build almost +exclusively with TypoScript while it slowly evolved to be mainly a configuration +language. + +As a Fluid template is also called "template" the terms took on a double meaning +in TYPO3. With TYPO3 v12 we speak about TypoScript records, TypoScript files +and the complete TypoScript configuration. However you will still find the +outdated term "TypoScript template" or just "template" in places. .. _guide-troubleshooting: Troubleshooting =============== -Common mistakes made with TypoScript templates can cause a message like this: +Common mistakes made in the TypoScript configuration can cause a message like this: .. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFoundDebuggingOff.png - :alt: Error message "No TypoScript template found! Without debug mode" + :alt: Error message "No TypoScript record found!" If you turn on the :ref:`debug mode <t3coreapi:troubleshooting-debug-mode>` you will get more detailed information: .. figure:: /Images/ManualScreenshots/NoTypoScriptTemplateFound.png - :alt: Error message "No TypoScript template found!" + :alt: Error message "No TypoScript record found!" -`No TypoScript template found`: This warning appears if no template, +`No TypoScript record found!`: This warning appears if no TypoScript record, with the `root level` flag enabled, is found in the page tree. .. figure:: /Images/ManualScreenshots/ThePageIsNotConfigured.png :alt: Error message "The page is not configured!" - -`The page is not configured! [type=0][]. This means that there is no TypoScript +`The page is not configured! [type=0][]`. This means that there is no TypoScript object of type PAGE with typeNum=0 configured.`: This warning appears if the -root level flag of a template in the page tree is enabled (i.e. this template -is used), but no :ref:`PAGE <page>` Object can be found. +TypoScript Configuration of the current page contains no :ref:`page` +definition. The following TypoScript setup code is enough to remove this warning: diff --git a/Documentation/Guide/UsingFluidStyledContent/Index.rst b/Documentation/Guide/UsingFluidStyledContent/Index.rst index 0f04ca863..66ca25f64 100644 --- a/Documentation/Guide/UsingFluidStyledContent/Index.rst +++ b/Documentation/Guide/UsingFluidStyledContent/Index.rst @@ -5,31 +5,42 @@ Using fluid\_styled\_content ============================ -It is worth taking a deeper look at "fluid\_styled\_content". It comes with -more than 600 lines of TypoScript code containing definitions for each type of +It is worth taking a deeper look at the TypoScript of the system extension +:composer:`typo3/cms-fluid-styled-content`. It comes with +more than 900 lines of TypoScript code containing definitions for each type of content element. Although it may seem daunting, it is very instructive to review all this code, as there is much to learn by example. To view the raw code, place yourself on -the root page of your website and move to the **WEB > Template** module. Then -choose the *Template Analyzer* function. +the root page of your website and move to the +:guilabel:`Site Management > TypoScript` module. Then +choose the submodule :guilabel:`Included TypoScript` from the drop-down. -You should see a list of all used TypoScript templates and how they possibly -include one another. All templates are evaluated by TYPO3 CMS from top to +You should see a list of all used TypoScript records and files and how they possibly +include one another. All TypoScript is evaluated by TYPO3 CMS from top to bottom. -.. include:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt +.. figure:: /Images/ManualScreenshots/IncludedTypoScript.png + :alt: Screenshot of the module Site Management > TypoScript > Included TypoScript -With a click on "EXT:fluid\_styled\_content/static/", you can view the content -of that template (below the hierarchical view), first the constants, then the -setup (scroll down). + Click on the :guilabel:`{ }`, "show code", button to see the code -You will see that "fluid\_styled\_content" adds rendering definitions for all +With a click on the :guilabel:`{ }`, "show code", button, you can view the content +of that TypoScript file. + +As the TypoScript is split up in several files you can also use the +:guilabel:`{ + }`, "show resolved code", button to show the code including all +its includes. + +You will see that the set `set:typo3/fluid-styled-content` adds rendering +definitions for all content elements. When rendering special content like file relations or menus the concept of data processors is used. You can find out more about data processors in the :doc:`manual of fluid_styled_content <typo3/cms-fluid-styled-content:Index>`. -HTML purists may find that "fluid\_styled\_content" generates too much markup. +HTML purists may find that the set `set:typo3/fluid-styled-content` generates +too much markup. + It is perfectly possible to trim down this setup or write one's own entirely. However this is not recommended for beginners. diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst index 05eb3931a..1a989389d 100644 --- a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst +++ b/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst @@ -8,7 +8,7 @@ Heed the order The single most important thing to know about `stdWrap` is that all properties are parsed/executed exactly in the order in which they appear in the :ref:`TypoScript Reference <stdwrap>`, no matter in which order you -have set them in your TypoScript template. +have set them in your TypoScript record. Let's consider this example: diff --git a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst index d766ec257..a5cde346b 100644 --- a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst +++ b/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst @@ -12,5 +12,5 @@ arbitrarily, until the anticipated result is finally achieved by accident. The :ref:`TypoScript reference <stdWrap>` is very clear about which properties exist and what their data type is, so please refer -to that essential resource while developing your templates. +to that essential resource while writing your TypoScript configuration. diff --git a/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png b/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.png deleted file mode 100644 index c54acb2261415b75ea93947b79cee3448aa29e93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111031 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�jbfA72fw~veZxQ@78KRa5OZUlaqhj{>&@IVn9 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 diff --git a/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt b/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt deleted file mode 100644 index a4b912d89..000000000 --- a/Documentation/Images/AutomaticScreenshots/TemplateAnalyzerStructure.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. figure:: /Images/AutomaticScreenshots/TemplateAnalyzerStructure.png - :alt: The template structure as seen with the Template Analyzer - :class: with-shadow - - The template structure as seen with the Template Analyzer \ No newline at end of file diff --git a/Documentation/Images/ManualScreenshots/IncludedTypoScript.png b/Documentation/Images/ManualScreenshots/IncludedTypoScript.png new file mode 100644 index 0000000000000000000000000000000000000000..23938b900dd1c7ba4b7f487d5f66b6ae756375bc GIT binary patch literal 69509 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 literal 0 HcmV?d00001 diff --git a/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFound.png b/Documentation/Images/ManualScreenshots/NoTypoScriptTemplateFound.png index 0d92981eda6fc511722b22e796b80a0059bfb8bb..97959f32256e94b81fcbfb6589a3b9de537ca723 100644 GIT binary patch literal 33948 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 CK{>bp literal 45177 zcmeFYc~sKf_dja&G+Nq|rR7AXX_JzgvqEWQ=0K)JnnF3xIHRJ_WLBn@R^~`)PHCFr zJW)B4IO05!6Dkg<APNXvs?TSw?^^edyMFhtJN#J7g&fZCKCiR)*?YhC=J^c^;{*F7 z_X!CJ9Wc3e`KFN2PIV!n?L&LE3tFaoPpk>vwgucYHWVuCke(NO_{a5<`6VHt;yB^0 z`#S}n_xfJ52@nzzY54uOtp$<mBxpPoc;!x@6~ZMDdEehz$k^Z6*(bma5eU1rM=+#l z#pLoO>k!xycP!s|D2a@s!dL2m(u(|TepJz~&f)U8!bj>Y#dljA5ARk8c8uOXCx2w8 zVuR%#%L9dGey^-<eJ~n+5^wEt?B<WA=W02Pgr6PSuWwy7&z*nN+I;3;>wUT^f!f_4 zgx5m=o%ENg>FXu4Fchr}50F)J{Gu`Ye#*J9jDjfQuKj-e|5v<zt#KdYHzF|%(OZ$I zKTrHk(~u~#4&Fk-H@TQYRu%s)v)Uh<L<9r-v0J!G`9FQM?_8Ubdl3~l_JfIG&CbY~ z_<a5R)!gm(Q40wzif?COx74M+1elY`hMG_R(D~DxE?5H@E(GG%Ga^9hokz<5`O_Sb z-$`&b2Qzp;{-_V-@SnE#gX;EC4A3w*iJtU#uo#{X@p=O5yI@Pha~Kk>+kW@+9a-W( zp8R-~|BE){eOrUu$_)$SxZ+=@^Zcp+yTdr{Nk10nM`n0u1A@*jm^UTj*XM?cddBeR zRR*VM>@?Ci^~C^bfWLLcCVsjJi>cH9I+8X}&u26hk$muB%(=U8732;fp<nORSwlsu zw4~iAv=K)UGq@Fl4^L8Y&xd2!OKZ=V2vE-mm%_q?mFX*RCvs*c78B!Orbw|UO+z(A zztt*)9C~}12tzYaGp`?5t%m7>lKAPN?qSRhuyUMW8^3Pr&8gGpXUBg}58gyMbA(xi zBHH-S)j9YZV}*b*Y3`yo%hHKCjLmC@@n)o0=*h0D*C_2_XLx<`0VN=Q_rOmh!Cv}S z30raPX9p4K=p224l0CS)^Z{N7;#$%T@E;?j_zVN?wkbq<1jcN%2)$XWKg^|O9;%6~ zz}U(XLEMHgu%DZh0{v+x5s|6~XU`&P>9Y_lK7=<1e_JC7Qpd~HZ_e;XQUJW^q3A>? ze^P+W*M>_3{a!zESN)i1(n#+ZXl@y%YN;dzw&z##zOD_S)(<6Vm;M_cI%VD@fuR|p zJGOK~*O&0&F!W*luwrL5{*N>$o_-qaie}ZXj=KV3%qt2>JA@v1BKYvabWir#ej_`r zl%!$G-61hfCZ!Wx3clon4yz4gJ_f!$phjP<af|x1K)|%M?-|%mx<-w6f{w-1aNVW= z+QqNx)+x4J8~<5HdJN`l&4F=deB0FxN)ZDQO<HR8^!x+l0m9ZUxg_kic!8`{x-<DW z*Dq*3_D#geoV0nZZ-7oTjvZ}WlxTb?^cHur3D}0ukcgX}!Lim6OHsrf|K}+liU=U@ zYoU-3FR|ziPSYSj14_>3k=u4-4Q@(wb%M8OZMWf@KhluA?9mkc2+rHJi|3<_kT7n8 zD3(`(mgFxa0@1vAJ^o~LDCaq}p0Q2?u^BiCVAJdd5VJnXf&l8c?8IiWjZ(zwvJ{Ow zJx`Z#=!E0LS#7QW?n+D%_x8}$<fl)7yyyx5w}AhCrcI&~%$<-bdZD^cu#Of@pDh@I zkB^8k-eQ33K4OG^-9Xt(19V{%9f>dur+dmZdsgrajBX^Jmo;=R?E`8yNT$Wm6pX6j zA6!AyF)4ANFlJlgq!N_$h_{$oL3?Lz*I^xk3k;8X424BZMHP3>OdL<$J+VKqV<b`! z-i{YG-w!V6E`sT!wkD(!;P--8s?9nle7iPeH?SLMR$C5@3zLFtyOTML*~$ITxY$W1 zfB?{sg-mo|2YT)H<F&^=!^iIG&yTCxvsXmnWsqQc{^m@gaE@r*8npt$C<W{M*at$- zmd(%|)Rgl?Yw-Oak_HA70o;_ei%cr!rf3S#ESyvHliR%+rHol9s~}ZbYwr0HB{r`_ zt6ROLcPkn<IRZ$AmecaDTtJy`5f98$P$eJ~1iuT-AqDTdLX9!Pb9%vjI(PehKbImC za>(W!P5gS<N@>Iyan(~+fk-B??rP2ffgF7`!u0C*QsWZ%1TgNd&!!k9rjB`toQ<C4 zOzv2p1=N4$e`S%tJ`xy2_#4dZ?Q9_asWxK<!JlDx(40eZ7v;lQcjM9tnIbSWb8ZB0 zuX!65x|D{s5VbylmpgZ~2oC4+NUT+OI6GTs84)qn(AgjHws_)bO+3qTN*T==iAzo2 z4OGIzJY@p$ylZIGm6bMQIB;Ne5*pmTxS_+O5Ju;H4_o}0U6>E$B_Q-p-{wqep{G+j z8k*Ra3u@^Na2^ud(eZNYrJ$W>hw&?X4+c0UqL+zH##}<kLnq#_C<VvZ>Z~uc`1LrR zg~02iMV{}fXpwjY6<9?Cr6HW>N|Tl>CJLFho~vh!yUy?o>(KSt9cJsZXK1xdZVqYN zNg$Sc(O_r;bQVot%i((7bSc^kPQqtk<0xl^*#}Na+eEY*axFV`2~#E1qP*uyLCM&4 zQ}dO{99peQeR)utg_OV$SQ>{Laj1^;t~W%M6b68D1odyuWDfk?L7ht8^c-1tzRka~ z%pSncKpZ8-qSC?G<_FUQ5OP2E7@8F)kvDi07!NyE(*LNczha;WTLl;2!}_u)5k3UF zFQuj_-C#~>iPd5+Rcxd=%k<s8wBgBC|E9e*(56Zo^z>V}9$!V8xQ9(RpGptD?OMO} zcnF|7$7o^~FF15g;QiJ{aK`jI=?5@Rys#=|Ko99OB32K+tJ^B@q8f%7$o(gj1ts^l zZOl|)$_ILtP?ygI4D+p1-zwHzZKJb>Fm6fQj%8v2<fT!^i$pB%ep1|+@oGX9xB4+V zQ`T_`$SbI0&0$}$`;5u08zODCyn{x!u)Q22WX&$(z;alcroh5Xig2GYZ{)|dKVG@f zI-7W;Z3oJIb1}_7D+9C_0@f`A;%uKnhsM!G+0Tud+7f{?$l2Re)O`Duo9}|(kdyC( zGt;jr!NWK?MpLU&Pjhx3kXasp<}Xw=)lb?ExpYW$qSq$$$QY%5QP~JKZZj$ssGI}< zkDs43`P9kjc*;rN+}El<H(rK$4r$!MS^d>E3juJCn|E)JSu08qELY9TPBTcyYC=Eo za+FdWh(kbynq%ipHw_AL>lN>wM1VMR4dGA2`E|x|?PN9xZBLn9nLGyl^sWuRldE*J z-eq<Y7dPIP#+NdXV0i}MH^xa=Pz0OgN(pFtwU@+&V0qI^TSKe04WVBf)a|*>E!>3A zviBF)BYH`|59fmSGi}1S-XkSgCenA;<Vov@<D>k;Gil&0>-CudU^?$q+BGoSI^vd5 z_!s&I6CXeao;?=V<B(MJwl+K+dcIfG)Cs0a&gU<3mYQ04$8YuG;TO42tl^BN5>1u~ zH;ZOb|LCxBwRR?3cye9WTS(|zWaK&TM;jfs5nkv+iom`F!=RX(Dwh~D_Ek4~@jP?q zkN2)o1gi0scWMfOXXSOAnIwGz&SULGp=#LrF^t+uG@Mh&l5I%DqVx5ckz^cMfwg6f zD8;tc(c{RQUEzAmon%k4y)F!2zm>8v9Cvt}MXdm<h33Jov%%-8BZDZl-$L*V0I_d6 z8iMDPf!dJda@<xWMvr=KZWtlm1vr}oIO`4Hq1*eEFiKlV)0%;>o<_T`+OQ>Hp;jWs zC!0@m18`^352%!=OzCV*cH&=e)Y1Ep&8=%|uCzDs<X;8=yzeY|2#^1onhTFmpiKTE z3rW;&wjmN#>ehy%z(Az<WJ;KbDFweZH!_n`M0*L&IDvMb(IQIRfbq5(5De%8zwH~( z?;sgf1M0zm8tug4iW-c`(>h+xsrAHbMCAVYqLXDsUn&!}sCtwJ7-z@QILTvo-9fJV z3H*uC=J7Z^w7qtc!fawEf2)1V^g{jS2suQVm+^wIuYNUdVTk=RaeVVN%dmmIF-$Y7 zg8jX@<?BBh^kTg@vt1(hRfgAsKE6m^%D911OD!~I6k%}qDc5ThFzT+)2Ni?I<u$Aw z^B;FN&~|Z}A&e#q?%q&N;y90L{;ym-#se)M!S@bkvNfFcC&+s5SCPmIJ`Ti!B{BE= zBF_P1f#+cyIVK$tp$zUyT76;4RGk}!#4sS95YPo)9zFVvbjnG(jEpAPA_M(X>*j%< zjoQwT`B$erE|jR0sxYO|ypN+pAoc=;d^qB3jvpW9oS?i8T-evUQP_sC1?eZH6xqC| zU4325f8fMh%OszTQ()5hTQ;6fXo+7d@|s3%s4M5xi#58}J7eHmc7bz<ae`~|R%iyV z2{iU_BKkqtkA;ET%}~wt`xV^rg9&wYIejW@8}j&dww7=!*7q|;`f|iE(^M}b|9-gK zb>iO4&Xq>=Pz8UQuc7x_%6AzOHNT^<)r|<7jU>~gqkgx>mnAT|`JXs_k%_#StFNCM zP1YO}3#jWU{DR!NNp7^;|JJQ^N=r_Ol1SJf&v_QYT>(#$Lu{;;eF;ao>?V3kG<<vb z*S@CJE6twZMjyb;UZaxFAKP|~0qW_*QWuO-ya}?Y4X%P|-+YuHR=dZ~H);uTs&cXA zrM!AVQ#2OC9>*_Xqm(3U6J=(<vQ}x5+oM?lXTHL3tv>HOBx*r1>a{DHr}oMF%3klK z>5InnKXb-w%Aw_5%21cZD2aa4fLw7Tnhj{ASEib-<&9wn%A@L&pCHZGRy=#!xJetO z!zP&duZttJaNdNTgYr+kXW`sLAdl%Byw-c3Tz`S<BEH^c{+L-OH?UMHh+`y>qb(Hd zSj`)9ef{o;i6g+4naJe*C^o6qcPIxm`o7UnDrz`t{}A>1wb>|E#l949GmNPragk*0 zSY&m#DA*pqD_^)^NE8KKm1q^kw9H-1kDiKt39ZPh-&>`cR}a52{QgVfB8EO`jEj54 z?~CeOcd=*pt#Tp`G!XW}o@iG#=wYIgO7sfNFk59IEVJ;0rpSKh79Fo$&gjPjYDw>( zk6qGlNA8Zdhg7d8>*{zw8;9vf?rq(i0?8+L!!Mb_4_1)|Cg(?rT3zS^HjUrXXwO&r z9@3JX)K3Mdp&<EVy@@vToJp?lN2N1LIj_!P46iGHFLXXYytYoeo=b#&7{>h?{%xo3 z2^(+8R^EUf?r2ALf>5(}*GPuzY5D9!)AJ*1h!G-4v$oO6r{17)(NpCC#iTEM_a=3_ zXPlD?zmOwQhbO6X&+6^IV=oPNs;zDh-F{)VSuF|7$%{>kUL9wB-bnm5=^QrHH8K4U z&`^4G;!8s4K|Zs@7MRCfs}law78~&1DgFK9LfE#&jm^u(SI_nN+md(%W&q)~PDjV| zH}jU^yF9}xjbt_pO*9{?Dd7Z1ZH~#gC2fnDw}2Dh!pCFO<?&Pn_&p@h^B&YUnb=;@ z;FU(y(*L6hyl!x59;$QS#3<|5QsQOI?qAUm{`JudWRt=|cbNWLjL}HAtCzo%8hN&6 zsJ-vjkPDW!teKaMz%8(YHb0<iuSLw5!uiXYIbi70;RJ-=D49CBd17j8wkEs1LUqIY z>023|+beb?>!$=w5KBSQ>$*~u*oNU9|2bvF#uxCYU{z#2gFO<5W{0m`NnI=Z@@L~A zDNgkm&6*)X_}adEP*>WsELhQx&~aBqOye1lVO-IXHK|Wno*%}!%-}G_omlK?mzYFs zU+9EK)WnshuB^@7cWJEh7WWw_*~JOhs$o&+_3avewyhY;8Ptci&MI*umvm?94`U47 zE7z=`?m*Zx)6ay86`2&`Qc+v-R#yp2y3&4s5~tx-A~)<iBBhz5we!7jf$v*4^!ht) z+I_Bsq9}U76Tz$Eo&2VUF?sJA>KFcSHMx<O;tKw1In3MX@0X`*Gep(|SII~?Z#l#q zRQt@`U&STzlmBxO@FPJwnDzMz(armt5#g(z{N>l6D{B?1a5wwlCr{)PSf1>n%DOGa z-Q^#_!7Zz2jcabUhnc5I2YEG?fFEw1<>(!6r{%_()1->6HBsya=E*W$rM1i{i8#<A z;Nt?Yy%k}#4_&{-PAv6|7rjm)0gr@Q+wx{IH-@{YiFSP(!dtnWkK6ld-f5^oV(#y3 z!MAqdSNvok0vGmc<P>_iw$B|Sm&$s9R)?944Blu5YQ&mRrr_oam^#JHNl$QiwhDf_ zI|_fIpKo!u(omAWmb4kPO8Iei4s&--_;>smM{HP1bir_qAy_nKQ^SR_gV|<6kvK-% z9H;^v!r$aY^Cu1T+9n^Nt4rXT(A@j>Y`7$fli4X-r?UmpM-`)fI@M=3C>A~gpYLx9 z<aUcP?+jwrCrH?O`Z{wU<;6rx6A9>F(^|dQde2yqK9RS&Hm}!EWU)CprUl^6pqOVv z!-nC!MehU!WZ-5gVU*`r(=~x*Ug1yDBHVbBx4pv1&$7@vCZpl~A`HOx_}LMh>ymSS zIIDAu@Ic#frf4##D13f_jA75|&D{R#8P9d{!S1<_tYL!6q=B$r=qF~A9gDji2wHHh z*u3?KQ0Q#_6nsySw>Bg2OV&p)dAsE?aqPZSP54%G92Lvu_u-7m!?S0V1%9wE#=jTn zF1pU)e=7Ao!yG_L-~ciMm~XYo-p8a<h*6N8xI`eFN1bV#h~5LloZ%l$;a*c<2Mt?> z121N&6nJm7uGLQ!0y!t`hgJuGSpH(BD4yS;_Yu9)8ZNoDrZgjZWS*8aI?Jipp%fqs z9tYN{aneRmFSYIzEOsR&E@e`5pTI#JMkhJiior#K!o5^%uyr`jl(y@c)Tr3Gl@;Yf zm+U5UAedyT>x^DcRI0iaWIYj#VRy&%99!dV$a2lFCzcR4_V?_AoxVCIuvXF}ERUKd zy%6}j=^N5NUb50-Pl2PciOR^xX2ES;XQ1m40~a%+r~{U;L<#(D`z;L+Js*#|Z@5?? zd_};86{s|lI$_h$Yb=MF-)Mt49$vPMb(luSU{G70RJ?Zvy2+%}(*{Q%X%^kfov52? z!amn5oGd+7zrUi>^SF?Z_NX5qg`bFl1%pr0r$U<+ja!x~gk2iosE$|*%EWfY0!DM8 zr<FIh`0B(sj4$q$$L;v?!!D$%x4s5>7=O>q9s^WS*$t!Uht+;h8vrO{;MFI<X0h+i z>Rqm6tL7d1ae2>vRJeGBw;EDcdOtWCq&}T`EZ{RFw@)YRHw>8xq3@%?<5TCPI$b#i zGPlP3p>FzqY5;y^1#_)Q_=p;ZoIm3I4m?wI$_nfOdk@Y_t6dA?s&5bQzfq$&1fe*F z6%biCO;&~xTO;Hx_YR1if@~bPn_%B&8!^N(Jr>UuiOtvcHcMIkScmTy@LnQx0YR!6 z!U=N5=(XFuQ6K?iuvZIMMc;xZZ<J46pX<mcvjSNo9SIWPh*=G>HXNDV9JN5+CR>*p zPX6V~Wp`w<`uf{)$TYIO^nNIGxXqQug%4AxN{Er&^EDw!>bf4aLup0zth^B}xi*At zLBmWGEDkI}L;WeKshT}>Y&dEh+?KQt@lJ&1%M|bijWyFEOt!KeZZ>gcZAcWRZWTWI zTT3ObQN9bP&+gbF2{W{l<Ld66o>O|div@Y45&IpgyETeT;ahc0iC17C{>r+HT)zed z!c|sx41})U3YjU};JFxYz5yRC@r*}`P#5T<RY)~#c=sj#RibJ&WZWuPIsYL3N_dO# zBvurt4fPuiCv@z`3K%?JcS9m*4*ETf+0vG^YTOQm*8=cWeys1^P4S^?cj2h1D1ZSs zlqKH2I3wVM1R)<{Ke)6Y3;u|^IV8+79|OYcH(4ZOvJ6^LKgkYX|Ci$7i?1dE)4^z3 z%!HB`ZELCs&&upI2~|BByFQfDQ0&z6o_A*bG%(=y?l|b?<N$981>i1Lu_NY-`GC3& z1YR@E8R^{8$w<e9Xh~1XjMTxS9Q85PsMA?X39O8Unc@#yYM~^$?;#MH!CZisxHj~j zg|pds&iRh7?h0rGf25%ktF^nREp~r!v6F1p>=X|E8L=PD%Ae004__^#fx_6P1}peb zAZ7>wb*p{kB+Kphq_u(p2eF&9PXMT9Q3A<zGM;-iaHLqS8incl$cyJ2qzmLQG!Cd$ zyGE4~M4f5RCT?Kn10gtkFNx<a=+}uRx?<^8dw^{SJ}ZZ6*G|WUHQTql%L@qAonTiH zp>HRJC$?}X&4-W$s)J63{Xo&(SD5UO)drSO;c0q1OM+b%TdAQf@I)#>OctHexONu# z$f*!5+&dXX-)3jZ+}OFyC7r5l|I@`qz<&;&Qi;BUmPtLH)P``i=lX&k<kOkPonRTv zonIYLJa=xE`WQl&7p)xoGsH3*n~DjJyMwm3L#ttKZJo$+rLCr*A9&{QoKU=^>CK#0 zM$ysS9}7Fk^hYm9yM!L3PykzXJmU@{MKFu395s7bu#aE1>i7Vk<tBI?p@{nEoBIx- zZ|#TIbg&6<BZYup{Ub+;(cH=T4fqHjvG-T-uiyUjpa?;_a-9nQOd`M7T7v@9e_zV{ zu@3OXXCu!A>-<0e^?*+Qo8_p~RS@L61h2wF1nJ-J5ArXo?f(7GuQRWSe{vp`*Z=?3 z1-Ti#E^v<ov1IY}#vl6$qjV%@19>tr;SU_Ywj0)-xg@+JzG_wizj=i)^B0`T2M3F; zcl~(aw9Fd8b4TI@F3|5Oe7DKL-hPPOMi@2vgX#nGS40_w0MWl#YhF@Az9Jg@oni1F z!ssQnjaPqGxhJL&u={@x62xc!mq2I%lfame4U0g&UzH;mvYb=5T+a!ua)dj#>=4xo zaO(6^kxjIkH>o-x5bgk@KZqx$5={%1mO=U#j@?zVpqw<9`FDP|1cXwiE+#7bw!h&p z7?@HaKOTDU$FJG-rw3_J5C-b)bk$qdUgVPuw0g6L><f|YeeNbKNGLv_8~&X$k?1L+ z%4B^zpEGymfsUUV{+lc1WJ@^%RYlk$Y+iX%{ZD9zD?xwmVd$pX_3n3GJwL+Fk(|=K zR(8goeVY^5X*n3fA_{cy*XZltGSYeSB%L?$nf>X)<r)JAlfCB$6p{d6D1!$QLbYTp zOglp3+cnF<Z28gj>bo246YuOnn9Xm^o2>9y`6akjWjFRHAW%Gw_eS74d^;kaq<4*y zE)dF-33GQqpHr@!{CWUeDry4zRA29Bihs!dR=!l|aI-yiqI*0l!jKZ!V$yRv;+eyg zF*E%7fgCYFN_3%119Ts?xtQ<JvgVdSs`-%9lnm0<d7{6KVf~K*ad+O1avP1kS@{!h z7D(@#$44x!hVjb>OO2w91~qPSpF3!=i%Y_u4K+8s7;I+;>WuwXFpaB!p^GPaj?bAm zI?0<KBtbjnBClI@JGJCWdtSR-w)5?z$JJ^Sv_fP4YwNY|4lQG8FIx;sX04)~#wRz% zI2$Bz<FndM;z*^}_6pOy5{6T?nt}VRG3392nd~g-BPp5Ogeusv08*@dt7xCm;7$=^ zX<hv~^-&qAWN)u{)+f=Rb1<#nsv7ebc4q~;c>eWQU8k?i=EgU!wI4G5$uzo7w5@OF zl<ybY(3rrDnvK0zq=#J=lRTNWt35XO)6bP->#q&4HybRcy$0sZsd6s^8<P)-no_DG zE<tQhDpdt%mmL@FRs3u|HWkHDq^msv4VD&zQr&Y#%^p_C*dlCDCF#s>ORx{|p<|T> zwj4a<&l8#deWKGK^+cQE%l`sT_Aen70unGi_3LC?-HaC|XXH;(&hAVDrH*w6U;XUp z<xXu)hvZGTDZbH6&_PJ``YoAJ-eQl;lGKhB&EYFugSMYjJg?<&yQ?M-(t1XwL-xnH z$&!(tQq)7;&}P-2sNg_>v<M9x{&N%AU01`lXdbgx3{|}O-F=VC(24XW$FeC&qr<hq zgwX}o8_8JJSQS5#{ek@K?`q2Bd2Tw6-@R--ih9z5cKB6-GOA~sPtyCvjDibfe?Tbf z-J`cEP!H`A2}l3jjaq>Ju0nf$#bxg?Yw9kN9Wqc2%Gb0uyLnnQ*V`hvH!5M`Oi9}7 zrx${pI&*q`_m2>MK#&oH;XA|U-rA>wYssQey;`^$&HOFwfYL>7&&5$^I}z^KqH`}h ze=kQVAn05JbJQ$3i5ZSd&n>s9x$0q0ykjf6o*C^U*yyk16aUqVOXfa1#Pa`<LW+q2 zTe@zFzA=ox_TU!5<&2`aX0!`jxGTzP;>_1HOOO5+lYViFtT*Nn@k>s{XUFo~C2X}^ zq|A2LdtL8Xnf_<4CEhA=T4q-1R{B4{7b7X$wu9zLCN)=GdU|6w0G%Ai4f7vqF7{7V zuX2L^C)l=Xaf<F%SA|o^VeyCcWZx0x#aP#mT3MF6eyU%E0lG)JJoOwI)8cWc|03Z~ z6zDpcAqxdqsGT!+glZ-S-a@!&b}7ZBt!V3Y_9;lm6Xn%=`~z#QHhg*xYVl^bb0CZL z!Bc+rjH6A*DsjJUT;;oK6cK?byP3c$D{Czjv<Ug?$5%aeT9y+y)B+7v{PTU3lgRI{ zQjY(IOZIotT1d$2k<;?=B$SWqU&Ge^M^^v0Vf$aS@ByElc&vsRWX5jDPZ_N-`uPtv zqS(Z{hSKw6NHDO1$=Kwj>1_Z}9_jjn8hpPS$Yrofg~~&9o%#J$&vT6JYUY!Cg=K=) z;Pqp!Jd3tj&Pi=T{<gv!`f@ao{ycs9jnc}2BUt36_gV7fmzp7IgjoB6v)V<Pv-VG< z*LfxB#P<ID%4`It^2{HHBfx~PMMq9W-$y+kW*=FRyi-34Sf`q)K}5$|6P`GY+mlQa z4!|(6b+<vyO|S!#_mm80b0Ed_PQfih?;b7P4{t~G;|zjn;;^=6lgcOml)>1f^lw_P zld*#3C%51$L5h08#VYf)x~FL;rgJwE*PVRIVNI4}3q)bB06u{snOSH4>6lpachKIH zVCMeUak2sZ_apyEnngSjxcMkZSsA_@C%LF$LK%q$vM24C(jEWMZz=5=2#nCurpMLY zRvA^QG|1Ep(|DhnJ9PwBnd6h`dfL9QEXB{btVAcOO?Xa;R_-_-QFdQ>EodSO&$fRN z0j2hKMiYAAEB}B{f^@$oDryW_+_C!eXFzYrKtkxmx*B)LOXq29)4LYb&$c4jdtuI+ zTI<3=Zgv)}^eEAVOc%J_!T<Pgai!r^V2`hN?Zg*Lhk_cmU87X|)UYQX=-3k8CAG2F zr!zMOb|72nbNaq@Mk%hh=3lLpa|_kjjsT}}@zqitmMKY`X`g2W1}f4q-^Df;y;nbt zEXo9vn{=Z#NJi2c<LgeakUBGr=G|D67RISwu~Cs5f%2eF4x#1f2u%sE%7cFtxQgMF z4wIDRrUKxt(+h^-rT^+Z_3m9*T$|Cr54;e`&1{REA9H*hse41(+HYfGYH(wyE#jCp z;xc}Fhm=I(PG{}abg!^Cmqji~Utw4s_+oC&F}@{nLi3I&lqUmKkb-^=S#feZKX3G` zXId{I6SAv{Ht63YWf>tJ^C^WluQ2-=E9<P&T%3RP`fStim6BQic_eZ6+l7>xVM#lg zlcPXHHKLS6zfAl*=tu6*TabDd(44xIrh7oqRR2}x9rHY$pVYnatrjmHzdP2dwWjG2 z^ttJ%9&UjB^13S``}U1de3*w5^@)4qMdGetW$HV6@QJcJJz<G{O=1D%MHVzSyAQr` zcTNXA8*NbX{@G*36lYi&m5z#5>u2S(ouQqJX<Ofi%9&S7_^L0*Rlo18#&_1>99{pR z;|Rn-MGeMoo;P*Z#oZaIY+oErNj6WMdu#AI81ljP=ipgC2O1cWzwzD4-{Eq}h(oRa z=KVb$=~F7jJ5_V<)zHtx)+H-nnok)lsL(gK@AR13;itGzNwhv(<y@8c{#M^DRo~g0 zUo4<tr3IHzbPrfPNW?XP1$<1c>#1p-IVc9Y->)i$?63MseED2CXGx(t(kBQU`!`mA za+0bd>K1^{R(EFLvp-3EA2tke<Ec5#NQ@4n!)ywQ%Bf}N>H>Pjtv!n)OOl2SkPu|% z8Jf|0pR&(TbG?UMy;!67qiP%7WyZxd4TeB=f1W2Tf5GOd2kl~aH%(*&TUnTfPUWQ# z#;KRGWMBB5E=dsFHj@gL`SfXC!Hj{+%?s~E6e>DpZsfov5%YJv6oPS!uVimdrD02h zi+gQD=sFrn)uX#<r#{*YX^mXV=}gcibOOeU8mtXQE9f2Ur#@t8L<jdUPU3k=+sWIF z^K#G|3Fh+;b3_&bJ_KpYlxiLY{FJ#?Q~KD0uDZ+R{qW*TDkpoUki+!(2L{<b;&scl zAzjMj$KzpF6#hKMt?uCWutc@OG)Tt8%Y8d6XP;_c2FW?MQC#jG){rWWR0|qE?VT93 z&M=8#)LDzJ3(+Tf-AM?l2ujfun_WmNte%at?^yCMHSv~jSuXGjzm|T4st;uZzRkgN zY8SNX_F9{s?)Mz1eU4N0)=nQ`$#rL`>9CzT?2m}{Wj^8bDYVUx@oM9hTWywpKFKx7 ztsz3*gOnUvJuIfpb(p1fx@79|jEkpDLA12R`~&LEM5)75F?FVQf0~Fa>O(0!{jG9G zuTKV_oAX;VZW?(~iSP5Q)WyqSU#ew@fEO)qm8Ts3+Gvl2(6Ci%(dmgGIfM&5tk=LJ z@gDDtc&=9W2mEmPjw60;jGMCXsbSBst}q{1UJJBAarp#?gsS(l3p_4r92236B8j|2 zzCblz&YNIxW|mjU{;hRVQ`B>b-#SLZ{Kavq5}fk)1U6!bP~1RZUoLTt_4r=ikJ3w3 zSW90IFKpaVRz)=mjyt5Ac~#dZwKWo^n?YaYHL*RSO-MPD9?zlgMu?p&W~1uq%?+{c z4@m#UOuL`s8@x}mEJ=uXVTkD!67?uIajfEBbd^)zsx;SmXOR2BqPw@#X(;Pn>a@aQ zN>o8d)a3)@v5JE!NmeH`oqZ_p)-O)mOr-aWZ?!!fRL5=HNJU51x<)8&3XV_QdU2#C zaBy(;?imkUrFnWrF`Yximsi8%qf7Yze9k(&a3roWUCV$FO%FixLuR)M_Q+TnSM}0= zYHHtCx@<AF_@vvamu6{jK@7GG$Zqvg#D*<>y#KuK;hVvFDhz?~6OqaQTh>+`MbEvZ zHdL~EsNI452-2Hl_eQUti%Q-n=hYu3%Sn1xd~e5J^VvtRtG~#Q0J1(?G9+5+;8VRQ z?+@eXUG8m_(MM2f^%sEf<)wQZ>jFuj=v!vXM8U43G|_3Jk232PVhpJ3P;AK5zx30) zop%qm92r*4$5HPKG*+uX$=Kj9e@w}Bn&@;8B};Ql1L#S=Z7<c|S1cV_X^b72{5bew z+*CHq0Bf4@y&lH1T-<w)f-gzg8)o~no)bK7Lq0XW`1B*eO10y2+51B6W|wMnFj#3v zT!ar$IJj__>Aq|E>2eX}OLDC0ftEsBM;G_ON@a(|iF-7cNNu@^;`$Gk)i_V9Zdb(D zkW*it1<d&+20seT+3<RJ!f#k%@*w4jmwM8Ail4;U3U}KsoUY0OV_yA24{9#$RY%g- z2B-M}$ON~ge*C6b^ifp2G4)Hq;5l5~7e&&oM)B&f4_u`i-lumhcci4IegNkGE49~4 zuUyGHaP32ItN$L{&gx&GM*xS!v?UX>$?EfQNg1Vn?zP}E%NM@PpFXsdh(5C_H)P!} zRoc8x-FOzfNEk|59iG_8x$otD9-%I&cY8XRXq3HLzg!OfvGs9Fp(N*I?3F)(Cp4YN zxqEHXIHJi9-qld^EG*5w{)I9b?SP>afxf6e4M|d&G$18%*7NC~S1$(kp(@@#i;7;` zm0-m9{yBK~*|duPjo=3nc2m>>lw0AG{seXXHya0t#V1@9Gix1bTZ0pBcBHH4jOCWQ zXUjv}`tN}mVW5HG;YdttkPV=z<7E=xL-nDb3`(i#_c4tFDQA?g>*c0SXr36#zaknl zhz9)fzs_OlxZk!|I}i2d3=*W<m!^dmRDWVb-?>_Mi#zl;Xp9tGSb$(pdXIJZ|A-RH zP61qLr+;#sKb1cb#j<QU6m{O<a86(^qTlG{;?X{@Iro<>O9ro7N@5tY<qwe#@7vVx zM-k$`V1IDpBI>fbpC05{ic-ILQNQY+y*=CMRQ*U>nTytO=RiIT-`v0TDs-Vu_lRhB z$1BY%hEi$zZZ$aVrqCma@+AvLVoXW2Bu0yw<?x*X3+gA^h_U4K6Wu(g2hY90QhIhV z3n!P|jYawIX@zXDq?Ac_ZRXE1(CbCH45M9ll(Bmj?0wJwbzRs_FhQ~ESwmD-SB>$c zEIs*<6c+!cfQ)`u1j-+%48f!2qGKTN16=5AlWFZ7wX0&r(`_IaASwV_xdr{yr6H}Z z!XG(e4S;$Xf9VL@>k_SjO`Z7Yr7tEp8mkRMJ^z+a`Hse6bz}21?=J{_%~Q)ZojFPu zWMie6OU8k54q>vQx>8f&+s)gI1JQN$*^X3~(X-NSp=VT*8kBQNf#ku0O5;L*&E=!C z?%AueFT3?Wed)|C05%R9wM>>mT(~w`pmhJ|>bdJ{?Xf3D0C8mjn=XkVlD+N3)A!34 zwFUy5A!o|6k{>!xIm$;IU*0>Py0@O-yZA6HF;=<;$k5+^Ub++k4n`aB{eI!-u3@kw zn|Q4a?8UOIqnlyllP5k8Jriy3fSAw<wbHRiT=uMfB&9;5t0Zm3JzY8K>F3$$zR$X> zNAm%>72pon#U2Oy&ms8bVCh9KQyu$AS^q&*eM!k)ql3hdv<aYMz<qtKGpJ{78b`iQ ze)O|XUjOL#pQG4C(Dw=77>nA7s(8WM{t@my<!S7#FMG}Bv<?EiDz|Dlgb9FzsUIw| zfyllQpS*<f%tPT4YyG}DoOu`1R+znGU7X>!lQZ%(n`>rVkRS$#7dt`@S<ZJ)ESh3! z*uOlhY`pNX;-6s6U^9!*TyCs%*~2%@8YzU{q%B(I)%82<z|Tu5RZI94#WdNvh=B5E zL$QtRfees)F}MGjI`(5E;V7<)&Jmpw`vhK=xe}w>9=}-ip(P#jI^H&|^wQYCe60hG z)|O-23IP~IQLKq+5~LpNIm1OK`~C~cBv@WM;~U9x`1wc3VrfZPX9mA|=l5foX&1dC zuAVH;D>=COab9@fGIr~=!DR(k!u6K2vo(v)?ez$<&g1^r{K^Q=>%beRA3weQTc~ox zy{BE&4r#UbL`6}Q=WK4ZeJ(dsG6BCkR#ux-?&bLr(z>2>JW4<LT%Ey=D~JtQPFS1e z990fzmp7wp@Aux{)C2;hK9IB>ukiVre$mw1UD35Dl%$k?0#?&clGVE*df{cRk2o@} zp{9WTnSaK{FXvtL7!sO!F!OAWf9X_qjC0EUo@G#FQAUw8YB5K)AZcIm)I_33_9dL- zL1x+P*ME`obVL*o`!su%g&4>W#Pw)5P`rxQ+)vNyuYW=mjo(>+GWF=MyCFyna3{y7 z6MKoZ%Z#WWur_G%%m^eN_V`SdO;}TrQ&G=Z+jsoQRz_bJDhQ^jQk@)?8T)p*qUX~s z52<2W7e>R<U2?|Y_XQbdH#s-a@zMEXM?i9@tAC@BzkB1|BFz*+X{OC&m{qz(MD?`Y zy4>{4!Lcsdt@W-dMCjDkHCans@<?u+7UNRK^VeZ+oeyU$AB`{hYDaW<`Y$?56&Gv( zq9eEoA8{LP32=r^=NIW--!oTnC(GF-u^6iy)!7{B$}t%60rg|@!=7S4hcwmx$HQ4> z)N8J;*0PS^+i>!|VOu#Ra!J%P;<*ECYvXcf?p(Eu4vXNlXMA2+B6s6b`mVK^*3?&F zitXlQ4394}CJrvQl=Iy#8ALo{-|+cqR+cIjWLVhwq_WM!FUPdV;@8DEPkga4U0JE; z!{Vgw*|W0#<1l$0`%ul^djFoSocK@Whj)-s;{pcACS`{GnQ)kUVRuYK+mE!wFj!N! z2L1WZh-l1<f`iJP7VmpQGz#3Q{PRkr;wavG<}HM?yu+{Ysy8{N-gdI5dyJSCSK9G1 zyvec?Noh*v%Xg|i5?w+JzGVcL+yT+HSI9^|`x7>+oK6C`%${xYE<sz?*ZVkN4VXV> zZboj{(x$-`RXcr!SAGPg`;hu1XV0trrF067)U@C>wKG1yQogevKa-+<5)jxCg6=hf z?!1r*U8{;yNdY2LhJOV`QXv4wdn5IV*nkS4-Dk&^sB?b&G)bt60@`k?^b>TyTcP;7 z`+ww0;KrJLq~yHxsY_W&3f*$JjzrU719C|%!XJLwhCdV%V*U^w2(39lNDVl8_YdKe z?z!^!H#w<-tjqrbHFfPz3g+wH|HVQ5^e7~4w2EIj`lE4*bN^}j8>yT_qLQN#o3*2U zNgz?B?|-Nnm9f`RsI}uAErhVp2b&7I?bnwknF@lk^fu7zINMQE%!@S2e()-N?#E<l zBF;HKV2TYg(E_&=cH(#!Dy@aS{^h<E0z5etBT70};sf+EOUH8{l$?5sd=i|vUUe0T zGE@Urs0b5MozV5=cxxeF(0}N-<rg2>ClGa5ywrHjE#XzerEGY8Dkurdel~C+sf9GJ zR<ss}AfG!(sI5^XjMlyx>u^GUTVNH>HfM>l=9KcrUOT}S>zr~hQ#*Ve|HIsk1{FKi zZzi*yXY);wY~eRnfYrw54&;W{MA55iz-yFkg2w<2qX-uK=H0)V|1zhhW|UR$0;<G6 ztM*@y6&}Wx8k3Ax4bLpxrBv`+A{sU=hT{6j+EbCwYD?n>4$P42xV+|3%>-_o%uzBP zX*c_&XsI#Q0+PWBY<d?x^!Amsd$!7Hb}?gl0$nyx!mla|d1GktXzp$uT*e@N;Mpp< zFHp_-F{#c;sqPB0CawJ3T4-hE?F3v!?e!Eh!_wqXKaWU@&uz<<rXH8l_J&H;T=aYJ z)~gW^qUsK|S+BAZelz>Y3`ItUPagL8YN+GtqCDN)cJ^B#u9|WAr3LYQ(nZyS-G<91 zDI>iTX!aL2`EAou%z}OG<7~`3i*k|H_Nx)<e#b*y-73;8qL^nk6u`ZZfvf2+uIRi7 zDeqrDw1YUQNhesly66Q#i-fXfR=og9_w`?2E~<4GMSd=94k*$boH>1F=`yD?6h!Xb zQt&v#UiNoG5$_Kv0vu9v&0?KPN+Rz>>L;vCrvmL%89JILMc+V`D&Ex$2fL3%r^M*1 zvM-r>HY^al2y2gSPlnI+q?JT<d(`Un*R?gI*3ZrR5jZ<$*tHm}(KUI01B*Uap7 zR>N-Ams52!r4><(bW5`1T8-^cR{dT=%6hvZp7ds;oDDmL=x0vB@{#Pd;9Dav5iV;V z`{`kXw~f1IP@hAEOMi0ws<NI%rKZ214+{rxDAXT_)@x$M7zC0}$`pbRBN03HM_HNY z?J#jK(mdi4w4C1@@Yq9g##|#S58<FLr`eaIYyYe?#l73v^>*}f@LgG5_?+3mG95{) zIQ=4pK>v92@#lO>N9~;=U%UrNZ^z8`tO>@9mDTiqJN2cSi2g~VjP}yZ<%<g`lHDF6 zrr7oEZ_}rnHx^yzpX-LDT+n&AM*iGTr8M)gw5EP2PA{>e6XaADjp|ZkmcEHl$8`w` zO6J_bh0rRcy4TtjOTLih3j1pR!+rkqJ)gk1q?aj#j%j;FSC8c|>(ziKx_sertWr-p zNmkQJ>5Est$YnE1p$@|PT|#-#T~)|UWcLwVrk16LvsHysbUu=Bwr`_HIPq%lu6&N2 zis)q8+Nl!Js{EPm@Z&*NWd%9K#PXz`!4Hxj>`G>$YqbqdXqa|{)CED;&i9=uRc@l2 z#<nrK_FJv{R>cab?D(4;u~3Vn87!q`TGEoASGLsZB_n~|AHr~|h+=9T36(QI^QO*y zj!=K)ivygkmG2<KqX#M4du_<bu>`;BjLN!7?XUFPk)d+}@}vdn#~nYnY?&$C93!kg z8~iRAjraIm)P2b~73QrlDU0YH7?X{yd4J1@dHsE?L#@@QyokiGb#x)6KlM;Xq~G2~ zgN27u3(V;Gt`q7<cs9y+k3!XP5#kZJm>RCM<~#eo6hc<-*%Pua#?EW?g~d2nm7v0o z*N95$<%!5?T8##L1BICtc|nL7kipDWpGNuesKrasEJkz8x{f@p*tH|<&?L;?f|<_z zniO_T(-WG5b=0HS#km<&gjo<vc1;;XrV-aKM}qRjyvCCzE;<~Z`tck^F?cD}YSmQe zPP;hTGrFjp@4lFT7_e1IuvfbxJ4|e-pRzBixes+J%bNR&qAXSjpxyc3yi*)aJV8r{ z1NxVt++LFzN*C8^zxz5A_pjDe%`i1>ydL{yoVuv-<mjWiJx8@^8y$L{7&kThOVS@S z^j^%t2Cvwi7&Oh`<;qy%3si}zDK;<Usg0lC+OsPe@0vQ~nIc*dcH<eq8Uu^yJ0C9T zUsjST_*uDFLN#iA_^e^5JFiMZ!Xx5gBSSMHJ#j}xAP0@r2-u^uWC^&ph|B7z{=u{v zRrd@Zg47gO=RodxjV5=b+iVXAxO&c~2RTIhP?yjb0-46{2=0!X@ADlUyoL&Fmc242 zuPYq~ioLcD-(yf3Ae*9`Nm|I-T`0JOw3w;EBin`wWJ=sxK%Xe1FI!_Xta3(UuRwca zzx!u6fOi|YHXB8=QW+n;!3zQRI=6Kv&woC44Sx)IY+BRV^R=CDjmjl2Tz-_My5caS zd7+?2Ri(OGN#%x><bJ95*=!Zg7x@Qm|0!vpUzWBvaH^IY-_rngno^%kCf*S>W;mfA z_UV2#9WmI-6v#y3Q!&Oaqar6rKUX3ll`+w1A13e59RAp3IXS2_OL(F`>9mVoS$hQ@ zj7oi1zt46w3oxdc+hjcAwW$siaWz(&?Sl2J?@VrY(%aVmUj&~Sby8n1;VNDGH%qX= zjzJLYx4z2lV`8{}D3q6XMnBO?$d^z``K#%z;N6QE08&27kDlO=-nnGSFz}xE0cJ?v z%HaR_6!qnF4J_<e*rDbC$4>VOnOE(@a?!zyM&qd?mVwkaBgJzs44{c(ClyJmvbJEH z7hsr)1MMzG`Tw}$nVs))oJ+}=xmGStC_BFp-!a=?uV0#^+MTTha~+HE>s~PMOI#^h zl@=Dj7AF5cU`vcAw(q>5Q7`u#rAUj-*y%^AZA#Ws_an)wfUJ>$<2ijsQx|`{TkT%4 zsO1=R%4Xe=xx3+%TIkkIxjd-0Ec>);*4R!_d{S0@a8L~Acb`&AbF;mnHRWsQd7lhA zh2tjcPipV@t?P+nvc{5t_<@^|?%y@FsrmCA;bda@v8e3X8v@TP_+h21j<4q!T6NsY ztU99A#z2x%4hYlUR*M#qY7@~;3944g=A-r-|3?-Z=5Dvmrte^OJBDd=1mNE9Mjajr zIqKqeezfX+LnzKsbjE;5w1NB>>_{j1i2OU^{s+ze09h$(gXf}omVy6M!*ztm@+_79 ztKO+Wi27`owlrnq;4d?_b3v-46Nu!f%PGqt0}DRynH<CS;*IT<ZEM6KPnm6Yf?TG+ zL99x3N+-(>OFi9?`bFjBhSCK0<z#kfbkMl*EzW$GxAAO*t$`ES>hbx~8XD-0AGBUV za$YXz%R%zFnU84#<8}tmJ>_$dIj6pU4?R~pGZsaob}~t+jDP1h)(0zw{g+u=5o556 zrG1v9w^u#HS9uZKBQd2hsRUj=@^HlEI%x7MmPwXG#L&{#4ceXMDw~aK%C~*&H19k+ z@~_xrdu?jPpcfY@nLIb>Buo9auC8LxYjMc+*VCaM0|9HT-eB%3Yv}rJ_Wd!#C7k!@ zl51G5=yk+t#q;Lt4EL;Ag$~@H+2~7UqRTB6AE)4<&>I1o*(r5kfpr`7ktUs0wKw4` zJ@r7I*60)WanreQ3??Sq4DG!?aKfN%_);2KNU6M=F5ek!KwZ5&j2y00%1b)wX9X}A zg|%1dxW}wMIh^?{D&^c|2bbog+|5_oNi($d!_7MX8g&1*Zj!wbg^9a8q{fD|om8)e zS|LyCTa#}r+UA$tFwHI}j^!RmzS^ujI~CM#Z%P^m9LhhAdha5r4fjqA937u%(#;lU zpW9Zs|G()*{Z<+vDdg@?M9|P$n&8LlWXoxD`f@HAr-Yce!lR!LGA2FKXMf_B;zLl; zh{(G9n(^5lrag+@k(z$lzj|1%C&lk1%HdNip;@dCKw3gqb`?~^UK3MC`c5x{HKW~t zDJ6lf8U}Xv;&Pd4>R;^wb4D)N&)s86tnKUD?8^5Vs+b`zG_0pTNl(!!FvY4g5w}0D zpHE`!F3e@h)4VLHxg<^hVR?g#eH34`OI4?b<xhE|DZ*!L=oHUbyzj-_-U3Gm!=JHh zN+CL*idL6((*=humPd~5ZcjU`)W<m0v?jfW>Xe<NpADsidmgyzVDTjU4X@&SOM6dc z?Z1)cjrZB_91MFe62oT3T5>{bUG-lxu}lzi!o(KRG<sIm9n~3HNs2Z6e78TM?h2F< z%Q3eup+2|U$#sw-MB*TKhGsRDCM{@LcRN$+PD5UTq{<Ot%8d9tpE;v}W|9FXb^wl) z1DF!S;Ue9eE5-(6>c*x0%a9$1M}#W>`Fjqbge|Y3jj09C(49hd0TlKcTUdr^*u8qW zRL^MEpn7Vok`9olAY=qkga-b)Ca;L1K>?G6+?xizj-#auZ7U_mLBEE3Y+RvS9py9i z_xz;1S2J3YcG&&5fD7E!UiD_$bGEWd8<nqK-%Cje`z*){ExDrDE>kJ1-Zq0hs=%;R zoo^a{xmg7|x5;#R(+W1gzplnNlcaT37GI<Eg(}k566((Ry(Zh8fmI{2GGPqufCmfD z|G2vUHzU5^<qZGJVdDSy23e#Kv3!aie6t<1l{-32hS#m8>_)u7V88iAp?Dn#+3*Q1 z%q<^ph4wpc%x5M6TP;D4CqB|@t#}cSy+AA}qLFP47zOj0*s}X+B`YK}>h)K+YzSMO zXeAhq$xeG^b^W$n60P%jm&7GC@;o&ml$-JLi&hUS346m(&z)|~kSyP7H}=?}XU3YV zL^#JCqCV;D@_h8W{$$tR*`5=^8y+Cd6GDHUPYkiI?~5ul(n~zN37K!qX@n8=5oO_1 zVOfGS{aW79sf=sAtDa7jY>>Orl>g(eC{*v_*`&;Ws%FfaQ68wG-XQ%2L5<7$-vT}b z`rdffIx;^Y)D88Fyfp8kj+?t0?iSpvg8j0f9&SdtWcTJuJiea^JN>%?X7E2%2`R*x zBfebZR;$X}q53g^N@SYw<d%tjVP9F0h(gu0<#fFoi_wr}@zbfN`A9_`=jpx?GqKmB z9|kp6%$PdXLlNs~%~kDjKmT=(GS>@z;oq~+AQ5oZ=$FU1LY4WDYEVh1YxU4O7v0%} zt7~cZUph#R7;#7Uyw!zkTEt!DU0zDwy4dkp-9ARzFjsrrUQm4`m*}OSM`Gv&q06o0 z%2Uh5=EbY~xVX&AL9LN@YKqfV&Gu}xE)$HVbDU5;Gf7^`i|WN$8h#GbXbW+bSF;fN z<?`4i3%$Mmz)=3UtBjyXi1nA~d65uWc}+R7V?LwYo)l#|SdOX+OmF)56<YJAGiB+T z#KdH!rc_b<-IP4_rDq%k`nB>@y)Km&l2JB-v)}GD$yqWFF6lP)!u#j><MY9fQV%*| zY@rQCGvw&dgx*(I^wxOeACl<R!7zFM8)4Tuk|#@E*9zh*lv(`})1mqe;|8ML;GO<! z|EM+>^%8Y+sglq_Lf$jmBD0N8O-2)yCC&udEUJCqg0uKZi+NwgCl6ci|1_Gu@<ur& zMNdhSUn6rtbC3<*&+i<cGfGJC9r~YpJCqPwD^hq%#anQg?26ihh{WEtFfDb7#(?NR z)pGHd$e$?o#LW~nwY<Y`3crqImh3FE>7m((j`qk)PTAmH-K>teTzwjI(E{Napo_RV zct=yOT%Km5QR$)JQ=|khSLDmIHjf-kMt6=U0HyZwVdjYrlp&ql+5rsfml5x7$2D_| zTm!9K(i=3hD)PYopscSp3!!ta=;5D1s<-oxG288Bl*-3&0c0~D7m7af26<GcxL89c zyy}k2M5$GJkf54PKpXw8@;u8U+QAM~*#DR*8bT)hAMCwnR8#HtFRCvpuLWZT>7oLH z6zM&vi1gmO(tGGF1Vq$O1QZYmy+{|3-a%iQA)ymmDAE#If)GfA0J%|g?|na=Gw!(m z4`-Y`M!vvGp7pG`<}=H0wpTB%#hGacR@g`m8Fepmc!h4i0?Vg2i0Cbva(lzPt9}$Y zdP{q_qzGIs-M{-<{QbO6!mXv9UTAlqo^EyE6u8!|WPNyF7DjkF6OlfkK6{(YvID)C zUW8go3pA!a1d|o}J>uAfNf<VVM#H^F)|P2Ak9mKDpY0s$Mg9~xa>-P=taP5e;7fyA zYW*JU?M3dMTYzVn>5o&ut1dEpP+8^>HgIv!3Ih1^DE2A+ipxpJz_6uQuZObDE%@O) zoG?W8@$5|r6o4C#9Bt^AgDE-9iGzASs#(lby50Y^wHV!fwn^+$!katTFED{F(Keu= zJR{MDA)oQ$<u`;eKJ<`7Rn3%L$Tgw8XFV!C!$nw!N2%<Ae1U(9VC_*vm@)d9l&?M0 zh-(dTIY&bxD9!qt20P}HdTBLP@=OOGiyn=H#>N!@KtrHG<Gez6p5HS!!I53L!+o%$ z$Wjcj+*g<#I`@kw%widf=N982;^!t4k<5!ae>H}Q&PbjQKL>!b_DBsF#=JozB84sD znd9h)U}9$QWQ3E47;~K`)_DDnY;9`p)}=4bnc*k}gop=Z#YwL!qq5I$Aaf>yU@jrz z?fx@-bkzmGTd1j(CzaIV#1`)sdlj|m*-y<z_Hh4=-g6NSw9#^wM^T`=@0U;>6LPLx z%*cQ6BQE$)Adm=ar5L9~bl+HL4|#l!?W4e<-Xljk3`gSUZx^O-pcy1=9H!=9i_=|Y zMrw%g@8zIcR01C@jdN`aw1R@HQR(Az<XY!DarJJX*X*FEY)()rKiJ_#E4P*AI}wZ5 zQ^RsesZrnG{&;V5dnC-g4sUP&=0Nn_q!{tBD}`OL0y(Tqyj#reY?@y9oU!e|;<;N| z4Or$S%)8o|tiDmx;kLGPp_JcS!a2O)a-fL+(O|W}rdY-^>cfc~C&boLWpUe})^)tO zeNOO9IxnT~{^Zl73W(b3lLf_K{>D7%^c9r`KZ(WOAx`~<I&mXh6=*Fa^xN>KWiP&t zq$g-0&~0z!n>}bYFN}t>$e=hvrmjCF&8y$+CL{CNh1hmNTKkom`!swSwc)8>^+~!J zbKvdeYf>Y2HH+N}8`4SX=O&N7`edh-HN&FbrKaaB55kYAp@R|SyCX4<yVsPLzN2A- zacoy=Z$!YnMH0yBA2aCXeBC7X*e2<`SB8H)aj=+uMb&Aa899C(S%fO)^XbXEKU;X2 zQ!{+2ng8BA@Rm@I$2v*|Hxn8I6Lb4NhHNFTKBiV?NU;6FFQ|}sIW;ku`j5{V$4TvX zyv_A~l@d&g{#xR{6$k(8;(`B9r5E#~f!j-PtDimPP6*sQb?=wYxz{BavSmeC52eFi z`g!4-BZu*;0D~9wRI_DZ?r>)ARW%m$tDc78(hGwKBTmO>5B{$&w4oesP&9O|DIR|; zKK)0%4aPS2Zq)BjY|+1pYp7Iyrpfi^!rirqb6X{+_%Be^9<}PGU5xwc@3nNU`9A(b zegHiE&sxq2zv33u6y`tQ8|C`#Zg~G$v`8cBw=?l)V>)Ta8S!tCJb%6<&htB}r1$4b zZo0ouUE!a7Pks0ut<n7Rh_x!eV=e#P&@UqWk5Fi|eE&yJJGr<0h@8{5zu0~spo29C z-BJp@#IXN<^Uxz8g31k3dB=KEIDU_^M>&|ZqQEH!^OPTCN(KADpzJmLSrSyKLmZQ1 z9!g@Mm`&W&{{d~8+nBgGFPgswB`t_8OHf9S%*GQy1!~meokuCyq=4r3oSW|O@6yig z83UzVznM2`R=87kz>qmZQsz$UYq!T(wX8yvgb4J049T?b`N&BNx98FO7|OJScFYdz z;_}m0QBkq};G$<|x`!qi>2agbq}!@ut6EY~()+fvqc4k&umo)b$7*+ZC)F|AOhKIR zRN5`VXpwKpcSEd)G_g*UI8>MF96yp6JCb>^k}^GZ7S{hj29T`vSuvmWP;Y0rG{ei; zG2!ado?`HRl@>*}FnvJ5a!}Kfh}^7j8h7WR^0)hwV<k(igK;|O_s4iG>@;jT_gEe7 zYRMnvQFx}Q1RKg)2B-HX$L(#K9yOz+tu$_Fe{Aau4&TcU2G}gD`GpK|mCtZr78vDY zOzln1B+QVq!dO`csi|j%Icks=>nl?nURewbRh71L^a|0O0?pXfN_TB`i&y!mhysHA zlF&>?5C^`_#1HnQ*_bfT63+(UcZj0TF!2jnFA?EMYBn%qk`YO;wd_a(63{CbVd&ve zJ|EWiNHdUwjqJ19ggSowt*um}xKhFRM!jm0b|P`xQkTkd{ms8#y92@Yh;kTuut{03 zKicHDUk_+Cd+A=QigBA`sq@F*5I^t#+Tx#BT)$Jk%Z}GW9!iFDgS(zl(rS=T%L|YZ zKbJ0%t~(kOcylPsi?QaM2=PTj{wtJ$1>K!mnqnx9sZ^<WGW#|35$klAZo+|HiDCgq z@tDdD()HvzJ3&va_7^M?YOI-VPvgXzFT5AYqu+r`Ao_%p<_?{m46X3>?=Za<Yiik3 z7ZTorlEO6$jl_$j4?4irM<D%mo+*-TLrn>*c4<Os-+P>&3~hJebD$BG2&w2G)rk?y zbj^fWfzn-KDkmX?x8&W?Dv67xeM;JSs=f@)<FDZyg83=37>?!Fq%16sJqY`p6~DJk zA$ne%Ewy!zC-$?FeoVAjX!NVvuX<Prw+B!U)SM1OCs))cVuXn>W<(IygX7i}(;Acv zSRZW~v?irm7LQk4+xf85AwSF?H(uOq|1JAsjhDa^v_c~QXYb-s2g>@~U}9yGc2;At z&h>K&-6wssUic;F+N<9Hs@2=scDZdNjoQ0zH%mp$ByQ}_LF=T=ymsM?5{BF!K(qao z(b!yYbD^U+y%;J``&sp&%qOFP_4GHaj)V<vLLICKthKLCQiZ<N$|7zCSJzo(g)3wx zle@uOx1A*x&)AFWMsjM)ZEAJz)sToCNnSo{CVWcQ)Gj;}yGO=^Og^G}`0-tOR8=1- zMAB`9MPlq34SRtF%GNX}`E|jLKqKbr-5#;fhxbrsX%{}RkEXw^Vnt;Ep9K2VhGNqK zX~bgk7w~H}AIkz+Q#6d4C(W|&Mm7D0vCv%J^1StNorUlg9CKA`;MYmdgGbK=z&Si> z)D|FK0-29%OOt|e#ubk`IU`y|U1XAEHV+#%fbR0m&gupL9f=~`fItNL`fyb(kbChy zgNTPR?c+wmWclnryy_S#UD1l>3Q#7cDXwS63)-`5DeGVTwgbkK-MrR%qnw=XnE_JC zx69)h_{WD}j7bSxn?@*yCq}HG_KhQqoEUtB70uUI=;(Rbs>G@ybTbW7-64I+*=PV! zbD_{AO#qx*M+2WRz$GAioC~d48)SQ|;S=<mmmOY|jbcN%NW2~CzIn2uS;P<w05#?= ze%*~2RK3S?iCNIntwp3ntBcerynEJ3uaIFqB@8f9UZR1J*o^Em)aWZL>VrF*cih#V z)FBDHS4m;1sS{b(T7Bc~SJrc-ut<JrEwa+tSyH0gG@Y5suMQT!v}?7SFzE8s!BHKx z;@j#FU$5OC3x+6wn+ACp7`NvNrlSjW4^6AhJuW22FEH6PG+ay0yfy#E2<g_Nn-D#; zcgb0gprlt@S_v0NFitenR2}SX#PzoUf~V_e5(H_{ANrU!jnZp1z;=zP^G@v3(TE_v zcgxPVmvcZz#jV5FZQuri9%iU&<(Tp;(+*<UzG@6Z-(DtM(N9(tjkFva_p{flX|ffZ zp&xi<`s@rnt7H@Q(6&e>DfKkK0ur=7M3$?3t@1aDJSonWrRS@(C2B;zSi$Ct*c!z- zM5pZ4nXIM+EesS|wDnKyZO~k1b?@Pin-X~}UW6B1&eE}Fa_J)D9+E8s-QyU4Y#8UL zpU?eg4VlK|@Nv@;KPe_);MTolE=8EOi~t^ONsP=-DJ)MHDQRU~b}(Xf-F)Jrii^ir zdIMLVyD6!U-v=xYQYl+sd@K^twwWWlyxe5?^xh77atKZ++wL-N1AZN6A-KGn&mBx^ zczu;0DM+?nEzJ*puO}F^Z}71t<O-@hT{lvpaIHDoIaw)a&T?@#LBQb*aqW4z1z}R* z>%`OcZD!s+=Pc37My4@w7ZY5`RuY%=#$UHcv+JUCUb6NbB>MsiRb_%2hv~!^v+=r8 zO)b?KPU~<GBxxjf^O_#VR5ALEoGVGaz)`rexc5!pfJ8eDElJi;?(Ot==F{r6))Md1 z@g`PJVlV?FC4Ftp#Hti$hWQj%v>WVNG9%(X(qm>8OXADKxC!^@tc#V|^<(|K>zrGi z^<?^s{2Z&DF?X8)J#^-5YWgO6LZ>QwM+)pko^G1IDcv<kxpJ)=@vgUM08&fkMw7K# zSo-<}wmuYvm$A}|jQJrUH~b>=H#bI5bwV-P*A!<;j?-e?5(1A-kr(CnvqE;q<;4K6 zy#De7uMC31K>#Xn*)9sxZ%^ex31p5MSnveC7ZlXih2LvGDnqOWeYGTw3dAIvGzRJ6 zUKFrPi{35&?kX|rxvP+~lt1tKypmqz6Npy5k-(_t2j4LPj+P2irK*1=7sIPoyVg^? zN5G;GI53?zcdc?*+&6hbd9S|daou5MN1_F<!;6XhEap;J7JCsZXP-fqv=H{NzjDfc z@tTxEv{<7hVA=oMU?#Q%Q2gGxFf2o0#<gh#sO4RIJBoga_p6PDpP-Tv-4uj7kBvNr zcgn*%V6;6e_G$(!*<V-I*cA81mEX?AX-&5Yju}_d;0Ei&<hXsSr?HD?fEV=)UG&OE zYl;J9_C?L!xOnwWI^$OQ();V7-BC(e=@tokP2#tt3;fe7$o*~wN>mfNiSyVlr&c{% z$qs8JG&YS1iCJ>+3uf*cOdU*VCO7SP3UDfDR170e`?T_ugPcQm@V=jjsuD>nul+Mb zGs0SBp1P2_Rt{1H$NC}Ui0<pF>-mC%YWxC>(1*1^^}-s%4B~W55RBX>&rd2;oc4S- z1^6I7$PZmxH0577cu;oe>oAp((2ITc5#H3SkXBJK7p4HVEOF;ych(98Gu7CWA8_s6 z(U-|}e3qJM-#o52I_WQ*TL}ufVjWpnUDhxjJVmyIJoF8n3Ugha6-agC47&b$`n7oR zMA)h*rUdY+56QwN;jw8v;&fKb&3QI9WZr`17i|hlXCZNssrnnpoju|7;o8eXLamFj z4xY{qRed`vKM(D(Yk?Jx4~*#LxSs}nRQ6XLp?S`WH3Mn0td<*$;-tupEi4pUJd<QF z$lVc(^5$W5o_acyZ$6mfGNP|we_pKda}{9q371$#7)0j&C_Z`!^?v6e`Jz#X+ngdP zDfx}vhcc1FO9*fKlyi_k3obXTqBB~}O`CSuzAY=N6b8bkZF~aeVKRo$d<e~V@-=(= z`>c`;*xFu}sH+8iC2}}!hw+2ek=VPYjssjmMNU}scXEc?Tvc$w<rs(ysm8Axtk0im zn4np5G}`|L8;Zx}PFlK!i&_NXURUXHl*$#Z3F?%hStLA2#xi4?V#{+dW~-m{S#_Rq zG}y0ZN(^=s7x46p%!w&OU5t)}jd<<LmiS}*xH8hy(Lae)@JF)YDWfFbr`T4*Kwx45 z(jT8z0od*eJ0N|)FlgZoEI!IZgc~hQEM)4|--n#e3t88dH*dYb1V)w5+sb3dlPfPa zJWB2VoXL8_1>05RJ=6%c^5sVhGNNM-H4kZ%$Y(kpt}l@yuavD)qln3bocsu{prU&l zUWFzvJoL)CJ`6Oj9jFU@R46`zijTD64xHkq!1UOT2AiV&=z^e09<PD&y?y*lm>k%$ z6d5c(CaTk!nr<;NPr4n&>1b9bL(Wa1LCv7ml+gYm)}2h`F|D|<{)32J(8fR^gm@)q zKd(ATHUZoB8ixuX69dCn6YE5JHDB@W-bu}(&|U~0u-VOfnJOWc3FwfEw$ad(GVv<k zXxUZR5l4u|9!BnVfCIfcV|}l=eZs@${P+r&8<JZcge~eWN97iw_5Y=KvqCm0iwpDY z^B7UzdawAvqgKySP&nYdpakK46qT3-)D8+vI{K~O9F4?tG09eyYrCrLFP!!sCbgu( z+;5uwjS>idJ+$jGne%#mv}<`0$eJ=58$G05dT$j%)TjmfKI)^to7i+o&_IdT-aas* zs_#>@<g~|LCK%;D#dJm{lOHi(lW*nIpb@dEUa=ahkc<p4vQdfIjF15PKF!KZE)mfy zY|W@AstCz6@2FTBRlC7>S^cFb3Es7MOPOh6ZS}a4=xSQXIV{<?$9dVFL90}}^$<CJ zIO$n}w%>gd>5KzABxanmaE?c9vkHA*j$hR&Wq4_z7sMY_tHakVw&@3p5l`3?T^T4A zHmVMn2A~+t<Rlc}Jgfr;TQ%k%ebdt6KDeMd-D`>&-p6iK9kp3`PP=vMOyhyyj<4|C zp4)dQYAJQ1xq-2~PHpl=cB!~z<BMXu^3!^-^D;vn=DWR4)Be5&OsZBguT%S;LmX?r z7;C!Z8z#4tH_!-6F#+yEl<RA6)MBb)x_Qc2-Y9h6HrC~tpsquto##~Ia<x%?0{v1p zGPiUq$OviwzOZ#zuO{flhi>fpy6?A@%)%1p#9GHvdnF<HX4|iqwdjOUs|{t)1%J8M zx{c*Vs|r$YCnV&g8HZXx)~5T1_T{FxqYF`YUI>sAh;FzgCAVtpMZ^7woFs=txf-6W zH_Q@}9^X2MwYrD|r?a)ryh*GLQ=UTQ&)8HC@$84bpfcRB%(UhOY_@f|E=uHax<#ld z^r|z94zp{~1Z|~_9KQl=Jbll*Pyz^gnR|E5?-*)v%|sr89NAs4&{<8~fuUcN^rtn> zf+l=RZ%Oiu4Y0AK$xm;z6qALxKqGT2zbw^(-YPJs2*Fz=q^L7$aQzoVN?k)iiajlD zyPZ5!5xt?NgW%P1-Zq&;>1(8o-<`6k=ed$EpV#(A`aY~)(3TIVUs$BZ`x6=Zvw-;% z;W<hg@^Ee$umAOcV{a2i;aPiIGPK_GxY*?f<F0SoEuG{e#@!rv%jpm6KVDr}dlPL- z1$%rAj&)b^yPtqjf6YZr%r#%CKKrTGjxB`$0#H=>{PXjFHX=rd9s_J1uD4TA?36AK zif{P@7OaKLK%){sZQB);qkEKnf67Wb9l*`%CjjNKh{-xeBBe+E7>awL<bETCJLK@q z;E$UWDsUw;yJ|GeSs-JU9M7#5FN?o)$J=6yMN)%nAU}RDD<m%QH=1Z+@h_Z)qnPa- z65KU$&?hhE?{2iJb|UwXd#>ff*EOw25s4MSn@~)@T4`(i-aCt?rCp||pFH}L{1$1) zyP)<V+dLYIQxMn7O0`_HW%Hh~g9LqywhfW`#j`)RT>iTk2^AHhBt6Pd&QZ7<1OF64 z`cb|aY^VZ?NW_5)5%#Uia4Zp*E$7i~j$Im%yfpKa4UvTzTZqk7LjXVIjmkiS1soK7 zxath?8#ZvLBOt$Ef3RDsVy^3wDl#qeiD!1ujzZHNRZXLHq%{V5Ed$C$k=qQWjJ?se zI@|)NV2-(F)b|*@_?hRGXMs@W<RrR14px1pwJe|~{AqcEd)NZh__DhxAE>JOrtDo} zf^X=4pQT?lxVSc5MDgG%&p0kT^<@sSVW+6e7Nd}Iz~^4l0r$*jU6+jpLZ5|H?5fs& z0wt>#_qD(PfMWWk*uWHDglN*fb}Gv6pASTXENts<M7ikdvAi-j6dsr_IWT*zn?|xH z6%DHhvOeOJdl!Z3**wgyGHTqA+ZDkj*(ksk$Edwcl9U@Y*>~D|h7)dfzc1M=1=~s6 z01C;17da9dc_(8a&9<t<!Hm7ZHfnM~Y->l8QI2(w@}GyVy?dPG)?%Bfpnnc@t84N( z!@bT=PTh$7>LO<jHcfk}>yOED2}Fk(W&e^2uA)=M&dMLSV1oPK9#85^dvuF08lAIU zhU{{vr)^^bBt7F)FoEA{G4S9SPQ5B99*Mr@=BF<*DJ?5t-cne5wOje8;QGY`AAf_U z34s^&Id~$~CAmtSLay2=n5w4m2$kFrcOBb=)yS_uDWO+F>!?RoE?wanU+u6}GElgX zG;&v!{ht~hP%QK+DFs+MkZvYH#KrSWc6<lPEFm<0KixIo_rGOl8q&K{wY{vBOEiOo zAr)0|@aundn$Nrh@2q^?7gTLiK~3S<{UI$?KAWAW(ijay=2r2^on5af20WWelz?`? z#lcy9ONcbGA3Sj*M}~kItn6@8l1bo&AzHVot=*21{58|x@6S(o;G}v8)_eNN<KmPr z7>>r#Oa2P4#5WIr$XLCHi@0;e#=F-6jP%$|Zwt@B=R)aKyIX2tD}EF@58ka*+qR7k zpPOY|jAoi@<a_H)@8FiZ_Rcv_<C&+M)y^CwD}0q!vid4pxdRYn!mRF~I5*t?K4Zym zCD^Z+Q?D`OH#cb-|1!3`_u#TUys$0j3kXh{iI1+zF8)!2X81jOinldph<N&i{=)6C z#O1ZaoE^*UAz^_8Bk17DPEK8cALzY3Ph#(IJ}YY`*;V}??^YPa;;6}tuTda(!0XK% z`B{2?rYmVZo@b^*I~q0)cr~^ZTX%VK{=ji^Yc^pb^iN#Gm;X2hQm298F6B7Vz)L|a zpukb#oIg7)QllcPKT|DXaP!cbv?$y1Uz+ciP%jiXzC_K`*_R_w#n&HVM@jo0%PcxI z%rZ20cK}p)3$}g>_B)0$S{(f=@Z!GU@P``|b;dva;yLIane~6V%J{!I%%mmh8}hTO z(20iQ;?n=!9z*|4>-*ho>HlX!IG}BhmcC@j__K#tx_`Nf<!yMg8g%sC-I;u}=+#q@ zIjt2l2l1csJX~1}UO!6MxuIE*Zt*2NO_+2PSc}GPCRJx9xM{6%u6S9Ax<{Z7gM1@F zDrv(5JJD_K)ZRDe)q<mDs8w@^WIy@w=ibMuJ>xvE(98-t!DW78leyQfkfoyVob79X zGDeJj4Dl|b{3%Qo8r|iU7-o)6G&5{LdS?)qFx&*sZPbbI8s~9d*ybd*)SxL5T%{u{ z=yqg9vD=?Ra%R5WZ<Liu4)%>9hO`RzB9eVv^^6{70Ag52QE?HrZC9G5W!pRN#j(9G zHW34Rbya*pT=P))<Dnfq>dl|eH#f#g6e7Tc+2k9G2f{@N1{NiYGi3r*^{{6YRb~00 zr^AK_9~f3a!ctw!aOp3X%ADPoi7q`}8iq;VhHnjW_I0nd3`0w?b@53X(wqbcIar9n z;_uxn`Z9r)HQLQPSp@5T^I<0`;5!BRi;yq!8@tXa6cu*y(A3AtJAUFVobM}^oSEOO zyf~DH+P2kJ`GtjqbdlFz^oACC*ZOhEk<eEu1b_B1uHmzvzTCU+!F;^^T@}o7*|Kms zx>pfv*UE#}imf~V@75U!Y{#w<7H)y_7>N}x1w1l7P}4^qu5Up+6@}%k8!07%+GAIB zF)bID;sp%^z3hW9Gh+!>b!R&p52<xxTSHef?t>@V2N=BOUug?IjAn=lM`rRQ2aD75 zD@36}gDGAB>3)ixoY)&gsxBc(-~G%2|01=H%PPQ!0oNW<V6}g??iT}C^fzACYME$l zuw6Tp)6@)oLb}+AjZUwWe6m|p=8QOT@mSqc!z6p%Zz&dYsJ|$?a_#K}^)X(MkvW}C zv%EvzBipo==72OF09=+&hA}ZlZP9=3(Bx3bJ&&zs!$9CPo`S712&@pJM%S)+jat9i z9`scrYa7k^(9}YlTd0k8l2%o6Vg(9nE^s@7P(h|k-CJK;AQKI<?4t_NN*#2qHp5`% z(PFhu;YouwZxXJaAO|r)TSEkT(1qn7#+5TDg$zbt10rjG4c~<v&8Kq3Q+GaC?C(5r zOKXdG2+JDV^ZHoV7p_!73ETJ}JCE9V0@1_+gNGd?jr${wYiIYS^MS337L$`6QxmA- zTVMfV6Qu!U&K5JeRR5&+z%dv7ZnebK&-lx7MwqLT=t8;<?T(a*IEo%Wm>eO;&{WUv zKB^EA(yLdmp=?&b?UfSA6kwNJtErqd?-fTav&aEx`$!t|=`q{LkS@rbb+YeXEs0sz zQ|=38wAi$K=f^Y92CVrgaWAVREToPYnAWdg**AGr7A7#}^LG{4+LTRpl^LouMZ|Hs zd@?>SWI0qiJYYgGB2+7p!{omBX}${ayMvF!(m4P-4s|%)waK?BtV$3H+}Yo=y_()+ z<INP8Uqk&EfN2~esVaqgKV9!d^O@TB>St#;uY|zRc6Fl@GINWFGrL~Ty!6^u>G$ZK zv`3TbQB7)r4C!sf<4WYDL!9{Z%pB8*<+6QfR=>>#tMbg)?I@(&@}(!z3*WV6-EqS+ zK`EWn$e8hqh<Z!!ohh^G&`CwQcF;$zKD>!|X1~g8<&5iEzRD=Kyz7L0O9T14Lv4p$ zvT(Ogb?msG%D`*GrfWr(yCVhL0`xSVbv5D$ltY7weICMsmsvS*PTC`osWViI>jSY` zR(~wWQED2bRX9lNueo-k&!=0-O)oHc*#lFk8mN&%dT9A94Q`YmGR%#>Z&SOxdQNlG zTw;N*=NW{^kehkJe&1Se<dvjPjtjXM<csjSrQwJ4w$@rbx|Mfkwus?nQJwiFkKQ#< z9kf7eY0~RdBaQQE2FQwT_@d9Mo}&=OiLHQOmGyUEt~A)M&*(m{cU1~ha(KRxe$!lF z%=&M;5DbCZ3KUXjQ%p2DkA?^-T1?o9%ad!el2x*v$`t1Ea2qUS2GoJO@Clt!O2s5Z z=sLHiw7HYHTN3uMANZ0?p2XX-E~TzvQlaf7@_nLIf7#T9&$It}VUX&`1+`E}du1=$ zBV;b7o&bI}+uG(*r&PL+DVqc0m?J~brDgdNIXjyNNleTGfMtHf>BnmxK_jYW`BdY2 zHGA2j@vzzby6IOyBoHl>1X-8cwa>^M4m+|pk@!j)txTR-?^}MuZ!fu_Q&4Kz((8#* zDP_jC)gq>cQTvYglqOAGnK8>+ktK;Z_PU`-yDC~bd;ayUx|wC$smL<sdcp^`qDu+% z%QNV1d;4>8^LA<Xk?=>S)>_;o5aMph{sj5`v-j1Nb?cJ-OCqD{5f^sce|Qgbbx!j& zqeVs-W2Fq%`b5FCfZB{<*G<2-^~I#3870D=N^j+or|<0%8Jsei$JxPHx@cgzA^KHO zToSB8qVLVFNT;hH-V;3lapBICHN^R~!HB{xQ;}{T;O2d?X-{;>Ph-tu4F=vyHw7)A zV*0KII)2a?#RBGHa40g_2d4McJ=+14P8sVE*!?1#bBo$Ys2B$ItCsEBNKAt41`zV> z|K7D<^TxTkDP@#8Bi=RB+qdBCXC{cD!t&r+>g%noqv+qoN7moagfXHwK2=!+7xfn& z__KUW$4cf-n>w1;UajZj#_DgVgTZB{6!gjq9|sx7%nrZm{<^j6&pUo~A0Aky3R|xE zmg1%QXIphTbF;(D;UP7xm;F}nVh*d~r8w3}i4ukWdgPpU!P&#uBg^-(0hDLX@+}$| zn)f8cY<<mPIJ9`{lMyg#1$n<)_-#-eE_Bwi=4l<teJna0xHiAC>j6=;Js;hsQU3Cl zujFpgl;@3i_XQH>6j~3RTeght)I51(N!RirlO4lVk{~sN30k*~r^0LP5GGywQ9R4{ zn@-l!<jYfy176i*A<fmXrMLzg&5bbR&Xlju>*|$A<A+1E&0F{Pd>K5M)C$mEOwlci zKBpc0HBBR|$-b&rC$l>CTWmNweK_qgxJN84gC&sKUSE;hc!T8Tdf1zRL~G-*2Rkk5 zUhaMAPG1`GB|8JOvJLsgWi%fNsVBP)_P0Axm2*(sTVh#XteF75lJNBP(}GbGzRhb) z4qEQAtJU}M_cklzrsgN~tYybIaELKt%DEwX|G`KjBPmeJ;+=O3I%_wU+ik+Dj65F~ zZ>@URA68g9jC$IfKP+Ydh-!MhZBGtymGb{AbL;u_V}I!)T(-TwSgn3P^BO)eu8wqN zS3Et|dJb5<9b1Y=(j{GEoz*6Y@AeEJy9Q_c*}F;e9uWs2<{>w<+S&`!c&Lqgy%(3E z_T=VW+c){lzG+jTd+z-17tvq|wTdZYE+zItwYsNF<IL!FUI_J_Ob=buPURn&=xBpY zhTNz~X&q+w<SiL_!Z^hPxo<YsS0xPCi+I*OB|lvE5QcnoD4U}jr%TJWr)KDYRxh@= zS)J+@j!K`PfjJ2|6iBcXa@(+PbT2NA!_qSz6`=DI?EGbDMy|8qN6(KZ<{|8={PAck z>-lHRZuYa&EcNn5Ki`Ow0-w2Afh$XZ*i4(x;?W{8&Zk~#<S(Ia>4d`rqkH8wM^I?D z%H7wiRdg4bizb<|p<Y_T#Om4ViShn$V0p%{xG}#k`r?-ity<5?VF4d;{JkE>9v7&M zR-|XhMJKB|zpwhr_(+FlBL^;!tf&jUT7**ZJpl?U^TzGIJmr|4f}mvLC7IiC%%)?D zwalU&Ne1f|{u~n&H(|TLk)0O=1>g(ozihK5&7H<wSCQ`hfoEI6l^*n`wi9IWX>+QZ zb8*b18MSby>Z9^d($Qf6x{VH7X3ed)=+FM4Y|7KY1_^P|Kpi3cT|B)fW}BVLMeLO- zpd#o*IA7U&i?#eGjV6UNEKNSOvZ+1g^os1aO6K}9&F&*a&9tS^xvc1_wNGqnbCT?M zc=&8vMuKos+bL5yRVl|wN&mh#oNMPzxj*e%mCQ6#vfZrM7`Z=8+n{ySE`bo<x3{pJ zY(>62TG4VM8S|2ILfi&f2Th(ZEwR1j!LSwz{7_VM(oIfe*Vy{ZmFgEJ?bYH%<flb& zsfK}O&Hms#KQyw%A|jl@)UD!7RchtuawlQt0HK*S0qwx13H;<M1oJ5Dqn6er{5wdl zb@kmeMf$884YmI+)dstEZX>pq#*VM!Knt&;Uj5E8;z3!WX>@j0!fF9b*P-&YP!!vk zB`U85F33DCwLu$|DXW}E7_+`n!5S;a$wlyfK(4B#DaaL#FC3NIawYl9`K8~{l~tWl zKa#=U>dt&J%4}4jDU*V;8Q9h5V|ufg;Ul@0anj>=_sebD^4XjDM0>_j|KthGU7X7t zFz+DKVvf?ZZOOJGF&>g#<bSh%aJI|<wC=gymW#$6x=MF@X?y1k2Hk^Zow55V%pl&h z1xlMUhP^`!ahOJ2bzveAk+<j8R;NdwKj8fiP;Xoi6nS;hBx-;8MQUlexiga8!nc^c z)F*pJy&GpH(Wx+^sIKdhu*$Dgj5SV2&hw6FDo<t)DC8vFoK3<$!SqL(h<Qt|LKel> z=NshSbzJW4u7(4+dd>~oSE2juN3NUmtuN_YO=n@&z5_RXz3R>&-r&erF5~9fOqStm zORXEJPol%Pt8p}wmBeAuO*gbr%U|b<I|$I;SexqAh(#Z`-rXAmQ6FSW(lq>2PnW1y zPu6&j%vaH`**%<AUl2!hF?AOONlLZm)ole!ZMXHCURboC<38)(k8z+7chA;s>emoQ z@(Aye#N9}199|B;UP4sxHnnu%%repQv0eFa<yuQuD?S<fk2zKCh$~hW@9zwiMOtlN zA*~I(;3g@ack-#O{8KMgE)B!h8-RHdc1W0`{tx(%6ip?@xfz7qS`4pC%-8yEAG20m z?fK+kd%2ezT66Vm%I(Wa1fc>_%TcT`^JZFY$8rIZIIH2yDJmb7RX!Hls^N71Q+ri| zx*EA!g{n4)jvEoPLRZ4iEgUXq!i6J&U)Rro<5)nD8o%r{lG1{4le||&RjhNFUGkM( z$L1CnTs>HL5(~ts1Um+r)}2AUTvD=2du93}z$}w_reCVKv_P{^S>1HTUO4@!k=AG< zw?w8^NIuvSEivQneVy%n56(MfNkM&6eJc0bD#u7zaHq|F`U<r35nqAJTylhSI}vJ7 z=Kx}~chcAitq6<8MN4BB><URaq{)pUqms-JXI|l5=dq@D%i=w&sacP3o34t75n+&9 z7tSZb?3rh<tFlYz-8<>6pAy|L(PD3gh}wMwNsh2gkKLk>qPYIp@rymgP%(LOt$g}Z zvWBA59WAHL`K8Y4nbHc=K*_R6l*({d-Y6`Y5=+->Va>j8j_TlyPAZ*X+&ZN-3X=yJ z;&QFFcHk$ThW-il${UA(8xoB|DM4E=1w7w?jaeYRLOxzlfe{Z@`knO>ubwliX;9>V zosSK_)#Z{vNoFPWqxa2`klD^k8VMC1X`F~-p$fn=Nx);lGyX)%ahTzr1}2#?vqBu; zZ$v)*VtJ@SO<3Lo=3Kv9sGIEZF!V8=KiRPmHeB5w_OI36(NqkW)ZT`(7*R_ApSm2Q zqg`3B#VGT%0VK&l;Q1A1n(`kn+Jg6PH*@9u)ljg_uqd2BotD^eg__%M_NyX_Eq)K@ z<DIa#G}7pjfQ(%Je32g(_w2Q8?7fG=w4cO&Dc}D>QU5aqu$goTdk#M#KM$Js%HGfZ zFc?L?e>C)HfYNy33iaCOK<X^)Ge5^&%+dauj3H@shcH5IF0PCr-~82w92;dDLhUmJ zfCsbR@n%{0)uAcW+@1Q{Z>hKc<G0YjU`l_+uNK<WYYqL%m_q7Ijp>iJNANVOv$OjR z(|kbkH_Mi0?Ko)w<iN0zbkC}hbX4ty{R_?l-9MOV_Qy|$>bg@4HNNfN`n9mPO?=?F zVNff30x_i(EjKU=sK-Oz$}GrUGb^PW$pa%Lrad%;d*(Ac2m0m?Tc)XHA)kGz7z-WM z`F(wda4B<c|IUFG6sK&r(egz!1Od&2d~b?fc!n64_sErkvnYMDp-y0V&K&mZ2?wY% zAY_>n0;4A9+fvXYg>zPcB8MWTa-w$#6Rxw=jy|!}*+BvR+as7QQpc9w3iT<+Y2gQ= z)B=dKEM(qJ#@bLOAYaDp+Q3Q6;3nWr*y7zS<|(Mvu;$NVlLpIUf~2DyFslwj*en<t z+AEl#hKGD_J8C1Hr0!;3sgL^b?kD2+oT#HoB!IA<ul#M7<v71rg%RFfW?R4_D_d6` zes<RSv)J^GEnB;w#jCX+grz_lEQi~VN&<DIo)k*@&qnd(49813Y{3HCxere?9?Wb+ zLz{M3H}SO8o>DAI5$$P*_>Ot-Bw+wXFp>UAzK8!J-@(;IQ*zE$;^%u?xb-h<If>sz zC?nf%Y-2mRP5}=&2s`7W`02pUb9z)<xq<%o>;5!=toWPyKDUoj0uKcIe^%@MS(A#a z0pg`D5+sjwi72fU`M^tFQu3kH8b1$<w@58&K!aMH9Bvz{(79=oMY$1pR1>`Wb4w@6 z|N2E_swknh;G+Khx$&4g{x?~c`ipPo@BV!Q>J3k%-#aGE9Rh?p^yOPp!1lNPpPj`d znz%`OHc$`95q?Gn@B_j8S>u?Uj`v=7seGf*=-@<bJmtdt43rsIY~7GbvFP}Iu)N9o zPfxV0NBHrL8mV>H2@>sBT6R4fO@fJES_AxZ*xmzL_f#51yxExEB0W=j=C@s2BH9fY z+_vJH)Fhn0RT5}@f55|qksEx5Qkmtw1t$YQcvEU3#iEG+kEgQi`SS`x#gnEV1ih6H z4Rqw~mP+%1TS!+#?OVXA7?W1Y^i^+46QJ%3ISw&1R01#w(su)VdwuiILE7s9y*hO` zMi$bHn{1vTY#e&5&(b#DUdwS{ZxOf>5VSH&9vF_%vL11l<c2NYze7kzqU~JTl3In{ zVTx>LpD-9vE(r8hz*mF5o0>ldI#tux{8MGwH_lbwE(-Ez2VNL>Aq3kLa@txInN!bt z$-C1}e@|pma;AlhSD*wNLI(Li=v%d0>X{;#3j}XnfEWX4Ki59_7qd~%YSfSk_WNBf zB2!m*!^1{K`KQT&GQdP8IH2|DVgK?wC))?YJ<pUe9lnJ9w3ih*;Un3q7>BCCdO_F# z@IGi#_{b)e2Gn|ABrvS|@svFXx_93GPL|2ONs_|0k6>W`%TTP?j4u!YOcCK=E1Isc zNzV}BnxJXm`OUd01ITJ27#7f>wq%$Ug0^L2@7t2W>&o8;3|rQjyt0jz%Rg{JA-)7V z{kUUUYbT9(b+56lx#dI*L#RfpU%JJ6yeDfqAko^p;GZYKHBH~bhB+QDdL?_k$|$!& zRlW#u7!(Xd;32%DD37fA2Qhb9)mCMCp-W73^fOmQZi*<ZA*;Y#%tiRxGv3OVdUTEU zMhH0t?`E?tv-iTT?7fxL23i<^5`wo^@)`YHZ3i-F`ubHu`8)H1x@g2Ej#kzlC`$G8 zmhtxat+)k@_CGPtmIUBDyuxD`4i^T_2QsY#i)bt!xaw(r3s&VPn-1mc)Z@E|DEns* zQ327C%!`MfyAD`y`~A0C@v=6n>h}O$WX0RdcUZUvT@9C{=A7$(_B8vc2nPDJFgp8O zL=KB}t$(@(ihAx^)*<KaP&`|dY<;7t(qSoj!z*tn*>krF$OCx4E*~gYQXxE2Ytd|3 zW0ckLe%*0Hp;`A0ptcn5qY?U!X7%2TPxe?q+oLjEH2?0afHegvpS~M*hBoJK4evxh zh1?W6CzCLr<CndoE$@yW4tVC)#7)*#N<`h}Dgi9s(ehSX(^@YRiSn5~&`#~1{SiVt zoOfe@R`FxN975f~`B{+rhOG8#S>}>#Iowpg(gY&un>`&cnaxrp>JAWf;#DKCPr5IC zsUvp{ySA(}m9BC$nzX!U*0+hHs{`I$uWh&_N6=Zdw2Qq`Kd|v~$6Kp!Z)u6aZEX2( z`wpGb!H?uY89~$Nn8dVYq?LqBx>{YwiE_r@a(5R-)h65C+es5NTOw;xutHV@sU`tg zS-dA!+4%Y@L*SljjTO9B^p>v65Yd^kGQ?@V7c(9)RR!1**0)Hr{QjUAYtf#0arnA( zR+isNK>M14ymgZ*y&hA=KL%+AbDR-$#L4w=))c7z?HG5B-5hz_<XJZTes88x*K5*Y z5l@Cc_7Bh!-ZK5O{h&iMN~k+&yfhtMFW)Tl@u~0EupQZf@!TQi<bVRh#)=3j?X)J> zbTb~g)E)ZaN_)E0B*BK2#g9ZOl`@S?RUKDtEk#UO*Q*PM`npCAhn|=_TFs6k67e&k z5<p3p`<gTNa{~&!Z><8CmNl=Y6;#$GF(?w9XFtkcKT*#8Z<Qu$84@JRn-!L9rb>|_ zuwa($7xZ=*sd{0g<GF45{I;Scg|typY4yU$4Y9A?&>#Dc!P6Fpp!s`z<eP$lX*+|S zv{C4f0wkm4GKEJgF(2@eJO(HEVjnrv=!0QP38rs5Bi7#5PRNyt-VJgm)<U8?C%S5) z+xi}vI(u)V1SumkXS_nPpIylvR(1*G*eo4$G5@mmmS%Otrj0&E&RX_uy0jDw^I)q$ zHYPbE?w{_;ccL-1hoVK3S2^ljS=(1^diG6AMP%m^2R=^N50O`?6j^!24Aav$t=MkJ z)(CbChG{H(?o+VeRmug}lSE^j{u;ToWP8y;2a~BrozC~05^}H}t*+%wFEa<%JsWH_ zwK34b;dAQYQ7=DF<Lz`;aMjQ#X7RMk+&%MySI~cI1NJX)o434%(kFkKsR9sFEhX0; ztX}c+bZcsQ!7kuH{;u)Y<?(gQ14wc}o>KM$VxSZt()ojDc^yjO*)DlS9idiSS_|De zsBG1UdBds)D8oF|rS-Co%eZx$eVjTgLJ`WMEK$XxY#%4dRwU2Z7dAC|-P7LiOVz8- zKjNB_59+PWEGI!jJtjEsc+-`E=;ce+i&f~-+J?6i1E^C^{BmCHzS&)_PU1!fv!&-b zv;sQtLHtV!1UydC>7=>Vu}Rs#AVLU<+b?x`w9n!Fu2oNFyP`m9u9xknI^5%IZWK*q z$U~Gq@x_%_oL^J`umM}r%Fizjn98@bH@v()22qAs66e3sbh(V6d<om<EHO}FqSwtm z&`g80_SDCiNBy62FdRfBkkn=lKJ!}rW;iSJoRo#MU>8jp1LWu}?7OeH_7^^!n8kT; ziSmLmMqf)$6z#G}vsy_@s4dz-(qbM|d5Yu)=#^nSRs=4H)D|0#ys^+ulOme!$d=+B ztYa0M8Z(!sUR2YoFeTT2`3L{r6bawYnQ&`udnM6POzBW@G@R3=)8uLqh;a@cDlj+X zV5N>gd|vu*n{@jSt4a>sK3H6Sb+97y1pnwTo_OaK0U5VUwa1{U4BlM}!kU)%z(z4u zJiha30_=8+U~_dDNRiP}Mw6!8_XoFH=oYT8mAvx#SYj1es-mqh*en}xg=sUcWGt8X z)-wCYc>-DXu~W*czfTl=k&cqQC1mW&lf{1BlpT54N`tu@#KeFNhkXz5CWYnJ<lP)l z$!EDY2TCp&Xaq)gRuX03rr@mW=sS9&SW#g?J-RX&j4khuYg(}$){UvyJqPVKw3}zY zz1ugX;G0<#Mq66@wfAMkYkQ5c-1GzIPtK2<Xtr~f_pU~Wd`V+}AB8)2#x80M@;Cie zwn(-$6aFRMyN!LT3Ma}>{yqmAB7}R7glWr@RBnP9!}VH(GlP?Sanp$*?j5Hv_i9u2 z0`_4`b&cyaE32!1;Qr4VfmRhNRwh)}Wc>Pnn1!EFQ+Hs6S_2ndmsH;(EBbfT&pY(z zlfE<YOP}0!oQ0=rmbJEDJ^2~_pN61$8P&gNy@q#Jowy0JD%M;2KD2ARv)wwEd`S0~ z18>_mWT610a*<xHIE*>+Kb)ZdwMF@J+}(c~j?`axlpos}Z;>Rb>r4Gd|9|ek0l#4N zck|g$zy-<oyMn!$L0(x_8FVM=Z~VtIVs9Sl<gQ2`Nliu{efe-m!H?FG&l@xtY_l&* z_jyw-ws6he#Uo)WpA0Lr6DP>Wew}x9{2n(bgfn1$(X0B$MmTs2|45FPJ&2It<&eM* zIShALCSIX-pkfK#g1imL5BaJikcgBIz0oa7cD-MClU0*C)7P^n;Z&StdLUqtblPWp zZT<Xei>@a7aJd5eEz**_hOl60VzcBo*mZx|A91r;8^tG2G(0{&@$Txvlpkf6a_55N z?N^1s_2A4_cJ~?bP5;MoI~(ESc9L2WR+Mkym#BgCdbNf(Z3mksa(2R2__Qbc?gw$o zOcLU-o@bVG2j00AKN_g_%T>@iDnt3OYJCXTO4&hWbr2V5RZe{4JN6$MIjB~5ecQI7 zI!YR<Bvd(mm#veox9`Wv=7V%uswJs%@@SSU6xZWM9SekjaT1nkF_nEOTI#uN#qfh7 zfQS~9I%UaI7{tByZeS;TK$Pmdq@VuHrx+1}t2$<HWb;a+!t+h1X)eN#qOaf2!Vid2 zKY}bE4j+-9*V0N6`FlTDyTW>5&J|M$=}2}Gl-U0n@tLJ5BaWFo*PKzW6$sQT1_GxN z-AgYTi8Xa@jU8CAUGgrq?+D&|Dhya#d7nCgs`*L-pS1K9bgO78A*5_X{%uh?;923P zT4R%c2D{~of@bq+WS#T=_{3*70@zuN$fPM&L#-J{2j0Ei+xNsSdGw^3zhDCNYv)-W zKOPP%A5a{%exyYGhpqTj%W1;c#lzl58?zi}niJ)mzn@MXrbL~Ya~r$3vpP_efCOdj zDOH`9y00$SoHe~US@0^%+1E4cALP;s=Tf4Da}rvi&nf(p+S*}>2&c<?;0L50AyQt% zvquO%+F%fyzl~cYx7PY(hj@zthN_rt==*fpM^B*7tmBLOw)>=;Dql?n#6&C)Nk$EO z$!U);bis0^bEiY3qrE~5*W=BK=-5!SL*I7H-|G$WVRNXqx_&fU5y9;e_?9$%WEgF6 zskP7HgDODzgm<G&UQ-EoBh@On3g(0YPBg&&UrzQic8R}|HX%!g8#ZSsWvVXFOLrL@ zOk4|Q)Aaf49Wv~|^>$g%4SW{&r37U?Lmmqz;j~-TF3I*@S(!cE>z?C;OK^T}=Tw8+ z@vI3h^FCVqlWRxHHG&E@qwK1*se-T(sAy7~kxWfrlb2@fnnGeMdC<Mu{JaC(Mwoh{ zMJ5eA1-wXH%M5WOyq&AMEYZIv(2>&x7yQ7O<S?q5O1o)(`o#3j-zOzlIL@i%U?(6k zR3|-l?$r+|!fV?Q^2XmGQE8`4AM@G1fo(PbcZSZ|BBdf@S%e{7!JOo5g{M=(dc}N~ zP8xWOJe^i7>Df(wT5(!6AuG-$?h2|OJhOgMomHrZKkq_t#$-B;6krv;xwC!R`gGiy zLK0VBIzM945A%iXs}Ecr+#}*Q(N-V2L%1bz#epw_&3cVbYydu?U?e-}dimrDiSxgq z4yr?1xWH@L!!DM^MY!<~DlS9m4gt+=Uc3pJY}NdWD}ADruot_I3=IAYb_Qc&%um-1 zwPk;ODJB1I(RTOF13$J?m$`0B5qD)DALSWjRR;D{`I2&l{W3aRvh8jaePj6=xRPya ziCHQFp0YD1j+*w@i2#TXxO(>;HdDY*965)~%N>F+P3e#=2f`O~3NK2jUQ3g+1)um_ z`}o+O<O7Oql8V|>xjIh)gP&6E3sBajC1QiLpl)Zz^405_y2iR``Cxh}Kl;*Gt(!t7 zla6xuS#n-Nqg46*Q`M7UNZGs2WZCb2)624VN?Uk8bgzqhlDmA$nv*}MUvK|n7JIJ` zCHk>ENzCKol57o&lX-H;P1HX+khkaEE~XMw#TqhcA=&et#-#gEajAL&atPD&UjE)8 zvD`${8}_b`V;*IQ-}4N4O_;t4s039|VI=xv+A_x@34jC_9L@Ki_Q9LERij!5%!pU5 znmC+52S0ejl86lV5u4jlBVOZ<B5OUeA2d3U`fkfR`(e-km1%x6YyyHE%I)HoWAVKv zmHTw%!8s{K){SyeW4VAULA7AEb8_`tY$I+mpCxT`Sii1YCZ@6W(@G5&)!kIc<4Trs zNt1#^%vhdQ6qC0mb&%g~G9+Xb8r3wKMt8}k&=lKgES=dMdUl%If_Hxf*~kj&cc`j{ zh<n>L3n6Vc;66dg3zz+O&z<nV{RTmvWx=d2$L}$oHJVkp(mbg<A-SRl{PtIRg_t?B z60one;{C^;=*w^E{R{mG5qGEdQhRie4LVr4(r`iIn~IOVDbUYcmVDwH%YUFmAs2h= zH!>$_G1u9r=k@zZ2(z9x$x%>_{092l$rIyLxlD!S{>Km_&zC>$ecTgSl%$QGGYgrp zI@R!5P@eY0xA_0CE@E%Lv<;!5^m-mFB9jj#Du=UXdLx{nz2_6tSJr`9J?&@3<qVZE z{_ObBsI1j2Gny0B7W>D*-#u99Hpb{hJy1X*dH~qKuqiN_x1A#)&*RTEFuNHy4W^hh z`iI%ZhRX(O=jwUk{&BdVjCfG%CajfHegnf1vJfN_A9!H4&&)j>5Swua)<YBHpvIz8 zPch2Il$|``f%=1Z*dA?}aXf0@4N;%6A-a=3v_Lk)r!VggRs$><=4I=MhK)I9)Bu7_ zs2I3YJBT{umtg9du;*v}J!y4|I=*b@p$dk<BiA;QekilsQ_^#OA=1Z@y@2kof8XLQ z75z1nQjX)1w%_<Su9KC}19fIH@^Q@KfZ2eyM6lOn%Qv-9nOv~VBcDXukduWfm=Q%+ z=tYX;0#?i~>jo9EWBGkV2(Uo$y<nN;wO@*u5q+$PS>Y_qs&nnE;Y!Mwg!}Y1Dkz{7 z(w_*pGE#pIfxJ!94de?I$k?s9O1|W`2}VKnWenuXfAkZCB#SpK-4{*S?y{7Gys~!7 zL=x&p9QJjjjAsJ&Ph#vBFMKQtjF=LJ1JyTOmwKf~+d85;rP$*erxfK&k}T`%LW(|u z8V&OEI`hxU#Hz_=(ApjOMg{NB#8!+_kxTY}>sK7KJ0orcE1$>4H<hT2k$j9u5)bM8 zdo(`osBSjVVVJlYa@ont8kVmy^TM&kej~omI@I<_R1Z_UrAVOYlVUcQ?pwqm4{b?I zG)<pgz4#=T=!6pQ#cQB0S&5i^!UwFXo&(*(aowxs_O*gmw%i91Yz39zt2ZR>vxWq> zvy1u~_)<IZ;^Cjt38SrFWt(i+s`eUxTB7E^jQ|HKSg~*7v$tA*AO@o9%(&s6jf&83 zlyj0)=X^}wyzHUf-*>po^V0w}z;}^qh1PKU>e-NUQVSdjZPWL~fzD=#$a{*y1nm}+ z_z78vlT5u%m^hohf1awI8~}$NK52$**ZAajaW}TP3pOcqt9d`kIC?s(OJ4?nTYF;q z?t^=^3tN@k6WSA>BYz8!Ex7rSK>f{Eggx4Co>l~J47h8X>Le?4sb2|C_?p1;)|l5k zKSm?o1lp9+_t96FAqGj%6_YIyw!A`y;kOd@%6G2USHkZ58pPXd>Szy`oyAUaJ^_jq ziJx7b8&gbZB#TA2?Au>??f%u^>eY2*W8hu!hV+36xMYzJ8)gWX3U!Seq8=FQ-#R)- zIF4F=>&V(c6on0hYy?*r|MXppE*W_VL^X0k6IjDObeg6$9N4;7n~1AnZr!AtG-G7T z;3iy~7=s6|baYB`cz#;QT%OSTD_uPE);`{Y4IuX&%)HXtnci?#T#}lPIrd0JDtPwC z_ra=ncQ5c}aYImkeF}anu2ctt+6wY#L?yk;0dvT<Yc%rzRCnd^P_FIYIo@(gHEmM1 ziDT;&LI`7~Oxdy&p+d42$(nr(opYiPS;tsI)+`6fZaRl(j$tZWi!EX@F=LD{4BmSd zj&nZe_r9O^_xrqm{QjM1p69ur`@Zh`zOL{0dtLX>bI6HVUOKORAOJ?QwLK&ENI9ts zSO~_|@-6Q7FeIl@s|~X?9_PUeJA)Ea5BfB0bIW<+E@U`p7E571aVd6i8Q}{xx5s$~ zBz`^JjWm8Qg1HuPqQV^|s*&3#A@@$=qGm;CfL_Vh!^bRO)*9}E&h0SCC>H{<xulwx z=eh0%cFSz}bY+<bwiXbm*h)2ABl|Mwq)uk=$i8^>`6Q*3#|b+3p+-R`hL7xho#HZn zRjK!robaKP2K^o9wiU~2i3G{}6ZFeJUyu{kTQJKz-Rpd_^R|MiZKEvEaf-P2rd+R= z8O<SEd61PpDIEANN7&ndw|nP1yjF0bkQ<-UQL)}5@er`V`FZdug(Q$3)6Xa74<aIr z2=gRym{^cYY<%L8)Svx8y)aSk5;Biv2#90HPKl!pXJ?91o<|!+R|z2}oY3MUSMKRs zp}xt9!-s}G>C0ih5bUzzd2Y@D(K&oW#Qj4K?F(~PrQ;b+2c1<ybhK6$7a9#s3Ia&k z4klTV3R!}aE%Qg2K?it7EH?9FYTNNl?-XhwPA~eY(YAiCkE#r@hrZuCsg}(|UFHe< zz(H3zG~2(4Fn@Mj#jTC1aWb+%zN_t~eP_Mk73m7cXxTj8dX`5W$I;+yjQf3WuPCgo zQZhVXivFgS=2X;J7nQk8?99lvSTL)3f(Crv6UdsNj|@o5l#}HwWo*WzNREuhHTnp* znCMNYdG>f!P{5fjF-@Tzk+xN`6!e$!>0Hc($$RwEcO6$1Lfxp3-EBiwOD(B0c_%=T zBRlTw{udm{s|NNa7kbChSkwa1jOakr$YUdZkx7?DQEV0S<q={7s@Q_3W;^IJ{g6=7 ziG+P79kf%G9>0#G6-QGo;SST5vZIaW(v^`w<~cq4La+jZHXXQd{Tggvecw)+K)U<V z=eH5e&z`uex6@iYCi{0EiL4*zqBL!i^w{C;dzMNU9CE~}{2NH`mOu72LA-T)kVJTZ zO$1%1<~T^s+jTTP(D<;TZ|e?EEkv|0*cX$=EFg%i&@aMEk7Nucx{2B!GCqE4^t07a zcgc$eT^(Y5%(uR{_qB=L*QA(tRhrYwnnCZ!=)aX|7vIkO+}Lz!PoOo!G}r2-S}184 zA)=8_{J9cK4%ApGT@~61a_T`k4x3VCZ>qL|NAt;wXWLt^<_7FmlT{nzo0|8T?YSp_ zY*?#M$ERz6gfW+2j!0S$zw}Rayo%Gdqf(P*KjfLjMaEUX&mKd#`|Rbv?jnSaEb0=B zZ*^@$J<05{3-8s&>@?hOEA3Nts-wz&Ng&yJHhYHJxV%{DKsmH^@6CZIkSI(5`H3th zfJK<5p_((`I~3wH|FM|ac1tNXHgd;siW>r{R4`w{Y|7PXdfqA6U^3e4)2C2Ah7^a) z4UQ-IH#&NJA~~oUOz%;l-+3c|%9p2&<@RoYB<|W%v+dUVLF5aRY4zbm>QtTVPU|+_ zI?PmE`n;m|T$5{-Icw)mN%xBGuD%2<EOqm+D+%11a5EcfG+7b%;7hlO(Xu`M&4u3# z!&Q58z0R!7w&y`cp}xHD_y$Y5`BbKZ6c`V!y_DY;mM(+RBbKh+m&@N0y-O-Tue`4H zfP(t=0m>AKE^{BVi*TAZzpqWt)*{0&%cLv61i#3?i1;EjZkLa>>`1&hM1+y7I#t2c z@crSBU7iy~-(FTG7Ztg=y*i9Fi!g5t5>xQ=ZM@%KJH5RDc2WMW6YQ1X=%|v$l)b{M ze!-Q}HuzJKoU#$CvXk?tvdNFai|#elL<RTqc@5mg>FrmlDcozbQ%X0^-^Iq9cZYz# z_4R0cZb!8&+Z8A>zuM!N_Uan6=;Zmrw*hJL=Jcwv9&h{`n6B$DfoCc#CqL8fHEn5f zq^&-q)<e47A|jUV+4Fb%DESuc{B^SBtbv+lqQ>31`~BBTZec$tDrb?ZDoHx7%2(!2 zoBUW5NHWg~uJ*Nks%l%_*e`7cDhB#?as&ay%OTF0=mR!r<DtF5#~FvdYKOdmv*yK< zK)532<;r`lH7je0_Ak_@;{oDBfZezu+#a=xm#Qsxf`;?c_{9n>wqMcDco^VS{w-dz z9yOLN8sOI6mU1!VySmm>Q&U*Qt}5Nqj~A}X5s)D{ZND13l2pmJBl&s<3-gppiz?{F zqt~kJ$nVL~YqC<yI0{muwXEo#)Pak{XzM-Y5W%9iF`5xefuao;23GoT)PlmP%<1C7 zr@>#I-9R92wlyUae>^|gnvzbWq3Ld&9U0-+`P9Zs<F}+2z-pOsbHfFJ<$KY($Bv{E z5xlX>#-UxP8-R!evtJ<Z3ih01+$m>EV$qqlqrJ~cAa{?^$b)mGFKL-)3vX0UA&Jh~ zL7!`RlOj9Y!uCKe#_McHBySgYaY#^{FcbRWmRn+o1H!38+O0J$LDI}M;As~US74M6 ziU7Ph7gRl}s_MS8L%dx+ykw$Oy1rGU2Op9BTdvdnh&|P!y@+G4*L<O^kLCg*%yKAi zoli2YjAmotA~qdg4RjY0Tn`4o?dIy<Pu#Mw51ZIw(p|eCk#A;?R_ainTDX_o-HfbS zt@;T}WhQqpjZ7wJX0(39Zd{Wbng?z)(Gr{CkNo}sYat<=^*iEo|5$l!`xBD2#8?tJ z_-@DC%=y|dV}zQRy?(%r>nAVI|5~>jK|Yl?+suIGtz6zMU>@#<e2FqZeih%5^d|8} zYxHZPSW9l#l@wmQ+%2fIim{$ZNo~96awAQ=zwW0889ls{gYNu_s}8z5Lv9FYcJm$7 z6_>V<zaez(`(5=O&|Rg0N+wl`wm({UrJ;+7pA%$~P7eHX%3I7-4(IyN*`==5IY@@| z;kJ^(&2W(TU&b9j^(Z1?S&Lkrzil#tAea?dpvoAW>Pc3?g{xv-&i)=;8&sC3Y*=qy zh8dw{FWL+rInG=}FVXeT0pC?qkYsu#gb!MH@w2C!txBeMmxSKEZ;b0T29Hvds3x(P zing<g-(2c{n3!Juif^yDoW=G+^6QLH6(iqcJ5h=sD<JemNefks+S^wj=gt$~gq)e) zy>cl;85a(JYKpYr&#<VPQjtGhZWHowTIBqgetdy_?4@QhIq1RM)u1yIj{E{2up;)1 z#=^Y(n!)ad$C+uaY51wU2mYN~!K(A%7<bi?#FC)W{qOlk80{VWhj87HhiuHCBgU2h zywf7&QJYJGUyJ*#B|2^n)5vugHv^j=3(f_;s|~)B*)fT1m~tn7UD(4{X=K!Gj1lYf zk310{bJX;~(7DGMA}y)!&3zK}<&!j%#dc|7H0ApwSWa4LzH3#rbG=|^5PHE1v8$oK z`uN~J{_LfE3w6w-V==5HgJSi*cFVb><DD_p!p2a75T1S-ad{M~P#7CyCaLr>2U2H{ zrfJe+nouqKQ?=RtB(M9`2b~)*scIpI8!#Hl#<)rG70E~^X;?=Zc3bR{+vDqADynI_ z)E*4yttHrilxX(=?gZt43;^da7w2KQbH(lFez1tPsv5ty%}1!Etk(Y7#n(%Zwita( z=tbm@_LMgFJ;WUV6L`b)IUZM}Mt<4J**L<jyh|!2dU{jK=x3-mm3UZ)&NNCxE{Z46 zjX_LZX?6++b7t$Gy(r!&M|jb0|Aiej{f~OoZ1{qure}>NEEhY4)av?d^N$Rx6Ze5? zF3NJ7JSbqIth{crHD@Q~wt<t1tkJ)rZvoM)(?j44@^o>~xBn%gLHC(iL^Bf*EP<6Z zh4s8|xyJK9Lk$K_Kh-$L`byHPXp9Dbq$)?5#Un}ICyou~;Q9w24ac4iA`DGuUZ+M_ zEx=!jUVvyVk9<{3Z`Y(YiPcD8hlNZi!*$Cufpx6%yPHvZ?|?paSmgaC9ok{{^X_es zw@&+GAw~ZXb6|df!lL8=WCyfD;GX^5hH~-umYKb!8~8hZrU=lf(||q#e2X?G90B=? zvLX9|KcUjy(K<~eKX84P(E_Ap&C7vxpvZHWRV>GM0lSx&^0TG%MydHzE7A3aV=NGJ zMeHP6UlY7mg8N!HHqAQYx4IaL`GA_oA>3q>2T}=Vvq%sD{{j9yTl<ws=<x75TJvp2 z{g##KFUrNDcOB6>i|RmG#v{w|!8a41^cQ?%C}(s7K)!f*9&L09Z0&emA3D=IWUIWg z-;((>c1dbl2+#Cmiz82QxttcbGEPF0uDtn+*~%owJ3U;|%4&i)KX@sKR=(p3`j{fH z=1`eY-c4=!dtD#6?ca!`{$olDL&E<wS3_779s>`r1<huu3f(P~);@KX|HC81+WkOQ zh^NAkO`+~M(gSTu*)b=7=av~bez6i9P158;`sN+0lP$xzuBQG36emEZFDqX78~xI6 zfv7_FXMFLDykHQt3`S&Ogu%VfCpWtHPrOi6w48)LGi(rToGEl<O&V(}!>&bb4X{eK z@a_*=`-AIYp3HDWXRrs&^DNg7XF7`IdDzFM$9DG;3k&=-1V&`^CNLCWZsMs3g&NR; zumtYNS!7`gvd&@@8>Hs1%_@^G8&9%iR#|73v^<&dAU5SmUx$FR2o6H!2raQsw)@rE zsD~*>pY1md%R(f^5fntTSc1%vNbXln;$h+BenfzU`xcsRX8|4s#DDVe$3oz!7EDYQ zyF57vb6Mg}p95Lgh2S1rqkV56SOvI%Kis*T^(WTR9$|ofT^CIL5y*>=`Lm3W@f20p z0g$&haV%@y_;8NM?=QcyiA|j2WKAVv1XIas=ypy+IlyjUCaiWJ?G9U(_}zaOo&`<a zM8C#br4Txx$_+kQ2qo6{(z&8DXDPbL5Yu3$uYKH^_Kt61bntG_Mflu=%y^d$EQq>t zeY^|%VF}A1L8wD@^e{Kpy*}J~IUyp00Yb#&zX=iV`c#k0*DN%=gAU_-7Cw^3w}KJ& z4F7BR=9<xxoAUPT^BCd8G#alTLp=~Bt75v^<Z%q-WV7s-D|Ga6fGZQ*95WG{!>r^J zVu<6RE4<X@eiimgxlS+-u+7qlWtQW_Lei^Ds=glzjSfy=0O>CBMCetP!j^{=v9SyS zCq87+ZdQ90tb&uL-<P0smkHBGK;yMxo9m(#ph!I-ukE{f*6W9QORwR|@hRa!!C)zr zGw7QQO{JO^7J^W0CcIU8@S*9zu;lOzIJs!k$FObj%|f0D`UWgyxt@vk6&M-Ir6~OT z{bso_ai{(SBLZJNKmD2I*9hbIzczi*-_CeZHr&nD)2{R9nZg`62N)dBCaH3b3btVQ z_th}l-#3jLSSwl9khNinT^vY=wXM2S{j1o|_z!Rx_HwYv)Hqw#`at|W)4#bZ{slLG zOSfU+*ZO7l!nD3J*D2zeV>Q}A=r1cNPur&kDS`9oT65)RL7(68l|S*6&ubb=MI`^J zQ7jp>$<Xh3wzATX=H)-|XdoII-61OmO>LvTTC}7zt(6R<awPcN?pxPEuO4qaLrJNy z5~{(&;2MnNuNlx3zCSkz6iYFf)bNHIXRSpqiT(Am`V%6do0!u<#9P@zq(Ql_VYccR z^uW5v+?~aGTA%sCj2fNd8^eDh5gdw#8Fv7nxk(|BnFc7wh@tY(!<D{F%AAW56hN<w z(_SDY0X%BGb2y&<WJ9-%o#x6z#wT8%v|hnKPa`C#n`h@;dYAkMyN3MM)@hM_rqG5! zV}L7R-qg(h`<@BPJ+S5okDBrQ6M~%6hlQnC&F87@<Q7?BUr%G7x(rH`u`d00Do;dk jTJrzwP0e!*(pu<si@Uc~obyUpy`z8D_)MAhwIBZp1t_>n From 4510224367036e78c81f83eb0e09391d13ea2cf5 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Fri, 1 Nov 2024 07:58:50 +0100 Subject: [PATCH 021/125] "Edit on GitHub" should always go on main This prevents all these PRs against the wrong versions. It might, however be confusing if the contents are very different. This was decided 31.10.24 in the team meeting: https://notes.typo3.org/T3DocTeamMeeting --- Documentation/TSconfig/Documentation/guides.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TSconfig/Documentation/guides.xml b/Documentation/TSconfig/Documentation/guides.xml index b64505469..a2e9ccc95 100644 --- a/Documentation/TSconfig/Documentation/guides.xml +++ b/Documentation/TSconfig/Documentation/guides.xml @@ -7,7 +7,7 @@ project-contact="https://typo3.slack.com/archives/C028JEPJL" project-repository="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" project-issues="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/issues" - edit-on-github-branch="13.4" + edit-on-github-branch="main" edit-on-github="TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" typo3-core-preferred="13" interlink-shortcode="t3tsconfig" From eb8dcd76ac9c2c5451e0c94aade2971603c095e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 10:11:30 +0100 Subject: [PATCH 022/125] [Backport 13.4] [TASK] Combine chapter Guide Overview into one page (#1401) * [TASK] Combine chapter Guide Overview into one page Releases: main, 13.4, 12.4 * [TASK] Combine guide chapters, reorder manu Releases: main, 13.4, 12.4 * [TASK] Add interim headlines Releases: main, 13.4, 12.4 --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/AppendixA/Index.rst | 6 +-- Documentation/Guide/Index.rst | 9 ++-- .../Guide/ReadingContentRecords/Index.rst | 10 ++-- .../_ContentElements.rst.txt} | 10 ++-- .../_Layout.html | 0 .../{ => _snippets}/_PAGE.typoscript | 0 .../_lib.contentElement.typoscript | 0 .../_tt_content.header.typoscript | 0 .../_tt_content.typoscript | 0 .../GetText}/Index.rst | 1 + .../Guide/TypoScriptFunctions/Index.rst | 12 ++--- .../StdWrap}/Index.rst | 19 ++++--- .../StdWrap/_Chapters/_CObject.rst.txt} | 3 +- .../StdWrap/_Chapters/_HeedTheOrder.rst.txt} | 3 +- .../_Chapters/_ModifyTheOrder.rst.txt} | 3 +- .../StdWrap/_Chapters/_TheDataType.rst.txt} | 1 - .../StdWrap/_snippets}/_cObject.typoscript | 0 .../StdWrap/_snippets}/_order.typoscript | 0 .../_snippets/_orderedStdWrap.typoscript} | 0 .../Guide/TypoScriptOverview/Index.rst | 33 +++++++----- .../TheTermTemplate/_page.typoscript | 3 -- .../_BackendConfiguration.rst.txt} | 1 - .../_FirstSteps.rst.txt} | 13 +++-- .../_MainTemplate.rst.txt} | 3 +- .../_Prerequisites.rst.txt} | 1 - .../_TheTermTemplate.rst.txt} | 3 +- .../_TypoScriptAnArray.rst.txt} | 5 +- .../_WhyTypoScript.rst.txt} | 1 - .../{FirstSteps => _snippets}/_mypage.php | 0 .../_mypage.typoscript | 0 .../_mypage2.typoscript | 0 .../_mypage3.typoscript | 0 .../_mypage4.typoscript | 0 .../_mypage5.typoscript | 0 .../_page.php | 0 .../_page.typoscript | 0 .../_page1.typoscript} | 0 .../Guide/UsingFluidStyledContent/Index.rst | 1 + Documentation/Index.rst | 53 +++++++++++-------- 39 files changed, 100 insertions(+), 94 deletions(-) rename Documentation/Guide/ReadingContentRecords/{ContentElements/Index.rst => _Chapters/_ContentElements.rst.txt} (90%) rename Documentation/Guide/ReadingContentRecords/{ContentElements => _snippets}/_Layout.html (100%) rename Documentation/Guide/ReadingContentRecords/{ => _snippets}/_PAGE.typoscript (100%) rename Documentation/Guide/ReadingContentRecords/{ContentElements => _snippets}/_lib.contentElement.typoscript (100%) rename Documentation/Guide/ReadingContentRecords/{ContentElements => _snippets}/_tt_content.header.typoscript (100%) rename Documentation/Guide/ReadingContentRecords/{ContentElements => _snippets}/_tt_content.typoscript (100%) rename Documentation/Guide/{UsingGetText => TypoScriptFunctions/GetText}/Index.rst (98%) rename Documentation/Guide/{UsingStdWrap => TypoScriptFunctions/StdWrap}/Index.rst (65%) rename Documentation/Guide/{UsingStdWrap/CObject/Index.rst => TypoScriptFunctions/StdWrap/_Chapters/_CObject.rst.txt} (74%) rename Documentation/Guide/{UsingStdWrap/HeedTheOrder/Index.rst => TypoScriptFunctions/StdWrap/_Chapters/_HeedTheOrder.rst.txt} (87%) rename Documentation/Guide/{UsingStdWrap/ModifyTheOrder/Index.rst => TypoScriptFunctions/StdWrap/_Chapters/_ModifyTheOrder.rst.txt} (87%) rename Documentation/Guide/{UsingStdWrap/TheDataType/Index.rst => TypoScriptFunctions/StdWrap/_Chapters/_TheDataType.rst.txt} (93%) rename Documentation/Guide/{UsingStdWrap/CObject => TypoScriptFunctions/StdWrap/_snippets}/_cObject.typoscript (100%) rename Documentation/Guide/{UsingStdWrap/HeedTheOrder => TypoScriptFunctions/StdWrap/_snippets}/_order.typoscript (100%) rename Documentation/Guide/{UsingStdWrap/ModifyTheOrder/_order.typoscript => TypoScriptFunctions/StdWrap/_snippets/_orderedStdWrap.typoscript} (100%) delete mode 100644 Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript rename Documentation/Guide/TypoScriptOverview/{BackendConfiguration/Index.rst => _Chapters/_BackendConfiguration.rst.txt} (93%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps/Index.rst => _Chapters/_FirstSteps.rst.txt} (88%) rename Documentation/Guide/TypoScriptOverview/{MainTemplate/Index.rst => _Chapters/_MainTemplate.rst.txt} (92%) rename Documentation/Guide/TypoScriptOverview/{Prerequisites/Index.rst => _Chapters/_Prerequisites.rst.txt} (96%) rename Documentation/Guide/TypoScriptOverview/{TheTermTemplate/Index.rst => _Chapters/_TheTermTemplate.rst.txt} (96%) rename Documentation/Guide/TypoScriptOverview/{TypoScriptAnArray/Index.rst => _Chapters/_TypoScriptAnArray.rst.txt} (92%) rename Documentation/Guide/TypoScriptOverview/{WhyTypoScript/Index.rst => _Chapters/_WhyTypoScript.rst.txt} (97%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage.php (100%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage2.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage3.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage4.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{FirstSteps => _snippets}/_mypage5.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{TypoScriptAnArray => _snippets}/_page.php (100%) rename Documentation/Guide/TypoScriptOverview/{TypoScriptAnArray => _snippets}/_page.typoscript (100%) rename Documentation/Guide/TypoScriptOverview/{MainTemplate/_page.typoscript => _snippets/_page1.typoscript} (100%) diff --git a/Documentation/AppendixA/Index.rst b/Documentation/AppendixA/Index.rst index 74fff9867..ff0fdc94d 100644 --- a/Documentation/AppendixA/Index.rst +++ b/Documentation/AppendixA/Index.rst @@ -1,9 +1,9 @@ .. include:: /Includes.rst.txt .. _appendix-a: -================================ -Appendix A – PHP include scripts -================================ +================== +PHP and TypoScript +================== .. _content-object-renderer: diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index 93ece2397..12c66d096 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -1,9 +1,10 @@ +:navigation-title: Getting started .. include:: /Includes.rst.txt .. _guide: -================ -TypoScript guide -================ +===================================================== +Getting started: A quick introduction into TypoScript +===================================================== Learn the fundamentals of TypoScript in just 45 minutes. @@ -27,6 +28,4 @@ Explained. UsingFluidStyledContent/Index TypoScriptObjects/Index TypoScriptFunctions/Index - UsingStdWrap/Index - UsingGetText/Index NextSteps/Index diff --git a/Documentation/Guide/ReadingContentRecords/Index.rst b/Documentation/Guide/ReadingContentRecords/Index.rst index 3e529c305..e06378bd3 100644 --- a/Documentation/Guide/ReadingContentRecords/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/Index.rst @@ -1,5 +1,5 @@ +:navigation-title: Content records .. include:: /Includes.rst.txt - .. _guide-content-records: ======================= @@ -29,7 +29,7 @@ After creating the :ref:`PAGE <page>` object, we use the :ref:`CONTENT content element we use the :ref:`TEXT <cobj-text>` object to perform the actual rendering: -.. literalinclude:: _PAGE.typoscript +.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_PAGE.typoscript The :ref:`CONTENT <cobj-content>` object executes an SQL query on the database. The query is controlled by the `select` property, which - in @@ -55,7 +55,5 @@ predetermined. Therefore, we have to create TypoScript definitions for every single database field (e.g. for images, image size, image position, link to top, index, etc.). -.. toctree:: - :hidden: - - ContentElements/Index +.. include:: _Chapters/_ContentElements.rst.txt + :show-buttons: diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst b/Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt similarity index 90% rename from Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst rename to Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt index 509b259e3..70d7f5f49 100644 --- a/Documentation/Guide/ReadingContentRecords/ContentElements/Index.rst +++ b/Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt @@ -1,5 +1,3 @@ -.. include:: /Includes.rst.txt - .. _guide-content-elements: ============================ @@ -22,7 +20,7 @@ definition named after that table. In case of content in TYPO3 the table is called `tt_content` therefore the default `renderObj` is also called `tt_content`: -.. literalinclude:: _tt_content.typoscript +.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_tt_content.typoscript :caption: Content element rendering taken from typo3/sysext/frontend/ext_localconf.php The basic extension for rendering content in TYPO3 since TYPO3 v8 is @@ -35,13 +33,13 @@ looking at the lines starting with `10 =` there is the possibility to add your own templates by setting the corresponding `constant` (in the `Constants` section of a TypoScript record): -.. literalinclude:: _lib.contentElement.typoscript +.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.typoscript Each content element inherits that configuration. As an example take a look at the content element definition of the content element of type `header`: -.. literalinclude:: _tt_content.header.typoscript +.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/ContentElement/Header.typoscript First, all configuration options defined in `lib.contentElement` are @@ -57,7 +55,7 @@ the paths (see above). In your own templates you have the data of the currently rendered content element available in the {data} fluid variable. For example take a look at how the text element is rendered: -.. literalinclude:: _Layout.html +.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_Layout.html :caption: Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html The database field `bodytext` from the `tt_content` table (which is diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html b/Documentation/Guide/ReadingContentRecords/_snippets/_Layout.html similarity index 100% rename from Documentation/Guide/ReadingContentRecords/ContentElements/_Layout.html rename to Documentation/Guide/ReadingContentRecords/_snippets/_Layout.html diff --git a/Documentation/Guide/ReadingContentRecords/_PAGE.typoscript b/Documentation/Guide/ReadingContentRecords/_snippets/_PAGE.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_PAGE.typoscript rename to Documentation/Guide/ReadingContentRecords/_snippets/_PAGE.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript b/Documentation/Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/ContentElements/_lib.contentElement.typoscript rename to Documentation/Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript b/Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.header.typoscript rename to Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript b/Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/ContentElements/_tt_content.typoscript rename to Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.typoscript diff --git a/Documentation/Guide/UsingGetText/Index.rst b/Documentation/Guide/TypoScriptFunctions/GetText/Index.rst similarity index 98% rename from Documentation/Guide/UsingGetText/Index.rst rename to Documentation/Guide/TypoScriptFunctions/GetText/Index.rst index e1f345726..8f9af1a4d 100644 --- a/Documentation/Guide/UsingGetText/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/GetText/Index.rst @@ -1,3 +1,4 @@ +:navigation-title: getText / data .. include:: /Includes.rst.txt .. _using-gettext: diff --git a/Documentation/Guide/TypoScriptFunctions/Index.rst b/Documentation/Guide/TypoScriptFunctions/Index.rst index 7431e63ba..fe965f0d0 100644 --- a/Documentation/Guide/TypoScriptFunctions/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/Index.rst @@ -11,17 +11,17 @@ an object has a property corresponding to a given function, you are assured to have that set of properties available. This chapter gives you a brief overview of the most common functions available -in TypoScript. As always the :doc:`TypoScript Reference <Index>` is the -ultimate source of knowledge on the matter. For each object property, it -indicates whether it is a simple data type or a function. +in TypoScript. See chapter :ref:`Functions <functions>` for a complete list. -The most used function is the "standard wrap", usually known as "stdWrap". Due -to its importance, it is entitled to -:ref:`its very own chapter <guide-using-stdwrap>`. +The most used function is the "standard wrap", usually known as "stdWrap". .. toctree:: :caption: The functions + :maxdepth: 1 + :titlesonly: + StdWrap/Index + GetText/Index ImgResource/Index Select/Index Split/Index diff --git a/Documentation/Guide/UsingStdWrap/Index.rst b/Documentation/Guide/TypoScriptFunctions/StdWrap/Index.rst similarity index 65% rename from Documentation/Guide/UsingStdWrap/Index.rst rename to Documentation/Guide/TypoScriptFunctions/StdWrap/Index.rst index caa60500e..c666f1d53 100644 --- a/Documentation/Guide/UsingStdWrap/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/StdWrap/Index.rst @@ -1,3 +1,4 @@ +:navigation-title: stdWrap .. include:: /Includes.rst.txt .. _guide-using-stdwrap: @@ -14,11 +15,17 @@ chapter is intended to give you a feel for `stdWrap` so that you may get familiar with it and be ready to explore it in greater depth using the :ref:`TypoScript Reference <stdwrap>`. -**Details of stdWrap:** +.. contents:: Details of stdWrap -.. toctree:: +.. include:: _Chapters/_HeedTheOrder.rst.txt + :show-buttons: + +.. include:: _Chapters/_ModifyTheOrder.rst.txt + :show-buttons: + +.. include:: _Chapters/_TheDataType.rst.txt + :show-buttons: + +.. include:: _Chapters/_CObject.rst.txt + :show-buttons: - HeedTheOrder/Index - ModifyTheOrder/Index - TheDataType/Index - CObject/Index diff --git a/Documentation/Guide/UsingStdWrap/CObject/Index.rst b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_CObject.rst.txt similarity index 74% rename from Documentation/Guide/UsingStdWrap/CObject/Index.rst rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_CObject.rst.txt index 5241da7b8..52b5ea64d 100644 --- a/Documentation/Guide/UsingStdWrap/CObject/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_CObject.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-stdwrap-cobject: ======= @@ -10,4 +9,4 @@ used to replace the content with a TypoScript object. This can be a :ref:`COA <cobj-coa>`, a plugin or a text like in this example: -.. literalinclude:: _cObject.typoscript +.. literalinclude:: /Guide/TypoScriptFunctions/StdWrap/_snippets/_cObject.typoscript diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_HeedTheOrder.rst.txt similarity index 87% rename from Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_HeedTheOrder.rst.txt index 1a989389d..dbc36790e 100644 --- a/Documentation/Guide/UsingStdWrap/HeedTheOrder/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_HeedTheOrder.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-stdwrap-order: ============== @@ -12,7 +11,7 @@ have set them in your TypoScript record. Let's consider this example: -.. literalinclude:: _order.typoscript +.. literalinclude:: /Guide/TypoScriptFunctions/StdWrap/_snippets/_order.typoscript It results in the following: diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_ModifyTheOrder.rst.txt similarity index 87% rename from Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_ModifyTheOrder.rst.txt index b55530b51..7357f4090 100644 --- a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_ModifyTheOrder.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-stdwrap-recursively: ================ @@ -9,7 +8,7 @@ There is a way around this ordering restriction. `stdWrap` has a property called `orderedStdWrap` in which several `stdWrap` properties can be called in numerical order. Thus: -.. literalinclude:: _order.typoscript +.. literalinclude:: /Guide/TypoScriptFunctions/StdWrap/_snippets/_orderedStdWrap.typoscript results in: diff --git a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_TheDataType.rst.txt similarity index 93% rename from Documentation/Guide/UsingStdWrap/TheDataType/Index.rst rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_TheDataType.rst.txt index a5cde346b..a3c44a140 100644 --- a/Documentation/Guide/UsingStdWrap/TheDataType/Index.rst +++ b/Documentation/Guide/TypoScriptFunctions/StdWrap/_Chapters/_TheDataType.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-data-types: diff --git a/Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript b/Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_cObject.typoscript similarity index 100% rename from Documentation/Guide/UsingStdWrap/CObject/_cObject.typoscript rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_cObject.typoscript diff --git a/Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript b/Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_order.typoscript similarity index 100% rename from Documentation/Guide/UsingStdWrap/HeedTheOrder/_order.typoscript rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_order.typoscript diff --git a/Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript b/Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_orderedStdWrap.typoscript similarity index 100% rename from Documentation/Guide/UsingStdWrap/ModifyTheOrder/_order.typoscript rename to Documentation/Guide/TypoScriptFunctions/StdWrap/_snippets/_orderedStdWrap.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/Index.rst b/Documentation/Guide/TypoScriptOverview/Index.rst index b97e829d2..3e7318e42 100644 --- a/Documentation/Guide/TypoScriptOverview/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/Index.rst @@ -1,3 +1,4 @@ +:navigation-title: Quick overview .. include:: /Includes.rst.txt .. _guide-overview: @@ -23,19 +24,27 @@ allows you to proceed more efficiently and waste less time in painful trial and error. Going through this tutorial is helpful for understanding -other tutorials, like the :doc:`Sitepackage <t3sitepackage:Index>`. +other tutorials, like the :ref:`Site package tutorial <t3sitepackage:start>`. +.. contents:: -.. toctree:: - :maxdepth: 5 - :titlesonly: - :glob: +.. include:: _Chapters/_BackendConfiguration.rst.txt + :show-buttons: - BackendConfiguration/Index - Prerequisites/Index - WhyTypoScript/Index - MainTemplate/Index - TheTermTemplate/Index - TypoScriptAnArray/Index - FirstSteps/Index +.. include:: _Chapters/_Prerequisites.rst.txt + :show-buttons: +.. include:: _Chapters/_WhyTypoScript.rst.txt + :show-buttons: + +.. include:: _Chapters/_MainTemplate.rst.txt + :show-buttons: + +.. include:: _Chapters/_TheTermTemplate.rst.txt + :show-buttons: + +.. include:: _Chapters/_TypoScriptAnArray.rst.txt + :show-buttons: + +.. include:: _Chapters/_FirstSteps.rst.txt + :show-buttons: diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript b/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript deleted file mode 100644 index b043dddf1..000000000 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/_page.typoscript +++ /dev/null @@ -1,3 +0,0 @@ -page = PAGE -page.10 = TEXT -page.10.value = Hello World diff --git a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_BackendConfiguration.rst.txt similarity index 93% rename from Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_BackendConfiguration.rst.txt index 8a8e2262a..a5b42d777 100644 --- a/Documentation/Guide/TypoScriptOverview/BackendConfiguration/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_BackendConfiguration.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-backend-configuration: ===================== diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt similarity index 88% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt index e89cb1873..39595bf9f 100644 --- a/Documentation/Guide/TypoScriptOverview/FirstSteps/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-first-steps: @@ -16,7 +15,7 @@ stand for functions or simple values. The :ref:`PAGE <page>` object is responsible for the rendering of a website page in the frontend: -.. literalinclude:: _mypage.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage.typoscript The :ref:`PAGE <page>` object on the one hand offers numerous named properties (like :typoscript:`typeNum`). On the other hand it also has an endless number of @@ -26,7 +25,7 @@ accordingly when they are rendered, from the smallest number to the largest. The order of the lines in the TypoScript record is irrelevant: -.. literalinclude:: _mypage2.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage2.typoscript Every entry is stored in a multidimensional PHP array. Every object and every property, therefore, is unique. We could define an arbitrary @@ -48,7 +47,7 @@ those various views, changing only what's specific for each of them. The previous example would look like this as a PHP array: -.. literalinclude:: _mypage.php +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage.php Empty spaces at the start and end of values are removed by TYPO3 CMS automatically (using the PHP :php:`trim()` function). @@ -56,7 +55,7 @@ automatically (using the PHP :php:`trim()` function). The :typoscript:`=` sign corresponds to a simple assignment. Here is an overview of the various operators: -.. literalinclude:: _mypage3.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage3.typoscript Object types are always written with capital letters; parameters and functions typically in camel case (first word lower case, next word @@ -76,12 +75,12 @@ resource to find out which objects, functions and properties exist. Things can get more complicated when objects are nested inside each other and many properties are used: -.. literalinclude:: _mypage4.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage4.typoscript To make things clearer, TypoScript code can be structured using curly braces (:typoscript:`{}`) at each nesting level: -.. literalinclude:: _mypage5.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage5.typoscript .. important:: diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt similarity index 92% rename from Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt index cf4d32146..fff7e348f 100644 --- a/Documentation/Guide/TypoScriptOverview/MainTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-main-template: .. _guide-main-typoscript-record: @@ -24,4 +23,4 @@ are defined by using the dot "." notation. The following is a typical example of TypoScript syntax: -.. literalinclude:: _page.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page1.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_Prerequisites.rst.txt similarity index 96% rename from Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_Prerequisites.rst.txt index 0d3124b15..09e1cf56e 100644 --- a/Documentation/Guide/TypoScriptOverview/Prerequisites/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_Prerequisites.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-prerequisites: ============= diff --git a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt similarity index 96% rename from Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt index 95cf38edf..0f279ad10 100644 --- a/Documentation/Guide/TypoScriptOverview/TheTermTemplate/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-template: @@ -47,6 +46,6 @@ definition. The following TypoScript setup code is enough to remove this warning: -.. literalinclude:: _page.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page1.typoscript Do not worry about this code for now, it will be explained later. diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt similarity index 92% rename from Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt index 795258959..5706b6662 100644 --- a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-typoscript-array: =========================== @@ -8,11 +7,11 @@ TypoScript is just an array Internally, TypoScript is parsed and stored as a PHP array. For example: -.. literalinclude:: _page.typoscript +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page.typoscript will be converted to the following PHP array: -.. literalinclude:: _page.php +.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page.php Upon evaluation, a ":ref:`PAGE <page>`" object will be created first, and the parameter :php:`$data['page.']` will be assigned to it. diff --git a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst b/Documentation/Guide/TypoScriptOverview/_Chapters/_WhyTypoScript.rst.txt similarity index 97% rename from Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst rename to Documentation/Guide/TypoScriptOverview/_Chapters/_WhyTypoScript.rst.txt index 9515bdddf..c6d52f370 100644 --- a/Documentation/Guide/TypoScriptOverview/WhyTypoScript/Index.rst +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_WhyTypoScript.rst.txt @@ -1,4 +1,3 @@ -.. include:: /Includes.rst.txt .. _guide-why-typoscript: diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage.php similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.php rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage.php diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage2.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage2.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage2.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage3.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage3.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage3.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage4.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage4.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage4.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_mypage5.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/FirstSteps/_mypage5.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_mypage5.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php b/Documentation/Guide/TypoScriptOverview/_snippets/_page.php similarity index 100% rename from Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.php rename to Documentation/Guide/TypoScriptOverview/_snippets/_page.php diff --git a/Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_page.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/TypoScriptAnArray/_page.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_page.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript b/Documentation/Guide/TypoScriptOverview/_snippets/_page1.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/MainTemplate/_page.typoscript rename to Documentation/Guide/TypoScriptOverview/_snippets/_page1.typoscript diff --git a/Documentation/Guide/UsingFluidStyledContent/Index.rst b/Documentation/Guide/UsingFluidStyledContent/Index.rst index 66ca25f64..bcf5d065c 100644 --- a/Documentation/Guide/UsingFluidStyledContent/Index.rst +++ b/Documentation/Guide/UsingFluidStyledContent/Index.rst @@ -1,3 +1,4 @@ +:navigation-title: fluid_styled_content .. include:: /Includes.rst.txt .. _using-fluid-styled-content: diff --git a/Documentation/Index.rst b/Documentation/Index.rst index c77589301..98c6d21a7 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -37,26 +37,33 @@ chapter of TYPO3 Explained. **Table of Contents:** -.. toctree:: - :maxdepth: 2 - :titlesonly: - - Introduction/Index - UsingSetting/Index - DataTypes/Index - TopLevelObjects/Index - ContentObjects/Index - DataProcessing/Index - Functions/Index - Conditions/Index - Guide/Index - AppendixA/Index - -.. Meta Menu - -.. toctree:: - :hidden: - - Glossary - About - Sitemap +.. toctree:: + :caption: About TypoScript + :maxdepth: 1 + :titlesonly: + + Introduction/Index + Guide/Index + UsingSetting/Index + + +.. toctree:: + :caption: Reference + :maxdepth: 1 + :titlesonly: + + ContentObjects/Index + DataProcessing/Index + TopLevelObjects/Index + Functions/Index + DataTypes/Index + Conditions/Index + +.. toctree:: + :caption: Appendix + :hidden: + + AppendixA/Index + Glossary + About + Sitemap From 13fe2df2e83556faad4cab43d0055b3396815378 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 10:27:49 +0100 Subject: [PATCH 023/125] [BUGFIX] Fix links to former TypoScript in 45 min (#554) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/TSconfig/Documentation/Index.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Documentation/TSconfig/Documentation/Index.rst b/Documentation/TSconfig/Documentation/Index.rst index 5adf930a8..b7082d92a 100644 --- a/Documentation/TSconfig/Documentation/Index.rst +++ b/Documentation/TSconfig/Documentation/Index.rst @@ -27,9 +27,10 @@ TSconfig Reference This document describes TSconfig: A TypoScript-like syntax for configuring details of the TYPO3 backend. -In addition, you can find a quick reference guide to TypoScript templates in -:ref:`t3ts45:start`, a complete reference of all object types and properties of -TypoScript in :ref:`TypoScript Reference <t3tsref:start>` and explanations of +In addition, you can find +:ref:`a quick introduction into TypoScript <t3tsref:guide>`, +and a complete reference of all object types and properties of +TypoScript in the :ref:`TypoScript Reference <t3tsref:start>` and explanations of TypoScript syntax in the chapter ":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" of TYPO3 Explained. From d3e709cb3d42296b7b222be6497d3524b9ea23cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 10:30:01 +0100 Subject: [PATCH 024/125] Clarify TCEFORM structure (#556) While reading the documentation for the first time, we noticed that it might be easier to understand if it is the same structure. Co-authored-by: Davin Thiemann <davin.thiemann@hdnet.de> --- Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst b/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst index c40802454..55d2237b5 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst @@ -29,7 +29,7 @@ apply. In general, a more specific property path overrides a less specific one: Some properties apply to single fields, those can be usually set per table or per table and record type. This leads to the property paths `TCEFORM.[tableName].[fieldName].[propertyName]` to configure the field for all types -and `TCEFORM.[tableName].[fieldName].types.[typeName]` to configure a field for a specific +and `TCEFORM.[tableName].[fieldName].types.[typeName].[propertyName]` to configure a field for a specific type, see the :ref:`TCA type section <t3tca:types>` for details on types. While all that property path munging looks messy at first, it should become more From 5364cce00c888b66d33fe1b6f6c0819041cf505d Mon Sep 17 00:00:00 2001 From: Lina Wolf <48202465+linawolf@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:15:13 +0100 Subject: [PATCH 025/125] [TASK] Move the TypoScript Syntax chapter into the reference (#1402) Releases: main, 13.4, 12.4 (cherry picked from commit 8abb7b8e1737f652e2dfe1bb07d1bcbae188914b) --- .../TypoScriptSyntax/CodeBlock1.rst.txt | 8 + .../TypoScriptSyntax/CodeBlock2.rst.txt | 10 + .../TypoScriptSyntax/CodeBlock3.rst.txt | 14 + .../CodeBlockInvalidClosingBrace.rst.txt | 8 + .../CodeBlockInvalidCondition.rst.txt | 12 + .../CodeBlockInvalidImport.rst.txt | 10 + .../TypoScriptSyntax/Comments.rst.txt | 25 ++ .../TypoScriptSyntax/Conditions1.rst.txt | 10 + .../TypoScriptSyntax/Conditions2.rst.txt | 13 + .../TypoScriptSyntax/Conditions3.rst.txt | 16 + .../TypoScriptSyntax/Conditions4.rst.txt | 19 + .../TypoScriptSyntax/Conditions5.rst.txt | 12 + .../TypoScriptSyntax/Identifiers1.rst.txt | 6 + .../TypoScriptSyntax/Identifiers2.rst.txt | 6 + .../OperatorAssignment.rst.txt | 31 ++ .../TypoScriptSyntax/OperatorCopy1.rst.txt | 14 + .../TypoScriptSyntax/OperatorCopy2.rst.txt | 10 + .../TypoScriptSyntax/OperatorCopy3.rst.txt | 10 + .../TypoScriptSyntax/OperatorCopy4.rst.txt | 19 + .../OperatorMultiLine.rst.txt | 24 ++ .../OperatorReference.rst.txt | 17 + .../TypoScriptSyntax/OperatorUnset.rst.txt | 15 + Documentation/Index.rst | 2 +- Documentation/Syntax/CodeBlocks/Index.rst | 55 +++ Documentation/Syntax/Comments/Index.rst | 37 ++ Documentation/Syntax/Conditions/Index.rst | 164 +++++++++ Documentation/Syntax/FileImports/Index.rst | 234 ++++++++++++ Documentation/Syntax/Identifiers/Index.rst | 33 ++ Documentation/Syntax/Index.rst | 22 ++ Documentation/Syntax/Operators/Index.rst | 335 ++++++++++++++++++ 30 files changed, 1190 insertions(+), 1 deletion(-) create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock1.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock2.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock3.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidClosingBrace.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidCondition.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidImport.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Comments.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Identifiers1.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Identifiers2.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorAssignment.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy1.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy2.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy3.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy4.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorMultiLine.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorReference.rst.txt create mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt create mode 100644 Documentation/Syntax/CodeBlocks/Index.rst create mode 100644 Documentation/Syntax/Comments/Index.rst create mode 100644 Documentation/Syntax/Conditions/Index.rst create mode 100644 Documentation/Syntax/FileImports/Index.rst create mode 100644 Documentation/Syntax/Identifiers/Index.rst create mode 100644 Documentation/Syntax/Index.rst create mode 100644 Documentation/Syntax/Operators/Index.rst diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock1.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock1.rst.txt new file mode 100644 index 000000000..2909d1d6a --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock1.rst.txt @@ -0,0 +1,8 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlock/setup.typoscript + + myIdentifier = TEXT + myIdentifier.stdWrap.field = title + myIdentifier.stdWrap.ifEmpty.data = leveltitle:0 diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock2.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock2.rst.txt new file mode 100644 index 000000000..f11d7f745 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock2.rst.txt @@ -0,0 +1,10 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlock2/setup.typoscript + + myIdentifier = TEXT + myIdentifier { + stdWrap.field = title + stdWrap.ifEmpty.data = leveltitle:0 + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock3.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock3.rst.txt new file mode 100644 index 000000000..6c33f124e --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlock3.rst.txt @@ -0,0 +1,14 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlock3/setup.typoscript + + myIdentifier = TEXT + myIdentifier { + stdWrap { + field = title + ifEmpty { + data = leveltitle:0 + } + } + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidClosingBrace.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidClosingBrace.rst.txt new file mode 100644 index 000000000..5f5553543 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidClosingBrace.rst.txt @@ -0,0 +1,8 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlockInvalidClosingBrace/setup.typoscript + + myIdentifier = TEXT + myIdentifier { + value = bar } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidCondition.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidCondition.rst.txt new file mode 100644 index 000000000..bbe676cc8 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidCondition.rst.txt @@ -0,0 +1,12 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlockInvalidCondition/setup.typoscript + + myIdentifier = TEXT + myIdentifier { + value = foo + [frontend.user.isLoggedIn] + value = bar + [end] + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidImport.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidImport.rst.txt new file mode 100644 index 000000000..cbfb70f1a --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/CodeBlockInvalidImport.rst.txt @@ -0,0 +1,10 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/CodeBlockInvalidCondition/setup.typoscript + + myIdentifier = TEXT + myIdentifier { + @import 'EXT:my_extension/Configuration/TypoScript/bar.typoscript' + value = foo + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Comments.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Comments.rst.txt new file mode 100644 index 000000000..85a1df506 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Comments.rst.txt @@ -0,0 +1,25 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Comments/setup.typoscript + + # This is a comment + // This is a comment + /* This is a + multiline comment */ + + foo < bar // This is a comment + foo < bar /* This is a valid comment, too */ + + foo > # Another valid comment + + foo := addToList(1) # Yes, a comment + + [foo = bar] # Many comment. Much wow. + + foo ( + # This is NOT a comment but part of the value assignment! + bar = barValue + ) # This is a comment + + foo = bar // This is NOT a comment but part of the value assignment! diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt new file mode 100644 index 000000000..8a21ddf72 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt @@ -0,0 +1,10 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions1/setup.typoscript + + [date("j") == 9] + page.10.value = It is the 9th day of the month! + [ELSE] + page.10.value = It is NOT the 9th day of the month! + [END] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt new file mode 100644 index 000000000..6eb5061c4 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt @@ -0,0 +1,13 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Conditions2/setup.typoscript + + # Some TypoScript, always parsed + [condition criteria] + # Some TypoScript, only parsed if the condition criteria is met + [ELSE] + # Some TypoScript, only parsed if the condition criteria is *not* met + # [ELSE] is optional + [GLOBAL] + # ... some TypoScript, always parsed diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt new file mode 100644 index 000000000..0c292d99b --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt @@ -0,0 +1,16 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions3/setup.typoscript + + page = PAGE + page.10 = TEXT + page.10.value = HELLO WORLD! + + [frontend.user.isLoggedIn || ip('127.0.0.1')] + page.20 = TEXT + page.20 { + value = A frontend user is logged in, or the browser IP is 127.0.0.1 + stdWrap.case = upper + } + [GLOBAL] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt new file mode 100644 index 000000000..da295179f --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt @@ -0,0 +1,19 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions4/setup.typoscript + + page = PAGE + page.10 = TEXT + page.10.value = You are logged in + + # This is hard to read + [frontend.user.isLoggedIn] + [ELSE] + page.10.value = You are *not* logged in + [END] + + # This is faster to read + [!frontend.user.isLoggedIn] + page.10.value = You are *not* logged in + [END] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt new file mode 100644 index 000000000..469b5ed2d --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt @@ -0,0 +1,12 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions5/setup.typoscript + + # Invalid: Conditions must not be used within code blocks + someIdentifier { + someProperty = foo + [frontend.user.isloggedIn] + someProperty = bar + [GLOBAL] + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers1.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers1.rst.txt new file mode 100644 index 000000000..8436a8aaa --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers1.rst.txt @@ -0,0 +1,6 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/General/setup.typoscript + + myIdentifier.mySubIdentifier = myValue diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers2.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers2.rst.txt new file mode 100644 index 000000000..8af10b920 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/Identifiers2.rst.txt @@ -0,0 +1,6 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Escaping/setup.typoscript + + myIdentifier.my\.identifier\.with\.dots = myValue diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorAssignment.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorAssignment.rst.txt new file mode 100644 index 000000000..2cd564d8c --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorAssignment.rst.txt @@ -0,0 +1,31 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/Assignment/setup.typoscript + + # Identifier "myIdentifier" is set to the value "foo" + myIdentifier = foo + + # Identifier path "myIdentifier.mySubIdentifier" is set to the value "foo" + myIdentifier.mySubIdentifier = foo + + # "myIdentifier.mySubIdentifier" it set to the value "foo", + # but is immediately overwritten to value "bar" + myIdentifier.mySubIdentifier = foo + myIdentifier.mySubIdentifier = bar + + # Same as above, value of "myIdentifier.mySubIdentifier" is "bar" + myIdentifier.mySubIdentifier = foo + myIdentifier { + mySubIdentifier = bar + } + + # Value assignments are not comment-aware, "#", "//" and "/*" after a + # "=" operator do not start a comment. The value of identifier + # "myIdentifier.mySubIdentifier" is "foo // not a comment" + myIdentifier.mySubIdentifier = foo // not a comment + + # Value assignment using a constant: + # Ends up as "foo myConstantValue bar" if constant "myConstant" is set to "myConstantValue" + # Ends up as "foo {$myConstantValue} bar" if constant "myConstant" is not set + myIdentifier. mySubIdentifier = foo {$myConstantValue} bar diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy1.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy1.rst.txt new file mode 100644 index 000000000..24fb9a718 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy1.rst.txt @@ -0,0 +1,14 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorCopy1/setup.typoscript + + myIdentifier = TEXT + myIdentifier.value = Hello world + myOtherIdentifier = TEXT + myOtherIdentifier.value = Hello world + + # The above is identical to this: + myIdentifier = TEXT + myIdentifier.value = Hello world + myOtherIdentifier < myIdentifier diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy2.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy2.rst.txt new file mode 100644 index 000000000..2185027fe --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy2.rst.txt @@ -0,0 +1,10 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorCopy2/setup.typoscript + + myIdentifier { + 10 = TEXT + 10.value = Hello world + 20 < myIdentifier.10 + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy3.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy3.rst.txt new file mode 100644 index 000000000..c9370b46e --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy3.rst.txt @@ -0,0 +1,10 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorCopy3/setup.typoscript + + myIdentifier { + 10 = TEXT + 10.value = Hello world + 20 < .10 + } diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy4.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy4.rst.txt new file mode 100644 index 000000000..fc0f211a2 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorCopy4.rst.txt @@ -0,0 +1,19 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorCopy4/setup.typoscript + + # The above is identical to this: + myIdentifier = TEXT + myIdentifier.value = Hello world + myOtherIdentifier < myIdentifier + + # Changing myIdentifier *after* it has been copied over to myOtherIdentifier, + # does *not* change myOtherIdentifier. The below line only changes the + # value of myIdentifier, not myOtherIdentifier: + myIdentifier.value = Hello world 2 + + # Changing myOtherIdentifier *after* it has been copied from to myIdentifier, + # does *not* change myIdentifier. The below line only changes the + # value of myOtherIdentifier, not myIdentifier: + myOtherIdentifier.value = Hello world 3 diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorMultiLine.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorMultiLine.rst.txt new file mode 100644 index 000000000..20a8c5642 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorMultiLine.rst.txt @@ -0,0 +1,24 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorMultiLine/setup.typoscript + + myIdentifier= TEXT + myIdentifier.value ( + This is a + multiline assignment + ) + + myIdentifier= TEXT + myIdentifier.value ( + <p class="warning"> + This is HTML code. + </p> + ) + + myIdentifier= TEXT + myIdentifier.value ( + This looks up the value for constant {$myConstant} + and falls back to the string "{$myConstant}" if it can + not be resolved. + ) diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorReference.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorReference.rst.txt new file mode 100644 index 000000000..37188b59e --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorReference.rst.txt @@ -0,0 +1,17 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/OperatorReference/setup.typoscript + + lib.myIdentifier = TEXT + lib.myIdentifier { + value = Hello world + stdWrap.wrap = <p>|</p> + } + tt_content.text =< lib.myIdentifier + tt_content.textpic =< lib.myIdentifier + + # This changes lib.myIdentifier.stdWrap.wrap *and* tt_content.text.stdWrap.wrap + lib.myIdentifier.stdWrap.wrap = <h1>|</h1> + # This changes only tt_content.textpic.stdWrap.wrap + tt_content.textpic.stdWrap.wrap = <h2>|</h2> diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt new file mode 100644 index 000000000..cf11d70a3 --- /dev/null +++ b/Documentation/CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt @@ -0,0 +1,15 @@ +.. Automatic screenshot: Remove this line if you want to manually change this file + +.. code-block:: typoscript + :caption: Extension examples, file Configuration/TypoScript/Syntax/ObjectUnset/setup.typoscript + + myIdentifier.mySubIdentifier = TEXT + myIdentifier.mySubIdentifier = myValue + myIdentifier.mySubIdentifier.stdWrap = <p>|</p> + + # "myIdentifier.mySubIdentifier" is completely removed, including value + # assignment and sub identifier "stdWrap" + myIdentifier.mySubIdentifier > + + # Same as above: Everything after ">" operator is considered a comment + myIdentifier.mySubIdentifier > // Some comment diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 98c6d21a7..a5599653e 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -45,7 +45,7 @@ chapter of TYPO3 Explained. Introduction/Index Guide/Index UsingSetting/Index - + Syntax/Index .. toctree:: :caption: Reference diff --git a/Documentation/Syntax/CodeBlocks/Index.rst b/Documentation/Syntax/CodeBlocks/Index.rst new file mode 100644 index 000000000..a3afe2bd7 --- /dev/null +++ b/Documentation/Syntax/CodeBlocks/Index.rst @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt +.. index:: + TypoScript; Operator "{ }" + TypoScript; Code blocks +.. _typoscript-syntax-syntax-code-blocks: +.. _typoscript-syntax-syntax-curly-brackets: + +=========== +Code blocks +=========== + +Curly braces can be used to structure identifier paths in a more efficient way: +Without repeating upper parts of a path in each line. This allows nesting. + +Example without braces: + +.. include:: /CodeSnippets/TypoScriptSyntax/CodeBlock1.rst.txt + +This can be written as: + +.. include:: /CodeSnippets/TypoScriptSyntax/CodeBlock2.rst.txt + +Curly braces can be nested to further improve readability. This is also +the same as above: + +.. include:: /CodeSnippets/TypoScriptSyntax/CodeBlock3.rst.txt + +Some rules apply during parsing: + +- Everything on the same line after the opening :typoscript:`{` and closing + :typoscript:`}` brace is considered a comment, even if the comment markers + :typoscript:`#`, :typoscript:`//` and :typoscript:`/* ... */` are missing. + +- The closing brace :typoscript:`}` must be on a single line in order to close a block. + The following construct is invalid, the closing brace is interpreted as part of + the value, so the TypoScript and TSconfig backend modules will mumble with a + "missing closing brace" warning: + + .. include:: /CodeSnippets/TypoScriptSyntax/CodeBlockInvalidClosingBrace.rst.txt + +- Conditions can not be placed within blocks, they are always "global" level + and stop any brace nesting. The following construct is invalid, the TypoScript and + TSconfig backend modules will mumble with a "missing closing brace" warning: + + .. include:: /CodeSnippets/TypoScriptSyntax/CodeBlockInvalidCondition.rst.txt + +- Nesting is per-file / per-text-snippet: It does not "swap" into included files. This + was the case with the old TypoScript parser. It has been a nasty side-effect, leading + to hard to debug problems. File includes with :typoscript:`@import` + within curly braces are not relative (anymore). + + A construct like this is invalid, the TypoScript and TSconfig backend modules will mumble + with a "missing closing brace" warning: + + .. include:: /CodeSnippets/TypoScriptSyntax/CodeBlockInvalidImport.rst.txt diff --git a/Documentation/Syntax/Comments/Index.rst b/Documentation/Syntax/Comments/Index.rst new file mode 100644 index 000000000..657be0c56 --- /dev/null +++ b/Documentation/Syntax/Comments/Index.rst @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +.. index:: + TypoScript; Comments + TypoScript; Operator "//" + TypoScript; Operator "#" + TypoScript; Single line comments + TypoScript; Operator "/*" + TypoScript; Comment blocks +.. _typoscript-syntax-syntax-comments: +.. _typoscript-syntax-syntax-comment-blocks: + +======== +Comments +======== + +TypoScript supports single line comments as well as multiline comment blocks. + +.. note:: + .. versionchanged:: 12.0 + + Comment handling has been relaxed significantly with the rewritten TypoScript + parser in TYPO3 v12. The parser is much less picky detecting comments, they + can be placed almost everywhere since v12, :typoscript:`*/` no longer needs + to be on a single line, and comments are auto-closed at the end of a single + text snippets. + +:typoscript:`//` and :typoscript:`#` indicate a comment. Everything until the end +of the line will be ignored by the parser. :typoscript:`/*` indicates a multiline +comment start, :typoscript:`*/` stops it. + +When using :typoscript:`//`, :typoscript:`#` and :typoscript:`/*` after an assignment +:typoscript:`=`, this is *not* considered a comment, but part of the value! Same is +true for multiline assignments. + +Some examples: + +.. include:: /CodeSnippets/TypoScriptSyntax/Comments.rst.txt diff --git a/Documentation/Syntax/Conditions/Index.rst b/Documentation/Syntax/Conditions/Index.rst new file mode 100644 index 000000000..ba71d2334 --- /dev/null +++ b/Documentation/Syntax/Conditions/Index.rst @@ -0,0 +1,164 @@ +.. include:: /Includes.rst.txt +.. index:: + TypoScript; Operator "[" + TypoScript; Conditions + TypoScript; [GLOBAL] condition + TypoScript; Symfony expression language +.. _typoscript-syntax-conditions: +.. _typoscript-syntax-syntax-square-brackets: +.. _typoscript-syntax-syntax-conditions: +.. _typoscript-syntax-syntax-value: +.. _typoscript-syntax-else-condition: +.. _typoscript-syntax-end-condition: +.. _typoscript-syntax-global-condition: +.. _typoscript-syntax-conditions-expression-language: +.. _typoscript-syntax-implementing-custom-conditions: + + +========== +Conditions +========== + +TypoScript can contain :code:`if` and :code:`if / else` control structures. They +are called `conditions`, their "body" is only considered if a condition criteria +evaluates to true. Examples of condition criteria are: + +- Is a user logged in? + +- Is it Monday? + +- Is the page called in a certain language? + +Conditions are a TypoScript syntax construct. They are thus available in both +frontend TypoScript and backend TSconfig. However, condition criteria are based +on prepared variables and functions, and those are different in frontend +TypoScript and backend TSconfig. For example, the :typoscript:`frontend` variable does +not exist in TSconfig, it is (obviously) impossible to have a backend TSconfig +condition that checks for a logged in frontend user. + +For a reference of allowed condition criteria, please refer to the according +chapter in the :ref:`frontend TypoScript Reference <conditions>` and +the :ref:`backend TSconfig Reference <t3tsconfig:conditions>`. These references +come with examples for single condition criteria as well. + +The TSconfig and TypoScript backend modules show lists of existing conditions +and allow simulating criteria verdicts to analyze their impact on the +resulting TypoScript tree. + +Condition criteria are based on +the `Symfony expression language <https://symfony.com/doc/current/components/expression_language/syntax.html>`__. +The Core allows extending the Symfony expression language with own variables and +functions, see :ref:`symfony expression language API <t3coreapi:sel-within-typoscript-conditions>` +for more details. + + +Basic example +============= + +.. include:: /CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt + + +.. _typoscript-syntax-conditions-syntax: + +Syntax and rules +================ + +The general syntax is like this: + +.. include:: /CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt + +These general rules apply: + +* Conditions are encapsulated in :typoscript:`[` and :typoscript:`]` + +* :typoscript:`[ELSE]` negates a previous condition criteria and can contain + a new body until :typoscript:`[END]` or :typoscript:`[GLOBAL]`. :typoscript:`[ELSE]` + is considered if the condition criteria did *not* evaluate to true. + +* :typoscript:`[END]` and :typoscript:`[GLOBAL]` stop a given condition scope. + This is similar to a closing curly brace :code:`}` in programming languages like PHP. + +* Multiple condition criteria can be combined using :typoscript:`or` or :typoscript:`||`, + as well as :typoscript:`and` or :typoscript:`&&` + +* Single criteria can be negated using :typoscript:`!` + + .. versionchanged:: 12.0 + + :typoscript:`[END]` and :typoscript:`[GLOBAL]` behave exactly the same. Both + are kept for historical reasons (for now). + +* Conditions can use constants. They are available in frontend TypoScript "setup" and + in TSconfig from "site settings". A simple example if this constant + :typoscript:`myPageUid = 42` is set: + + .. code-block:: typoscript + + [traverse(page, "uid") == {$myPageUid}] + page.10.value = Page uid is 42 + [end] + +* Conditions can *not* be nested within code blocks. + + .. versionchanged:: 12.0 + + Conditions *can* be nested into each other, if they are located in + different snippets (files or records), see example below. They can *not* be nested + within the same code snippet. + +* A second condition that is *not* :typoscript:`[ELSE]`, :typoscript:`[END]` + or :typoscript:`[GLOBAL]` *stops* a previous condition and starts a new one. + This is the main reason conditions can *not* be nested within one text snippet. + +* .. versionchanged:: 12.0 + + :typoscript:`@import` *can* be nested + inside conditions. This allows conditional includes and is a new feature of the + TYPO3 v12 parser. + +* .. versionchanged:: 12.0 + + Conditions automatically stop at the end of a text snippet (file or record), even + without :typoscript:`[END]` or :typoscript:`[GLOBAL]`. Another snippet on the same + level is in "global" scope automatically. The backend TypoScript and + TSconfig modules may mumble about a not properly closed condition, though. + +* .. versionadded:: 12.1 + + Using the null-safe operator is possible when accessing properties on objects + which might not be available in some context, for example `TSFE` in the + backend: + + .. code-block:: typoscript + + # Previously + [getTSFE() && getTSFE().id == 123] + + # Now + [getTSFE()?.id == 123] + + +.. _typoscript-syntax-conditions-usage: +.. _typoscript-syntax-conditions-combine: +.. _typoscript-syntax-conditions-confinements: +.. _typoscript-syntax-conditions-braces: +.. _typoscript-syntax-the-global-condition: +.. _typoscript-syntax-conditions-examples: + +Examples +======== + +* If a user is logged in, or if the client is local, text will be + output in upper case: + + .. include:: /CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt + +* In case :code:`if` is empty and only a :code:`else` body is needed for a + single condition criteria, these two are identical: + + .. include:: /CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt + +* Conditions can *not* be nested within curly braces. The example below + is invalid syntax and the backend modules mumble with "missing braces": + + .. include:: /CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt diff --git a/Documentation/Syntax/FileImports/Index.rst b/Documentation/Syntax/FileImports/Index.rst new file mode 100644 index 000000000..83fd88850 --- /dev/null +++ b/Documentation/Syntax/FileImports/Index.rst @@ -0,0 +1,234 @@ +.. include:: /Includes.rst.txt +.. index:: TypoScript; Includes +.. _typoscript-syntax-includes: + +============ +File imports +============ + +.. deprecated:: 13.4 + The old school :typoscript:`<INCLUDE_TYPOSCRIPT:` syntax has been deprecated + and will be removed with TYPO3 v14.0. See :ref:`t3coreapi/13:typoscript-syntax-includes-migration`. + +To structure and reuse single TypoScript snippets and not stuffing everything +into one file or record, the syntax allows loading TypoScript content from sub files. + +The keyword :typoscript:`@import` is a syntax construct and +thus available in both frontend TypoScript and backend TSconfig. + +:typoscript:`@import` allows including additional files using wildcards on the file +level. Wildcards in paths are not allowed. + +The TypoScript parser allows to place :typoscript:`@import` within condition +bodies, which allows conditional imports with :typoscript:`@import`. + +:typoscript:`@import` is not allowed to be placed within code blocks +and breaks any curly braces level, resetting current scope +to top level. + +.. _typoscript-syntax-import: + +@import +======= + +This keyword allows including files inspired by a syntax similar to :code:`SASS`. +It is restricted, but still allows wildcards on file level. Single files *must* end +with :file:`.typoscript` if included in frontend Typoscript. In backend TSconfig, +single files *should* end with :file:`.tsconfig`, but *may* end with +:typoscript:`.typoscript` as well (for now). + +The include logic is a bit more restrictive with TYPO3 v12, previous versions +have been slightly more relaxed in this regard. See +:doc:`this changelog <ext_core:Changelog/12.0/Breaking-97816-TypoScriptSyntaxChanges>` +for more details. + +The following rules apply: + +* Multiple files are imported in alphabetical order. + If a special loading order is desired it is common to prefix the filenames with + numbers that increase for files that shall be loaded later. + +* Recursion is allowed: Imported files can have :typoscript:`@import` statements. + +* The :typoscript:`@import` statement does not take a condition clause as the old + :typoscript:`<INCLUDE_TYPOSCRIPT condition="">` statement did. That kind of condition + should be considered a conceptual mistake. It should not be used. + +* .. versionchanged:: 12.0 + + It is allowed to put :typoscript:`@import` within a condition. This example imports + the additional file only if a frontend user is logged in: + + .. code-block:: typoscript + + [frontend.user.isLoggedIn] + @import './userIsLoggedIn.typoscript' + [END] + +* Both the old syntax :typoscript:`<INCLUDE_TYPOSCRIPT>` and the new one :typoscript:`@import` + can be used at the same time. + +* Directory imports are not recursive, meaning that a directory import does + not automatically travel down its subdirectories. + +* Quoting the filename is necessary with the new syntax. Either double quotes + (") or single quotes (') can be used. + +* Wildcards :typoscript:`*` are only allowed on file level, not on directory level. + Only a single wildcard character is allowed. + +* Includes relative to the current file location are allowed using :typoscript:`./` + as prefix. + +* Includes must start with :typoscript:`EXT:` if not relative. Loading files + outside of extensions is not possible. + +* Directory traversal using :typoscript:`../` is not allowed. + +Some examples: + +.. code-block:: typoscript + + # Import a single file + @import 'EXT:my_extension/Configuration/TypoScript/randomfile.typoscript' + + # Import multiple files in a single directory, sorted by file name + @import 'EXT:my_extension/Configuration/TypoScript/*.typoscript' + + # It's possible to omit the file ending. For frontend TypoScript, ".typoscript" is + # appended automatically, backend TSconfig allows both ".typoscript" and ".tsconfig" + @import 'EXT:my_extension/Configuration/TypoScript/' + + # Import files starting with "foo", ending with ".typoscript" (frontend) + @import 'EXT:my_extension/Configuration/TypoScript/foo*' + + # Import files ending with ".setup.typoscript" + @import 'EXT:my_extension/Configuration/TypoScript/*.setup.typoscript' + + # Import "bar.typoscript" relative to current file + @import './bar.typoscript' + + # Import all ".setup.typoscript" files in sub directory relative to current file + @import './subDirectory/*.setup.typoscript' + + +.. _typoscript-syntax-includes-alternatives: + +Alternatives to using file imports +================================== + +The following features can make file inclusion unnecessary: + +* :ref:`Automatic global inclusion of user TSconfig of extensions <t3tsconfig:usersettingdefaultusertsconfig>` +* :ref:`Automatic global inclusion of page TSconfig of extensions <t3tsconfig:pagesettingdefaultpagetsconfig>` +* :ref:`Automatic page TSconfig on site level <t3tsconfig:include-static-page-tsconfig-per-site>` +* :ref:`TypoScript provider for sites and sets <site-sets-typoscript>` + automatically loads TypoScript per site when the site set is included in the + site configuration. + + +.. index:: TypoScript; Includes by conditions +.. _typoscript-syntax-includes-conditions: +.. _typoscript-syntax-includes-best-practices: +.. _typoscript-syntax-includes-migration: + +Migration from `<INCLUDE_TYPOSCRIPT:` to `@import` +================================================== + +.. important:: + :typoscript:`@import` does not support recursively including all `.typoscript` + files from sub directories. You need to list each directory with its own + :typoscript:`@import` statement. + See :ref:`typoscript-syntax-includes-migration-recursive`. + +.. important:: + :typoscript:`@import` supports the file endings `.typoscript` and `.tsconfig` + only. All other file names will be ignored. Rename all TypoScript files to + these endings. + +Most usages of :typoscript:`<INCLUDE_TYPOSCRIPT:` can be turned into :typoscript:`@import` +easily. A few examples: + +.. code-block:: diff + + -<INCLUDE_TYPOSCRIPT: source="FILE:EXT:my_extension/Configuration/TypoScript/myMenu.typoscript"> + +@import 'EXT:my_extension/Configuration/TypoScript/myMenu.typoscript' + + # Including .typoscript files in a single (non recursive!) directory + -<INCLUDE_TYPOSCRIPT: source="DIR:EXT:my_extension/Configuration/TypoScript/" extensions="typoscript"> + +@import 'EXT:my_extension/Configuration/TypoScript/*.typoscript' + + # Including .typoscript and .ts files in a single (non recursive!) directory + -<INCLUDE_TYPOSCRIPT: source="DIR:EXT:my_extension/Configuration/TypoScript/" extensions="typoscript,ts"> + +@import 'EXT:my_extension/Configuration/TypoScript/*.typoscript' + # Rename all files ending from .ts to .typoscript + + # Including a file conditionally + -<INCLUDE_TYPOSCRIPT: source="FILE:EXT:my_extension/Configuration/TypoScript/user.typoscript" condition="[frontend.user.isLoggedIn]"> + +[frontend.user.isLoggedIn] + + @import 'EXT:my_extension/Configuration/TypoScript/user.typoscript' + +[END] + +There are a few more use cases that cannot be transitioned so easily since +:typoscript:`@import` is a bit more restrictive. + +As one restriction :typoscript:`@import` cannot include files from arbitrary directories +like :file:`fileadmin/`, but only from extensions by using the :typoscript:`EXT:` +prefix. Instances that use :typoscript:`<INCLUDE_TYPOSCRIPT:` with :typoscript:`source="FILE:./someDirectory/..."` +should move these TypoScript files into a project or site extension. Such instances are also encouraged to +look into the TYPO3 v13 :ref:`Site sets <site-sets>` feature and eventually transition towards it along the way. + +:typoscript:`@import` allows to import files with the file ending `.typoscript` +and `.tsconfig`. If you used any of the outdated file endings like `.ts` or +`.txt` rename those files before switching to the :typoscript:`@import` syntax. + +.. _typoscript-syntax-includes-migration-recursive: + +Migrating recursive TypoScript file inclusion +--------------------------------------------- + +If you have such a tree of TypoScript files: + +.. directory-tree:: + :show-file-icons: true + + * EXT:my_sitepackage/Configuration/TypoScript/ + + * Setup + + * Extensions + + * Solr + + * indexing.typoscript + * searchPlugin.typoscript + + * news.typoscript + * tt_address.typoscript + + * ContentElements + + * file1.typoscript + * file2.typoscript + * file3.typoscript + + * myProject.typoscript + * someSettings.typoscript + + * setup.typoscript + +Each directory **must** be listed separately for inclusion when migrating to +the `@import` statement: + +.. code-block:: diff + :caption: EXT:my_sitepackage/Configuration/TypoScript/setup.typoscript (Difference) + + -<INCLUDE_TYPOSCRIPT: source="FILE:EXT:my_sitepackage/Configuration/TypoScript/Setup"> + + +@import 'EXT:my_sitepackage/Configuration/TypoScript/Setup' + +@import 'EXT:my_sitepackage/Configuration/TypoScript/Extensions' + +@import 'EXT:my_sitepackage/Configuration/TypoScript/Extensions/Solr' + +@import 'EXT:my_sitepackage/Configuration/TypoScript/ContentElements' + +The need for recursive includes may also be mitigated by restructuring +TypoScript based functionality using :ref:`Site sets <t3coreapi:site-sets>`. diff --git a/Documentation/Syntax/Identifiers/Index.rst b/Documentation/Syntax/Identifiers/Index.rst new file mode 100644 index 000000000..765bac7d3 --- /dev/null +++ b/Documentation/Syntax/Identifiers/Index.rst @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt +.. index:: + TypoScript; Identifier +.. _typoscript-syntax-basics: +.. _typoscript-syntax-syntax-object-path: + +=========== +Identifiers +=========== + +TypoScript is line based. Each line normally contains three parts: + +.. code-block:: text + + [Identifier] [Operator] [Value] + + +In this example we have the identifier :typoscript:`myIdentifier` with the sub identifier +:typoscript:`mySubIdentifier`, the assignment operator :typoscript:`=` and the value :typoscript:`myValue`. + +.. include:: /CodeSnippets/TypoScriptSyntax/Identifiers1.rst.txt + +The identifier path (in above example :typoscript:`myIdentifier.mySubIdentifier`) is +a dotted path of single identifiers, and the first block of non-whitespace characters +on a line until an operator, a curly open brace, or a whitespace. The dot (:typoscript:`.`) +is used to separate single identifiers, creating a hierarchy. + +When a dot is part of a single identifier name (this may, for instance, sometimes happen when configuring +FlexForm details), it must be quoted with a backlash. The example below results in the +identifier :typoscript:`myIdentifier` with the sub identifier :typoscript:`my.identifier.with.dots` +having the assigned value :typoscript:`myValue`: + +.. include:: /CodeSnippets/TypoScriptSyntax/Identifiers2.rst.txt diff --git a/Documentation/Syntax/Index.rst b/Documentation/Syntax/Index.rst new file mode 100644 index 000000000..682290f54 --- /dev/null +++ b/Documentation/Syntax/Index.rst @@ -0,0 +1,22 @@ +:navigation-title: Syntax +.. include:: /Includes.rst.txt +.. index:: TypoScript; Syntax +.. _typoscript-syntax: + +================= +TypoScript syntax +================= + +This chapter is about the syntax of TypoScript: The rules you must obey in order to +store configuration in this structure. + +.. toctree:: + :titlesonly: + :glob: + + Identifiers/Index + CodeBlocks/Index + Operators/Index + Comments/Index + Conditions/Index + FileImports/Index diff --git a/Documentation/Syntax/Operators/Index.rst b/Documentation/Syntax/Operators/Index.rst new file mode 100644 index 000000000..11ccfc102 --- /dev/null +++ b/Documentation/Syntax/Operators/Index.rst @@ -0,0 +1,335 @@ +.. include:: /Includes.rst.txt +.. index:: TypoScript; Operator +.. _typoscript-syntax-syntax-operator: + +========= +Operators +========= + +TypoScript syntax comes with a couple of operators to assign +values, copy from other identifier paths, and to manipulate values. +Let's have a closer look at them. + +.. index:: + TypoScript; Operator "=" + TypoScript; Value assignment +.. _typoscript-syntax-syntax-equal-operator: +.. _typoscript-syntax-syntax-value-assignment: + +Value assignment with "=" +========================= + +This most common operator assigns a single line value to an identifier path. +Everything after the :typoscript:`=` character until the end of the line is +considered to be the value. The value is trimmed, leading and trailing whitespaces +are removed. + +Values are parsed for constant references. With a value assignment like +:typoscript:`foo = someText {$someConstant} furtherText`, the parser will +look up the constant reference :typoscript:`{$someConstant}` and tries to +substitute it with a defined constant value. If such a constant does not +exist, it falls back to the string literal including the :typoscript:`{$` and +:typoscript:`}` characters. + +A couple of examples: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorAssignment.rst.txt + +.. caution:: + The TypoScript parser looks for valid operators first, then parses things + behind it. Consider this example: + + .. code-block:: typoscript + + lib.nav.wrap =<ul id="nav">|</ul> + + This is ambiguous: The above :typoscript:`=<ul` could be interpreted both as + an assignment :typoscript:`=` of the value :typoscript:`<ul`, or as a + :ref:`reference <typoscript-syntax-syntax-object-referencing>` + :typoscript:`=<` to the identifier :typoscript:`ul`. + + Before TYPO3 v12.0 the TypoScript parser interpreted this as an assignment, + since TYPO3 v12.0 it is treated as a reference. + + The above example aims for an assignment, though, which can be achieved by + adding a whitespace between :typoscript:`=` and :typoscript:`<`: + + .. code-block:: typoscript + + lib.nav.wrap = <ul id="nav">|</ul> + +.. index:: + TypoScript; Operator "( )" + TypoScript; Multi-line values +.. _typoscript-syntax-syntax-round-brackets: +.. _typoscript-syntax-syntax-multiline-values: + +Multiline assignment with "(" and ")" +===================================== + +Opening and closing parenthesis are used to assign multi-line values. This allows +defining values that span several lines and thus include line breaks. + +The end parenthesis :typoscript:`)` is important: If it is not found, the parser +considers all following lines until the end of the TypoScript text snipped to be part +of the value. This includes comments, :typoscript:`[GLOBAL]` conditions and :typoscript:`@import` +file includes: They are not a syntax construct and are considered part of the value assignment. + +However, the value is parsed for constants (text looking like :typoscript:`{$myIdentifier.mySubIdentifier}`: +The parser will try to substitute them to their assigned constant value. The "TypoScript" and +"Page TSconfig" backend modules may show a warning if a reference to a constant can't be resolved. +If a constant reference can't be resolved, the value falls back to its string literal. +Since multi-line values are sometimes used to output JavaScript, and JavaScript also uses a +syntax construct like :typoscript:`{$...}`, this may lead to false positive warnings in those +backend modules. + +A couple of examples: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorMultiLine.rst.txt + + +.. index:: + TypoScript; Operator ">" + TypoScript; Object unsetting +.. _typoscript-syntax-syntax-bigger-than-operator: +.. _typoscript-syntax-syntax-unsetting-operator: + +Unset with ">" +============== + +This can be used to unset a previously defined identifier path value, and +all of its sub identifiers: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt + + +.. index:: + TypoScript; Operator "<" + TypoScript; Object copying +.. _typoscript-syntax-syntax-smaller-than-operator: +.. _typoscript-syntax-syntax-object-copying: + +Copy with "<" +============= + +The :typoscript:`<` character is used to copy one identifier path to another. +The whole current identifier state is copied: both value and sub identifiers. +It overrides any old sub identifiers and values at that position. + +The copy operator is useful to follow the +`DRY - Don't repeat yourself <https://en.wikipedia.org/wiki/Don%27t_repeat_yourself>`__ +principle. It allows maintaining a configuration set at a central place, and copies are +used at further places when needed again. + +The result of the below TypoScript is two independent sets which are duplicates. +They are not references to each other but actual copies: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorCopy1.rst.txt + +The copy operator is allowed within code blocks as well: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorCopy2.rst.txt + +In the above example, the copied identifier path is referred to with its full path +:typoscript:`myIdentifier.10`. When copying on the same level, it is allowed +to use a relative path, indicated by a prepended dot. The following produces +the same result as above: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorCopy3.rst.txt + +Using the copy operator creates a copy of the source path at exactly this point +in the parsing process. Changing the source afterwards does not change the +target, and changing the target afterwards does not change the source: + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorCopy4.rst.txt + + +.. index:: + TypoScript; Operator "=<" + TypoScript; References +.. _typoscript-syntax-syntax-equal-smaller-than-operator: +.. _typoscript-syntax-syntax-object-referencing: + +References with "=<" +==================== + +.. note:: + + The reference operator :typoscript:`=<` is not a general syntax construct. + Even though the TypoScript and TSconfig backend modules show usages of + the operator, they are only resolved in frontend TypoScript for the + special :typoscript:`tt_content` path: You can use :typoscript:`=<` + in frontend TypoScript for example with + :typoscript:`tt_content.text =< lib.contentElement`, and you are encouraged + to do so in this special case for performance reasons, but this operator + does not work anywhere else. + +In the context of frontend TypoScript, it is possible to create +references from one identifier path to another within the :typoscript:`tt_content` +path. References mean that multiple positions can copy the same source +identifier path without making an actual copy. This allows changes to the +source identifier afterwards, which changes the targets as well. References can +be convenient for this special case, but should be used with caution. + +.. include:: /CodeSnippets/TypoScriptSyntax/OperatorReference.rst.txt + +.. index:: + TypoScript; Operator ":=" + TypoScript; Value modifications +.. _typoscript-syntax-syntax-colon-equal-operator: +.. _typoscript-syntax-syntax-value-modification: + +Value modifications with ":=" +============================= + +This operator assigns a value to an identifier path by calling a +predefined function which modifies the existing value in different ways. +This is very useful when a value should be modified without completely +redefining it again. + +A modifier is referenced by its modifier name, plus arguments in +parenthesis. These predefined functions are available: + +`prependString()` + Add a string to the beginning of the existing value. + + .. code-block:: typoscript + + foo = cd + foo := prependString(ab) + # foo is "abcd" + +`appendString()` + Add a string to the end of the existing value. + + .. code-block:: typoscript + + foo = ab + foo := appendString(cd) + # foo is "abcd" + +`removeString()` + Remove a string from the existing value. + + .. code-block:: typoscript + + foo = foobarfoo + foo := removeString(foo) + # foo is "bar" + +`replaceString()` + Replace old with new value. Separate these using :code:`|`. + + .. code-block:: typoscript + + foo = abcd + foo := replaceString(bc|123) + # foo is "a123d" + +`addToList()` + Add values to the end of a list of existing values. There is no check for + duplicate values, and the list is not sorted in any way. + + .. code-block:: typoscript + + foo = 123,456 + foo := addToList(789) + # foo is "123,456,789" + + foo = + foo := addToList(123) + # foo is "123" (no leading comma added on empty existing value) + +`removeFromList()` + Remove a comma-separated list of values from an existing comma-separated + list of values. Empty values are removed as well. + + .. code-block:: typoscript + + foo = foo,123,bar,456,foo,,789 + foo:= removeFromList(foo,bar) + # foo is "123,456,789" + +`uniqueList()` + Remove duplicate entries from a comma-separated list of values. + + .. code-block:: typoscript + + foo = 123,456,abc,456,456 + foo := uniqueList() + # foo is "123,456,abc" + +`reverseList()` + Reverses the order of entries in a comma-separated list of values. + + .. code-block:: typoscript + + foo = 123,456,abc,456 + foo := reverseList() + # foo is "456,abc,456,123" + +`sortList()` + Sorts the entries in a comma-separated list of values. There are optional + sorting parameters, multiple can be separated using :typoscript:`,`: + + ascending (default) + Sort the items in ascending order: First numbers from small to big, then + letters in alphabetical order. + + descending + Sort the items in descending order: First letters in descending order, then + numbers from big to small. + + numeric + Apply numeric sorting: Numbers from small to big, letters sorted after "0". + + .. code-block:: typoscript + + foo = 10,100,0,20,abc + foo := sortList() + # foo is "0,10,20,100,abc" + + foo = 10,0,100,-20 + foo := sortList(numeric) + # foo is "-20,0,10,100" + + foo = 10,100,0,20,-20 + foo := sortList(numeric,descending) + # foo is "100,20,10,0,-20" + +`getEnv()` + Access a $_ENV value. Resolves to empty value if not set. + + .. code-block:: typoscript + + # $_ENV['foo'] = 'fooValue' + foo := getEnv(foo); + # foo is "fooValue" + +`myCustomFunction()` + .. versionchanged:: 12.0 + + The PSR-14 event :php:`\TYPO3\CMS\Core\TypoScript\AST\Event\EvaluateModifierFunctionEvent` + is available to define custom TypoScript functions. The event replaces the hook + :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsparser.php']['preParseFunc']`. + + The section :ref:`EvaluateModifierFunctionEvent <t3coreapi:EvaluateModifierFunctionEvent>` + provides an example and the API. + +Null coalescing operator `??` for TypoScript constants +======================================================= + +.. versionadded:: 13.1 + +TypoScript constants expressions support a null coalescing +operator (`??`) as a way for providing a migration path from a legacy constant +name to a newer name, while providing full backwards compatibility for the +legacy constant name, if still defined. + +Example that evaluates to `$config.oldThing` if set, otherwise the newer setting +`$myext.thing` would be used: + +.. code-block:: typoscript + :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript + + plugin.tx_myext.settings.example = {$config.oldThing ?? $myext.thing} From 09dbaf533e5c166212126f8872835798fcd0d710 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Fri, 1 Nov 2024 13:00:34 +0100 Subject: [PATCH 026/125] [TASK] Adjust TypoScript Syntax links (#1403) Releases: main, 13.4, 12.4 (cherry picked from commit 0784ff0b212d076d1bf15c52aa7ce19c95f92672) --- Documentation/About.rst | 6 +++--- Documentation/Conditions/Index.rst | 4 ++-- Documentation/Glossary.rst | 6 +++--- Documentation/Guide/Index.rst | 3 +-- Documentation/Guide/NextSteps/Index.rst | 2 +- .../Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt | 2 +- Documentation/Index.rst | 4 ++-- Documentation/Introduction/Index.rst | 6 +++--- Documentation/Syntax/FileImports/Index.rst | 2 +- Documentation/TopLevelObjects/Index.rst | 2 +- Documentation/TopLevelObjects/Other.rst | 4 ++-- Documentation/UsingSetting/Constants.rst | 2 +- Documentation/UsingSetting/Entering.rst | 2 +- 13 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Documentation/About.rst b/Documentation/About.rst index 252b69695..3adbad0f8 100644 --- a/Documentation/About.rst +++ b/Documentation/About.rst @@ -13,10 +13,10 @@ TypoScript as used in frontend TypoScript configuration, and not in .. seealso:: - * For explanations about the syntax of TypoScript itself, + * For explanations about the syntax of TypoScript, please refer to the - :ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>` - chapter in "TYPO3 Explained" + :ref:`TypoScript Syntax <typoscript-syntax>` + chapter. * For an introduction to TypoScript configuration, see :ref:`guide` .. _credits: diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 811153567..3df437d1f 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -24,7 +24,7 @@ on current data. .. seealso:: Have a look at the - :ref:`TypoScript syntax condition chapter <t3coreapi:typoscript-syntax-conditions>` + :ref:`TypoScript syntax condition chapter <typoscript-syntax-conditions>` for the basic syntax of conditions. The :ref:`Symfony expression language <t3coreapi:symfony-expression-language>` @@ -1343,7 +1343,7 @@ Check if a constant is set to a certain value --------------------------------------------- TypoScript constants can be used in conditions with the -:ref:`Syntax <t3coreapi:typoscript-syntax-conditions-syntax>` for conditions: +:ref:`Syntax <typoscript-syntax-conditions-syntax>` for conditions: .. code-block:: typoscript :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript diff --git a/Documentation/Glossary.rst b/Documentation/Glossary.rst index 34e76b3ac..963ecc2d4 100644 --- a/Documentation/Glossary.rst +++ b/Documentation/Glossary.rst @@ -7,10 +7,10 @@ Glossary ======== -We use the terms as explained in :ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-introduction>`, +We use the terms as explained in :ref:`TypoScript Syntax <typoscript-syntax>`, with some modifications: -The section :ref:`t3coreapi:typoscript-syntax-object-paths` differentiates between Object paths, Objects, +We differentiates between Object paths, Objects, properties and values. To reuse the OOP analogy and compare with PHP: @@ -110,7 +110,7 @@ cObject data type used for content elements. Top level objects - As described in :ref:`t3coreapi:typoscript-syntax-introduction` + As described in :ref:`typoscript-syntax` TypoScript configuration is converted into a multidimensional PHP array. You can view this in the :ref:`submodule-active-typoscript`. Top level objects are located on the top level. Top level objects are for diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index 12c66d096..5bf3fabd4 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -12,8 +12,7 @@ Furthermore, you can find a full reference of all object types and properties of TypoScript in the :doc:`TypoScript Reference <Index>`, insights into TYPO3 backend configuration with TypoScript in the :doc:`TSconfig <t3tsconfig:Index>` documentation and explanations of TypoScript syntax in the -":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" chapter of TYPO3 -Explained. +":ref:`TypoScript Syntax <typoscript-syntax>`" chapter. ---- diff --git a/Documentation/Guide/NextSteps/Index.rst b/Documentation/Guide/NextSteps/Index.rst index 7cefc62ba..df301096b 100644 --- a/Documentation/Guide/NextSteps/Index.rst +++ b/Documentation/Guide/NextSteps/Index.rst @@ -12,7 +12,7 @@ guide you through the creation of a whole website template using TypoScript. To learn more about the structure and syntax of TypoScript, -you can refer to the :ref:`TypoScript Syntax and In-depth Study<t3coreapi:typoscript-syntax-start>` +you can refer to the :ref:`TypoScript Syntax and In-depth Study <typoscript-syntax>` reference. Finally - as was mentioned again and again throughout this tutorial - diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt b/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt index 39595bf9f..0b45ea0cc 100644 --- a/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt +++ b/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt @@ -94,4 +94,4 @@ and makes the script easier to read. In addition it reduces the repetition of variable names making it easier to rename an object. The full reference for the syntax is found in the -:ref:`TypoScript Syntax and In-depth Study<t3coreapi:typoscript-syntax-start>`. +:ref:`TypoScript Syntax and In-depth Study <typoscript-syntax>`. diff --git a/Documentation/Index.rst b/Documentation/Index.rst index a5599653e..103e38e39 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -30,8 +30,8 @@ TypoScript as used in frontend TypoScript configuration. You can find a quick guide to TypoScript configuration at :ref:`guide`, insights into TYPO3 backend configuration with TypoScript in the :ref:`TSconfig <t3tsconfig:start>` documentation and -explanations of TypoScript syntax in the ":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" -chapter of TYPO3 Explained. +explanations of TypoScript syntax in the ":ref:`TypoScript Syntax <typoscript-syntax>`" +chapter. ---- diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 3d1c28f9f..9123c90c9 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -45,10 +45,10 @@ to this principle) Please read the following for an introduction: -* :ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>` - chapter in "TYPO3 Explained" for an introduction to the TypoScript +* :ref:`TypoScript Syntax <typoscript-syntax>` + chapter for an introduction to the TypoScript syntax -* :ref:`guide` for an introduction to TypoScript Templating +* :ref:`guide` for an introduction to TypoScript configuration * The chapter :ref:`using-and-setting` describes how to use, set and extend TypoScript. diff --git a/Documentation/Syntax/FileImports/Index.rst b/Documentation/Syntax/FileImports/Index.rst index 83fd88850..3b41d0e0a 100644 --- a/Documentation/Syntax/FileImports/Index.rst +++ b/Documentation/Syntax/FileImports/Index.rst @@ -8,7 +8,7 @@ File imports .. deprecated:: 13.4 The old school :typoscript:`<INCLUDE_TYPOSCRIPT:` syntax has been deprecated - and will be removed with TYPO3 v14.0. See :ref:`t3coreapi/13:typoscript-syntax-includes-migration`. + and will be removed with TYPO3 v14.0. See :ref:`t3tsref/13:typoscript-syntax-includes-migration`. To structure and reuse single TypoScript snippets and not stuffing everything into one file or record, the syntax allows loading TypoScript content from sub files. diff --git a/Documentation/TopLevelObjects/Index.rst b/Documentation/TopLevelObjects/Index.rst index 71440a0ec..016e3baab 100644 --- a/Documentation/TopLevelObjects/Index.rst +++ b/Documentation/TopLevelObjects/Index.rst @@ -7,7 +7,7 @@ Top-level objects ================= -As described in the :ref:`TypoScript syntax introduction <t3coreapi:typoscript-syntax-introduction>` +As described in the :ref:`TypoScript syntax introduction <typoscript-syntax>` TypoScript templates are converted into a multidimensional PHP array. You can view this in the TypoScript object browser. Top level objects are located on the top level. Top level objects are for diff --git a/Documentation/TopLevelObjects/Other.rst b/Documentation/TopLevelObjects/Other.rst index c8dafaba8..61de8ead1 100644 --- a/Documentation/TopLevelObjects/Other.rst +++ b/Documentation/TopLevelObjects/Other.rst @@ -64,8 +64,8 @@ lib TypoScript code. This top-level object is available after the template is cached, - objects in it can therefore be referenced by using the - :ref:`reference operator <t3coreapi:typoscript-syntax-syntax-object-referencing>` :typoscript:`=<`. + objects in it can therefore be referenced by using the + :ref:`reference operator <typoscript-syntax-syntax-object-referencing>` :typoscript:`=<`. Just like with a :confval:`tlo-temp` object copying is also possible. diff --git a/Documentation/UsingSetting/Constants.rst b/Documentation/UsingSetting/Constants.rst index f825db637..3f07d2028 100644 --- a/Documentation/UsingSetting/Constants.rst +++ b/Documentation/UsingSetting/Constants.rst @@ -14,7 +14,7 @@ Constants Constants are values defined in the :guilabel:`Constants` field of a template. They follow the :ref:`syntax of ordinary TypoScript -<t3coreapi:typoscript-syntax-syntax>` and are case sensitive! They are used to +<typoscript-syntax>` and are case sensitive! They are used to manage *in a single place* values, which are later used in *several places*. .. seealso:: diff --git a/Documentation/UsingSetting/Entering.rst b/Documentation/UsingSetting/Entering.rst index 86be072e5..5ba4eba71 100644 --- a/Documentation/UsingSetting/Entering.rst +++ b/Documentation/UsingSetting/Entering.rst @@ -82,7 +82,7 @@ Include TypoScript files **does not work**, even if their names are explicitly used in the import. In both the "Constants" and "Setup" fields, the -:ref:`@import <t3coreapi:typoscript-syntax-includes>` syntax can be +:ref:`@import <typoscript-syntax-includes>` syntax can be used to include TypoScript contained inside files: .. code-block:: typoscript From 2d8e1f0797a345ba89265343556c0705ad0bd957 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:22:18 +0100 Subject: [PATCH 027/125] [BUGFIX] Fix links to former TypoScript syntax (#558) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/TSconfig/Documentation/Index.rst | 2 +- Documentation/TSconfig/Documentation/Introduction/Index.rst | 2 +- .../TSconfig/Documentation/UsingSetting/Conditions.rst | 2 +- .../TSconfig/Documentation/UsingSetting/PageTSconfig.rst | 2 +- Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst | 2 +- .../TSconfig/Documentation/UsingSetting/UserTSconfig.rst | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Documentation/TSconfig/Documentation/Index.rst b/Documentation/TSconfig/Documentation/Index.rst index b7082d92a..9ee7f3b52 100644 --- a/Documentation/TSconfig/Documentation/Index.rst +++ b/Documentation/TSconfig/Documentation/Index.rst @@ -32,7 +32,7 @@ In addition, you can find and a complete reference of all object types and properties of TypoScript in the :ref:`TypoScript Reference <t3tsref:start>` and explanations of TypoScript syntax in the chapter -":ref:`TypoScript Syntax <t3coreapi:typoscript-syntax-start>`" of TYPO3 +":ref:`TypoScript Syntax <t3tsref:typoscript-syntax>`" of TYPO3 Explained. ---- diff --git a/Documentation/TSconfig/Documentation/Introduction/Index.rst b/Documentation/TSconfig/Documentation/Introduction/Index.rst index 22dbfdac5..e2120393b 100644 --- a/Documentation/TSconfig/Documentation/Introduction/Index.rst +++ b/Documentation/TSconfig/Documentation/Introduction/Index.rst @@ -44,7 +44,7 @@ for users and groups ("User TSconfig"). Each variant is further detailed in this The general "dotted notation" of `TypoScript` is re-used for Page TSconfig and User TSconfig, it is possible to reference values, use conditions, and so on. For a general look at the syntax, please read the according section of -:ref:`TYPO3 Explained <t3coreapi:typoscript-syntax-start>`. +:ref:`TYPO3 Explained <t3tsref:typoscript-syntax>`. Other than the basic syntax, TSconfig and frontend TypoScript have nothing in common. Properties outlined in the :ref:`TypoScript Reference <t3tsref:start>` can never be diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst index c867e9963..f6b2d73a3 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst @@ -13,7 +13,7 @@ Conditions ========== TSconfig TypoScript conditions offer a way to conditionally change TypoScript based -on current context. See the :ref:`TypoScript syntax condition chapter <t3coreapi:typoscript-syntax-conditions>` +on current context. See the :ref:`TypoScript syntax condition chapter <t3tsref:typoscript-syntax-conditions>` for the basic syntax of conditions. It is possible to use TypoScript conditions in both user TSconfig and page TSconfig, diff --git a/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst b/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst index 0ca781660..367b06be4 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst @@ -244,7 +244,7 @@ Static and direct page TSconfig are loaded for the page they are set on and all their subpages. The TypoScript syntax to -:ref:`modify <t3coreapi:typoscript-syntax-syntax-value-modification>` values +:ref:`modify <t3tsref:typoscript-syntax-syntax-value-modification>` values can also be used for the page TSconfig. Example diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst index 87eca5958..3c878907b 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst @@ -15,4 +15,4 @@ Please note the following differences: * In TSconfig no constants are available. * There are differences in the :ref:`conditions <conditions>` that can be used. * The general TypoScript syntax is described in - :ref:`TypoScript syntax <t3coreapi:typoscript-syntax-start>`. + :ref:`TypoScript syntax <t3tsref:typoscript-syntax>`. diff --git a/Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst b/Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst index a1b60356f..24e66648c 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst @@ -129,7 +129,7 @@ Properties, which are set in the TSconfig field of a group, are valid for all users of that group. Values set in one group can be overridden and -:ref:`modified <t3coreapi:typoscript-syntax-syntax-value-modification>` in the +:ref:`modified <t3tsref:typoscript-syntax-syntax-value-modification>` in the same or another group. If a user is a member of multiple groups, the TSconfig settings are evaluated in the order in which the groups are included in the user account: When editing the backend user, the selected groups are evaluated @@ -156,7 +156,7 @@ from top to bottom. * You get the value "bold,italic". Finally, you can override or -:ref:`modify <t3coreapi:typoscript-syntax-syntax-value-modification>` the +:ref:`modify <t3tsref:typoscript-syntax-syntax-value-modification>` the settings from groups that your user is a member of in the user TSconfig field of that specific user. From 4afd6ef77b232833a755eb2724cbfe1232a66b41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 06:43:02 +0100 Subject: [PATCH 028/125] [FEATURE] Reorder the chapters in the guide (#1407) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../{ReadingContentRecords => Content}/Index.rst | 5 ++++- .../_Chapters/_ContentElements.rst.txt | 8 ++++---- .../_Chapters/_HtmlTemplate.rst.txt} | 6 +++--- .../_snippets}/_FLUIDTEMPLATE.typoscript | 0 .../_snippets}/_Fluid.html | 0 .../_snippets/_Layout.html | 0 .../_snippets/_PAGE.typoscript | 0 .../_snippets/_lib.contentElement.typoscript | 0 .../_snippets/_tt_content.header.typoscript | 0 .../_snippets/_tt_content.typoscript | 0 .../_FirstSteps.rst.txt => FirstSteps/Index.rst} | 16 ++++++++-------- .../_snippets/_mypage.php | 0 .../_snippets/_mypage.typoscript | 0 .../_snippets/_mypage2.typoscript | 0 .../_snippets/_mypage3.typoscript | 0 .../_snippets/_mypage4.typoscript | 0 .../_snippets/_mypage5.typoscript | 0 Documentation/Guide/Index.rst | 8 ++++---- .../Guide/{CreateAMenu => Menu}/Index.rst | 0 .../_lib.textmenu.typoscript | 0 .../Guide/{CreateAMenu => Menu}/_menu.html | 0 .../{TypoScriptOverview => Overview}/Index.rst | 3 --- .../_Chapters/_BackendConfiguration.rst.txt | 0 .../_Chapters/_MainTemplate.rst.txt | 2 +- .../_Chapters/_Prerequisites.rst.txt | 0 .../_Chapters/_TheTermTemplate.rst.txt | 2 +- .../_Chapters/_TypoScriptAnArray.rst.txt | 4 ++-- .../_Chapters/_WhyTypoScript.rst.txt | 0 .../_snippets/_page.php | 0 .../_snippets/_page.typoscript | 0 .../_snippets/_page1.typoscript | 0 31 files changed, 27 insertions(+), 27 deletions(-) rename Documentation/Guide/{ReadingContentRecords => Content}/Index.rst (95%) rename Documentation/Guide/{ReadingContentRecords => Content}/_Chapters/_ContentElements.rst.txt (90%) rename Documentation/Guide/{HtmlTemplate/Index.rst => Content/_Chapters/_HtmlTemplate.rst.txt} (82%) rename Documentation/Guide/{HtmlTemplate => Content/_snippets}/_FLUIDTEMPLATE.typoscript (100%) rename Documentation/Guide/{HtmlTemplate => Content/_snippets}/_Fluid.html (100%) rename Documentation/Guide/{ReadingContentRecords => Content}/_snippets/_Layout.html (100%) rename Documentation/Guide/{ReadingContentRecords => Content}/_snippets/_PAGE.typoscript (100%) rename Documentation/Guide/{ReadingContentRecords => Content}/_snippets/_lib.contentElement.typoscript (100%) rename Documentation/Guide/{ReadingContentRecords => Content}/_snippets/_tt_content.header.typoscript (100%) rename Documentation/Guide/{ReadingContentRecords => Content}/_snippets/_tt_content.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview/_Chapters/_FirstSteps.rst.txt => FirstSteps/Index.rst} (88%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage.php (100%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage2.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage3.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage4.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview => FirstSteps}/_snippets/_mypage5.typoscript (100%) rename Documentation/Guide/{CreateAMenu => Menu}/Index.rst (100%) rename Documentation/Guide/{CreateAMenu => Menu}/_lib.textmenu.typoscript (100%) rename Documentation/Guide/{CreateAMenu => Menu}/_menu.html (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/Index.rst (95%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_BackendConfiguration.rst.txt (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_MainTemplate.rst.txt (92%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_Prerequisites.rst.txt (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_TheTermTemplate.rst.txt (96%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_TypoScriptAnArray.rst.txt (92%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_Chapters/_WhyTypoScript.rst.txt (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_snippets/_page.php (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_snippets/_page.typoscript (100%) rename Documentation/Guide/{TypoScriptOverview => Overview}/_snippets/_page1.typoscript (100%) diff --git a/Documentation/Guide/ReadingContentRecords/Index.rst b/Documentation/Guide/Content/Index.rst similarity index 95% rename from Documentation/Guide/ReadingContentRecords/Index.rst rename to Documentation/Guide/Content/Index.rst index e06378bd3..7447f9e56 100644 --- a/Documentation/Guide/ReadingContentRecords/Index.rst +++ b/Documentation/Guide/Content/Index.rst @@ -29,7 +29,7 @@ After creating the :ref:`PAGE <page>` object, we use the :ref:`CONTENT content element we use the :ref:`TEXT <cobj-text>` object to perform the actual rendering: -.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_PAGE.typoscript +.. literalinclude:: /Guide/Content/_snippets/_PAGE.typoscript The :ref:`CONTENT <cobj-content>` object executes an SQL query on the database. The query is controlled by the `select` property, which - in @@ -55,5 +55,8 @@ predetermined. Therefore, we have to create TypoScript definitions for every single database field (e.g. for images, image size, image position, link to top, index, etc.). +.. include:: _Chapters/_HtmlTemplate.rst.txt + :show-buttons: + .. include:: _Chapters/_ContentElements.rst.txt :show-buttons: diff --git a/Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt b/Documentation/Guide/Content/_Chapters/_ContentElements.rst.txt similarity index 90% rename from Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt rename to Documentation/Guide/Content/_Chapters/_ContentElements.rst.txt index 70d7f5f49..4a882be1f 100644 --- a/Documentation/Guide/ReadingContentRecords/_Chapters/_ContentElements.rst.txt +++ b/Documentation/Guide/Content/_Chapters/_ContentElements.rst.txt @@ -20,7 +20,7 @@ definition named after that table. In case of content in TYPO3 the table is called `tt_content` therefore the default `renderObj` is also called `tt_content`: -.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_tt_content.typoscript +.. literalinclude:: /Guide/Content/_snippets/_tt_content.typoscript :caption: Content element rendering taken from typo3/sysext/frontend/ext_localconf.php The basic extension for rendering content in TYPO3 since TYPO3 v8 is @@ -33,13 +33,13 @@ looking at the lines starting with `10 =` there is the possibility to add your own templates by setting the corresponding `constant` (in the `Constants` section of a TypoScript record): -.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript +.. literalinclude:: /Guide/Content/_snippets/_lib.contentElement.typoscript :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.typoscript Each content element inherits that configuration. As an example take a look at the content element definition of the content element of type `header`: -.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript +.. literalinclude:: /Guide/Content/_snippets/_tt_content.header.typoscript :caption: Taken from typo3/sysext/fluid_styled_content/Configuration/TypoScript/ContentElement/Header.typoscript First, all configuration options defined in `lib.contentElement` are @@ -55,7 +55,7 @@ the paths (see above). In your own templates you have the data of the currently rendered content element available in the {data} fluid variable. For example take a look at how the text element is rendered: -.. literalinclude:: /Guide/ReadingContentRecords/_snippets/_Layout.html +.. literalinclude:: /Guide/Content/_snippets/_Layout.html :caption: Taken from typo3/sysext/fluid_styled_content/Resources/Private/Templates/Text.html The database field `bodytext` from the `tt_content` table (which is diff --git a/Documentation/Guide/HtmlTemplate/Index.rst b/Documentation/Guide/Content/_Chapters/_HtmlTemplate.rst.txt similarity index 82% rename from Documentation/Guide/HtmlTemplate/Index.rst rename to Documentation/Guide/Content/_Chapters/_HtmlTemplate.rst.txt index 23df2b2fc..71897ae34 100644 --- a/Documentation/Guide/HtmlTemplate/Index.rst +++ b/Documentation/Guide/Content/_Chapters/_HtmlTemplate.rst.txt @@ -7,7 +7,7 @@ Insert content in a HTML template ================================= -Although we now know how to render content, and how to build a menu, we do not +Although we now know how to render content, we do not have a real website yet. Again everything could be done using TypoScript. That would be pretty complex @@ -19,7 +19,7 @@ harder to apply. TYPO3 CMS provides the :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` object, with which we can use Fluid template and render our website with it: -.. literalinclude:: _FLUIDTEMPLATE.typoscript +.. literalinclude:: /Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript In your template file you can now replace the parts that should be filled by TYPO3 with references to the TypoScript configuration objects you defined @@ -27,4 +27,4 @@ earlier. For example to render a template with the menu we defined add: -.. literalinclude:: _Fluid.html +.. literalinclude:: /Guide/Content/_snippets/_Fluid.html diff --git a/Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript b/Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript similarity index 100% rename from Documentation/Guide/HtmlTemplate/_FLUIDTEMPLATE.typoscript rename to Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript diff --git a/Documentation/Guide/HtmlTemplate/_Fluid.html b/Documentation/Guide/Content/_snippets/_Fluid.html similarity index 100% rename from Documentation/Guide/HtmlTemplate/_Fluid.html rename to Documentation/Guide/Content/_snippets/_Fluid.html diff --git a/Documentation/Guide/ReadingContentRecords/_snippets/_Layout.html b/Documentation/Guide/Content/_snippets/_Layout.html similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_snippets/_Layout.html rename to Documentation/Guide/Content/_snippets/_Layout.html diff --git a/Documentation/Guide/ReadingContentRecords/_snippets/_PAGE.typoscript b/Documentation/Guide/Content/_snippets/_PAGE.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_snippets/_PAGE.typoscript rename to Documentation/Guide/Content/_snippets/_PAGE.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript b/Documentation/Guide/Content/_snippets/_lib.contentElement.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_snippets/_lib.contentElement.typoscript rename to Documentation/Guide/Content/_snippets/_lib.contentElement.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript b/Documentation/Guide/Content/_snippets/_tt_content.header.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.header.typoscript rename to Documentation/Guide/Content/_snippets/_tt_content.header.typoscript diff --git a/Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.typoscript b/Documentation/Guide/Content/_snippets/_tt_content.typoscript similarity index 100% rename from Documentation/Guide/ReadingContentRecords/_snippets/_tt_content.typoscript rename to Documentation/Guide/Content/_snippets/_tt_content.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt b/Documentation/Guide/FirstSteps/Index.rst similarity index 88% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt rename to Documentation/Guide/FirstSteps/Index.rst index 0b45ea0cc..9647c9f54 100644 --- a/Documentation/Guide/TypoScriptOverview/_Chapters/_FirstSteps.rst.txt +++ b/Documentation/Guide/FirstSteps/Index.rst @@ -1,5 +1,5 @@ - - +:navigation-title: First steps +.. include:: /Includes.rst.txt .. _guide-first-steps: =========== @@ -15,7 +15,7 @@ stand for functions or simple values. The :ref:`PAGE <page>` object is responsible for the rendering of a website page in the frontend: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage.typoscript +.. literalinclude:: _snippets/_mypage.typoscript The :ref:`PAGE <page>` object on the one hand offers numerous named properties (like :typoscript:`typeNum`). On the other hand it also has an endless number of @@ -25,7 +25,7 @@ accordingly when they are rendered, from the smallest number to the largest. The order of the lines in the TypoScript record is irrelevant: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage2.typoscript +.. literalinclude:: _snippets/_mypage2.typoscript Every entry is stored in a multidimensional PHP array. Every object and every property, therefore, is unique. We could define an arbitrary @@ -47,7 +47,7 @@ those various views, changing only what's specific for each of them. The previous example would look like this as a PHP array: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage.php +.. literalinclude:: _snippets/_mypage.php Empty spaces at the start and end of values are removed by TYPO3 CMS automatically (using the PHP :php:`trim()` function). @@ -55,7 +55,7 @@ automatically (using the PHP :php:`trim()` function). The :typoscript:`=` sign corresponds to a simple assignment. Here is an overview of the various operators: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage3.typoscript +.. literalinclude:: _snippets/_mypage3.typoscript Object types are always written with capital letters; parameters and functions typically in camel case (first word lower case, next word @@ -75,12 +75,12 @@ resource to find out which objects, functions and properties exist. Things can get more complicated when objects are nested inside each other and many properties are used: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage4.typoscript +.. literalinclude:: _snippets/_mypage4.typoscript To make things clearer, TypoScript code can be structured using curly braces (:typoscript:`{}`) at each nesting level: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_mypage5.typoscript +.. literalinclude:: _snippets/_mypage5.typoscript .. important:: diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage.php b/Documentation/Guide/FirstSteps/_snippets/_mypage.php similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage.php rename to Documentation/Guide/FirstSteps/_snippets/_mypage.php diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage.typoscript rename to Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage2.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage2.typoscript rename to Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage3.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage3.typoscript rename to Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage4.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage4.typoscript rename to Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_mypage5.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_mypage5.typoscript rename to Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index 5bf3fabd4..722b4c2dc 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -20,10 +20,10 @@ documentation and explanations of TypoScript syntax in the :maxdepth: 1 :titlesonly: - TypoScriptOverview/Index - ReadingContentRecords/Index - CreateAMenu/Index - HtmlTemplate/Index + Overview/Index + FirstSteps/Index + Content/Index + Menu/Index UsingFluidStyledContent/Index TypoScriptObjects/Index TypoScriptFunctions/Index diff --git a/Documentation/Guide/CreateAMenu/Index.rst b/Documentation/Guide/Menu/Index.rst similarity index 100% rename from Documentation/Guide/CreateAMenu/Index.rst rename to Documentation/Guide/Menu/Index.rst diff --git a/Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript b/Documentation/Guide/Menu/_lib.textmenu.typoscript similarity index 100% rename from Documentation/Guide/CreateAMenu/_lib.textmenu.typoscript rename to Documentation/Guide/Menu/_lib.textmenu.typoscript diff --git a/Documentation/Guide/CreateAMenu/_menu.html b/Documentation/Guide/Menu/_menu.html similarity index 100% rename from Documentation/Guide/CreateAMenu/_menu.html rename to Documentation/Guide/Menu/_menu.html diff --git a/Documentation/Guide/TypoScriptOverview/Index.rst b/Documentation/Guide/Overview/Index.rst similarity index 95% rename from Documentation/Guide/TypoScriptOverview/Index.rst rename to Documentation/Guide/Overview/Index.rst index 3e7318e42..db090a83a 100644 --- a/Documentation/Guide/TypoScriptOverview/Index.rst +++ b/Documentation/Guide/Overview/Index.rst @@ -45,6 +45,3 @@ other tutorials, like the :ref:`Site package tutorial <t3sitepackage:start>`. .. include:: _Chapters/_TypoScriptAnArray.rst.txt :show-buttons: - -.. include:: _Chapters/_FirstSteps.rst.txt - :show-buttons: diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_BackendConfiguration.rst.txt b/Documentation/Guide/Overview/_Chapters/_BackendConfiguration.rst.txt similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_BackendConfiguration.rst.txt rename to Documentation/Guide/Overview/_Chapters/_BackendConfiguration.rst.txt diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt b/Documentation/Guide/Overview/_Chapters/_MainTemplate.rst.txt similarity index 92% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt rename to Documentation/Guide/Overview/_Chapters/_MainTemplate.rst.txt index fff7e348f..fe63b2d5c 100644 --- a/Documentation/Guide/TypoScriptOverview/_Chapters/_MainTemplate.rst.txt +++ b/Documentation/Guide/Overview/_Chapters/_MainTemplate.rst.txt @@ -23,4 +23,4 @@ are defined by using the dot "." notation. The following is a typical example of TypoScript syntax: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page1.typoscript +.. literalinclude:: /Guide/Overview/_snippets/_page1.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_Prerequisites.rst.txt b/Documentation/Guide/Overview/_Chapters/_Prerequisites.rst.txt similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_Prerequisites.rst.txt rename to Documentation/Guide/Overview/_Chapters/_Prerequisites.rst.txt diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt b/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt similarity index 96% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt rename to Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt index 0f279ad10..f3976b55c 100644 --- a/Documentation/Guide/TypoScriptOverview/_Chapters/_TheTermTemplate.rst.txt +++ b/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt @@ -46,6 +46,6 @@ definition. The following TypoScript setup code is enough to remove this warning: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page1.typoscript +.. literalinclude:: /Guide/Overview/_snippets/_page1.typoscript Do not worry about this code for now, it will be explained later. diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt b/Documentation/Guide/Overview/_Chapters/_TypoScriptAnArray.rst.txt similarity index 92% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt rename to Documentation/Guide/Overview/_Chapters/_TypoScriptAnArray.rst.txt index 5706b6662..2cd05cb3a 100644 --- a/Documentation/Guide/TypoScriptOverview/_Chapters/_TypoScriptAnArray.rst.txt +++ b/Documentation/Guide/Overview/_Chapters/_TypoScriptAnArray.rst.txt @@ -7,11 +7,11 @@ TypoScript is just an array Internally, TypoScript is parsed and stored as a PHP array. For example: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page.typoscript +.. literalinclude:: /Guide/Overview/_snippets/_page.typoscript will be converted to the following PHP array: -.. literalinclude:: /Guide/TypoScriptOverview/_snippets/_page.php +.. literalinclude:: /Guide/Overview/_snippets/_page.php Upon evaluation, a ":ref:`PAGE <page>`" object will be created first, and the parameter :php:`$data['page.']` will be assigned to it. diff --git a/Documentation/Guide/TypoScriptOverview/_Chapters/_WhyTypoScript.rst.txt b/Documentation/Guide/Overview/_Chapters/_WhyTypoScript.rst.txt similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_Chapters/_WhyTypoScript.rst.txt rename to Documentation/Guide/Overview/_Chapters/_WhyTypoScript.rst.txt diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_page.php b/Documentation/Guide/Overview/_snippets/_page.php similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_page.php rename to Documentation/Guide/Overview/_snippets/_page.php diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_page.typoscript b/Documentation/Guide/Overview/_snippets/_page.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_page.typoscript rename to Documentation/Guide/Overview/_snippets/_page.typoscript diff --git a/Documentation/Guide/TypoScriptOverview/_snippets/_page1.typoscript b/Documentation/Guide/Overview/_snippets/_page1.typoscript similarity index 100% rename from Documentation/Guide/TypoScriptOverview/_snippets/_page1.typoscript rename to Documentation/Guide/Overview/_snippets/_page1.typoscript From 5d3a272c94951173c5eeee733d427edd98b3102d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 08:30:37 +0100 Subject: [PATCH 029/125] Add new subkeys for siteLanguage.locale in Data.rst (#1373) (#1408) Replacement for siteLanguage.twoLetterIsoCode and the new subkeys for siteLanguage.locale are now in the documentation. Sources: typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php from main branch and https://review.typo3.org/c/Packages/TYPO3.CMS/+/77597 Co-authored-by: github1maxserv <87801194+github1maxserv@users.noreply.github.com> --- Documentation/Functions/Data.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index 7ec5f0eef..9735201a6 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -1004,7 +1004,15 @@ siteLanguage The language mapped to the ID of the site language. :typoscript:`locale` - The locale, like `de_CH` or `en_GB`. + .. versionchanged:: 12.3 + Several subkeys are available: + + * :typoscript:`languageCode`: this contains the two-letter language code (previously :typoscript:`siteLanguage:twoLetterIsoCode`) + * :typoscript:`countryCode`: contains the uppercase country code part of the locale + * :typoscript:`full`: contains the entire locale (also the default if no subkey is specified) + + The locale, like `de_CH` or `en_GB` (also available from the subkey :typoscript:`locale.full`). + :typoscript:`navigationTitle` The label to be used within language menus. From 0912c4fed694610f47ceaa8b4a03281b229948db Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 06:22:17 +0100 Subject: [PATCH 030/125] [Backport 13.4] [FEATURE] Add chapter about PAGE to the TS guide (#1412) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FEATURE] Add explanaition about PAGE to the TS guide Releases: main, 13.4, 12.4 * Update Documentation/Guide/Page/Index.rst Co-authored-by: Stefan Frömken <froemken@gmail.com> * Update Documentation/Guide/Page/Index.rst --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Stefan Frömken <froemken@gmail.com> --- .../_snippets/_FLUIDTEMPLATE.typoscript | 9 +- Documentation/Guide/FirstSteps/Index.rst | 2 +- .../Guide/FirstSteps/_snippets/_mypage.php | 16 +-- .../FirstSteps/_snippets/_mypage.typoscript | 12 +- .../FirstSteps/_snippets/_mypage2.typoscript | 16 +-- .../FirstSteps/_snippets/_mypage3.typoscript | 12 +- .../FirstSteps/_snippets/_mypage4.typoscript | 24 ++-- .../FirstSteps/_snippets/_mypage5.typoscript | 4 +- Documentation/Guide/Index.rst | 1 + .../_Chapters/_TheTermTemplate.rst.txt | 2 +- Documentation/Guide/Page/Index.rst | 129 ++++++++++++++++++ Documentation/Guide/Page/_Default.html | 3 + .../Guide/Page/_css-loading.typoscript | 16 +++ Documentation/Guide/Page/_favicon.typoscript | 6 + .../Guide/Page/_fluid-template.typoscript | 12 ++ .../Guide/Page/_hello-world.typoscript | 5 + .../Guide/Page/_javascript-loading.typoscript | 14 ++ .../Guide/Page/_tracking-code.typoscript | 12 ++ Documentation/TopLevelObjects/Page/Index.rst | 17 ++- 19 files changed, 260 insertions(+), 52 deletions(-) create mode 100644 Documentation/Guide/Page/Index.rst create mode 100644 Documentation/Guide/Page/_Default.html create mode 100644 Documentation/Guide/Page/_css-loading.typoscript create mode 100644 Documentation/Guide/Page/_favicon.typoscript create mode 100644 Documentation/Guide/Page/_fluid-template.typoscript create mode 100644 Documentation/Guide/Page/_hello-world.typoscript create mode 100644 Documentation/Guide/Page/_javascript-loading.typoscript create mode 100644 Documentation/Guide/Page/_tracking-code.typoscript diff --git a/Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript b/Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript index 7e687b101..20e06450f 100644 --- a/Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript +++ b/Documentation/Guide/Content/_snippets/_FLUIDTEMPLATE.typoscript @@ -1,15 +1,14 @@ 10 = FLUIDTEMPLATE 10 { - templateName = TEXT - templateName.value = Default + templateName = Default templateRootPaths { - 0 = EXT:sitepackage/Resources/Private/Templates/Page/ + 0 = EXT:site_package/Resources/Private/Templates/Pages/ } partialRootPaths { - 0 = EXT:sitepackage/Resources/Private/Partials/Page/ + 0 = EXT:site_package/Resources/Private/Partials/Pages/ } layoutRootPaths { - 0 = EXT:sitepackage/Resources/Private/Layouts/Page/ + 0 = EXT:site_package/Resources/Private/Layouts/Pages/ } } diff --git a/Documentation/Guide/FirstSteps/Index.rst b/Documentation/Guide/FirstSteps/Index.rst index 9647c9f54..8abbb320b 100644 --- a/Documentation/Guide/FirstSteps/Index.rst +++ b/Documentation/Guide/FirstSteps/Index.rst @@ -67,7 +67,7 @@ referenced and can be assigned values accordingly: .. code-block:: typoscript - mypage.10.stdWrap.wrap = <h1>|</h1> + page.10.stdWrap.wrap = <h1>|</h1> The :doc:`TypoScript Reference (TSref) <Index>` is the ultimate resource to find out which objects, functions and properties exist. diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage.php b/Documentation/Guide/FirstSteps/_snippets/_mypage.php index 06df62fdc..e363b203c 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage.php +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage.php @@ -1,13 +1,13 @@ <?php -$TypoScript['mypage'] = 'PAGE'; -$TypoScript['mypage.']['typeNum'] = 0; -$TypoScript['mypage.']['10'] = 'TEXT'; -$TypoScript['mypage.']['10.']['value'] = 'This is rendered first.'; -$TypoScript['mypage.']['20'] = 'TEXT'; -$TypoScript['mypage.']['20.']['value'] = 'This is rendered in the middle.'; -$TypoScript['mypage.']['30'] = 'TEXT'; -$TypoScript['mypage.']['30.']['value'] = 'This gets rendered last.'; +$TypoScript['page'] = 'PAGE'; +$TypoScript['page.']['typeNum'] = 0; +$TypoScript['page.']['10'] = 'TEXT'; +$TypoScript['page.']['10.']['value'] = 'This is rendered first.'; +$TypoScript['page.']['20'] = 'TEXT'; +$TypoScript['page.']['20.']['value'] = 'This is rendered in the middle.'; +$TypoScript['page.']['30'] = 'TEXT'; +$TypoScript['page.']['30.']['value'] = 'This gets rendered last.'; $TypoScript['print'] = 'PAGE'; $TypoScript['print.']['typeNum'] = 98; diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript index 493487809..af7f5daec 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage.typoscript @@ -1,11 +1,11 @@ -# The object mypage is defined as PAGE object. -mypage = PAGE +# The object page is defined as PAGE object. +page = PAGE # PAGE objects have the property typeNum. -mypage.typeNum = 0 +page.typeNum = 0 -# mypage has an object "10" of type TEXT. It is a TEXT object. -mypage.10 = TEXT +# page has an object "10" of type TEXT. It is a TEXT object. +page.10 = TEXT # TEXT objects in turn have a property called "value". -mypage.10.value = Hello World +page.10.value = Hello World diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript index 572282c82..f5daa9e58 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage2.typoscript @@ -1,18 +1,18 @@ # Create a PAGE object. -mypage = PAGE -mypage.typeNum = 0 +page = PAGE +page.typeNum = 0 -mypage.30 = TEXT -mypage.30.value = This gets rendered last. +page.30 = TEXT +page.30.value = This gets rendered last. # Rendering will first output object number 10, then 20 and 30. # An object with number 25 would logically be output between 20 and 30. -mypage.20 = TEXT -mypage.20.value = This is rendered in the middle. +page.20 = TEXT +page.20.value = This is rendered in the middle. # This is the first output object -mypage.10 = TEXT -mypage.10.value = This is rendered first. +page.10 = TEXT +page.10.value = This is rendered first. # Here we create a second PAGE object, which we can use for the # print view. diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript index 5b23ad339..e66093014 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage3.typoscript @@ -4,18 +4,18 @@ test = TEXT test.value = Holla # "<" means "copy object". -# mypage.10 returns "Holla" -mypage.10 < test +# page.10 returns "Holla" +page.10 < test # Change the original object. -# The change has no effect on mypage.10; it still returns "Holla". +# The change has no effect on page.10; it still returns "Holla". test.value = Hello world # "=<" means "create an object reference (link the object)". test.value = Holla -mypage.10 =< test +page.10 =< test # Change the object which is referenced. -# Changes DO have an effect on mypage.10. -# mypage.10 will return "Hello world". +# Changes DO have an effect on page.10. +# page.10 will return "Hello world". test.value = Hello world diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript index 8f67cdfa5..0738e7139 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage4.typoscript @@ -1,15 +1,15 @@ -mypage = PAGE -mypage.typeNum = 0 -mypage.10 = TEXT -mypage.10.value = Hello world -mypage.10.stdWrap.typolink.parameter = http://www.typo3.org/ -mypage.10.stdWrap.typolink.additionalParams = ¶meter=value +page = PAGE +page.typeNum = 0 +page.10 = TEXT +page.10.value = Hello world +page.10.stdWrap.typolink.parameter = http://www.typo3.org/ +page.10.stdWrap.typolink.additionalParams = ¶meter=value # The function name "ATagParams" does not use the standardized # "camelCase". -mypage.10.stdWrap.typolink.ATagParams = class="externalwebsite" -mypage.10.stdWrap.typolink.extTarget = _blank -mypage.10.stdWrap.typolink.title = The website of TYPO3 -mypage.10.stdWrap.postCObject = TEXT -mypage.10.stdWrap.postCObject.value = This text also appears in the link text -mypage.10.stdWrap.postCObject.stdWrap.wrap = |, because the postCObject is executed before the typolink function. +page.10.stdWrap.typolink.ATagParams = class="externalwebsite" +page.10.stdWrap.typolink.extTarget = _blank +page.10.stdWrap.typolink.title = The website of TYPO3 +page.10.stdWrap.postCObject = TEXT +page.10.stdWrap.postCObject.value = This text also appears in the link text +page.10.stdWrap.postCObject.stdWrap.wrap = |, because the postCObject is executed before the typolink function. diff --git a/Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript b/Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript index 102027084..f6bab9fe6 100644 --- a/Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript +++ b/Documentation/Guide/FirstSteps/_snippets/_mypage5.typoscript @@ -1,5 +1,5 @@ -mypage = PAGE -mypage { +page = PAGE +page { typeNum = 0 10 = TEXT diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index 722b4c2dc..d3fd4dbee 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -22,6 +22,7 @@ documentation and explanations of TypoScript syntax in the Overview/Index FirstSteps/Index + Page/Index Content/Index Menu/Index UsingFluidStyledContent/Index diff --git a/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt b/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt index f3976b55c..4e51f922a 100644 --- a/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt +++ b/Documentation/Guide/Overview/_Chapters/_TheTermTemplate.rst.txt @@ -41,7 +41,7 @@ with the `root level` flag enabled, is found in the page tree. `The page is not configured! [type=0][]`. This means that there is no TypoScript object of type PAGE with typeNum=0 configured.`: This warning appears if the -TypoScript Configuration of the current page contains no :ref:`page` +TypoScript Configuration of the current page contains no :ref:`PAGE <guide-page>` definition. The following TypoScript setup code is enough to remove this warning: diff --git a/Documentation/Guide/Page/Index.rst b/Documentation/Guide/Page/Index.rst new file mode 100644 index 000000000..4b7546e9d --- /dev/null +++ b/Documentation/Guide/Page/Index.rst @@ -0,0 +1,129 @@ +:navigation-title: Page +.. include:: /Includes.rst.txt +.. _guide-page: + +================================ +Configure the PAGE in TypoScript +================================ + +A TypoScript object of type :ref:`PAGE <t3tsref:object-type-page>` is needed +to display anything in the frontend of TYPO3. + +The :typoscript:`PAGE` object is used to define a certain view of the content that was +entered in the backend. + +To display an HTML representation of your content usually a Fluid template +is used to define the output of the HTML body while the `PAGE` object can +additionally define meta data for the HTML head or even the HTTP response. + +By default the top level variable `page` is used to define the main +:typoscript:`PAGE` object. The following would display the empty skeleton of +an HTML page: + +.. code-block:: typoscript + + page = PAGE + +If this line is missing, you get the error message +"No page configured for type=0.". + +See also :ref:`Troubleshooting <t3tsref:guide-troubleshooting>`. + +.. contents:: Overview + +.. _guide-page-body: + +Displaying the page body with TypoScript +======================================== + +Numeral indexes on the `PAGE` object are used to output the actual content of +the page. Many integrators like to use the index 10. + +As we already saw in section :ref:`guide-first-steps`, the following code outputs +"Hello World!": + +.. literalinclude:: _hello-world.typoscript + :caption: TypoScript setup + +In a more common use case you want to load the page content from a Fluid +template: + +.. literalinclude:: _fluid-template.typoscript + :caption: TypoScript setup + +You need at least a +:ref:`Minimal site package (see site package tutorial) <t3sitepackage:minimal-design>` +to keep your templates in its private resources folder, for example +:path:`/packages/site_package/Resources/Private/Templates`: + +.. literalinclude:: _Default.html + :caption: /packages/site_package/Resources/Private/Templates/Pages/Default.html + +.. note:: + Learn more about building site packages (website themes) with TypoScript and + Fluid templates in the :ref:`TYPO3 site package tutorial <t3sitepackage:start>`. + +.. _guide-page-loading-css: + +Loading CSS in TypoScript +========================= + +You can write inline CSS using property +:confval:`cssInline.[array] <t3tsref:page-cssinline>`, or place your CSS file +in the public resources of your :ref:`Minimal site package <t3sitepackage:minimal-design>`: + +.. literalinclude:: _css-loading.typoscript + :caption: TypoScript setup + +.. _guide-page-loading-js: + +Loading JavaScript in TypoScript +================================ + +You can write inline JavaScript using property +:confval:`jsFooterInline.[array] <t3tsref:page-jsfooterinline>`, or place your JavaScript file +in the public resources of your :ref:`Minimal site package <t3sitepackage:minimal-design>`: + +.. literalinclude:: _javascript-loading.typoscript + :caption: TypoScript setup + +.. warning:: + If you are using inline JavaScript **never** pass any unescaped user input + directly to the JavaScript. + + See also :ref:`Preventing Cross-site scripting (XSS) + in TypoScript <t3coreapi:security-typoscript-xss>`. + +.. _guide-page-favicon: + +Favicon / shortcut icon definition in the TypoScript PAGE +========================================================= + +Use property :confval:`shortcutIcon <t3tsref:page-shortcuticon>` to define +the favicon: + +.. literalinclude:: _favicon.typoscript + :caption: TypoScript setup + +You need to have a +:ref:`Minimal site package (see site package tutorial) <t3sitepackage:minimal-design>` +and put the favicon file in the public resources folder of that site package. +If you followed the instruction from the site package tutorial that would be +path :path:`/packages/site_package/Resources/Public/Icons`. + +.. _guide-page-tracking-code: + +Tracking code: Add content to the end of your page +================================================== + +You can use the property :confval:`footerData.[array] <t3tsref:page-footerdata>` +to enter some HTML code just before the closing `</body>` tag: + +.. literalinclude:: _tracking-code.typoscript + :caption: TypoScript setup + +.. warning:: + The HTML is output directly. Never use any unescaped user input. + + See also :ref:`Preventing Cross-site scripting (XSS) + in TypoScript <t3coreapi:security-typoscript-xss>`. diff --git a/Documentation/Guide/Page/_Default.html b/Documentation/Guide/Page/_Default.html new file mode 100644 index 000000000..4fe1c867b --- /dev/null +++ b/Documentation/Guide/Page/_Default.html @@ -0,0 +1,3 @@ +<main> + <p>Hello World!</p> +</main> diff --git a/Documentation/Guide/Page/_css-loading.typoscript b/Documentation/Guide/Page/_css-loading.typoscript new file mode 100644 index 000000000..e65be66d9 --- /dev/null +++ b/Documentation/Guide/Page/_css-loading.typoscript @@ -0,0 +1,16 @@ +page = PAGE +page { + 10 = TEXT + 10.value = <div class="myTodo">TODO: Add Fluid template </div> + cssInline { + 10 = TEXT + 10.value ( + .myTodo { + border: 2px solid #ee7600; + } + ) + } + includeCSS { + styles = EXT:site_package/Resources/Public/Css/styles.css + } +} diff --git a/Documentation/Guide/Page/_favicon.typoscript b/Documentation/Guide/Page/_favicon.typoscript new file mode 100644 index 000000000..8942cd731 --- /dev/null +++ b/Documentation/Guide/Page/_favicon.typoscript @@ -0,0 +1,6 @@ +page = PAGE +page { + shortcutIcon = EXT:site_package/Ressources/Public/Icons/favicon.ico + 10 = TEXT + 10.value = TODO: Add Fluid template +} diff --git a/Documentation/Guide/Page/_fluid-template.typoscript b/Documentation/Guide/Page/_fluid-template.typoscript new file mode 100644 index 000000000..df4e46a54 --- /dev/null +++ b/Documentation/Guide/Page/_fluid-template.typoscript @@ -0,0 +1,12 @@ +page = 10 +page { + 10 = FLUIDTEMPLATE + 10 { + templateName = TEXT + templateName.value = Default + + templateRootPaths { + 0 = EXT:site_package/Resources/Private/Templates/Pages/ + } + } +} diff --git a/Documentation/Guide/Page/_hello-world.typoscript b/Documentation/Guide/Page/_hello-world.typoscript new file mode 100644 index 000000000..be6c0a040 --- /dev/null +++ b/Documentation/Guide/Page/_hello-world.typoscript @@ -0,0 +1,5 @@ +page = PAGE +page { + 10 = TEXT + 10.value = Hello World! +} diff --git a/Documentation/Guide/Page/_javascript-loading.typoscript b/Documentation/Guide/Page/_javascript-loading.typoscript new file mode 100644 index 000000000..e4f31744d --- /dev/null +++ b/Documentation/Guide/Page/_javascript-loading.typoscript @@ -0,0 +1,14 @@ +page = PAGE +page { + 10 = TEXT + 10.value = <div class="myTodo">TODO: Add Fluid template </div> + jsFooterInline { + 10 = TEXT + 10.value ( + alert("Hello World! "); + ) + } + includeCSS { + includeJSFooter = EXT:site_package/Resources/Public/JavaScript/main.js + } +} diff --git a/Documentation/Guide/Page/_tracking-code.typoscript b/Documentation/Guide/Page/_tracking-code.typoscript new file mode 100644 index 000000000..a046b6fd5 --- /dev/null +++ b/Documentation/Guide/Page/_tracking-code.typoscript @@ -0,0 +1,12 @@ +page = PAGE +page { + 10 = TEXT + 10.value = TODO: Add Fluid template + footerData { + 10 = TEXT + 10.value ( + <!-- Enter some tracking code supplied by your provider --> + <p>My tracking code</p> + ) + } +} diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index a84f4d2c5..df1f9ad16 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -12,8 +12,8 @@ PAGE This defines what is rendered in the frontend. -PAGE is an object type. A good habit is to use :typoscript:`page` as the top-level object name for -the content-page on a website. +PAGE is an object type. A good habit is to use :typoscript:`page` as +the top-level object name for the main `PAGE` object of a website. TYPO3 does not initialize :typoscript:`page` by default. You must initialize this explicitly, for example: @@ -31,9 +31,20 @@ page is found. Most of this code is executed in the PHP script :php:`\TYPO3\CMS\Frontend\Http\RequestHandler`. -.. contents:: Table of contens +.. contents:: Table of contents :depth: 1 +.. _page-getting-started: + +Getting started with the PAGE object +==================================== + +See :ref:`PAGE in TypoScript (Getting started), <guide-page>` for an +introduction into this object. + +If no `PAGE` object is found, the error "No page configured for type=0." is +displayed. See chapter :ref:`Troubleshooting <t3tsref:guide-troubleshooting>`. + .. _page_output: Output of the PAGE object From 7fa9a60c1188183ad3ed93c140e88abeb69dbed9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 06:28:34 +0100 Subject: [PATCH 031/125] [Backport 13.4] Add more explaination for TS:data SiteLanguage:locale #1409 (#1414) * Add more explaination for TS:data SiteLanguage:locale #1409 * Add description for locale itself --------- Co-authored-by: Stefan Froemken <froemken@gmail.com> --- Documentation/Functions/Data.rst | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index 9735201a6..4e5f92d82 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -1005,14 +1005,25 @@ siteLanguage :typoscript:`locale` .. versionchanged:: 12.3 - Several subkeys are available: - - * :typoscript:`languageCode`: this contains the two-letter language code (previously :typoscript:`siteLanguage:twoLetterIsoCode`) - * :typoscript:`countryCode`: contains the uppercase country code part of the locale - * :typoscript:`full`: contains the entire locale (also the default if no subkey is specified) - - The locale, like `de_CH` or `en_GB` (also available from the subkey :typoscript:`locale.full`). - + The :typoscript:`locale` property in typoscript can be subdivided + into more specific details using subkeys separated by a colon `:`. + The subkeys `languageCode`, `countryCode`, and `full` allow access + to the individual components of the :typoscript:`locale` value. For + instance, a :typoscript:`locale` value of "en_US.UTF-8" can be + broken down into "en", "US", and for the `full` subkey, "en-US". + + * :typoscript:`languageCode`: this contains the two-letter + language code (previously + :typoscript:`siteLanguage:twoLetterIsoCode`) + * :typoscript:`countryCode`: contains the uppercase country code + part of the locale + * :typoscript:`full`: contains the entire locale (also the default + if no subkey is specified) + + The :typoscript:`locale` property represents the language, country, and + character encoding settings for TYPO3. It is a composite value, such as + "en_US.UTF-8", which can be dissected into different components via + subkeys for more precise language and location specifications. :typoscript:`navigationTitle` The label to be used within language menus. From f8193822c5d8e42a3473855aade34c48885e8886 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Mon, 4 Nov 2024 06:39:41 +0100 Subject: [PATCH 032/125] [TASK] Fix rendering warnings Releases: 13.4 --- Documentation/Syntax/FileImports/Index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/Syntax/FileImports/Index.rst b/Documentation/Syntax/FileImports/Index.rst index 3b41d0e0a..7ff9f4c04 100644 --- a/Documentation/Syntax/FileImports/Index.rst +++ b/Documentation/Syntax/FileImports/Index.rst @@ -122,7 +122,7 @@ The following features can make file inclusion unnecessary: * :ref:`Automatic global inclusion of user TSconfig of extensions <t3tsconfig:usersettingdefaultusertsconfig>` * :ref:`Automatic global inclusion of page TSconfig of extensions <t3tsconfig:pagesettingdefaultpagetsconfig>` * :ref:`Automatic page TSconfig on site level <t3tsconfig:include-static-page-tsconfig-per-site>` -* :ref:`TypoScript provider for sites and sets <site-sets-typoscript>` +* :ref:`TypoScript provider for sites and sets <t3coreapi:site-sets-typoscript>` automatically loads TypoScript per site when the site set is included in the site configuration. @@ -176,7 +176,7 @@ As one restriction :typoscript:`@import` cannot include files from arbitrary dir like :file:`fileadmin/`, but only from extensions by using the :typoscript:`EXT:` prefix. Instances that use :typoscript:`<INCLUDE_TYPOSCRIPT:` with :typoscript:`source="FILE:./someDirectory/..."` should move these TypoScript files into a project or site extension. Such instances are also encouraged to -look into the TYPO3 v13 :ref:`Site sets <site-sets>` feature and eventually transition towards it along the way. +look into the TYPO3 v13 :ref:`Site sets <t3coreapi:site-sets>` feature and eventually transition towards it along the way. :typoscript:`@import` allows to import files with the file ending `.typoscript` and `.tsconfig`. If you used any of the outdated file endings like `.ts` or From a5341bbca9317cae76ea7aa4ad6152ec4c9ddad0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:01:00 +0100 Subject: [PATCH 033/125] Overhaul Introduction (#562) Releases:main Co-authored-by: Sarah McCarthy <sarahmccarthy123@yahoo.com> --- .../Documentation/Introduction/Index.rst | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/Documentation/TSconfig/Documentation/Introduction/Index.rst b/Documentation/TSconfig/Documentation/Introduction/Index.rst index e2120393b..96537e565 100644 --- a/Documentation/TSconfig/Documentation/Introduction/Index.rst +++ b/Documentation/TSconfig/Documentation/Introduction/Index.rst @@ -10,18 +10,20 @@ Introduction About this document =================== -This document describes TSconfig and its options: A TypoScript a-like configuration -syntax to configure details of the backend for backend users based on a user, group and page level. +This document describes TSconfig and its options. Tsconfig is a TypoScript-like configuration +syntax which is used to configure parts of the backend based on user, group and page. -This document can be seen as detail below the main :ref:`TYPO3 Explained <t3coreapi:start>` documentation. -It is too huge to be integrated into TYPO3 Explained directly. +This document can be seen as detail below the main :ref:`TYPO3 Explained <t3coreapi:start>` +documentation as this section is too big to be included there. -First parts of this document explain the concepts of TSconfig, the different places it can be -found in the system, how it can be diagnosed, and goes a bit into the PHP API if developers -need to access data from TSconfig. -The rest of the document is a reference: A document to look-up and find properties on a daily basis. +The first parts of this document explain concepts related to TSconfig, where it +can be found in the system, how it can be debugged, and how developers +can access data from TSconfig via the the PHP API. -This document is especially important for integrators who want to make life as easy as possible +The rest of the document can be used as a reference for looking up properties as +you need them. + +This document is especially important for integrators wanting to make life as easy as possible for their dear backend users. .. index:: ! TSconfig @@ -30,35 +32,36 @@ for their dear backend users. About TSconfig ============== -TSconfig is used in TYPO3 to configure and customize the backend on a page and -a user or group basis. The syntax to do this is based on `TypoScript` that is also -used to configure frontend output of the web site. +TSconfig is used in TYPO3 to configure and customize the backend on a page, user +or group basis. Its syntax is based on the `TypoScript` that is +used to configure the frontend output of the web site. -The whole point of TSconfig is that it allows configuration of backend details -by integrators, without asking developers for writing PHP code. Thus, some areas -of TSconfig are rather powerful and offer vast possibilities of customizing the TYPO3 backend. +The whole point of TSconfig is that integrators can configure parts of the backend +without having to ask developers to write PHP code. This means that some areas +of TSconfig are very powerful and provide a lot of different ways of customizing the +TYPO3 backend. TSconfig is divided into configuration for pages ("Page TSconfig") and configuration -for users and groups ("User TSconfig"). Each variant is further detailed in this document. +for users and groups ("User TSconfig"). Each type is further explained in this document. -The general "dotted notation" of `TypoScript` is re-used for Page TSconfig and -User TSconfig, it is possible to reference values, use conditions, and so on. -For a general look at the syntax, please read the according section of +The general "dotted notation" used in `TypoScript` is also used in Page TSconfig and +User TSconfig. It is possible to reference values, use conditions, and so on. +For a general look at the syntax, please read the relevant section in :ref:`TYPO3 Explained <t3tsref:typoscript-syntax>`. -Other than the basic syntax, TSconfig and frontend TypoScript have nothing in common. -Properties outlined in the :ref:`TypoScript Reference <t3tsref:start>` can never be -used in TSconfig and vice versa. Frontend TypoScript and TSconfig are different -things: TypoScript is used to steer the rendering of the frontend web site, TSconfig +Other than basic syntax, TSconfig and frontend TypoScript have nothing in common. +Properties in the :ref:`TypoScript Reference <t3tsref:start>` cannot be +used in TSconfig and vice versa. TypoScript and TSconfig are two different +things: TypoScript is used to configure rendering of the frontend web site, TSconfig is used to configure what is displayed to a logged in backend user. -While this might be confusing in the first place, it becomes clear as soon as integrators -start using TSconfig and looking at the available options: It is all about setting values -to configure if a backend users sees or does not see this-and-that, give a user additional -editing options, or removing them. As a last note to complete this picture: TSconfig is -also used to configure the "Admin panel" in the frontend. While this might look funny in the -first place, thinking about that makes clear on why admin panel configuration options are -bound to TSconfig and not to frontend TypoScript: The admin panel is basically a view to parts -of the backend that is shown in the frontend, it is entirely bound to backend users. So, the -admin panel is a backend thing, even if displayed in frontend, it is for backend users. This +While this might sound confusing at first, as soon as integrators +start using TSconfig and looking at the available options it is clear: it is all about setting values +to configure what a backend user does or does not see, give them additional +editing options, or removing them. And as a final point, TSconfig is +also used to configure the "Admin panel" in the frontend. While this might seem strange at +first, thinking about it makes it clear why admin panel configuration options are +bound to TSconfig and not to frontend TypoScript. The admin panel is basically a +frontend view of parts of the backend - it is entirely bound to the backend user. So the +admin panel is a backend thing. Even if it is displayed in the frontend it is meant for backend users. This is why the admin panel is configured via TSconfig. From ac0fdd3fd0e33b514eb2d1463f979a8c8613d190 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:06:46 +0100 Subject: [PATCH 034/125] [BUGFIX] jumbotrong -> jumbotron (#1417) releases: main, 13.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- .../DataProcessing/_PageContentFetchingProcessor/_Default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html index 50285dac8..db4feb219 100644 --- a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html +++ b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html @@ -1,5 +1,5 @@ <main> - <f:for each="{myContent.jumbotrong.records}" as="contentElement"> + <f:for each="{myContent.jumbotron.records}" as="contentElement"> <f:if condition="{contentElement.fullType} = 'tt_content.my_extension_jumbotron'"> <h2>{contentElement.header}</h2> <f:format.html>{contentElement.bodytext}</f:format.html> From e544830b182293a03e11399ed519ec2d30f57160 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:07:29 +0100 Subject: [PATCH 035/125] [BUGFIX] In PAGEVIEW rootpage is found in site not page (#1418) Releases: main, 13.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- .../ContentObjects/Pageview/_includes/_LinkToRootPage.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/ContentObjects/Pageview/_includes/_LinkToRootPage.html b/Documentation/ContentObjects/Pageview/_includes/_LinkToRootPage.html index 8bb96d09b..582feefd7 100644 --- a/Documentation/ContentObjects/Pageview/_includes/_LinkToRootPage.html +++ b/Documentation/ContentObjects/Pageview/_includes/_LinkToRootPage.html @@ -1,7 +1,7 @@ <f:layout name="Default" /> <f:section name="Main"> <main role="main"> - <p>Go to the root page: <f:link.page pageUid="{page.rootPageId}">Home</f:link.page></p> + <p>Go to the root page: <f:link.page pageUid="{site.rootPageId}">Home</f:link.page></p> <p>...</p> </main> -</f:section> \ No newline at end of file +</f:section> From b639c8a44b64692916c9a5326c39228214fa52b2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:02:39 +0100 Subject: [PATCH 036/125] [Backport 13.4] [FEATURE] Explain menu rendering with data processors (#1420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FEATURE] Explain menu rendering with data processors Releases: main, 13.4, 12.4 * Apply suggestions from code review * Apply suggestions from code review Co-authored-by: Stefan Frömken <froemken@gmail.com> --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Stefan Frömken <froemken@gmail.com> --- Documentation/Guide/Menu/Index.rst | 58 ++++++++----------- Documentation/Guide/Menu/_MenuTemplate.html | 18 ++++++ .../Guide/Menu/_lib.textmenu.typoscript | 29 ---------- Documentation/Guide/Menu/_menu.html | 9 --- Documentation/Guide/Menu/_menu.typoscript | 13 +++++ 5 files changed, 55 insertions(+), 72 deletions(-) create mode 100644 Documentation/Guide/Menu/_MenuTemplate.html delete mode 100644 Documentation/Guide/Menu/_lib.textmenu.typoscript delete mode 100644 Documentation/Guide/Menu/_menu.html create mode 100644 Documentation/Guide/Menu/_menu.typoscript diff --git a/Documentation/Guide/Menu/Index.rst b/Documentation/Guide/Menu/Index.rst index 18ca8e0c7..89b36707c 100644 --- a/Documentation/Guide/Menu/Index.rst +++ b/Documentation/Guide/Menu/Index.rst @@ -1,48 +1,38 @@ .. include:: /Includes.rst.txt - .. _guide-menu: -============= -Create a menu -============= +============================= +Create a menu with TypoScript +============================= Until now, we learned how the page *content* is rendered; however, the page *navigation* is missing. -TYPO3 CMS offers a special menu object called -:ref:`HMENU <cobj-hmenu>` ("H" stands for hierarchical) to easily build -different kinds of menus. - -We want our menu to be built like a nested list: - -.. literalinclude:: _menu.html - -It is customary to declare new objects as sub-properties of the -`lib` top-level object. We can give it any name that hasn't -been assigned yet: - -.. literalinclude:: _lib.textmenu.typoscript - -The :ref:`HMENU <cobj-hmenu>` object allows us to create a diversity of menus. -The main properties are numbers and correspond to the menu level. +TYPO3 provides a special data processor, the :ref:`menu data processor <MenuProcessor>` +to pass data to render a menu to the Fluid template. -The :ref:`TMENU <tmenu>` object renders a menu level as -text. A different -rendering can be chosen for each menu level. +Configure the data processor in TypoScript: -On every menu level, we can configure various states for the single -menu items – see :ref:`menu items <menu-common-properties>`, -e.g. `NO` for "normal", `ACT` for "pages in the root line" -(i.e. the current page, its parent, grandparent, and so forth) or -`CUR` for "the current page". +.. literalinclude:: _menu.typoscript + :caption: TypoScript Setup -.. important:: +And render the menu in your Fluid template. You need at least a +:ref:`Minimal site package (see site package tutorial) <t3sitepackage:minimal-design>` +to keep your templates in its private resources folder, for example +:path:`/packages/site_package/Resources/Private/Templates`: - Except for the normal state (`NO`), other states have to be activated - before they get displayed (i.e. `ACT = 1`). +.. literalinclude:: _MenuTemplate.html + :caption: /packages/site_package/Resources/Private/Templates/Pages/Default.html -Now that our menu is defined, we can use it with: +Find more examples on how to configure and render menus with TypoScript and +Fluid in chapter +:ref:`Main menu of the Site Package Tutorial <t3sitepackage:main-menu-creation>`. -.. code-block:: typoscript +You can find more examples on how to output menus of different styles, including +multi-level menus, breadcrumbs, language menus, and sitemaps in the chapter +about the :ref:`menu data processor <MenuProcessor>`. - page.5 < lib.textmenu +.. note:: + Before data processors were introduced it was common to use the TypoScript + object :ref:`HMENU <t3tsref:cobj-hmenu>` to render a menu. It is still + possible doing so and you might see it in older examples. diff --git a/Documentation/Guide/Menu/_MenuTemplate.html b/Documentation/Guide/Menu/_MenuTemplate.html new file mode 100644 index 000000000..13171cf65 --- /dev/null +++ b/Documentation/Guide/Menu/_MenuTemplate.html @@ -0,0 +1,18 @@ +<header> + <ul class="navbar-nav"> + <f:for each="{myMainMenu}" as="menuItem"> + <li class="nav-item"> + <a class="nav-link {f:if(condition: menuItem.active, then:'active')}" + href="{menuItem.link}" + target="{menuItem.target}" + title="{menuItem.title}" + > + {menuItem.title} + </a> + </li> + </f:for> + </ul> +</header> +<main> + <p>Hello World!</p> +</main> diff --git a/Documentation/Guide/Menu/_lib.textmenu.typoscript b/Documentation/Guide/Menu/_lib.textmenu.typoscript deleted file mode 100644 index 5654a035c..000000000 --- a/Documentation/Guide/Menu/_lib.textmenu.typoscript +++ /dev/null @@ -1,29 +0,0 @@ -lib.textmenu = HMENU -lib.textmenu { - - # We define the first level as text menu. - 1 = TMENU - - # We define the normal state ("NO"). - 1.NO = 1 - 1.NO.allWrap = <li>|</li> - - # We define the active state ("ACT"). - 1.ACT = 1 - 1.ACT.wrapItemAndSub = <li>|</li> - - # Wrap the whole first level. - 1.wrap = <ul class="level1">|</ul> - - # The second and third level should be configured exactly - # the same way. - # In between the curly brackets, objects can be copied. - # With the dot "." we define that the object can be found - # in the brackets. - # With 2.wrap and 3.wrap we overwrite the wrap, which was - # copied from 1.wrap. - 2 < .1 - 2.wrap = <ul class="level2">|</ul> - 3 < .1 - 3.wrap = <ul class="level3">|</ul> -} diff --git a/Documentation/Guide/Menu/_menu.html b/Documentation/Guide/Menu/_menu.html deleted file mode 100644 index f00147372..000000000 --- a/Documentation/Guide/Menu/_menu.html +++ /dev/null @@ -1,9 +0,0 @@ -<ul class="level1"> - <li>first level</li> - <li>first level - <ul class="level2"> - <li>second level</li> - </ul> - </li> - <li>first level</li> -</ul> diff --git a/Documentation/Guide/Menu/_menu.typoscript b/Documentation/Guide/Menu/_menu.typoscript new file mode 100644 index 000000000..537e9bbc0 --- /dev/null +++ b/Documentation/Guide/Menu/_menu.typoscript @@ -0,0 +1,13 @@ +page = PAGE +page { + 10 = FLUIDTEMPLATE + 10 { + templateName = Default + templateRootPaths.10 = EXT:site_package/Resources/Private/Templates/Pages/ + # ... + dataProcessing { + 10 = menu + 10.as = myMainMenu + } + } +} From 3350082901abfa7b874a162651b68c45efa03349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20M=C3=BCller?= <2566282+brotkrueml@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:35:41 +0100 Subject: [PATCH 037/125] [TASK] Add missing page.meta attribute sub-property (#1337) The more generic `attribute` sub-property can be used to set the attribute to any arbitrary value. An example is already available for the Open Graph meta tags. Therefore, it is more generic than the `httpEquivalent` sub-property. Releases: main, 12.4 (cherry picked from commit 8c43fe709dd7095c0331f1d7875c938e8c0fa22b) --- Documentation/TopLevelObjects/Page/Index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index df1f9ad16..f0c58ac42 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -596,9 +596,14 @@ Properties For each key the following sub-properties are available: + `attribute` + Sets the attribute for the meta tag. If it is not defined, the + default :html:`name` is used. + `httpEquivalent` If set to 1, the :html:`http-equiv` attribute is used in the meta tag instead of the :html:`name` attribute. Default: 0. + `replace` If set to 1, the tag will replace the one set earlier by a plugin. If set to 0 (default), the meta tag generated by the plugin will be used. If From 9388a8d3eaccc6df7c5cddefddec1fd2846e716b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:39:49 +0100 Subject: [PATCH 038/125] [BUGFIX] Avoid hint to temp. in styles. TLO (#1424) styles. is not unset after parsing since v7: https://review.typo3.org/c/Packages/TYPO3.CMS/+/31814 Co-authored-by: Christian Kuhn <lolli@schwarzbu.ch> --- Documentation/TopLevelObjects/Other.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Documentation/TopLevelObjects/Other.rst b/Documentation/TopLevelObjects/Other.rst index 61de8ead1..6befff1b5 100644 --- a/Documentation/TopLevelObjects/Other.rst +++ b/Documentation/TopLevelObjects/Other.rst @@ -97,8 +97,7 @@ styles .. confval:: styles :name: tlo-styles - This top-level object name is reserved. It works just like :confval:`tlo-temp`. - It is preserved for historic reasons, use :confval:`tlo-temp` instead. + This top-level object name is reserved. .. index:: Top-level objects; tt_content .. _tlo-tt: From c9e2ac81a999c9a8b6aef8518c16002f1a8a98ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:01:32 +0100 Subject: [PATCH 039/125] =?UTF-8?q?[Backport=2013.4]=20Remove=20the=20sect?= =?UTF-8?q?ion=20for=20the=20TLO=20=E2=80=9Ctemp.=E2=80=9D=20as=20no=20uns?= =?UTF-8?q?et()=20is=20executed=20anymore=20(#1427)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation/TopLevelObjects/Index.rst | 1 - Documentation/TopLevelObjects/Other.rst | 43 +------------------------ 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/Documentation/TopLevelObjects/Index.rst b/Documentation/TopLevelObjects/Index.rst index 016e3baab..74f299ebe 100644 --- a/Documentation/TopLevelObjects/Index.rst +++ b/Documentation/TopLevelObjects/Index.rst @@ -27,7 +27,6 @@ page | ... :ref:`PAGE <page-datatype>` config :ref:`CONFIG <config-datatype>` :ref:`plugin` :ref:`tlo-module` -:ref:`temp <tlo-temp>` :ref:`styles <tlo-styles>` :ref:`lib <tlo-lib>` :ref:`tt_* <tlo-tt>` diff --git a/Documentation/TopLevelObjects/Other.rst b/Documentation/TopLevelObjects/Other.rst index 6befff1b5..cdfbd4a26 100644 --- a/Documentation/TopLevelObjects/Other.rst +++ b/Documentation/TopLevelObjects/Other.rst @@ -8,45 +8,6 @@ Reserved top-level objects .. contents:: List of the reserved top-level objects :depth: 1 -.. index:: Top-level objects; temp - -.. _top-level-objects-temp: -.. _tlo-temp: - -temp -==== - -.. confval:: temp - :name: tlo-temp - - This top-level object name is reserved. - - The top-level object :typoscript:`temp` is used to store and copy - TypoScript code during parse time. - - :typoscript:`temp` is unset before the template is cached, objects in it - can therefore not be referenced. Use :confval:`tlo-lib` for that purpose. - -Example: Use the top-level object `temp` to copy code ------------------------------------------------------ - -.. code-block:: typoscript - :caption: EXT:my_sitepackage/Configuration/TypoScript/setup.typoscript - - temp.some_content = TEXT - temp.some_content.value = Hello World! - - // Output - // <h1>Hello World!</h1><p>Hello World!</p> - page = PAGE - page { - 10 < temp.some_content - 10.wrap = <h1>|</h1> - - 20 < temp.some_content - 20.wrap = <p>|</p> - } - .. index:: Top-level objects; lib .. _top-level-objects-lib: @@ -64,10 +25,8 @@ lib TypoScript code. This top-level object is available after the template is cached, - objects in it can therefore be referenced by using the + objects in it can therefore be referenced and copied by using the :ref:`reference operator <typoscript-syntax-syntax-object-referencing>` :typoscript:`=<`. - Just like with a :confval:`tlo-temp` object copying is - also possible. .. code-block:: typoscript :caption: EXT:my_sitepackage/Configuration/TypoScript/setup.typoscript From 221ad66f3e89fb40f75e8908da794029402ad35a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 21:40:02 +0100 Subject: [PATCH 040/125] fix: avoid backslash in type values (#1430) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/Functions/Select.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/Functions/Select.rst b/Documentation/Functions/Select.rst index 718b3a82a..a111404fb 100644 --- a/Documentation/Functions/Select.rst +++ b/Documentation/Functions/Select.rst @@ -38,7 +38,7 @@ uidInList .. confval:: uidInList :name: select-uidInList - :type: *list of record\_ids* / :ref:`stdWrap` + :type: *list of record uids* / :ref:`stdWrap` Comma-separated list of record uids from the according database table. For example when the select function works on the table `tt_content`, then @@ -72,7 +72,7 @@ pidInList .. confval:: pidInList :name: select_pidInList - :type: *list of page\_ids* / :ref:`stdWrap` + :type: *list of page uids* / :ref:`stdWrap` :Default: :typoscript:`this` Comma-separated list of pids of the record. This will be page uids (pids). For From 0f39edfb2a476189bde20d32810831d50847b5b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 17 Nov 2024 18:52:56 +0100 Subject: [PATCH 041/125] Fix "itemsLimitPerTable" / "itemsLimitSingleTable" ranges and clarify interactions with TCA "maxDBListItems" / "maxSingleDBListItems" (#567) See : https://github.com/TYPO3/typo3/blob/3a42fd3456ffaee433bf2e4e45c04ba310be914e/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php#L607 https://github.com/TYPO3/typo3/blob/3a42fd3456ffaee433bf2e4e45c04ba310be914e/typo3/sysext/core/Configuration/TCA/pages.php#L64 Co-authored-by: gcrico <guillaume.crico@gmail.com> --- .../Documentation/PageTsconfig/Mod/WebList.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst index 2533826c7..b6c6e8dcb 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst @@ -369,9 +369,13 @@ itemsLimitPerTable :Default: 20 ` Set the default maximum number of items to show per table. - The number must be between `5` and `10000`. If below or above this range, + The number must be between `0` and `10000`. If below or above this range, the nearest valid number will be used. + If a value is defined in the `$TCA[<table>]['interface']['maxDBListItems']` + of the table, it will override this TSconfig option. + For example, the `maxDBListItems` for the `pages` table is `30` by default. + .. _pageTsConfigWebList-itemsLimitPerTable-example: Example: Limit items per table in overview to 10 @@ -398,9 +402,13 @@ itemsLimitSingleTable :Default: 100 Set the default maximum number of items to show in single table view. - The number must be between `5` and `10000`. If below or above this range, + The number must be between `0` and `10000`. If below or above this range, the nearest valid number will be used. + If a value is defined in the `$TCA[<table>]['interface']['maxSingleDBListItems']` + of the table, it will override this TSconfig option. + For example, the `maxSingleDBListItems` for the `pages` table is `50` by default. + .. _pageTsConfigWebList-itemsLimitSingleTable-example: Example: Limit items in single table view to 10 From 28a7f1d91d9cbbcc0f87a326c994c2c6977a562d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:18:50 +0100 Subject: [PATCH 042/125] [Backport 13.4] [TASK] Mention tree.level starting at 1 not 0 (#570) * [TASK] Mention tree.level starting at 1 not 0 As mentioned in https://forge.typo3.org/issues/96385 the former treeLevel started at `0` but with the change to `tree.level` this was changed to be based at `1` for root level. The docs need to reflect this fact. * [TASK] Add further hint on backend/frontend tree.level, fix indentation --------- Co-authored-by: Garvin Hicking <blog@garv.in> --- .../Documentation/UsingSetting/Conditions.rst | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst index f6b2d73a3..9343e6131 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst @@ -150,21 +150,33 @@ tree.level :type: integer Current tree level. Only available in page TSconfig, not - in user TSconfig. + in user TSconfig. Starts at `1` (root level). .. _condition-tree-level-example: -Example: Condition applies on a page with level 0 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Example: Condition applies on a page on root level +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: typoscript :caption: EXT:site_package/Configuration/page.tsconfig - # Check if page is on level 0: - [tree.level == 0] + # Check if page is on level 1 (root): + [tree.level == 1] // Your settings go here [END] +.. hint:: + + In older versions before TYPO3 v10, this setting was available as + `treeLevel` variable. + That variable started the root level at value `0`, and now it starts at `1`. + Keep this in mind when migrating old conditions. + + Unlike the frontend TypoScript condition `tree.level`, the backend tree level + is not affected by `pages.is_siteroot`. This means, for nested sites it cannot + be used to match "site roots" or in general any n-th levels of page tree depths. + It's the *absolute depth* of the entire page tree, starting with `1`. + .. index:: Conditions; tree.pagelayout .. _condition-tree-pagelayout: From 97abd0a45fc7df6041e7c4b95f119d9dd3aa54ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:30:26 +0100 Subject: [PATCH 043/125] [Backport 13.4] [TASK] Site settings can be used as constants in TSconfig (#572) * [TASK] Site settings can be used as constants in TSconfig Releases: main, 13.4 * Update Syntax.rst --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst index 3c878907b..774832491 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst @@ -10,9 +10,12 @@ While the objects, properties and conditions are different, the *syntax* of TSconfig is basically the same as it is for TypoScript in frontend TypoScript templates. +.. versionchanged:: 12.4 + :ref:`Site settings <t3coreapi:sitehandling-settings>` can be used with the + TypoScript constant syntax in TSconfig. + Please note the following differences: -* In TSconfig no constants are available. * There are differences in the :ref:`conditions <conditions>` that can be used. * The general TypoScript syntax is described in :ref:`TypoScript syntax <t3tsref:typoscript-syntax>`. From 3399394aeba8a7174de7303760340f4aa1f37c63 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:51:11 +0100 Subject: [PATCH 044/125] [TASK] Update mod.SHARED.colPos_list (#574) The standard backend layout has only one column since at least 8.7. According to the code in the Core the default value is empty. Update the example removing outdated screenshots and use a backend layout defined via page TSconfig. Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../List/SimpleBackendLayout.png | Bin 13216 -> 0 bytes .../Page/SimpleBackendLayoutInPageModule.png | Bin 4711 -> 0 bytes .../SimpleBackendLayoutLeftNotEditable.png | Bin 4961 -> 0 bytes .../Documentation/PageTsconfig/Mod/Shared.rst | 64 ++++++------------ .../Mod/WebLayout/_BackendLayout.tsconfig | 2 +- .../_mod.SHARED.colPos_list.tsconfig | 1 + 6 files changed, 21 insertions(+), 46 deletions(-) delete mode 100644 Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SimpleBackendLayout.png delete mode 100644 Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutInPageModule.png delete mode 100644 Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutLeftNotEditable.png create mode 100644 Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SimpleBackendLayout.png b/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SimpleBackendLayout.png deleted file mode 100644 index fabf6f1284833203c0b93164c00163d7b223bcd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13216 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 diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutInPageModule.png b/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutInPageModule.png deleted file mode 100644 index a044b99a41f470617116f0abfacba744e56e2a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4711 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 Rd-5Fw(bu`9U8!Xs@jp+JNqGPO diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutLeftNotEditable.png b/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/SimpleBackendLayoutLeftNotEditable.png deleted file mode 100644 index d81b52c3e96cceed4a92dfa80f9947fe7c68c553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4961 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%0Dk(<GbC55!$ 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 diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst index fb3578f37..5a3273a8e 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst @@ -4,6 +4,7 @@ mod; SHARED Modules; All .. _pagesharedotionsformodules: +.. _mod-shared: ====== SHARED @@ -23,61 +24,34 @@ colPos_list .. confval:: colPos_list :name: mod-share-colPos-list - :type: list of integers - :Default: 1,0,2,3 + :type: comma separated list of integers + :default: '' + :Path: mod.SHARED.colPos_list - This option lets you specify which columns of tt_content elements should be editable in the - 'Columns' view of the Web > Page module. + This setting controls which areas or columns of the backend layouts are + editable. Columns configured in the :ref:`Backend Layout <backend-layouts>`, + which are not listed here, will be displayed with placeholder area. - Used on top of backend layouts, this setting controls which columns are editable. Columns configured - in the Backend Layout which are not listed here, will be displayed with placeholder area. - - Each column has a number which ultimately comes from the configuration of the table tt_content, - field 'colPos'. These are the values of the four default columns used in the default backend layout: - - Left: `1`, Normal: `0`, Right: `2`, Border: `3` + The default backend layout only has one column, which has the id 0. .. _example_for_backend_layout: -Example: Create a basic backend layout --------------------------------------- - -The example creates a basic backend layout and sets the "Left" column to be not editable: - -* Create a record of type "Backend Layout", for instance in the root page of your website - -* Add a title, e.g. "My Layout" - -* Use the wizard to create a two column backend layout, the result may look like this: - - .. figure:: /Images/ManualScreenshots/List/SimpleBackendLayout.png - :alt: A simple backend layout - - A simple backend layout - -* Create a page and select this new backend layout in the "Appearance" tab. - The page module then looks like this, displaying the two defined columns: - - .. figure:: /Images/ManualScreenshots/Page/SimpleBackendLayoutInPageModule.png - :alt: Backend layout used in page module - - Backend layout used in page module - -* Now set the "Left" column to be not editable using page TSconfig in the - :guilabel:`Resources` tab of the page, by restricting `colPos_list` to - `0` (the "Content" columns as defined above): +Example: Make a column in a backend layout not editable +------------------------------------------------------- - .. code-block:: typoscript - :caption: Page TSconfig in the "Resources" tab of the page +Assuming the current page uses the following backend layout: - mod.SHARED.colPos_list = 0 +.. literalinclude:: /PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig + :caption: config/sites/my-site/page.tsconfig -* The result in the page module then looks like this: +And we want to make the area "Jumbotron" (colPos = 1) not editable. - .. figure:: /Images/ManualScreenshots/Page/SimpleBackendLayoutLeftNotEditable.png - :alt: One column not editable in a backend layout +As long as :confval:`mod-share-colPos-list` is empty all areas are allowed. +We therefore have to list all colPos, which should still be allowed. In this +that would be the columns left (colPos = 0) and right (colPos = 2). - One column not editable in a backend layout +.. literalinclude:: /PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig + :caption: config/sites/my-site/page.tsconfig .. index:: defaultLanguageFlag diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig index 2891fd19f..698538b84 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig @@ -18,7 +18,7 @@ mod.web_layout.BackendLayouts { } } - 1 { + 2 { columns { 1 { name = Left diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig new file mode 100644 index 000000000..3b359d5dc --- /dev/null +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig @@ -0,0 +1 @@ +mod.SHARED.colPos_list = 0,2 \ No newline at end of file From 1cbb4c7a6fdfa27417c64c8f185e3390c105e0ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:51:30 +0100 Subject: [PATCH 045/125] [TASK] Remove version 12 change information (#575) Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../PageTsconfig/Mod/WebInfo.rst | 36 ------------- .../Documentation/PageTsconfig/Mod/WebTs.rst | 52 ------------------- .../Documentation/PageTsconfig/Options.rst | 2 - .../Documentation/PageTsconfig/TceForm.rst | 7 ++- .../Documentation/PageTsconfig/TceMain.rst | 7 --- .../Documentation/PageTsconfig/Templates.rst | 2 - .../Documentation/UsingSetting/Conditions.rst | 20 +++---- .../UsingSetting/PageTSconfig.rst | 5 -- .../Documentation/UsingSetting/Syntax.rst | 8 +-- 9 files changed, 17 insertions(+), 122 deletions(-) delete mode 100644 Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebTs.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst index c55584b0d..06198038e 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst @@ -65,39 +65,3 @@ Example: Override the field definitions in the info module fields = title,uid,table_tt_content,table_fe_users } } - -.. index:: - web_info.menu.function - Module menu; Info -.. _pageblindingfunctionmenuoptions-webinfo: - -menu.function -============= - -.. versionchanged:: 12.0 - The page TSconfig option :tsconfig:`mod.web_info.menu.function` has been removed - with TYPO3 v12.0. Use **user** TSconfig option - :ref:`options.hideModules <useroptions-hideModules>` instead. - -.. _pageblindingfunctionmenuoptions-webinfo-migration: - -Migration from menu.function to options.hideModules ---------------------------------------------------- - -Migrate former usage of :tsconfig:`mod.web_info.menu.function` in **page** TSconfig -to option :ref:`options.hideModules <useroptions-hideModules>`. - -.. code-block:: typoscript - :caption: **Page** TSconfig, for example EXT:my_extension/Configuration/page.tsconfig - - # before - mod.web_info.menu.function.TYPO3\CMS\Info\Controller\TranslationStatusController = 0 - -.. code-block:: typoscript - :caption: **User** TSconfig, for example EXT:my_extension/Configuration/user.tsconfig - - # after - options.hideModules := addToList(web_info_translations) - -See also :ref:`setting-user-tsconfig`. You can find the names of all -TypoScript modules in :t3src:`info/Configuration/Backend/Modules.php`. diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebTs.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebTs.rst deleted file mode 100644 index de90483bf..000000000 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebTs.rst +++ /dev/null @@ -1,52 +0,0 @@ -:orphan: -.. include:: /Includes.rst.txt - -====== -web_ts -====== - -.. versionchanged:: 12.0 - The :guilabel:`Web > Template` module has been replaced by the - :guilabel:`Web > TypoScript` module. The only option in this namespace - has been removed. - -.. contents:: - :local: - -.. index:: - web_info.menu.function - Module menu; Template -.. _pageblindingfunctionmenuoptions-webts: - -menu.function -============= - -.. versionchanged:: 12.0 - The TSconfig option :tsconfig:`mod.web_ts.menu.function` has been removed - with TYPO3 v12.0. Use **user** TSconfig option - :ref:`options.hideModules <useroptions-hideModules>` instead. - -.. _pageblindingfunctionmenuoptions-webts-migration: - -Migration from menu.function to options.hideModules ---------------------------------------------------- - -Migrate former usage of :tsconfig:`mod.web_ts.menu.function` in **page** TSconfig -to option :ref:`options.hideModules <useroptions-hideModules>`. - -.. code-block:: typoscript - :caption: **Page** TSconfig, for example EXT:my_extension/Configuration/page.tsconfig - - # before - mod.web_ts.menu.function { - TYPO3\CMS\Tstemplate\Controller\TemplateAnalyzerModuleFunctionController = 0 - } - -.. code-block:: typoscript - :caption: **User** TSconfig, for example EXT:my_extension/Configuration/user.tsconfig - - # after - options.hideModules := addToList(web_typoscript_analyzer) - -See also :ref:`setting-user-tsconfig`. You can find the names of all -TypoScript modules in :t3src:`tstemplate/Configuration/Backend/Modules.php`. diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Options.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Options.rst index 13a86b1d9..643660515 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Options.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Options.rst @@ -61,8 +61,6 @@ Example: Exclude two backend layouts from drop down selector defaultUploadFolder ------------------- -.. versionadded:: 12.3 - .. confval:: defaultUploadFolder :name: options-defaultUploadFolder :type: string diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst b/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst index 55d2237b5..20b551a18 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst @@ -92,10 +92,9 @@ addItems The subkey :typoscript:`icon` will allow to add your own icons to new values. - .. versionadded:: 12.1 - The subkey :typoscript:`group` can be used to insert a new element into an - existing select item group by settings the value to the group identifier. - The grouping is usually displayed in select fields with groups available. + The subkey :typoscript:`group` can be used to insert a new element into an + existing select item group by settings the value to the group identifier. + The grouping is usually displayed in select fields with groups available. This property is available for various levels: diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst b/Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst index 933f12933..422123f9f 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst @@ -242,13 +242,6 @@ linkHandler Define the order of how the various tabs are displayed in the link browser. - .. versionchanged:: 12.0 - Due to the integration of EXT:recordlist into EXT:backend the namespace of - LinkHandlers has changed from :php:`TYPO3\CMS\Recordlist\LinkHandler` to - :php:`TYPO3\CMS\Backend\LinkHandler`. - For TYPO3 v12 the moved classes are available as an alias under the old - namespace to allow extensions to be compatible with TYPO3 v11 and v12. - .. _pagetcemaintables-linkhandler-example: Example: Display an additional tab in the linkbrowser diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst index 37c542967..ef8e9ca04 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst @@ -9,8 +9,6 @@ templates ========= -.. versionadded:: 12.0 - All Fluid templates rendered by backend controllers can be overridden with own templates on a per-file basis. The feature is available for basically all core backend modules, as well as the backend main frame templates. Exceptions are diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst index 9343e6131..f913b3d5c 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst @@ -561,17 +561,17 @@ typo3.version :name: condition-typo3-version :type: string - TYPO3 version (e.g. 12.4.0-dev) + TYPO3 version (e.g. 13.4.0-dev) .. _condition-typo3-version-example: -Example: Condition only applies in an exact TYPO3 version like 12.4.0 +Example: Condition only applies in an exact TYPO3 version like 13.4.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: typoscript :caption: EXT:site_package/Configuration/page.tsconfig - [typo3.version == "12.4.0"] + [typo3.version == "13.4.0"] // Your settings go here [END] @@ -586,18 +586,18 @@ typo3.branch :name: condition-typo3-branch :type: string - TYPO3 branch (e.g. 12.4) + TYPO3 branch (e.g. 13.4) .. _condition-typo3-branch-example: -Example: Condition applies in all TYPO3 versions of a branch like 12.4 +Example: Condition applies in all TYPO3 versions of a branch like 13.4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: typoscript :caption: EXT:site_package/Configuration/page.tsconfig - [typo3.branch == "12.4"] + [typo3.branch == "13.4"] // Your settings go here [END] @@ -770,14 +770,14 @@ Example: Condition applies if the current TYPO3 version matches a pattern .. code-block:: typoscript :caption: EXT:site_package/Configuration/page.tsconfig - # True if current version is 12.4.x - [compatVersion("12.4")] + # True if current version is 13.4.x + [compatVersion("13.4")] // Your settings go here [END] - [compatVersion("12.4.0")] + [compatVersion("13.4.0")] // Your settings go here [END] - [compatVersion("12.4.1")] + [compatVersion("13.4.1")] // Your settings go here [END] diff --git a/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst b/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst index 367b06be4..18eb767b0 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst @@ -34,11 +34,6 @@ this is not recommended anymore. Setting the page TSconfig globally ================================== -.. versionadded:: 12.0 - Starting with TYPO3 v12.0 page TSconfig in a file named - :file:`Configuration/page.tsconfig` in an extension is automatically - loaded during build time. - Global page TSconfig should be stored within an extension, usually a sitepackage extension. The content of the file :file:`Configuration/page.tsconfig` within an extension is automatically loaded during build time. diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst index 774832491..f63fd9c89 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst +++ b/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst @@ -10,12 +10,12 @@ While the objects, properties and conditions are different, the *syntax* of TSconfig is basically the same as it is for TypoScript in frontend TypoScript templates. -.. versionchanged:: 12.4 - :ref:`Site settings <t3coreapi:sitehandling-settings>` can be used with the - TypoScript constant syntax in TSconfig. - Please note the following differences: * There are differences in the :ref:`conditions <conditions>` that can be used. * The general TypoScript syntax is described in :ref:`TypoScript syntax <t3tsref:typoscript-syntax>`. + +.. note:: + :ref:`Site settings <t3coreapi:sitehandling-settings>` can be used with the + TypoScript constant syntax in TSconfig. From 301c4d602a09015b0903ca43955e9a6af0091633 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:00:41 +0100 Subject: [PATCH 046/125] [TASK] cObject retrieves raw record automatically (#1432) Resolves: https://github.com/TYPO3-Documentation/TYPO3CMS-Tutorial-SitePackage/pull/239 Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../DataProcessing/PageContentFetchingProcessor.rst | 5 ----- .../_PageContentFetchingProcessor/_Default.html | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Documentation/DataProcessing/PageContentFetchingProcessor.rst b/Documentation/DataProcessing/PageContentFetchingProcessor.rst index 423e03ea3..140c5f2b9 100644 --- a/Documentation/DataProcessing/PageContentFetchingProcessor.rst +++ b/Documentation/DataProcessing/PageContentFetchingProcessor.rst @@ -69,11 +69,6 @@ or render it your self. `{contentElement.fullType}` Is composed of "tt_content.[CType]". For a content element of type text it contains "tt_content.text". -`{contentElement.rawRecord}` - Contains an array with the raw row from the database. As the - :typoscript:`tt_content` TypoScript object expects the raw data as input - you should use `{contentElement.rawRecord}` in combination with the - CObject ViewHelper. The :ref:`backend layout <t3coreapi:be-layout>` is defined like this: diff --git a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html index db4feb219..44cac1c7c 100644 --- a/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html +++ b/Documentation/DataProcessing/_PageContentFetchingProcessor/_Default.html @@ -9,7 +9,7 @@ <h2>{contentElement.header}</h2> <f:cObject typoscriptObjectPath="{contentElement.mainType}" table="{contentElement.mainType}" - data="{contentElement.rawRecord}" + data="{contentElement}" /> </f:for> </main> From a531ced86dedf47dc2bb9bfdcb946ffda03583ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:30:10 +0100 Subject: [PATCH 047/125] [TASK] Allow sets to be excluded from site configuration GUI (#577) resolves: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1081 releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../Documentation/UserTsconfig/Options.rst | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst b/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst index d4254d349..fc99173a2 100644 --- a/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst +++ b/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst @@ -1043,3 +1043,23 @@ Properties :typoscript:`options.showHistory.[tableName]`. Any value set for a single table will override the default value set for :typoscript:`showHistory`. + + .. confval:: hideSets + :name: useroptions-hideSets + :type: comma separated list + + Hides existing :ref:`Site sets <t3coreapi:site-sets>` from the list of available + sets for backend users, in case only a curated list of sets + shall be selectable: + + .. code-block:: typoscript + :caption: EXT:my_extension/Configuration/user.tsconfig + + options.sites.hideSets := addToList(typo3/fluid-styled-content) + + The :guilabel:`Site Management > Sites` GUI will not show hidden sets, + but makes one exception if a hidden set has already been applied to a site + + In this case a set + marked as hidden will be shown in the list of currently activated sets (that means + it can be introspected and removed via backend UI). From 7fc0975a33cde5e78a5893d1cae1973d26347656 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:08:41 +0100 Subject: [PATCH 048/125] [TASK] Add link to BeforeRecordDownloadPresetsAreDisplayedEvent (#579) References https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/934 Releases: main Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../TSconfig/Documentation/PageTsconfig/Mod/WebList.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst index b6c6e8dcb..1df37a6d2 100644 --- a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst +++ b/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst @@ -236,10 +236,8 @@ downloadPresets :file:`EXT:my_extension/Configuration/page.tsconfig` file and their table name(s). - .. todo:: Link event after it is merged - Additionally, the list of presets can be manipulated via the PSR-14 event - :php:`BeforeRecordDownloadPresetsAreDisplayedEvent`. + :ref:`\TYPO3\CMS\Backend\RecordList\Event\BeforeRecordDownloadPresetsAreDisplayedEvent <t3coreapi:BeforeRecordDownloadPresetsAreDisplayedEvent>`. .. _pageTsConfigWebList-downloadPresets-example: From bacedbcad3259e51d0d12f7719ca3859f95b221b Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Tue, 19 Nov 2024 17:31:37 +0100 Subject: [PATCH 049/125] [TASK] Merge TSref and TSconfig reference mkdir temp git clone https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig.git temp/tsconfig tmp/replacements.txt: regex:(\[[A-Z]+\])==>\1 styleguide: regex:(\[[A-Z]+\].*) \(#([0-9]+)\)==>\1\n\nhttps://github.com/TYPO3-CMS/styleguide/pull/\2 regex: #([0-9]+)==> https://github.com/TYPO3-CMS/styleguide/issues/\1 cd temp/tsconfig/ git checkout -b main-moved git filter-repo --to-subdirectory-filter Documentation/TSconfig --replace-message ../replacements.txt --refs main-moved --force cd ../.. git remote add -f tsconfig temp/tsconfig git fetch tsconfig git merge --allow-unrelated-histories tsconfig/main-moved Releases: main (cherry picked from commit ce86ec054547f65d30f8c9292cdbc7706af3ca54) --- .../Config/TSconfig.php} | 4 +- .../PageTSconfig/Mod/CsvExport.rst.txt | 0 .../Mod/noExportRecordsLinks.rst.txt | 0 .../Images/AutomaticScreenshots/Input1.png | Bin .../AutomaticScreenshots/Input1.rst.txt | 0 .../WebList/ExportDialog.png | Bin .../WebList/ExportDialog.rst.txt | 0 .../WebList/NoExportButtons.png | Bin .../WebList/NoExportButtons.rst.txt | 0 .../WebList/WithExportButtons.png | Bin .../WebList/WithExportButtons.rst.txt | 0 .../Access/AccessDefaultActions.png | Bin .../Access/AccessDefaultPermissions.png | Bin .../AdminPanel/UserTsAdminPanel.png | Bin .../BackendLayouts/PageModule.png | Bin .../BackendLayouts/PageProperties.png | Bin .../BackendUsers/TSconfigUserInput.png | Bin .../ColorPalettes/ColorPalette.png | Bin .../Configuration/UserTSconfigOverview.png | Bin .../Info/FunctionMenuInfoModule.png | Bin .../Info/PageTsModWebInfoFieldDefinitions.png | Bin .../List/BackendLayoutID.png | Bin .../List/BackendLayoutsExcluded.png | Bin .../List/FileListPrimaryActions.png | Bin .../List/NewRecordWizardNewOrder.png | Bin .../List/PageCopyWithSuffix.png | Bin .../List/PageTsModWebListAllowedNewTables.png | Bin ...eTsModWebListListOnlyInSingleTableView.png | Bin ...eTsModWizardsNewContentElementExample2.png | Bin .../PageTsModWizardsNewRecordHideInside.png | Bin .../List/PagesContextMenu.png | Bin .../List/PagesDoktypeDifferentLabels.png | Bin .../ManualScreenshots/List/PanelModified.png | Bin .../ManualScreenshots/List/PanelNormal.png | Bin .../ManualScreenshots/List/PanelUserDB.png | Bin .../ManualScreenshots/List/SelectFlagIcon.png | Bin .../List/SelectInvalidValue.png | Bin .../List/SelectInvalidValueDifferentLabel.png | Bin .../List/SelectNoInvalidValue.png | Bin .../List/TSconfigPageInput.png | Bin .../List/TcaTypeGroupSuggest.png | Bin .../List/listModuleWithExportButtons.png | Bin .../List/listModuleWithoutExportButtons.png | Bin .../List/optionsPageTreeBackgroundColor.png | Bin .../List/optionsPageTreeLabel.png | Bin .../Page/FunctionMenuPageModule.png | Bin .../Template/FunctionMenuTemplateModule.png | Bin .../UserSettings/UserSettings.png | Bin .../View/WebViewTSConfigPreview.png | Bin Documentation/Index.rst | 13 +- Documentation/Introduction/Index.rst | 111 ++---- .../PageTsconfig/ColorPalettes.rst | 0 .../Documentation => }/PageTsconfig/Index.rst | 0 .../Documentation => }/PageTsconfig/Mod.rst | 0 .../PageTsconfig/Mod/Shared.rst | 0 .../PageTsconfig/Mod/WebInfo.rst | 0 .../PageTsconfig/Mod/WebLayout.rst | 0 .../Mod/WebLayout/BackendLayout.rst | 0 .../Mod/WebLayout/_BackendLayout.tsconfig | 0 .../Mod/WebLayout/_BackendLayout.typoscript | 0 .../PageTsconfig/Mod/WebLayout/_Default.html | 0 .../_backendLayouts-example.tsconfig | 0 .../PageTsconfig/Mod/WebList.rst | 0 .../PageTsconfig/Mod/WebView.rst | 0 .../PageTsconfig/Mod/Wizards.rst | 0 .../Mod/_WebList/_downloadPresets.tsconfig | 0 .../_WebList/_downloadPresetsUser.tsconfig | 0 .../Mod/_newContentElementWizard.tsconfig | 0 .../_newContentElementWizardGroup.tsconfig | 0 .../_mod.SHARED.colPos_list.tsconfig | 0 .../PageTsconfig/Options.rst | 0 .../Documentation => }/PageTsconfig/Rte.rst | 0 .../PageTsconfig/TcaDefaults.rst | 0 .../PageTsconfig/TceForm.rst | 0 .../PageTsconfig/TceMain.rst | 0 .../PageTsconfig/Templates.rst | 0 .../Documentation => }/PageTsconfig/Tx.rst | 0 Documentation/TSconfig/.ddev/.gitignore | 41 --- Documentation/TSconfig/.ddev/config.yaml | 203 ---------- Documentation/TSconfig/.editorconfig | 29 -- .../.github/ISSUE_TEMPLATE/config.yml | 8 - .../.github/ISSUE_TEMPLATE/issue_report.md | 38 -- .../TSconfig/.github/workflows/backport.yml | 16 - .../.github/workflows/documentation.yml | 17 - .../TSconfig/.github/workflows/tests.yml | 24 -- Documentation/TSconfig/.gitignore | 36 -- Documentation/TSconfig/.gitpod.yml | 23 -- Documentation/TSconfig/.php-cs-fixer.dist.php | 73 ---- Documentation/TSconfig/Build/.gitignore | 1 - .../TSconfig/Build/Scripts/runTests.sh | 348 ------------------ Documentation/TSconfig/CONTRIBUTING.md | 38 -- .../TSconfig/Documentation/Includes.rst.txt | 1 - .../TSconfig/Documentation/Index.rst | 56 --- .../Documentation/Introduction/Index.rst | 67 ---- .../TSconfig/Documentation/Sitemap.rst | 9 - .../TSconfig/Documentation/guides.xml | 22 -- Documentation/TSconfig/Makefile | 36 -- Documentation/TSconfig/README.rst | 18 - Documentation/TSconfig/composer.json | 64 ---- .../Documentation => }/UserTsconfig/Auth.rst | 0 .../Documentation => }/UserTsconfig/Index.rst | 0 .../UserTsconfig/Options.rst | 0 .../Documentation => }/UserTsconfig/Page.rst | 0 .../UserTsconfig/Permissions.rst | 0 .../Documentation => }/UserTsconfig/Setup.rst | 0 .../UserTsconfig/TcaDefaults.rst | 0 .../Documentation => }/UserTsconfig/Tx.rst | 0 .../_Setup/_user-setup-default.tsconfig | 0 .../Conditions.rst | 188 +++++----- .../Index.rst | 0 .../PageTSconfig.rst | 0 .../PhpApi.rst | 0 .../Syntax.rst | 0 .../UserTSconfig.rst | 0 .../_ext_localconf_page_tsconfig_v11.php | 0 .../_PageTSconfig/_pages.php | 0 .../_PageTSconfig/_pages_localized.php | 0 .../_PhpApi/_MyBackendController.php | 2 + .../_PhpApi/_MyBackendLoggedInController.php | 1 + .../_PhpApi/_getTSConfig.php | 0 .../_PhpApi/_user.tsconfig | 0 .../_UserTSconfig/_ext_localconf_v12.php | 0 Documentation/codesnippets.php | 1 + 123 files changed, 150 insertions(+), 1338 deletions(-) rename Documentation/{TSconfig/Documentation/CodeSnippets/codesnippets.php => CodeSnippets/Config/TSconfig.php} (82%) rename Documentation/{TSconfig/Documentation => }/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/Input1.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/Input1.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/ExportDialog.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/ExportDialog.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/NoExportButtons.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/NoExportButtons.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/WithExportButtons.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Access/AccessDefaultActions.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Access/AccessDefaultPermissions.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/AdminPanel/UserTsAdminPanel.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/BackendLayouts/PageModule.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/BackendLayouts/PageProperties.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/BackendUsers/TSconfigUserInput.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/ColorPalettes/ColorPalette.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Configuration/UserTSconfigOverview.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Info/FunctionMenuInfoModule.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Info/PageTsModWebInfoFieldDefinitions.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/BackendLayoutID.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/BackendLayoutsExcluded.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/FileListPrimaryActions.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/NewRecordWizardNewOrder.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PageCopyWithSuffix.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PageTsModWebListAllowedNewTables.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PageTsModWebListListOnlyInSingleTableView.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PageTsModWizardsNewContentElementExample2.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PageTsModWizardsNewRecordHideInside.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PagesContextMenu.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PagesDoktypeDifferentLabels.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PanelModified.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PanelNormal.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/PanelUserDB.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/SelectFlagIcon.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/SelectInvalidValue.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/SelectInvalidValueDifferentLabel.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/SelectNoInvalidValue.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/TSconfigPageInput.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/TcaTypeGroupSuggest.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/listModuleWithExportButtons.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/listModuleWithoutExportButtons.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/List/optionsPageTreeLabel.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Page/FunctionMenuPageModule.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/Template/FunctionMenuTemplateModule.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/UserSettings/UserSettings.png (100%) rename Documentation/{TSconfig/Documentation => }/Images/ManualScreenshots/View/WebViewTSConfigPreview.png (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/ColorPalettes.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Index.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/Shared.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebInfo.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout/BackendLayout.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout/_BackendLayout.typoscript (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout/_Default.html (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebLayout/_backendLayouts-example.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebList.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/WebView.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/Wizards.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/_WebList/_downloadPresets.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/_WebList/_downloadPresetsUser.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/_newContentElementWizard.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/_newContentElementWizardGroup.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Options.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Rte.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/TcaDefaults.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/TceForm.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/TceMain.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Templates.rst (100%) rename Documentation/{TSconfig/Documentation => }/PageTsconfig/Tx.rst (100%) delete mode 100644 Documentation/TSconfig/.ddev/.gitignore delete mode 100644 Documentation/TSconfig/.ddev/config.yaml delete mode 100644 Documentation/TSconfig/.editorconfig delete mode 100644 Documentation/TSconfig/.github/ISSUE_TEMPLATE/config.yml delete mode 100644 Documentation/TSconfig/.github/ISSUE_TEMPLATE/issue_report.md delete mode 100644 Documentation/TSconfig/.github/workflows/backport.yml delete mode 100644 Documentation/TSconfig/.github/workflows/documentation.yml delete mode 100644 Documentation/TSconfig/.github/workflows/tests.yml delete mode 100644 Documentation/TSconfig/.gitignore delete mode 100644 Documentation/TSconfig/.gitpod.yml delete mode 100644 Documentation/TSconfig/.php-cs-fixer.dist.php delete mode 100644 Documentation/TSconfig/Build/.gitignore delete mode 100755 Documentation/TSconfig/Build/Scripts/runTests.sh delete mode 100644 Documentation/TSconfig/CONTRIBUTING.md delete mode 100644 Documentation/TSconfig/Documentation/Includes.rst.txt delete mode 100644 Documentation/TSconfig/Documentation/Index.rst delete mode 100644 Documentation/TSconfig/Documentation/Introduction/Index.rst delete mode 100644 Documentation/TSconfig/Documentation/Sitemap.rst delete mode 100644 Documentation/TSconfig/Documentation/guides.xml delete mode 100644 Documentation/TSconfig/Makefile delete mode 100644 Documentation/TSconfig/README.rst delete mode 100644 Documentation/TSconfig/composer.json rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Auth.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Index.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Options.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Page.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Permissions.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Setup.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/TcaDefaults.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/Tx.rst (100%) rename Documentation/{TSconfig/Documentation => }/UserTsconfig/_Setup/_user-setup-default.tsconfig (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/Conditions.rst (81%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/Index.rst (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/PageTSconfig.rst (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/PhpApi.rst (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/Syntax.rst (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/UserTSconfig.rst (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PageTSconfig/_pages.php (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PageTSconfig/_pages_localized.php (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PhpApi/_MyBackendController.php (93%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PhpApi/_MyBackendLoggedInController.php (93%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PhpApi/_getTSConfig.php (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_PhpApi/_user.tsconfig (100%) rename Documentation/{TSconfig/Documentation/UsingSetting => UsingSettingTSconfig}/_UserTSconfig/_ext_localconf_v12.php (100%) diff --git a/Documentation/TSconfig/Documentation/CodeSnippets/codesnippets.php b/Documentation/CodeSnippets/Config/TSconfig.php similarity index 82% rename from Documentation/TSconfig/Documentation/CodeSnippets/codesnippets.php rename to Documentation/CodeSnippets/Config/TSconfig.php index 83b9c4be6..f713ecd97 100644 --- a/Documentation/TSconfig/Documentation/CodeSnippets/codesnippets.php +++ b/Documentation/CodeSnippets/Config/TSconfig.php @@ -7,14 +7,14 @@ [ 'action' => 'createCodeSnippet', 'sourceFile' => 'EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig', - 'targetFileName' => 'PageTSconfig/Mod/CsvExport.rst.txt', + 'targetFileName' => 'CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt', 'caption' => 'EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig', 'language' => 'typoscript', ], [ 'action' => 'createCodeSnippet', 'sourceFile' => 'EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig', - 'targetFileName' => 'PageTSconfig/Mod/noExportRecordsLinks.rst.txt', + 'targetFileName' => 'CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt', 'caption' => 'EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig', 'language' => 'typoscript', ], diff --git a/Documentation/TSconfig/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt b/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt rename to Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt diff --git a/Documentation/TSconfig/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt b/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt rename to Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/Input1.png b/Documentation/Images/AutomaticScreenshots/Input1.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/Input1.png rename to Documentation/Images/AutomaticScreenshots/Input1.png diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/Input1.rst.txt b/Documentation/Images/AutomaticScreenshots/Input1.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/Input1.rst.txt rename to Documentation/Images/AutomaticScreenshots/Input1.rst.txt diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.png b/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.png rename to Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.png diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.rst.txt b/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.rst.txt rename to Documentation/Images/AutomaticScreenshots/WebList/ExportDialog.rst.txt diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.png b/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.png rename to Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.png diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.rst.txt b/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.rst.txt rename to Documentation/Images/AutomaticScreenshots/WebList/NoExportButtons.rst.txt diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.png b/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.png rename to Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.png diff --git a/Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt b/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt similarity index 100% rename from Documentation/TSconfig/Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt rename to Documentation/Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Access/AccessDefaultActions.png b/Documentation/Images/ManualScreenshots/Access/AccessDefaultActions.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Access/AccessDefaultActions.png rename to Documentation/Images/ManualScreenshots/Access/AccessDefaultActions.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Access/AccessDefaultPermissions.png b/Documentation/Images/ManualScreenshots/Access/AccessDefaultPermissions.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Access/AccessDefaultPermissions.png rename to Documentation/Images/ManualScreenshots/Access/AccessDefaultPermissions.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/AdminPanel/UserTsAdminPanel.png b/Documentation/Images/ManualScreenshots/AdminPanel/UserTsAdminPanel.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/AdminPanel/UserTsAdminPanel.png rename to Documentation/Images/ManualScreenshots/AdminPanel/UserTsAdminPanel.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendLayouts/PageModule.png b/Documentation/Images/ManualScreenshots/BackendLayouts/PageModule.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendLayouts/PageModule.png rename to Documentation/Images/ManualScreenshots/BackendLayouts/PageModule.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendLayouts/PageProperties.png b/Documentation/Images/ManualScreenshots/BackendLayouts/PageProperties.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendLayouts/PageProperties.png rename to Documentation/Images/ManualScreenshots/BackendLayouts/PageProperties.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendUsers/TSconfigUserInput.png b/Documentation/Images/ManualScreenshots/BackendUsers/TSconfigUserInput.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/BackendUsers/TSconfigUserInput.png rename to Documentation/Images/ManualScreenshots/BackendUsers/TSconfigUserInput.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/ColorPalettes/ColorPalette.png b/Documentation/Images/ManualScreenshots/ColorPalettes/ColorPalette.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/ColorPalettes/ColorPalette.png rename to Documentation/Images/ManualScreenshots/ColorPalettes/ColorPalette.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Configuration/UserTSconfigOverview.png b/Documentation/Images/ManualScreenshots/Configuration/UserTSconfigOverview.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Configuration/UserTSconfigOverview.png rename to Documentation/Images/ManualScreenshots/Configuration/UserTSconfigOverview.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Info/FunctionMenuInfoModule.png b/Documentation/Images/ManualScreenshots/Info/FunctionMenuInfoModule.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Info/FunctionMenuInfoModule.png rename to Documentation/Images/ManualScreenshots/Info/FunctionMenuInfoModule.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Info/PageTsModWebInfoFieldDefinitions.png b/Documentation/Images/ManualScreenshots/Info/PageTsModWebInfoFieldDefinitions.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Info/PageTsModWebInfoFieldDefinitions.png rename to Documentation/Images/ManualScreenshots/Info/PageTsModWebInfoFieldDefinitions.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/BackendLayoutID.png b/Documentation/Images/ManualScreenshots/List/BackendLayoutID.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/BackendLayoutID.png rename to Documentation/Images/ManualScreenshots/List/BackendLayoutID.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/BackendLayoutsExcluded.png b/Documentation/Images/ManualScreenshots/List/BackendLayoutsExcluded.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/BackendLayoutsExcluded.png rename to Documentation/Images/ManualScreenshots/List/BackendLayoutsExcluded.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/FileListPrimaryActions.png b/Documentation/Images/ManualScreenshots/List/FileListPrimaryActions.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/FileListPrimaryActions.png rename to Documentation/Images/ManualScreenshots/List/FileListPrimaryActions.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/NewRecordWizardNewOrder.png b/Documentation/Images/ManualScreenshots/List/NewRecordWizardNewOrder.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/NewRecordWizardNewOrder.png rename to Documentation/Images/ManualScreenshots/List/NewRecordWizardNewOrder.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageCopyWithSuffix.png b/Documentation/Images/ManualScreenshots/List/PageCopyWithSuffix.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageCopyWithSuffix.png rename to Documentation/Images/ManualScreenshots/List/PageCopyWithSuffix.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWebListAllowedNewTables.png b/Documentation/Images/ManualScreenshots/List/PageTsModWebListAllowedNewTables.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWebListAllowedNewTables.png rename to Documentation/Images/ManualScreenshots/List/PageTsModWebListAllowedNewTables.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWebListListOnlyInSingleTableView.png b/Documentation/Images/ManualScreenshots/List/PageTsModWebListListOnlyInSingleTableView.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWebListListOnlyInSingleTableView.png rename to Documentation/Images/ManualScreenshots/List/PageTsModWebListListOnlyInSingleTableView.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewContentElementExample2.png b/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewContentElementExample2.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewContentElementExample2.png rename to Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewContentElementExample2.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewRecordHideInside.png b/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewRecordHideInside.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewRecordHideInside.png rename to Documentation/Images/ManualScreenshots/List/PageTsModWizardsNewRecordHideInside.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PagesContextMenu.png b/Documentation/Images/ManualScreenshots/List/PagesContextMenu.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PagesContextMenu.png rename to Documentation/Images/ManualScreenshots/List/PagesContextMenu.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PagesDoktypeDifferentLabels.png b/Documentation/Images/ManualScreenshots/List/PagesDoktypeDifferentLabels.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PagesDoktypeDifferentLabels.png rename to Documentation/Images/ManualScreenshots/List/PagesDoktypeDifferentLabels.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelModified.png b/Documentation/Images/ManualScreenshots/List/PanelModified.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelModified.png rename to Documentation/Images/ManualScreenshots/List/PanelModified.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelNormal.png b/Documentation/Images/ManualScreenshots/List/PanelNormal.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelNormal.png rename to Documentation/Images/ManualScreenshots/List/PanelNormal.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelUserDB.png b/Documentation/Images/ManualScreenshots/List/PanelUserDB.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/PanelUserDB.png rename to Documentation/Images/ManualScreenshots/List/PanelUserDB.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectFlagIcon.png b/Documentation/Images/ManualScreenshots/List/SelectFlagIcon.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectFlagIcon.png rename to Documentation/Images/ManualScreenshots/List/SelectFlagIcon.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectInvalidValue.png b/Documentation/Images/ManualScreenshots/List/SelectInvalidValue.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectInvalidValue.png rename to Documentation/Images/ManualScreenshots/List/SelectInvalidValue.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectInvalidValueDifferentLabel.png b/Documentation/Images/ManualScreenshots/List/SelectInvalidValueDifferentLabel.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectInvalidValueDifferentLabel.png rename to Documentation/Images/ManualScreenshots/List/SelectInvalidValueDifferentLabel.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectNoInvalidValue.png b/Documentation/Images/ManualScreenshots/List/SelectNoInvalidValue.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/SelectNoInvalidValue.png rename to Documentation/Images/ManualScreenshots/List/SelectNoInvalidValue.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/TSconfigPageInput.png b/Documentation/Images/ManualScreenshots/List/TSconfigPageInput.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/TSconfigPageInput.png rename to Documentation/Images/ManualScreenshots/List/TSconfigPageInput.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/TcaTypeGroupSuggest.png b/Documentation/Images/ManualScreenshots/List/TcaTypeGroupSuggest.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/TcaTypeGroupSuggest.png rename to Documentation/Images/ManualScreenshots/List/TcaTypeGroupSuggest.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/listModuleWithExportButtons.png b/Documentation/Images/ManualScreenshots/List/listModuleWithExportButtons.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/listModuleWithExportButtons.png rename to Documentation/Images/ManualScreenshots/List/listModuleWithExportButtons.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/listModuleWithoutExportButtons.png b/Documentation/Images/ManualScreenshots/List/listModuleWithoutExportButtons.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/listModuleWithoutExportButtons.png rename to Documentation/Images/ManualScreenshots/List/listModuleWithoutExportButtons.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png b/Documentation/Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png rename to Documentation/Images/ManualScreenshots/List/optionsPageTreeBackgroundColor.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/optionsPageTreeLabel.png b/Documentation/Images/ManualScreenshots/List/optionsPageTreeLabel.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/List/optionsPageTreeLabel.png rename to Documentation/Images/ManualScreenshots/List/optionsPageTreeLabel.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/FunctionMenuPageModule.png b/Documentation/Images/ManualScreenshots/Page/FunctionMenuPageModule.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Page/FunctionMenuPageModule.png rename to Documentation/Images/ManualScreenshots/Page/FunctionMenuPageModule.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/Template/FunctionMenuTemplateModule.png b/Documentation/Images/ManualScreenshots/Template/FunctionMenuTemplateModule.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/Template/FunctionMenuTemplateModule.png rename to Documentation/Images/ManualScreenshots/Template/FunctionMenuTemplateModule.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/UserSettings/UserSettings.png b/Documentation/Images/ManualScreenshots/UserSettings/UserSettings.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/UserSettings/UserSettings.png rename to Documentation/Images/ManualScreenshots/UserSettings/UserSettings.png diff --git a/Documentation/TSconfig/Documentation/Images/ManualScreenshots/View/WebViewTSConfigPreview.png b/Documentation/Images/ManualScreenshots/View/WebViewTSConfigPreview.png similarity index 100% rename from Documentation/TSconfig/Documentation/Images/ManualScreenshots/View/WebViewTSConfigPreview.png rename to Documentation/Images/ManualScreenshots/View/WebViewTSConfigPreview.png diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 103e38e39..eb3a3f4f2 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -3,7 +3,7 @@ .. _start: ==================== -TypoScript Reference +TypoScript Explained ==================== :Version: @@ -45,10 +45,11 @@ chapter. Introduction/Index Guide/Index UsingSetting/Index + UsingSettingTSconfig/Index Syntax/Index .. toctree:: - :caption: Reference + :caption: Frontend TypoScript :maxdepth: 1 :titlesonly: @@ -59,6 +60,14 @@ chapter. DataTypes/Index Conditions/Index +.. toctree:: + :caption: Backend TypoScript + :maxdepth: 1 + :titlesonly: + + PageTsconfig/Index + UserTsconfig/Index + .. toctree:: :caption: Appendix :hidden: diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 9123c90c9..0f8c46b24 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -1,103 +1,70 @@ .. include:: /Includes.rst.txt .. _introduction: -.. _typoscript-syntax-typoscript-templates: ============ Introduction ============ -What is to be rendered on a page in the frontend, -the menu structure, how content objects are displayed, etc. can be -defined with TypoScript - often it is used in -combination with the Fluid templating engine. - -This document is a **reference**, used to lookup TypoScript templating -:ref:`basic data types <data-types>`, :ref:`object types <cobject>`, -:ref:`functions <functions>` and :ref:`conditions <conditions>`. This -reference is not intended to give you a full introduction into the topic -TypoScript. - - -What is TypoScript? -=================== - -TypoScript can have 2 meanings: +This document serves as a manual for TypoScript and TSconfig, two +essential configuration tools in TYPO3. -* **TypoScript syntax** is used in TypoScript templates and in - TSconfig -* **TypoScript templates** are used to configure - the TYPO3 frontend rendering. - -Additionally, in TypoScript templates, you must differentiate between - -* TypoScript **constants** (using the TypoScript constant syntax) -* and Typoscript **setup** - -Though TypoScript does include "functions" and "objects" and "conditions" -it is not a programming language. Think of it more as a configuration -language. The results of the TypoScript setup are used to build a PHP -array. +.. _typoscript-syntax-typoscript-templates: -Basically think of TypoScript as a means to "configure" the **frontend**, -while TSconfig is used to configure the **backend** (with a few exceptions -to this principle) +TypoScript +========== -Please read the following for an introduction: +TypoScript is a configuration language used to define the frontend rendering +in TYPO3. It is not a programming language but a means of configuring the +website. -* :ref:`TypoScript Syntax <typoscript-syntax>` - chapter for an introduction to the TypoScript - syntax -* :ref:`guide` for an introduction to TypoScript configuration -* The chapter :ref:`using-and-setting` describes how to use, set - and extend TypoScript. +Key sections to explore: +* :ref:`TypoScript Syntax <typoscript-syntax>` for an introduction to the syntax. +* :ref:`TypoScript Reference <data-types>` for details on data types, object types, functions, and conditions. +* :ref:`guide` for configuring frontend behavior using TypoScript. +* :ref:`using-and-setting` for extending and setting TypoScript properties. .. _typoscript-syntax-typoscript-templates-usage: -Templating methods in TYPO3 -=========================== +Templating in TYPO3 +=================== + +Frontend rendering in TYPO3 can use several methods, each requiring some TypoScript configuration: +**Best Practice:** -TypoScript templates are used to drive frontend rendering. +- **Fluid Templates**: Use the `Fluid <https://typo3.org/fluid>`__ engine with TypoScript's :ref:`cobj-fluidtemplate` to integrate external HTML templates with Fluid variables. + * See :ref:`t3sitepackage:start` for creating site packages and custom themes. + * See :ref:`t3coreapi:adding-your-own-content-elements` to create custom content elements with TypoScript and Fluid. -A minimal amount of TypoScript will *always* be necessary to -tell TYPO3 CMS which templating method to use. -It could be any of the following. +**Other Methods:** -Best practice: +- External templating engines via extensions. +- Custom PHP code for advanced use cases. +- TypoScript content objects for fully configurable rendering. -- **Fluid templates:** Configure TYPO3 to use `Fluid <https://typo3.org/fluid>`__ - for templating. This allows to use external HTML templates, but - with fluid-style variables with curly braces. A content object type - :ref:`cobj-fluidtemplate` is available, which uses Fluid - from inside TypoScript. +**Outdated Method:** - * See :ref:`t3sitepackage:start` for a complete walkthrough of creating a - sitepackage, which is the basis for a custom theme for your site. - * See :ref:`t3coreapi:adding-your-own-content-elements` for an - introduction on how to create your own content element types using - TypoScript :ref:`cobj-template`, Fluid and data processors. +- **HTML Templates** using markers and subparts (:ref:`cobj-template`) are no longer recommended. -Other methods: +.. _about-tsconfig: +TSconfig +======== -- **External Templating Engines:** Any other templating system can be - used. It will be provided via an extension. In such a case TypoScript - may be used to delegate the rendering to that system. +TSconfig customizes the TYPO3 backend for pages, users, and groups without requiring PHP code. It is a TypoScript-like syntax, used for backend configuration, distinct from TypoScript, which configures the frontend. -- **Custom PHP:** Configure TYPO3 to call your own PHP code which - generates content in any way you may prefer. This might include using - third party templating engines! +**Key Concepts:** -- **TS content objects:** Build the page entirely using TypoScript - content objects. All these objects are highly configurable. +- **Page TSconfig**: Configures backend behavior on a per-page basis. +- **User TSconfig**: Configures options for specific users or groups. -Outdated methods: +TSconfig is primarily for integrators to control what backend users see and interact with, including: +- Configuring backend options and views. +- Customizing the Admin Panel in the frontend, which is tightly linked to backend user roles. -- **HTML templates:** Configure TYPO3 CMS to facilitate external HTML- - templates with markers and subparts using the :ref:`cobj-template` - content object type. This method is considered outdated and no - longer recommended. +For details on syntax, refer to :ref:`TYPO3 Explained <t3tsref:typoscript-syntax>`. Remember, properties from the :ref:`TypoScript Reference <t3tsref:start>` cannot be used in TSconfig and vice versa. +This document provides the foundational concepts and serves as a reference for both TypoScript and TSconfig, empowering developers and integrators to customize TYPO3 effectively. diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/ColorPalettes.rst b/Documentation/PageTsconfig/ColorPalettes.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/ColorPalettes.rst rename to Documentation/PageTsconfig/ColorPalettes.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Index.rst b/Documentation/PageTsconfig/Index.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Index.rst rename to Documentation/PageTsconfig/Index.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod.rst b/Documentation/PageTsconfig/Mod.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod.rst rename to Documentation/PageTsconfig/Mod.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst b/Documentation/PageTsconfig/Mod/Shared.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/Shared.rst rename to Documentation/PageTsconfig/Mod/Shared.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst b/Documentation/PageTsconfig/Mod/WebInfo.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebInfo.rst rename to Documentation/PageTsconfig/Mod/WebInfo.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout.rst b/Documentation/PageTsconfig/Mod/WebLayout.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout.rst rename to Documentation/PageTsconfig/Mod/WebLayout.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst b/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst rename to Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig b/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig rename to Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.typoscript b/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.typoscript similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.typoscript rename to Documentation/PageTsconfig/Mod/WebLayout/_BackendLayout.typoscript diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_Default.html b/Documentation/PageTsconfig/Mod/WebLayout/_Default.html similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_Default.html rename to Documentation/PageTsconfig/Mod/WebLayout/_Default.html diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_backendLayouts-example.tsconfig b/Documentation/PageTsconfig/Mod/WebLayout/_backendLayouts-example.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebLayout/_backendLayouts-example.tsconfig rename to Documentation/PageTsconfig/Mod/WebLayout/_backendLayouts-example.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/PageTsconfig/Mod/WebList.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebList.rst rename to Documentation/PageTsconfig/Mod/WebList.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebView.rst b/Documentation/PageTsconfig/Mod/WebView.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/WebView.rst rename to Documentation/PageTsconfig/Mod/WebView.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/Wizards.rst b/Documentation/PageTsconfig/Mod/Wizards.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/Wizards.rst rename to Documentation/PageTsconfig/Mod/Wizards.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_WebList/_downloadPresets.tsconfig b/Documentation/PageTsconfig/Mod/_WebList/_downloadPresets.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/_WebList/_downloadPresets.tsconfig rename to Documentation/PageTsconfig/Mod/_WebList/_downloadPresets.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_WebList/_downloadPresetsUser.tsconfig b/Documentation/PageTsconfig/Mod/_WebList/_downloadPresetsUser.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/_WebList/_downloadPresetsUser.tsconfig rename to Documentation/PageTsconfig/Mod/_WebList/_downloadPresetsUser.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_newContentElementWizard.tsconfig b/Documentation/PageTsconfig/Mod/_newContentElementWizard.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/_newContentElementWizard.tsconfig rename to Documentation/PageTsconfig/Mod/_newContentElementWizard.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_newContentElementWizardGroup.tsconfig b/Documentation/PageTsconfig/Mod/_newContentElementWizardGroup.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/_newContentElementWizardGroup.tsconfig rename to Documentation/PageTsconfig/Mod/_newContentElementWizardGroup.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig b/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig rename to Documentation/PageTsconfig/Mod/_snippets/_mod.SHARED.colPos_list.tsconfig diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Options.rst b/Documentation/PageTsconfig/Options.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Options.rst rename to Documentation/PageTsconfig/Options.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Rte.rst b/Documentation/PageTsconfig/Rte.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Rte.rst rename to Documentation/PageTsconfig/Rte.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TcaDefaults.rst b/Documentation/PageTsconfig/TcaDefaults.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/TcaDefaults.rst rename to Documentation/PageTsconfig/TcaDefaults.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst b/Documentation/PageTsconfig/TceForm.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/TceForm.rst rename to Documentation/PageTsconfig/TceForm.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst b/Documentation/PageTsconfig/TceMain.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/TceMain.rst rename to Documentation/PageTsconfig/TceMain.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst b/Documentation/PageTsconfig/Templates.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Templates.rst rename to Documentation/PageTsconfig/Templates.rst diff --git a/Documentation/TSconfig/Documentation/PageTsconfig/Tx.rst b/Documentation/PageTsconfig/Tx.rst similarity index 100% rename from Documentation/TSconfig/Documentation/PageTsconfig/Tx.rst rename to Documentation/PageTsconfig/Tx.rst diff --git a/Documentation/TSconfig/.ddev/.gitignore b/Documentation/TSconfig/.ddev/.gitignore deleted file mode 100644 index 4eba70c2f..000000000 --- a/Documentation/TSconfig/.ddev/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -#ddev-generated: Automatically generated ddev .gitignore. -# You can remove the above line if you want to edit and maintain this file yourself. -/.gitignore - -/**/*.example -/.dbimageBuild -/.dbimageExtra -/.ddev-docker-*.yaml -/.*downloads -/.global_commands -/.homeadditions -/.importdb* -/.sshimageBuild -/.venv -/.webimageBuild -/.webimageExtra -/apache/apache-site.conf -/commands/.gitattributes -/commands/db/mysql -/commands/host/launch -/commands/web/xdebug -/commands/web/live -/config.local.y*ml -/db_snapshots -/import-db -/import.yaml -/mutagen/mutagen.yml -/mutagen/.start-synced -/nginx_full/nginx-site.conf -/postgres/postgresql.conf -/providers/acquia.yaml -/providers/lagoon.yaml -/providers/platform.yaml -/providers/upsun.yaml -/sequelpro.spf -/settings/settings.ddev.py -/traefik/config/reference-tsconfig.yaml -/traefik/certs/reference-tsconfig.crt -/traefik/certs/reference-tsconfig.key -/xhprof/xhprof_prepend.php -/**/README.* diff --git a/Documentation/TSconfig/.ddev/config.yaml b/Documentation/TSconfig/.ddev/config.yaml deleted file mode 100644 index 9c2fdc778..000000000 --- a/Documentation/TSconfig/.ddev/config.yaml +++ /dev/null @@ -1,203 +0,0 @@ -name: reference-tsconfig -type: php -docroot: "" -php_version: "8.2" -webserver_type: nginx-fpm -router_http_port: "8081" -router_https_port: "4434" -xdebug_enabled: false -additional_hostnames: [] -additional_fqdns: [] -mariadb_version: "10.5" -mysql_version: "" -nfs_mount_enabled: false -mutagen_enabled: false -hooks: - post-start: - - exec: composer install --no-progress -omit_containers: [dba, ddev-ssh-agent] -webimage_extra_packages: [parallel] -use_dns_when_possible: true -composer_version: "2.4" -web_environment: -- typo3DatabaseName=typo3 -- typo3DatabaseHost=db -- typo3DatabaseUsername=root -- typo3DatabasePassword=root - -# Key features of ddev's config.yaml: - -# name: <projectname> # Name of the project, automatically provides -# http://projectname.ddev.site and https://projectname.ddev.site - -# type: <projecttype> # drupal6/7/8, backdrop, typo3, wordpress, php - -# docroot: <relative_path> # Relative path to the directory containing index.php. - -# php_version: "7.4" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4" "8.0" - -# You can explicitly specify the webimage, dbimage, dbaimage lines but this -# is not recommended, as the images are often closely tied to ddev's' behavior, -# so this can break upgrades. - -# webimage: <docker_image> # nginx/php docker image. -# dbimage: <docker_image> # mariadb docker image. -# dbaimage: <docker_image> - -# mariadb_version and mysql_version -# ddev can use many versions of mariadb and mysql -# However these directives are mutually exclusive -# mariadb_version: 10.2 -# mysql_version: 8.0 - -# router_http_port: <port> # Port to be used for http (defaults to port 80) -# router_https_port: <port> # Port for https (defaults to 443) - -# xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart" -# Note that for most people the commands -# "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better, -# as leaving xdebug enabled all the time is a big performance hit. - -# xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart" -# Note that for most people the commands -# "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better, -# as leaving xhprof enabled all the time is a big performance hit. - -# webserver_type: nginx-fpm # or apache-fpm - -# timezone: Europe/Berlin -# This is the timezone used in the containers and by PHP; -# it can be set to any valid timezone, -# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -# For example Europe/Dublin or MST7MDT - -# composer_version: "" -# if composer_version:"" it will use the current ddev default composer release. -# It can also be set to "1", to get most recent composer v1 -# or "2" for most recent composer v2. -# It can be set to any existing specific composer version. -# After first project 'ddev start' this will not be updated until it changes - -# additional_hostnames: -# - somename -# - someothername -# would provide http and https URLs for "somename.ddev.site" -# and "someothername.ddev.site". - -# additional_fqdns: -# - example.com -# - sub1.example.com -# would provide http and https URLs for "example.com" and "sub1.example.com" -# Please take care with this because it can cause great confusion. - -# upload_dir: custom/upload/dir -# would set the destination path for ddev import-files to custom/upload/dir. - -# working_dir: -# web: /var/www/html -# db: /home -# would set the default working directory for the web and db services. -# These values specify the destination directory for ddev ssh and the -# directory in which commands passed into ddev exec are run. - -# omit_containers: [db, dba, ddev-ssh-agent] -# Currently only these containers are supported. Some containers can also be -# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit -# the "db" container, several standard features of ddev that access the -# database container will be unusable. In the global configuration it is also -# possible to omit ddev-router, but not here. - -# nfs_mount_enabled: false -# Great performance improvement but requires host configuration first. -# See https://ddev.readthedocs.io/en/stable/users/performance/#using-nfs-to-mount-the-project-into-the-container - -# mutagen_enabled: false -# Experimental performance improvement using mutagen asynchronous updates. -# See https://ddev.readthedocs.io/en/latest/users/performance/#using-mutagen - -# fail_on_hook_fail: False -# Decide whether 'ddev start' should be interrupted by a failing hook - -# host_https_port: "59002" -# The host port binding for https can be explicitly specified. It is -# dynamic unless otherwise specified. -# This is not used by most people, most people use the *router* instead -# of the localhost port. - -# host_webserver_port: "59001" -# The host port binding for the ddev-webserver can be explicitly specified. It is -# dynamic unless otherwise specified. -# This is not used by most people, most people use the *router* instead -# of the localhost port. - -# host_db_port: "59002" -# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic -# unless explicitly specified. - -# phpmyadmin_port: "8036" -# phpmyadmin_https_port: "8037" -# The PHPMyAdmin ports can be changed from the default 8036 and 8037 - -# host_phpmyadmin_port: "8036" -# The phpmyadmin (dba) port is not normally bound on the host at all, instead being routed -# through ddev-router, but it can be specified and bound. - -# mailhog_port: "8025" -# mailhog_https_port: "8026" -# The MailHog ports can be changed from the default 8025 and 8026 - -# host_mailhog_port: "8025" -# The mailhog port is not normally bound on the host at all, instead being routed -# through ddev-router, but it can be bound directly to localhost if specified here. - -# webimage_extra_packages: [php7.4-tidy, php-bcmath] -# Extra Debian packages that are needed in the webimage can be added here - -# dbimage_extra_packages: [telnet,netcat] -# Extra Debian packages that are needed in the dbimage can be added here - -# use_dns_when_possible: true -# If the host has internet access and the domain configured can -# successfully be looked up, DNS will be used for hostname resolution -# instead of editing /etc/hosts -# Defaults to true - -# project_tld: ddev.site -# The top-level domain used for project URLs -# The default "ddev.site" allows DNS lookup via a wildcard -# If you prefer you can change this to "ddev.local" to preserve -# pre-v1.9 behavior. - -# ngrok_args: --subdomain mysite --auth username:pass -# Provide extra flags to the "ngrok http" command, see -# https://ngrok.com/docs#http or run "ngrok http -h" - -# disable_settings_management: false -# If true, ddev will not create CMS-specific settings files like -# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php -# In this case the user must provide all such settings. - -# You can inject environment variables into the web container with: -# web_environment: -# - SOMEENV=somevalue -# - SOMEOTHERENV=someothervalue - -# no_project_mount: false -# (Experimental) If true, ddev will not mount the project into the web container; -# the user is responsible for mounting it manually or via a script. -# This is to enable experimentation with alternate file mounting strategies. -# For advanced users only! - -# bind_all_interfaces: false -# If true, host ports will be bound on all network interfaces, -# not just the localhost interface. This means that ports -# will be available on the local network if the host firewall -# allows it. - -# Many ddev commands can be extended to run tasks before or after the -# ddev command is executed, for example "post-start", "post-import-db", -# "pre-composer", "post-composer" -# See https://ddev.readthedocs.io/en/stable/users/extending-commands/ for more -# information on the commands that can be extended and the tasks you can define -# for them. Example: -#hooks: diff --git a/Documentation/TSconfig/.editorconfig b/Documentation/TSconfig/.editorconfig deleted file mode 100644 index 6bf8660c9..000000000 --- a/Documentation/TSconfig/.editorconfig +++ /dev/null @@ -1,29 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org -# -# Use as master: https://github.com/TYPO3-Documentation/T3DocTeam/blob/main/.editorconfig - -# top-most EditorConfig file -root = true - -[{*.rst,*.rst.txt}] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 -max_line_length = 80 - -# MD-Files -[*.md] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 -max_line_length = 80 - -[Makefile] -# Use tabs for indentation (Makefiles require tabs) -indent_style = tab diff --git a/Documentation/TSconfig/.github/ISSUE_TEMPLATE/config.yml b/Documentation/TSconfig/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 62195f946..000000000 --- a/Documentation/TSconfig/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: 🔒️ Security Issue - url: https://typo3.org/community/teams/security - about: If you encounter a security issue 👿, please reach out **only** to the TYPO3 Security Team by writing to security (at) typo3.org. Please don't share the information with the Documentation Team or anyone else. - - name: ❓ Ask question - url: https://typo3.slack.com/app_redirect?channel=C028JEPJL - about: Please ask questions in the Slack channel "#typo3-documentation" 🤗 diff --git a/Documentation/TSconfig/.github/ISSUE_TEMPLATE/issue_report.md b/Documentation/TSconfig/.github/ISSUE_TEMPLATE/issue_report.md deleted file mode 100644 index 492d070c7..000000000 --- a/Documentation/TSconfig/.github/ISSUE_TEMPLATE/issue_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: 🐛 Issue Report -about: If something is missing or not documented correctly 🤔 - ---- - -We recommend submitting changes and suggestions via pull requests. For small changes you -can use the "Edit on GitHub" button which is found at the top of every documentation -page. - -For more information on how you can contribute and help improve TYPO3's -documentation, visit the "How to document guide": https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/WritingDocsOfficial/Index.html - -### Current behavior - -A clear and concise description of what the problem is. - -### Expected behavior/output - -A clear and concise description of what you expect to happen. - -### Links - -One or more links to the documentation page (if available), preferably to the -relevant section. If applicable, also link to other resources which might be -helpful to better understand your proposal. - -### TYPO3 versions - -[e.g. 11, 12] - -### Possible Solution - -Only if you have concrete suggestions to solve the issue. - -### Additional context - -Add any other context or screenshots about your proposal here. diff --git a/Documentation/TSconfig/.github/workflows/backport.yml b/Documentation/TSconfig/.github/workflows/backport.yml deleted file mode 100644 index 18f2e8bc2..000000000 --- a/Documentation/TSconfig/.github/workflows/backport.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Backport -on: - pull_request_target: - types: - - closed - - labeled - -jobs: - backport: - runs-on: ubuntu-latest - name: Backport - steps: - - name: Backport - uses: m-kuhn/backport@v1.2.6 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/Documentation/TSconfig/.github/workflows/documentation.yml b/Documentation/TSconfig/.github/workflows/documentation.yml deleted file mode 100644 index 10cc6d5f4..000000000 --- a/Documentation/TSconfig/.github/workflows/documentation.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: test documentation - -on: [ push, pull_request ] - -jobs: - tests: - name: documentation - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Test if the documentation will render without warnings - run: | - mkdir -p Documentation-GENERATED-temp \ - && docker run --rm --pull always -v $(pwd):/project \ - ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --minimal-test diff --git a/Documentation/TSconfig/.github/workflows/tests.yml b/Documentation/TSconfig/.github/workflows/tests.yml deleted file mode 100644 index c7b370580..000000000 --- a/Documentation/TSconfig/.github/workflows/tests.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: tests - -on: - push: - pull_request: - -jobs: - testsuite: - name: all tests - runs-on: ubuntu-latest - env: - php: '8.2' - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install testing system - run: Build/Scripts/runTests.sh -p ${{ env.php }} -s composerUpdate - - - name: Lint PHP - run: Build/Scripts/runTests.sh -p ${{ env.php }} -s lint - - - name: CGL - run: Build/Scripts/runTests.sh -n -p ${{ env.php }} -s cgl -n diff --git a/Documentation/TSconfig/.gitignore b/Documentation/TSconfig/.gitignore deleted file mode 100644 index 19e5a0f15..000000000 --- a/Documentation/TSconfig/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -######################### -# Git -# global ignore file -######################## -# ignoring temporary files (left by e.g. vim) -# ignoring by common IDE's used directories/files -# dont ignore .rej and .orig as we want to see/clean files after conflict resolution -# -# for local exclude patterns please edit .git/info/exclude -# -*.bak -*.idea -.Build/* -*.project -*.swp -*NOT_VERSIONED* -*~ -.buildpath -.cache -.DS_Store -.env -.project -.session -.settings -.TemporaryItems -.Trashes -.webprj -/_make -/Documentation-GENERATED-temp/ -ehthumbs.db -composer.lock -nbproject -Thumbs.db -var/ -.cache/ -/composer.json.testing diff --git a/Documentation/TSconfig/.gitpod.yml b/Documentation/TSconfig/.gitpod.yml deleted file mode 100644 index b9f8f4629..000000000 --- a/Documentation/TSconfig/.gitpod.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Example -# https://gitpod.io/#https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/tree/main - -image: gitpod/workspace-full - -tasks: - - name: RenderT3Docs - init: | - docker pull ghcr.io/t3docs/render-documentation:v3.0.dev28 - docker tag ghcr.io/t3docs/render-documentation:v3.0.dev28 t3docs/render-documentation:develop - - command: | - eval "$(docker run --rm t3docs/render-documentation:develop show-shell-commands)" - dockrun_t3rd makehtml-no-cache - gp open ./Documentation-GENERATED-temp/Result/project/0.0.0/_buildinfo/warnings.txt - cd ./Documentation-GENERATED-temp/Result/project/0.0.0/ - nohup php -S localhost:8001 & - gp preview "$(gp url 8001)/Index.html" --external - -ports: - - port: 8001 - name: t3docspreview - onOpen: ignore diff --git a/Documentation/TSconfig/.php-cs-fixer.dist.php b/Documentation/TSconfig/.php-cs-fixer.dist.php deleted file mode 100644 index fc43cbf1b..000000000 --- a/Documentation/TSconfig/.php-cs-fixer.dist.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php - -declare(strict_types=1); - -use PhpCsFixer\Config; -use PhpCsFixer\Finder; - -return (new Config()) - ->setFinder( - (new Finder()) - ->in(__DIR__) - ) - ->setRiskyAllowed(true) - ->setRules([ - '@DoctrineAnnotation' => true, - // @todo: Switch to @PER-CS2.0 once php-cs-fixer's todo list is done: https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7247 - '@PER-CS1.0' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'cast_spaces' => ['space' => 'none'], - // @todo: Can be dropped once we enable @PER-CS2.0 - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'declare_parentheses' => true, - 'dir_constant' => true, - // @todo: Can be dropped once we enable @PER-CS2.0 - 'function_declaration' => [ - 'closure_fn_spacing' => 'none', - ], - 'function_to_constant' => ['functions' => ['get_called_class', 'get_class', 'get_class_this', 'php_sapi_name', 'phpversion', 'pi']], - 'type_declaration_spaces' => true, - 'global_namespace_import' => ['import_classes' => false, 'import_constants' => false, 'import_functions' => false], - 'list_syntax' => ['syntax' => 'short'], - // @todo: Can be dropped once we enable @PER-CS2.0 - 'method_argument_space' => true, - 'modernize_strpos' => true, - 'modernize_types_casting' => true, - 'native_function_casing' => true, - 'no_alias_functions' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_leading_namespace_whitespace' => true, - 'no_null_property_initialization' => true, - 'no_short_bool_cast' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_superfluous_elseif' => true, - 'no_trailing_comma_in_singleline' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unused_imports' => true, - 'no_useless_nullsafe_operator' => true, - 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], - 'php_unit_construct' => ['assertions' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame']], - 'php_unit_mock_short_will_return' => true, - 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_scalar' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], - 'return_type_declaration' => ['space_before' => 'none'], - 'single_quote' => true, - 'single_space_around_construct' => true, - 'single_line_comment_style' => ['comment_types' => ['hash']], - // @todo: Can be dropped once we enable @PER-CS2.0 - 'single_line_empty_body' => true, - 'trailing_comma_in_multiline' => ['elements' => ['arrays']], - 'whitespace_after_comma_in_array' => ['ensure_single_space' => true], - 'yoda_style' => ['equal' => false, 'identical' => false, 'less_and_greater' => false], - ]); diff --git a/Documentation/TSconfig/Build/.gitignore b/Documentation/TSconfig/Build/.gitignore deleted file mode 100644 index cffb6ef0d..000000000 --- a/Documentation/TSconfig/Build/.gitignore +++ /dev/null @@ -1 +0,0 @@ -testing-docker/.env diff --git a/Documentation/TSconfig/Build/Scripts/runTests.sh b/Documentation/TSconfig/Build/Scripts/runTests.sh deleted file mode 100755 index a207517f3..000000000 --- a/Documentation/TSconfig/Build/Scripts/runTests.sh +++ /dev/null @@ -1,348 +0,0 @@ -#!/usr/bin/env bash - -# -# EXT:examples test runner based on docker/podman. -# - -cleanUp() { - ATTACHED_CONTAINERS=$(${CONTAINER_BIN} ps --filter network=${NETWORK} --format='{{.Names}}') - for ATTACHED_CONTAINER in ${ATTACHED_CONTAINERS}; do - ${CONTAINER_BIN} rm -f ${ATTACHED_CONTAINER} >/dev/null - done - ${CONTAINER_BIN} network rm ${NETWORK} >/dev/null -} - -cleanCacheFiles() { - echo -n "Clean caches ... " - rm -rf \ - .Build/.cache \ - .php-cs-fixer.cache - echo "done" -} - -cleanRenderedDocumentationFiles() { - echo -n "Clean rendered documentation files ... " - rm -rf \ - Documentation-GENERATED-temp - echo "done" -} - -loadHelp() { - # Load help text into $HELP - read -r -d '' HELP <<EOF -EXT:examples test runner. Check code styles, lint PHP files and some other details. - -Usage: $0 [options] [file] - -Options: - -s <...> - Specifies which test suite to run - - cgl: cgl test and fix all php files - - clean: Clean temporary files - - cleanCache: Clean cache folds for files. - - cleanRenderedDocumentation: Clean existing rendered documentation output. - - composer: "composer" with all remaining arguments dispatched. - - composerNormalize: "composer normalize" - - composerUpdate: "composer update", handy if host has no PHP - - composerValidate: "composer validate" - - lint: PHP linting - - renderDocumentation - - testRenderDocumentation - - -b <docker|podman> - Container environment: - - docker - - podman - - If not specified, podman will be used if available. Otherwise, docker is used. - - -p <8.2|8.3> - Specifies the PHP minor version to be used - - 8.2: (default) use PHP 8.2 - - 8.3: use PHP 8.3 - -n - Only with -s cgl, composerNormalize, rector - Activate dry-run in CGL check and composer normalize that does not actively change files and only prints broken ones. - - -u - Update existing typo3/core-testing-*:latest container images and remove dangling local volumes. - New images are published once in a while and only the latest ones are supported by core testing. - Use this if weird test errors occur. Also removes obsolete image versions of typo3/core-testing-*. - - -h - Show this help. - -Examples: - # Run unit tests using PHP 8.2 - ./Build/Scripts/runTests.sh -EOF -} - -# Test if docker exists, else exit out with error -if ! type "docker" >/dev/null 2>&1 && ! type "podman" >/dev/null 2>&1; then - echo "This script relies on docker or podman. Please install" >&2 - exit 1 -fi - -# Option defaults -TEST_SUITE="cgl" -PHP_VERSION="8.2" -PHP_XDEBUG_ON=0 -PHP_XDEBUG_PORT=9003 -CGLCHECK_DRY_RUN=0 -CI_PARAMS="${CI_PARAMS:-}" -DOCS_PARAMS="${DOCS_PARAMS:=--pull always}" -CONTAINER_BIN="" -CONTAINER_HOST="host.docker.internal" - -# Option parsing updates above default vars -# Reset in case getopts has been used previously in the shell -OPTIND=1 -# Array for invalid options -INVALID_OPTIONS=() -# Simple option parsing based on getopts (! not getopt) -while getopts "b:s:p:xy:nhu" OPT; do - case ${OPT} in - s) - TEST_SUITE=${OPTARG} - ;; - b) - if ! [[ ${OPTARG} =~ ^(docker|podman)$ ]]; then - INVALID_OPTIONS+=("${OPTARG}") - fi - CONTAINER_BIN=${OPTARG} - ;; - p) - PHP_VERSION=${OPTARG} - if ! [[ ${PHP_VERSION} =~ ^(8.2|8.3)$ ]]; then - INVALID_OPTIONS+=("p ${OPTARG}") - fi - ;; - x) - PHP_XDEBUG_ON=1 - ;; - y) - PHP_XDEBUG_PORT=${OPTARG} - ;; - n) - CGLCHECK_DRY_RUN=1 - ;; - h) - loadHelp - echo "${HELP}" - exit 0 - ;; - u) - TEST_SUITE=update - ;; - \?) - INVALID_OPTIONS+=("${OPTARG}") - ;; - :) - INVALID_OPTIONS+=("${OPTARG}") - ;; - esac -done - -# Exit on invalid options -if [ ${#INVALID_OPTIONS[@]} -ne 0 ]; then - echo "Invalid option(s):" >&2 - for I in "${INVALID_OPTIONS[@]}"; do - echo "-"${I} >&2 - done - echo >&2 - echo "call \".Build/Scripts/runTests.sh -h\" to display help and valid options" - exit 1 -fi - -COMPOSER_ROOT_VERSION="13.0.x-dev" -HOST_UID=$(id -u) -USERSET="" -if [ $(uname) != "Darwin" ]; then - USERSET="--user $HOST_UID" -fi - -# Go to the directory this script is located, so everything else is relative -# to this dir, no matter from where this script is called, then go up two dirs. -THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -cd "$THIS_SCRIPT_DIR" || exit 1 -cd ../../ || exit 1 -ROOT_DIR="${PWD}" - -# Create .cache dir: composer need this. -mkdir -p .Build/.cache -mkdir -p .Build/Web/typo3temp/var/tests - -IMAGE_PREFIX="docker.io/" -# Non-CI fetches TYPO3 images (php and nodejs) from ghcr.io -TYPO3_IMAGE_PREFIX="ghcr.io/typo3/" -CONTAINER_INTERACTIVE="-it --init" - -IS_CORE_CI=0 -# ENV var "CI" is set by gitlab-ci. We use it here to distinct 'local' and 'CI' environment. -if [ "${CI}" == "true" ]; then - IS_CORE_CI=1 - IMAGE_PREFIX="" - CONTAINER_INTERACTIVE="" -fi - -# determine default container binary to use: 1. podman 2. docker -if [[ -z "${CONTAINER_BIN}" ]]; then - if type "podman" >/dev/null 2>&1; then - CONTAINER_BIN="podman" - elif type "docker" >/dev/null 2>&1; then - CONTAINER_BIN="docker" - fi -fi - -IMAGE_PHP="${TYPO3_IMAGE_PREFIX}core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest" -IMAGE_ALPINE="${IMAGE_PREFIX}alpine:3.8" -IMAGE_DOCS="ghcr.io/typo3-documentation/render-guides:latest" - -# Set $1 to first mass argument, this is the optional test file or test directory to execute -shift $((OPTIND - 1)) - -SUFFIX=$(echo $RANDOM) -NETWORK="t3docsexamples-${SUFFIX}" -${CONTAINER_BIN} network create ${NETWORK} >/dev/null - -if [ ${CONTAINER_BIN} = "docker" ]; then - # docker needs the add-host for xdebug remote debugging. podman has host.container.internal built in - CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network ${NETWORK} --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${ROOT_DIR}:${ROOT_DIR} -w ${ROOT_DIR}" - CONTAINER_DOCS_PARAMS="${CONTAINER_INTERACTIVE} ${DOCS_PARAMS} --rm --network ${NETWORK} --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${ROOT_DIR}:/project" -else - # podman - CONTAINER_HOST="host.containers.internal" - CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} ${CI_PARAMS} --rm --network ${NETWORK} -v ${ROOT_DIR}:${ROOT_DIR} -w ${ROOT_DIR}" - CONTAINER_DOCS_PARAMS="${CONTAINER_INTERACTIVE} ${DOCS_PARAMS} --rm --network ${NETWORK} -v ${ROOT_DIR}:/project" -fi - -if [ ${PHP_XDEBUG_ON} -eq 0 ]; then - XDEBUG_MODE="-e XDEBUG_MODE=off" - XDEBUG_CONFIG=" " -else - XDEBUG_MODE="-e XDEBUG_MODE=debug -e XDEBUG_TRIGGER=foo" - XDEBUG_CONFIG="client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal" -fi - -# Suite execution -case ${TEST_SUITE} in - cgl) - if [ "${CGLCHECK_DRY_RUN}" -eq 1 ]; then - COMMAND="php -dxdebug.mode=off .Build/bin/php-cs-fixer fix -v --dry-run --diff --config=.php-cs-fixer.dist.php --using-cache=no ." - else - COMMAND="php -dxdebug.mode=off .Build/bin/php-cs-fixer fix -v --config=.php-cs-fixer.dist.php --using-cache=no ." - fi - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name cgl-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" - SUITE_EXIT_CODE=$? - ;; - clean) - cleanCacheFiles - cleanRenderedDocumentationFiles - ;; - cleanCache) - cleanCacheFiles - ;; - cleanRenderedDocumentation) - cleanRenderedDocumentationFiles - ;; - composer) - COMMAND=(composer "$@") - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - composerNormalize) - if [ "${CGLCHECK_DRY_RUN}" -eq 1 ]; then - COMMAND=(composer normalize -n) - else - COMMAND=(composer normalize) - fi - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - composerUpdate) - rm -rf .Build/bin/ .Build/typo3 .Build/vendor .Build/Web ./composer.lock - cp ${ROOT_DIR}/composer.json ${ROOT_DIR}/composer.json.orig - if [ -f "${ROOT_DIR}/composer.json.testing" ]; then - cp ${ROOT_DIR}/composer.json ${ROOT_DIR}/composer.json.orig - fi - COMMAND=(composer require --no-ansi --no-interaction --no-progress) - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-install-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - cp ${ROOT_DIR}/composer.json ${ROOT_DIR}/composer.json.testing - mv ${ROOT_DIR}/composer.json.orig ${ROOT_DIR}/composer.json - ;; - composerValidate) - COMMAND=(composer validate "$@") - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - lint) - COMMAND="find . -name \\*.php ! -path "./.Build/\\*" -print0 | xargs -0 -n1 -P4 php -dxdebug.mode=off -l >/dev/null" - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-command-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" - SUITE_EXIT_CODE=$? - ;; - rector) - if [ "${CGLCHECK_DRY_RUN}" -eq 1 ]; then - COMMAND=(php -dxdebug.mode=off .Build/bin/rector -n --config=Build/rector/rector.php --clear-cache "$@") - else - COMMAND=(php -dxdebug.mode=off .Build/bin/rector --config=Build/rector/rector.php --clear-cache "$@") - fi - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name rector-${SUFFIX} -e COMPOSER_CACHE_DIR=.Build/.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - renderDocumentation) - COMMAND=(--config=Documentation "$@") - mkdir -p Documentation-GENERATED-temp - ${CONTAINER_BIN} run ${CONTAINER_INTERACTIVE} ${CONTAINER_DOCS_PARAMS} --name render-documentation-${SUFFIX} ${IMAGE_DOCS} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - testRenderDocumentation) - COMMAND=(--config=Documentation --no-progress --fail-on-log "$@") - mkdir -p Documentation-GENERATED-temp - ${CONTAINER_BIN} run ${CONTAINER_INTERACTIVE} ${CONTAINER_DOCS_PARAMS} --name render-documentation-test-${SUFFIX} ${IMAGE_DOCS} "${COMMAND[@]}" - SUITE_EXIT_CODE=$? - ;; - update) - # pull typo3/core-testing-* versions of those ones that exist locally - echo "> pull ${TYPO3_IMAGE_PREFIX}core-testing-* versions of those ones that exist locally" - ${CONTAINER_BIN} images "${TYPO3_IMAGE_PREFIX}core-testing-*" --format "{{.Repository}}:{{.Tag}}" | xargs -I {} ${CONTAINER_BIN} pull {} - echo "" - # remove "dangling" typo3/core-testing-* images (those tagged as <none>) - echo "> remove \"dangling\" ${TYPO3_IMAGE_PREFIX}/core-testing-* images (those tagged as <none>)" - ${CONTAINER_BIN} images --filter "reference=${TYPO3_IMAGE_PREFIX}/core-testing-*" --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi -f {} - echo "" - ;; - *) - loadHelp - echo "Invalid -s option argument ${TEST_SUITE}" >&2 - echo >&2 - echo "${HELP}" >&2 - exit 1 - ;; -esac - -cleanUp - -# Print summary -echo "" >&2 -echo "###########################################################################" >&2 -echo "Result of ${TEST_SUITE}" >&2 -echo "Container runtime: ${CONTAINER_BIN}" >&2 -if [[ ${IS_CORE_CI} -eq 1 ]]; then - echo "Environment: CI" >&2 -else - echo "Environment: local" >&2 -fi -echo "PHP: ${PHP_VERSION}" >&2 -echo "TYPO3: ${CORE_VERSION}" >&2 -if [[ ${SUITE_EXIT_CODE} -eq 0 ]]; then - echo "SUCCESS" >&2 -else - echo "FAILURE" >&2 -fi -echo "###########################################################################" >&2 -echo "" >&2 - -# Exit with code of test suite - This script return non-zero if the executed test failed. -exit $SUITE_EXIT_CODE diff --git a/Documentation/TSconfig/CONTRIBUTING.md b/Documentation/TSconfig/CONTRIBUTING.md deleted file mode 100644 index 5d07311f9..000000000 --- a/Documentation/TSconfig/CONTRIBUTING.md +++ /dev/null @@ -1,38 +0,0 @@ -# Contribute to TYPO3 Documentation - -## Create Issues - -* If you find something missing or something is wrong in this manual, you are welcome to write an issue describing the problem. -* If you can, please try to fix the problem yourself. -* For minor changes, it is not necessary to create an issue first. - -## Make changes (create pull requests) - -* In order to make changes on a [rendered page](https://docs.typo3.org/typo3cms/TSconfigReference/), just click on "Edit me on GitHub". -* For a step-by-step walkthrough for making a change, see [Contribute to docs.typo3.org](https://docs.typo3.org/typo3cms/HowToDocument/WritingDocsOfficial/Index.html) -* For a step-by-step walkthrough of alternative workflow, see [Local Editing and Rendering with Docker](https://docs.typo3.org/typo3cms/HowToDocument/WritingDocsOfficial/LocalEditing.html) - -## Preview rendering - -You can preview the rendered result of the docs in by calling the following URL: -https://gitpod.io/#https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/tree/<your branch> - -For example - -* https://gitpod.io/#https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/tree/main renders the branch main -* https://gitpod.io/#https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/tree/lwolf-mychange renders branch lwolf-mychange -* https://gitpod.io/#https://github.com/linawolf/TYPO3CMS-Reference-TSconfig/tree/lwolf-mychange renders the branch lwolf-mychange in my personal fork - -Hint: Use the VSStudio in browser as preview, PHPStorm is very slow - -## Get help - -* If you need help with contributing to the docs, see [How to get Help](https://docs.typo3.org/typo3cms/HowToDocument/HowToGetHelp.html) - -# Contribute to TYPO3 Core - -* See [TYPO3 Contribution Guide - Core Development](https://docs.typo3.org/typo3cms/ContributionWorkflowGuide/) - -# General TYPO3 Support - -If you have some general TYPO3 support questions or need help with TYPO3, please see https://typo3.org/help. diff --git a/Documentation/TSconfig/Documentation/Includes.rst.txt b/Documentation/TSconfig/Documentation/Includes.rst.txt deleted file mode 100644 index 236250747..000000000 --- a/Documentation/TSconfig/Documentation/Includes.rst.txt +++ /dev/null @@ -1 +0,0 @@ -.. You can put central messages to display on all pages here diff --git a/Documentation/TSconfig/Documentation/Index.rst b/Documentation/TSconfig/Documentation/Index.rst deleted file mode 100644 index 9ee7f3b52..000000000 --- a/Documentation/TSconfig/Documentation/Index.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. include:: /Includes.rst.txt - -.. _start: - -================== -TSconfig Reference -================== - -:Version: - |release| - -:Language: - en - -:Author: - TYPO3 contributors - -:License: - This document is published under the - `Open Publication License <https://www.opencontent.org/openpub/>`__. - -:Rendered: - |today| - ----- - -This document describes TSconfig: A TypoScript-like syntax for configuring -details of the TYPO3 backend. - -In addition, you can find -:ref:`a quick introduction into TypoScript <t3tsref:guide>`, -and a complete reference of all object types and properties of -TypoScript in the :ref:`TypoScript Reference <t3tsref:start>` and explanations of -TypoScript syntax in the chapter -":ref:`TypoScript Syntax <t3tsref:typoscript-syntax>`" of TYPO3 -Explained. - ----- - -**Table of Contents:** - -.. toctree:: - :maxdepth: 2 - :titlesonly: - - Introduction/Index - UsingSetting/Index - PageTsconfig/Index - UserTsconfig/Index - -.. Meta Menu - -.. toctree:: - :hidden: - - Sitemap diff --git a/Documentation/TSconfig/Documentation/Introduction/Index.rst b/Documentation/TSconfig/Documentation/Introduction/Index.rst deleted file mode 100644 index 96537e565..000000000 --- a/Documentation/TSconfig/Documentation/Introduction/Index.rst +++ /dev/null @@ -1,67 +0,0 @@ -.. include:: /Includes.rst.txt -.. _introduction: - -============ -Introduction -============ - -.. _about: - -About this document -=================== - -This document describes TSconfig and its options. Tsconfig is a TypoScript-like configuration -syntax which is used to configure parts of the backend based on user, group and page. - -This document can be seen as detail below the main :ref:`TYPO3 Explained <t3coreapi:start>` -documentation as this section is too big to be included there. - -The first parts of this document explain concepts related to TSconfig, where it -can be found in the system, how it can be debugged, and how developers -can access data from TSconfig via the the PHP API. - -The rest of the document can be used as a reference for looking up properties as -you need them. - -This document is especially important for integrators wanting to make life as easy as possible -for their dear backend users. - -.. index:: ! TSconfig -.. _about-tsconfig: - -About TSconfig -============== - -TSconfig is used in TYPO3 to configure and customize the backend on a page, user -or group basis. Its syntax is based on the `TypoScript` that is -used to configure the frontend output of the web site. - -The whole point of TSconfig is that integrators can configure parts of the backend -without having to ask developers to write PHP code. This means that some areas -of TSconfig are very powerful and provide a lot of different ways of customizing the -TYPO3 backend. - -TSconfig is divided into configuration for pages ("Page TSconfig") and configuration -for users and groups ("User TSconfig"). Each type is further explained in this document. - -The general "dotted notation" used in `TypoScript` is also used in Page TSconfig and -User TSconfig. It is possible to reference values, use conditions, and so on. -For a general look at the syntax, please read the relevant section in -:ref:`TYPO3 Explained <t3tsref:typoscript-syntax>`. - -Other than basic syntax, TSconfig and frontend TypoScript have nothing in common. -Properties in the :ref:`TypoScript Reference <t3tsref:start>` cannot be -used in TSconfig and vice versa. TypoScript and TSconfig are two different -things: TypoScript is used to configure rendering of the frontend web site, TSconfig -is used to configure what is displayed to a logged in backend user. - -While this might sound confusing at first, as soon as integrators -start using TSconfig and looking at the available options it is clear: it is all about setting values -to configure what a backend user does or does not see, give them additional -editing options, or removing them. And as a final point, TSconfig is -also used to configure the "Admin panel" in the frontend. While this might seem strange at -first, thinking about it makes it clear why admin panel configuration options are -bound to TSconfig and not to frontend TypoScript. The admin panel is basically a -frontend view of parts of the backend - it is entirely bound to the backend user. So the -admin panel is a backend thing. Even if it is displayed in the frontend it is meant for backend users. This -is why the admin panel is configured via TSconfig. diff --git a/Documentation/TSconfig/Documentation/Sitemap.rst b/Documentation/TSconfig/Documentation/Sitemap.rst deleted file mode 100644 index cd06f7dcd..000000000 --- a/Documentation/TSconfig/Documentation/Sitemap.rst +++ /dev/null @@ -1,9 +0,0 @@ -:template: sitemap.html - -.. include:: /Includes.rst.txt - -======= -Sitemap -======= - -.. The sitemap.html template will insert here the page tree automatically. diff --git a/Documentation/TSconfig/Documentation/guides.xml b/Documentation/TSconfig/Documentation/guides.xml deleted file mode 100644 index a2e9ccc95..000000000 --- a/Documentation/TSconfig/Documentation/guides.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<guides xmlns="https://www.phpdoc.org/guides" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="https://www.phpdoc.org/guides ../vendor/phpdocumentor/guides-cli/resources/schema/guides.xsd" - links-are-relative="true"> - <extension class="\T3Docs\Typo3DocsTheme\DependencyInjection\Typo3DocsThemeExtension" - project-home="https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/" - project-contact="https://typo3.slack.com/archives/C028JEPJL" - project-repository="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" - project-issues="https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig/issues" - edit-on-github-branch="main" - edit-on-github="TYPO3-Documentation/TYPO3CMS-Reference-TSconfig" - typo3-core-preferred="13" - interlink-shortcode="t3tsconfig" - confval-default="TSconfig" - /> - <project - title="TSconfig Reference" - release="13.4" - version="13.4" - copyright="since 2012 by the TYPO3 contributors" - /> -</guides> diff --git a/Documentation/TSconfig/Makefile b/Documentation/TSconfig/Makefile deleted file mode 100644 index 06e37aa4b..000000000 --- a/Documentation/TSconfig/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -.PHONY: help -help: ## Displays this list of targets with descriptions - @echo "The following commands are available:\n" - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' - -.PHONY: docs -docs: ## Generate projects docs (from "Documentation" directory) - mkdir -p Documentation-GENERATED-temp - - docker run --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation - -.PHONY: codesnippets -codesnippets: ## Regenerate automatic code snippets - .Build/bin/typo3 codesnippet:create Documentation/CodeSnippets/ - -.PHONY: test -test: test-lint test-cgl test-docs ## Runs all test suites - -.PHONY: test-lint -test-lint: ## Lint PHP includes - Build/Scripts/runTests.sh -s lint - -.PHONY: test-cgl -test-cgl: ## Test coding guidelines to PHP includes - Build/Scripts/runTests.sh -n -s cgl - -.PHONY: fix-cgl -fix-cgl: ## Apply coding guidelines to PHP includes - Build/Scripts/runTests.sh -s cgl - -.PHONY: test-docs -test-docs: ## Test the documentation rendering - mkdir -p Documentation-GENERATED-temp - - docker run --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --minimal-test - diff --git a/Documentation/TSconfig/README.rst b/Documentation/TSconfig/README.rst deleted file mode 100644 index 6eebb33d9..000000000 --- a/Documentation/TSconfig/README.rst +++ /dev/null @@ -1,18 +0,0 @@ -================== -TSconfig Reference -================== - -This document describes TSconfig: A TypoScript-like syntax for configuring -details of the TYPO3 backend. - -In addition, you can find a quick reference guide to TypoScript templates in -`TypoScript in 45 Minutes`_, a complete reference of all object types and -properties of TypoScript in `TypoScript Reference`_ and explanations of -TypoScript syntax in the chapter "`TypoScript Syntax`_" of TYPO3 Explained. - -.. _TypoScript in 45 Minutes: https://docs.typo3.org/m/typo3/tutorial-typoscript-in-45-minutes/main/en-us/Index.html -.. _TypoScript Reference: https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Index.html -.. _TypoScript Syntax: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Configuration/TypoScriptSyntax/Index.html#typoscript-syntax-start - -:Repository: https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-TSconfig -:Read online: https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/ diff --git a/Documentation/TSconfig/composer.json b/Documentation/TSconfig/composer.json deleted file mode 100644 index 4e0ddd7eb..000000000 --- a/Documentation/TSconfig/composer.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "typo3/reference-tsconfig", - "type": "typo3-cms-documentation", - "description": "Page TSconfig and User TSconfig reference.", - "license": "OPL-1.0", - "require": { - "typo3/cms-core": "dev-main" - }, - "minimum-stability": "dev", - "prefer-stable": true, - "extra": { - "typo3/cms": { - "web-dir": ".Build/public", - "extension-key": "t3docs-reference-tsconfig" - } - }, - "config": { - "allow-plugins": { - "typo3/cms-composer-installers": true, - "typo3/class-alias-loader": true - }, - "bin-dir": ".Build/bin", - "sort-packages": true, - "vendor-dir": ".Build/vendor" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.48", - "t3docs/codesnippet": "dev-main", - "t3docs/examples": "dev-main", - "typo3/cms-adminpanel": "dev-main", - "typo3/cms-backend": "dev-main", - "typo3/cms-belog": "dev-main", - "typo3/cms-beuser": "dev-main", - "typo3/cms-dashboard": "dev-main", - "typo3/cms-extbase": "dev-main", - "typo3/cms-extensionmanager": "dev-main", - "typo3/cms-felogin": "dev-main", - "typo3/cms-filelist": "dev-main", - "typo3/cms-filemetadata": "dev-main", - "typo3/cms-fluid": "dev-main", - "typo3/cms-fluid-styled-content": "dev-main", - "typo3/cms-form": "dev-main", - "typo3/cms-frontend": "dev-main", - "typo3/cms-impexp": "dev-main", - "typo3/cms-indexed-search": "dev-main", - "typo3/cms-info": "dev-main", - "typo3/cms-install": "dev-main", - "typo3/cms-linkvalidator": "dev-main", - "typo3/cms-lowlevel": "dev-main", - "typo3/cms-opendocs": "dev-main", - "typo3/cms-recycler": "dev-main", - "typo3/cms-redirects": "dev-main", - "typo3/cms-reports": "dev-main", - "typo3/cms-rte-ckeditor": "dev-main", - "typo3/cms-scheduler": "dev-main", - "typo3/cms-seo": "dev-main", - "typo3/cms-setup": "dev-main", - "typo3/cms-sys-note": "dev-main", - "typo3/cms-t3editor": "dev-main", - "typo3/cms-tstemplate": "dev-main", - "typo3/cms-viewpage": "dev-main", - "typo3/cms-workspaces": "dev-main" - } -} diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Auth.rst b/Documentation/UserTsconfig/Auth.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Auth.rst rename to Documentation/UserTsconfig/Auth.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Index.rst b/Documentation/UserTsconfig/Index.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Index.rst rename to Documentation/UserTsconfig/Index.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Options.rst b/Documentation/UserTsconfig/Options.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Options.rst rename to Documentation/UserTsconfig/Options.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Page.rst b/Documentation/UserTsconfig/Page.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Page.rst rename to Documentation/UserTsconfig/Page.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Permissions.rst b/Documentation/UserTsconfig/Permissions.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Permissions.rst rename to Documentation/UserTsconfig/Permissions.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Setup.rst b/Documentation/UserTsconfig/Setup.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Setup.rst rename to Documentation/UserTsconfig/Setup.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/TcaDefaults.rst b/Documentation/UserTsconfig/TcaDefaults.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/TcaDefaults.rst rename to Documentation/UserTsconfig/TcaDefaults.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/Tx.rst b/Documentation/UserTsconfig/Tx.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/Tx.rst rename to Documentation/UserTsconfig/Tx.rst diff --git a/Documentation/TSconfig/Documentation/UserTsconfig/_Setup/_user-setup-default.tsconfig b/Documentation/UserTsconfig/_Setup/_user-setup-default.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/UserTsconfig/_Setup/_user-setup-default.tsconfig rename to Documentation/UserTsconfig/_Setup/_user-setup-default.tsconfig diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst b/Documentation/UsingSettingTSconfig/Conditions.rst similarity index 81% rename from Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst rename to Documentation/UsingSettingTSconfig/Conditions.rst index f913b3d5c..cc3f24d6c 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/Conditions.rst +++ b/Documentation/UsingSettingTSconfig/Conditions.rst @@ -3,10 +3,10 @@ Conditions Conditions; Difference to TypoScript templates Conditions; Access backend user -.. _conditions: -.. _condition-references: +.. _tsconfig-conditions: +.. _tsconfig-condition-references: .. _conditions-example: -.. _condition-differences: +.. _tsconfig-condition-differences: ========== Conditions @@ -21,31 +21,31 @@ just as it is done in frontend TypoScript. The list of available variables and functions is different, though. The Symfony expression language tends to throw warnings when sub arrays are -checked in a condition that do not exist. Use the :ref:`traverse <condition-function-traverse>` +checked in a condition that do not exist. Use the :ref:`traverse <tsconfig-condition-function-traverse>` function to avoid this. .. contents:: :local: -.. _condition-variables: +.. _tsconfig-condition-variables: Condition variables available in TSconfig ========================================= .. index:: Conditions; applicationContext -.. _condition-applicationContext: +.. _tsconfig-condition-applicationContext: applicationContext ------------------ .. confval:: applicationContext - :name: condition-applicationContext + :name: tsconfig-condition-applicationContext :type: string Current application context as string. See :ref:`t3coreapi:bootstrapping-context`. -.. _condition-applicationContext-example: +.. _tsconfig-condition-applicationContext-example: Example: Condition applies in application context "Development" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -72,19 +72,19 @@ This condition applies in any context that is "Production" or starts with .. index:: Conditions; page -.. _condition-page: +.. _tsconfig-condition-page: page ---- .. confval:: page - :name: condition-page + :name: tsconfig-condition-page :type: array All data of the current page record as array. Only available in page TSconfig, not in user TSconfig. -.. _condition-page-example: +.. _tsconfig-condition-page-example: Example: Condition applies only on certain pages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -124,13 +124,13 @@ Example: Condition applies only on certain pages .. index:: Conditions; tree -.. _condition-tree: +.. _tsconfig-condition-tree: tree ---- .. confval:: tree - :name: condition-tree + :name: tsconfig-condition-tree :type: Object Object with tree information. Only available in page TSconfig, not @@ -140,19 +140,19 @@ tree Conditions; tree.level Conditions; Page level -.. _condition-tree-level: +.. _tsconfig-condition-tree-level: tree.level ---------- .. confval:: tree.level - :name: condition-tree-level + :name: tsconfig-condition-tree-level :type: integer Current tree level. Only available in page TSconfig, not in user TSconfig. Starts at `1` (root level). -.. _condition-tree-level-example: +.. _tsconfig-condition-tree-level-example: Example: Condition applies on a page on root level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -178,20 +178,20 @@ Example: Condition applies on a page on root level It's the *absolute depth* of the entire page tree, starting with `1`. .. index:: Conditions; tree.pagelayout -.. _condition-tree-pagelayout: +.. _tsconfig-condition-tree-pagelayout: tree.pagelayout --------------- .. confval:: tree.pagelayout - :name: condition-tree-pagelayout + :name: tsconfig-condition-tree-pagelayout :type: integer / string Check for the defined backend layout of a page including the inheritance of the field :guilabel:`Backend Layout (subpages of this page)`. Only available in page TSconfig, not in user TSconfig. -.. _condition-tree-pagelayout-example: +.. _tsconfig-condition-tree-pagelayout-example: Example: Condition applies on pages with a certain backend layout ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -212,19 +212,19 @@ Example: Condition applies on pages with a certain backend layout .. index:: Conditions; tree.rootLine -.. _condition-tree-rootLine: +.. _tsconfig-condition-tree-rootLine: tree.rootLine ------------- .. confval:: tree.rootLine - :name: condition-tree-rootLine + :name: tsconfig-condition-tree-rootLine :type: array An array of arrays with uid and pid. Only available in page TSconfig, not in user TSconfig. -.. _condition-tree-rootLine-example: +.. _tsconfig-condition-tree-rootLine-example: Example: Condition applies on all subpages of page ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -240,19 +240,19 @@ Example: Condition applies on all subpages of page .. index:: Conditions; tree.rootLineIds Conditions; Pid in rootline -.. _condition-tree-rootLineIds: +.. _tsconfig-condition-tree-rootLineIds: tree.rootLineIds ---------------- .. confval:: tree.rootLineIds - :name: condition-tree-rootLineIds + :name: tsconfig-condition-tree-rootLineIds :type: array An array with UIDs of the root line. Only available in page TSconfig, not in user TSconfig. -.. _condition-tree-rootLineIds-example: +.. _tsconfig-condition-tree-rootLineIds-example: Example: Condition applies if a page is in the root line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -269,19 +269,19 @@ Example: Condition applies if a page is in the root line .. index:: Conditions; tree.rootLineParentIds Conditions; Pid up in rootline -.. _condition-tree-rootLineParentIds: +.. _tsconfig-condition-tree-rootLineParentIds: tree.rootLineParentIds ---------------------- .. confval:: tree.rootLineParentIds - :name: condition-tree-rootLineParentIds + :name: tsconfig-condition-tree-rootLineParentIds :type: array An array with parent UIDs of the root line. Only available in page TSconfig, not in user TSconfig. -.. _condition-tree-rootLineParentIds-example: +.. _tsconfig-condition-tree-rootLineParentIds-example: Example: Condition applies if a page's parent is in the root line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -296,26 +296,26 @@ Example: Condition applies if a page's parent is in the root line .. index:: Conditions; backend -.. _condition-backend: +.. _tsconfig-condition-backend: backend ------- .. confval:: backend - :name: condition-backend + :name: tsconfig-condition-backend :type: Object Object with backend information. .. index:: Conditions; backend.user -.. _condition-backend-user: +.. _tsconfig-condition-backend-user: backend.user ------------ .. confval:: backend.user - :name: condition-backend-user + :name: tsconfig-condition-backend-user :type: Object Object with current backend user information. @@ -323,18 +323,18 @@ backend.user .. index:: Conditions; backend.user.isAdmin Conditions; Admin logged in -.. _condition-backend-user-isAdmin: +.. _tsconfig-condition-backend-user-isAdmin: backend.user.isAdmin -------------------- .. confval:: backend.user.isAdmin - :name: condition-backend-user-isAdmin + :name: tsconfig-condition-backend-user-isAdmin :type: boolean True if current user is admin. -.. _condition-backend-user-isAdmin-example: +.. _tsconfig-condition-backend-user-isAdmin-example: Example: Condition applies if the current backend user is an admin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -349,20 +349,20 @@ Example: Condition applies if the current backend user is an admin .. index:: Conditions; backend.user.isLoggedIn -.. _condition-backend-user-isLoggedIn: +.. _tsconfig-condition-backend-user-isLoggedIn: backend.user.isLoggedIn ----------------------- .. confval:: backend.user.isLoggedIn - :name: condition-backend-user-isLoggedIn + :name: tsconfig-condition-backend-user-isLoggedIn :type: boolean True if current user is logged in. .. todo: When does this make sense? TSconfig is only applied in backend context... -.. _condition-backend-user-isLoggedIn-example: +.. _tsconfig-condition-backend-user-isLoggedIn-example: Example: Condition applies if any backend user is logged in ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -376,18 +376,18 @@ Example: Condition applies if any backend user is logged in .. index:: Conditions; backend.user.userId -.. _condition-backend-user-userId: +.. _tsconfig-condition-backend-user-userId: backend.user.userId ------------------- .. confval:: backend.user.userId - :name: condition-backend-user-userId + :name: tsconfig-condition-backend-user-userId :type: integer UID of current user. -.. _condition-backend-user-userId-example: +.. _tsconfig-condition-backend-user-userId-example: Example: Condition applies if a certain backend user is logged in ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -402,18 +402,18 @@ Example: Condition applies if a certain backend user is logged in .. index:: Conditions; backend.user.userGroupIds -.. _condition-backend-user-userGroupIds: +.. _tsconfig-condition-backend-user-userGroupIds: backend.user.userGroupIds ------------------------- .. confval:: backend.user.userGroupList - :name: condition-backend-user-userGroupIds + :name: tsconfig-condition-backend-user-userGroupIds :type: array array of user group IDs of the current backend user. -.. _condition-backend-user-userGroupIds-example: +.. _tsconfig-condition-backend-user-userGroupIds-example: Example: Condition applies if a backend user of a certain group is logged in ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -426,18 +426,18 @@ Example: Condition applies if a backend user of a certain group is logged in [END] .. index:: Conditions; backend.user.userGroupList -.. _condition-backend-user-userGroupList: +.. _tsconfig-condition-backend-user-userGroupList: backend.user.userGroupList -------------------------- .. confval:: backend.user.userGroupList - :name: condition-backend-user-userGroupList + :name: tsconfig-condition-backend-user-userGroupList :type: string Comma list of group UIDs -.. _condition-backend-user-userGroupList-example: +.. _tsconfig-condition-backend-user-userGroupList-example: Example: Condition applies if the groups of a user meet a certain pattern ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -452,31 +452,31 @@ Example: Condition applies if the groups of a user meet a certain pattern [END] .. index:: Conditions; workspace -.. _condition-workspace: +.. _tsconfig-condition-workspace: workspace --------- .. confval:: workspace - :name: condition-workspace + :name: tsconfig-condition-workspace :type: Object object with workspace information .. index:: Conditions; workspace.workspaceId -.. _condition-workspace-workspaceId: +.. _tsconfig-condition-workspace-workspaceId: workspace.workspaceId --------------------- .. confval:: .workspaceId - :name: condition-workspace-workspaceId + :name: tsconfig-condition-workspace-workspaceId :type: integer UID of current workspace. -.. _condition-workspace-workspaceId-example: +.. _tsconfig-condition-workspace-workspaceId-example: Example: Condition applies only in a certain workspace ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -490,18 +490,18 @@ Example: Condition applies only in a certain workspace .. index:: Conditions; workspace.isLive -.. _condition-workspace-isLive: +.. _tsconfig-condition-workspace-isLive: workspace.isLive ---------------- .. confval:: workspace.isLive - :name: condition-workspace-isLive + :name: tsconfig-condition-workspace-isLive :type: boolean True if current workspace is live. -.. _condition-workspace-isLive-example: +.. _tsconfig-condition-workspace-isLive-example: Example: Condition applies only in live workspace ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -515,18 +515,18 @@ Example: Condition applies only in live workspace .. index:: Conditions; workspace.isOffline -.. _condition-workspace-isOffline: +.. _tsconfig-condition-workspace-isOffline: workspace.isOffline ------------------- .. confval:: workspace.isOffline - :name: condition-workspace-isOffline + :name: tsconfig-condition-workspace-isOffline :type: boolean True if current workspace is offline -.. _condition-workspace-isOffline-example: +.. _tsconfig-condition-workspace-isOffline-example: Example: Condition applies only in offline workspace ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -540,30 +540,30 @@ Example: Condition applies only in offline workspace .. index:: Conditions; typo3 -.. _condition-typo3: +.. _tsconfig-condition-typo3: typo3 ----- .. confval:: typo3 - :name: condition-typo3 + :name: tsconfig-condition-typo3 :type: Object Object with TYPO3 related information .. index:: Conditions; typo3.version -.. _condition-typo3-version: +.. _tsconfig-condition-typo3-version: typo3.version ------------- .. confval:: typo3.version - :name: condition-typo3-version + :name: tsconfig-condition-typo3-version :type: string TYPO3 version (e.g. 13.4.0-dev) -.. _condition-typo3-version-example: +.. _tsconfig-condition-typo3-version-example: Example: Condition only applies in an exact TYPO3 version like 13.4.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -577,19 +577,19 @@ Example: Condition only applies in an exact TYPO3 version like 13.4.0 .. index:: Conditions; typo3.branch -.. _condition-typo3-branch: +.. _tsconfig-condition-typo3-branch: typo3.branch ------------ .. confval:: typo3.branch - :name: condition-typo3-branch + :name: tsconfig-condition-typo3-branch :type: string TYPO3 branch (e.g. 13.4) -.. _condition-typo3-branch-example: +.. _tsconfig-condition-typo3-branch-example: Example: Condition applies in all TYPO3 versions of a branch like 13.4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -603,18 +603,18 @@ Example: Condition applies in all TYPO3 versions of a branch like 13.4 .. index:: Conditions; typo3.devIpMask -.. _condition-typo3-devIpMask: +.. _tsconfig-condition-typo3-devIpMask: typo3.devIpMask --------------- .. confval:: typo3.devIpMask - :name: condition-typo3-devIpMask + :name: tsconfig-condition-typo3-devIpMask :type: string :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']` -.. _condition-typo3-devIpMask-example: +.. _tsconfig-condition-typo3-devIpMask-example: Example: Condition only applies if the devIpMask is set to a certain value ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -630,26 +630,26 @@ Example: Condition only applies if the devIpMask is set to a certain value [END] -.. _condition-functions: +.. _tsconfig-condition-functions: Condition functions available in TSconfig ========================================= .. index:: Conditions; date -.. _condition-function-date: +.. _tsconfig-condition-function-date: date() ------ .. confval:: date([parameter]) - :name: condition-function-date + :name: tsconfig-condition-function-date :type: integer :Parameter: [parameter]: string / integer Get current date in given format. See PHP `date <https://www.php.net/manual/en/function.date.php>`_ function as reference for possible usage. -.. _condition-function-date-example: +.. _tsconfig-condition-function-date-example: Example: Condition applies at certain dates or times ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -679,20 +679,20 @@ Example: Condition applies at certain dates or times .. index:: Conditions; like -.. _condition-function-like: +.. _tsconfig-condition-function-like: like() ------ .. confval:: like([search-string], [pattern]) - :name: condition-function-like + :name: tsconfig-condition-function-like :type: boolean :parameter: [search-string] : string; [pattern]: string This function has two parameters: The first parameter is the string to search in, the second parameter is the search string. -.. _condition-function-like-example: +.. _tsconfig-condition-function-like-example: Example: Use the "like()" function in conditions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -717,13 +717,13 @@ Example: Use the "like()" function in conditions .. index:: Conditions; traverse -.. _condition-function-traverse: +.. _tsconfig-condition-function-traverse: traverse() ---------- .. confval:: traverse([array], [key]) - :name: condition-function-traverse + :name: tsconfig-condition-function-traverse :type: any :Parameter: [array]: array; [key]: string or integer @@ -733,7 +733,7 @@ traverse() In case the path is not found in the array, an empty string is returned. -.. _condition-function-traverse-example: +.. _tsconfig-condition-function-traverse-example: Example: Condition applies if request parameter matches a certain value ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -750,19 +750,19 @@ Example: Condition applies if request parameter matches a certain value .. index:: Conditions; compatVersion -.. _condition-function-compatVersion: +.. _tsconfig-condition-function-compatVersion: compatVersion() --------------- .. confval:: compatVersion([version-pattern]) - :name: condition-function-compatVersion + :name: tsconfig-condition-function-compatVersion :type: boolean :Parameter: [version-pattern]: string Compares against the current TYPO3 branch. -.. _condition-function-compatVersion-example: +.. _tsconfig-condition-function-compatVersion-example: Example: Condition applies if the current TYPO3 version matches a pattern ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -781,19 +781,19 @@ Example: Condition applies if the current TYPO3 version matches a pattern // Your settings go here [END] -.. _condition-function-getenv: +.. _tsconfig-condition-function-getenv: getenv() -------- .. confval:: getenv([enviroment_variable]) - :name: condition-function-getenv + :name: tsconfig-condition-function-getenv :type: string :Parameter: [enviroment_variable]: string PHP function `getenv <https://www.php.net/manual/en/function.getenv.php>`_. -.. _condition-function-getenv-example: +.. _tsconfig-condition-function-getenv-example: Example: Condition applies if the virtual host is set to a certain value ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -806,19 +806,19 @@ Example: Condition applies if the virtual host is set to a certain value [END] .. index:: Conditions; feature -.. _condition-function-feature: +.. _tsconfig-condition-function-feature: feature() --------- .. confval:: feature([feature_key]) - :name: condition-function-feature + :name: tsconfig-condition-function-feature :type: any :Parameter: [feature_key]: string Provides access to feature toggles current state. -.. _condition-function-feature-example: +.. _tsconfig-condition-function-feature-example: Example: condition applies if a feature toggle is enabled ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -833,13 +833,13 @@ Example: condition applies if a feature toggle is enabled // Your settings go here [END] -.. _condition-function-site: +.. _tsconfig-condition-function-site: site() ------ .. confval:: site([keyword]) - :name: condition-function-site + :name: tsconfig-condition-function-site :type: string :Parameter: [keyword]: string @@ -858,20 +858,20 @@ site() site("languages") Returns array of available languages for current site. - For deeper information, see :ref:`t3tsref:condition-functions-in-frontend-context-function-siteLanguage`. + For deeper information, see :ref:`condition-functions-in-frontend-context-function-siteLanguage`. site("allLanguages") Returns array of available and unavailable languages for current site. - For deeper information, see :ref:`t3tsref:condition-functions-in-frontend-context-function-siteLanguage`. + For deeper information, see :ref:`condition-functions-in-frontend-context-function-siteLanguage`. site("defaultLanguage") Returns the default language for current site. - For deeper information, see :ref:`t3tsref:condition-functions-in-frontend-context-function-siteLanguage`. + For deeper information, see :ref:`condition-functions-in-frontend-context-function-siteLanguage`. site("configuration") Returns an array with all available configuration for current site. -.. _condition-function-site-example: +.. _tsconfig-condition-function-site-example: Example: Condition applies if a certain value is set in the site configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Index.rst b/Documentation/UsingSettingTSconfig/Index.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/Index.rst rename to Documentation/UsingSettingTSconfig/Index.rst diff --git a/Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst b/Documentation/UsingSettingTSconfig/PageTSconfig.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/PageTSconfig.rst rename to Documentation/UsingSettingTSconfig/PageTSconfig.rst diff --git a/Documentation/TSconfig/Documentation/UsingSetting/PhpApi.rst b/Documentation/UsingSettingTSconfig/PhpApi.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/PhpApi.rst rename to Documentation/UsingSettingTSconfig/PhpApi.rst diff --git a/Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst b/Documentation/UsingSettingTSconfig/Syntax.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/Syntax.rst rename to Documentation/UsingSettingTSconfig/Syntax.rst diff --git a/Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst b/Documentation/UsingSettingTSconfig/UserTSconfig.rst similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/UserTSconfig.rst rename to Documentation/UsingSettingTSconfig/UserTSconfig.rst diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php b/Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php rename to Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_pages.php b/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_pages.php rename to Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_pages_localized.php b/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages_localized.php similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_PageTSconfig/_pages_localized.php rename to Documentation/UsingSettingTSconfig/_PageTSconfig/_pages_localized.php diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendController.php b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendController.php similarity index 93% rename from Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendController.php rename to Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendController.php index abd6b5665..81a55c659 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendController.php +++ b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendController.php @@ -2,6 +2,8 @@ declare(strict_types=1); +namespace UsingSettingTSconfig\_PhpApi; + use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendLoggedInController.php b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php similarity index 93% rename from Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendLoggedInController.php rename to Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php index 641ec8234..191742b8d 100644 --- a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_MyBackendLoggedInController.php +++ b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php @@ -2,6 +2,7 @@ declare(strict_types=1); +namespace UsingSettingTSconfig\_PhpApi; final class _MyBackendLoggedInController { public function isUserToggleEnabled(): bool diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_getTSConfig.php b/Documentation/UsingSettingTSconfig/_PhpApi/_getTSConfig.php similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_getTSConfig.php rename to Documentation/UsingSettingTSconfig/_PhpApi/_getTSConfig.php diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_user.tsconfig b/Documentation/UsingSettingTSconfig/_PhpApi/_user.tsconfig similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_PhpApi/_user.tsconfig rename to Documentation/UsingSettingTSconfig/_PhpApi/_user.tsconfig diff --git a/Documentation/TSconfig/Documentation/UsingSetting/_UserTSconfig/_ext_localconf_v12.php b/Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php similarity index 100% rename from Documentation/TSconfig/Documentation/UsingSetting/_UserTSconfig/_ext_localconf_v12.php rename to Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php diff --git a/Documentation/codesnippets.php b/Documentation/codesnippets.php index cbf328d2e..478db7b2d 100644 --- a/Documentation/codesnippets.php +++ b/Documentation/codesnippets.php @@ -6,4 +6,5 @@ return array_merge( include ('CodeSnippets/Config/DataProcessing.php'), include ('CodeSnippets/Config/Menus.php'), + include ('CodeSnippets/Config/TSconfig.php'), ); From 2ded273ca60611e0e89975a32cf5692940c24e46 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Tue, 19 Nov 2024 21:35:00 +0100 Subject: [PATCH 050/125] [TASK] Use confval-menu for user tsconfig Releases: main, 13.4 (cherry picked from commit 43915f281c5ee5a01095b7b164ce4830480702b3) --- Documentation/UserTsconfig/Auth.rst | 51 +++-- Documentation/UserTsconfig/Options.rst | 2 +- Documentation/UserTsconfig/Setup.rst | 267 ++++++++++--------------- 3 files changed, 133 insertions(+), 187 deletions(-) diff --git a/Documentation/UserTsconfig/Auth.rst b/Documentation/UserTsconfig/Auth.rst index 4bbaccee0..4cb66bf7f 100644 --- a/Documentation/UserTsconfig/Auth.rst +++ b/Documentation/UserTsconfig/Auth.rst @@ -8,20 +8,21 @@ auth The `auth` key is used for configuration of authentication services. +.. contents:: + :depth: 2 + .. _user-auth-properties: Properties ========== -.. contents:: - :depth: 2 - :local: +.. confval-menu:: + :name: auth + :display: table + :type: .. _user-auth-be-redirectToURL: -auth.BE.redirectToURL ---------------------- - .. confval:: auth.BE.redirectToURL :name: user-auth-be-redirectToURL :type: string @@ -31,9 +32,6 @@ auth.BE.redirectToURL .. _user-auth-mfa-required: -auth.mfa.required ------------------ - .. confval:: auth.mfa.required :name: user-auth-mfa-required :type: boolean @@ -48,44 +46,45 @@ auth.mfa.required .. _user-auth-mfa-disableProviders: -auth.mfa.disableProviders -------------------------- - .. confval:: auth.mfa.disableProviders :name: auth.mfa.disableProviders :type: string, comma separated list of strings + :Example: :ref:`user-auth-mfa-disableProviders-example` Disable multi-factor authentication providers for the current user or group. It overrules the configuration from the Backend usergroup "Access List". This means, if a provider is allowed in "Access List" but disallowed with TSconfig, it will be disallowed for the user or user group. -.. _user-auth-mfa-disableProviders-example: - -Example: Disable a multi-factor authentication provider -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig - - auth.mfa.disableProviders := addToList(totp) - .. _user-auth-mfa-recommendedProvider: -auth.mfa.recommendedProvider ----------------------------- - .. confval:: auth.mfa.recommendedProvider :name: auth.mfa.recommendedProvider :type: string + :Example: :ref:`user-auth-mfa-recommendedProvider-example` Set a recommended multi-factor authentication provider on a per user or user group basis, which overrules the global configuration. +.. _user-auth-mfa-example: + +Examples +======== + +.. _user-auth-mfa-disableProviders-example: + +Example: Disable a multi-factor authentication provider +------------------------------------------------------- + +.. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig + + auth.mfa.disableProviders := addToList(totp) + .. _user-auth-mfa-recommendedProvider-example: Example: Set a recommended multi-factor authentication provider -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------------------------------------- .. code-block:: typoscript :caption: EXT:site_package/Configuration/user.tsconfig diff --git a/Documentation/UserTsconfig/Options.rst b/Documentation/UserTsconfig/Options.rst index fc99173a2..d76439ac8 100644 --- a/Documentation/UserTsconfig/Options.rst +++ b/Documentation/UserTsconfig/Options.rst @@ -22,7 +22,7 @@ Properties ========== .. confval-menu:: - :name: confval-group-1 + :name: useroptions :display: table :type: :Default: diff --git a/Documentation/UserTsconfig/Setup.rst b/Documentation/UserTsconfig/Setup.rst index ad4742000..8d76a9cbe 100644 --- a/Documentation/UserTsconfig/Setup.rst +++ b/Documentation/UserTsconfig/Setup.rst @@ -25,212 +25,159 @@ The following properties are available: Properties ========== -.. contents:: - :depth: 2 - :local: +.. confval-menu:: + :name: user-setup + :display: table + :type: + :Default: -.. _user-setup-default: + .. _user-setup-default: -setup.default.[someProperty] ----------------------------- + .. confval:: setup.default.[someProperty] + :name: user-setup-default + :type: any -.. confval:: setup.default.[someProperty] - :name: user-setup-default - :type: any + With this property you can set *default* values. In case a backend user may override these settings + using its :guilabel:`User Settings` module the default settings will be overridden + for this specific backend user. To change the defaults for users with this + property only affects *new* users who did not login yet. It is usually not + possible to set new defaults for users who already logged in, at least once. + The only way to apply new defaults to existing users is by :guilabel:`Reset Backend User Preferences` + in the :guilabel:`Admin tools > Maintenance` section of the install tool. - With this property you can set *default* values. In case a backend user may override these settings - using its :guilabel:`User Settings` module the default settings will be overridden - for this specific backend user. To change the defaults for users with this - property only affects *new* users who did not login yet. It is usually not - possible to set new defaults for users who already logged in, at least once. - The only way to apply new defaults to existing users is by :guilabel:`Reset Backend User Preferences` - in the :guilabel:`Admin tools > Maintenance` section of the install tool. + .. literalinclude:: _Setup/_user-setup-default.tsconfig + :language: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig - .. literalinclude:: _Setup/_user-setup-default.tsconfig - :language: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. _user-setup-override: + .. confval:: setup.override.[someProperty] + :name: user-setup-override + :type: mixed -.. _user-setup-override: + This forces values for the properties of the list below, a user can not override these + setting in its :guilabel:`User settings` module. So, overriding values will be impossible for the + user to change himself and no matter what the current value is, the overriding + value will overrule it. -setup.override.[someProperty] ------------------------------ + .. attention:: + There is a tricky aspect to these `setup.override`: If first you have set a + value by `setup.override` and then remove it again, you will experience + that the value persists to exist. This is because it is saved in the + backend user's profile. Therefore, if you have once set a value, do + *not* remove it again but rather set it blank if you want to disable + the effect again! -.. confval:: setup.override.[someProperty] - :name: user-setup-override - :type: mixed + .. _user-setup-fields-fieldName-disabled: - This forces values for the properties of the list below, a user can not override these - setting in its :guilabel:`User settings` module. So, overriding values will be impossible for the - user to change himself and no matter what the current value is, the overriding - value will overrule it. + .. confval:: setup.fields.[fieldName].disabled + :name: user-setup-fields-fieldName-disabled + :type: boolean - .. attention:: - There is a tricky aspect to these `setup.override`: If first you have set a - value by `setup.override` and then remove it again, you will experience - that the value persists to exist. This is because it is saved in the - backend user's profile. Therefore, if you have once set a value, do - *not* remove it again but rather set it blank if you want to disable - the effect again! + On top of being able to set default values or override them, it is also possible to + hide fields in the :guilabel:`User Settings` module, using `setup.fields.[fieldName].disabled = 1`. + You can find the names of the fields in the :guilabel:`Configuration` module by browsing the "User Settings" array, example: -.. _user-setup-fields-fieldName-disabled: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/user.tsconfig -setup.fields.[fieldName].disabled ---------------------------------- + # Do not show the 'emailMeAtLogin' field to the user in "User Settings" module + setup.fields.emailMeAtLogin.disabled = 1 -.. confval:: setup.fields.[fieldName].disabled - :name: user-setup-fields-fieldName-disabled - :type: boolean + # And force the value of this field to be set to 1 + setup.override.emailMeAtLogin = 1 - On top of being able to set default values or override them, it is also possible to - hide fields in the :guilabel:`User Settings` module, using `setup.fields.[fieldName].disabled = 1`. - You can find the names of the fields in the :guilabel:`Configuration` module by browsing the "User Settings" array, example: + .. index:: User settings; Format of window title in backend - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/user.tsconfig + .. _user-setup-backendTitleFormat: - # Do not show the 'emailMeAtLogin' field to the user in "User Settings" module - setup.fields.emailMeAtLogin.disabled = 1 + .. confval:: backendTitleFormat + :name: user-setup-backendTitleFormat + :type: string - # And force the value of this field to be set to 1 - setup.override.emailMeAtLogin = 1 + Format of window title in backend. Possible values: -.. index:: User settings; Format of window title in backend + `titleFirst` + [title] · [sitename] + `sitenameFirst` + [sitename] · [title] -.. _user-setup-backendTitleFormat: -backendTitleFormat ------------------- + .. index:: User settings; Copy levels -.. confval:: backendTitleFormat - :name: user-setup-backendTitleFormat - :type: string + .. _user-setup-copyLevels: - Format of window title in backend. Possible values: + .. confval:: copyLevels + :name: user-setup-copyLevels + :type: positive integer - `titleFirst` - [title] · [sitename] - `sitenameFirst` - [sitename] · [title] + Recursive Copy: Enter the number of page sub-levels to include, when a page is copied -.. index:: User settings; Copy levels + .. index:: File upload; In doc module -.. _user-setup-copyLevels: + .. _user-setup-edit-docModuleUpload: -copyLevels ----------- + .. confval:: edit_docModuleUpload + :name: user-setup-edit-docModuleUpload + :type: boolean -.. confval:: copyLevels - :name: user-setup-copyLevels - :type: positive integer + Allow file upload directly from file reference fields within backend forms. - Recursive Copy: Enter the number of page sub-levels to include, when a page is copied + .. note:: + The uploaded file will be stored in the default upload folder, + see :ref:`user TSconfig <useroptions-defaultUploadFolder>` and :ref:`page TSconfig <pagedefaultuploadfolder>` + .. _user-setup-emailMeAtLogin: -.. index:: File upload; In doc module + .. confval:: emailMeAtLogin + :name: user-setup-emailMeAtLogin + :type: boolean -.. _user-setup-edit-docModuleUpload: + Notify me by email, when somebody logs into my account -edit_docModuleUpload --------------------- + .. _user-setup-lang: -.. confval:: edit_docModuleUpload - :name: user-setup-edit-docModuleUpload - :type: boolean + .. confval:: lang + :name: user-setup-lang + :type: language-key - Allow file upload directly from file reference fields within backend forms. + One of the language keys. For current options see + :ref:`t3coreapi:i18n_languages`, for example `dk`, `de`, `es` etc. - .. note:: - The uploaded file will be stored in the default upload folder, - see :ref:`user TSconfig <useroptions-defaultUploadFolder>` and :ref:`page TSconfig <pagedefaultuploadfolder>` + .. _user-setup-neverHideAtCopy: + .. confval:: neverHideAtCopy + :name: user-setup-neverHideAtCopy + :type: boolean -.. index:: Email me at login + If set, then the hideAtCopy feature for records in TCE will not be used. -.. _user-setup-emailMeAtLogin: + .. _user-setup-showHiddenFilesAndFolders: -emailMeAtLogin --------------- + .. confval:: showHiddenFilesAndFolders + :name: user-setup-showHiddenFilesAndFolders + :type: boolean -.. confval:: emailMeAtLogin - :name: user-setup-emailMeAtLogin - :type: boolean + If set, hidden files and folders will be shown in the filelist. - Notify me by email, when somebody logs into my account + .. _user-setup-startModule: + .. confval:: startModule + :name: user-setup-startModule + :type: string -.. index:: Backend; Language + Name of the module that is called when the user logs into the backend, for + example `web_layout`, `web_list`, `web_view`, `web_info`, `web_ts` etc. -.. _user-setup-lang: + .. _user-setup-titleLen: -lang ----- + .. confval:: titleLen + :name: user-setup-titleLen + :type: positive integer -.. confval:: lang - :name: user-setup-lang - :type: language-key + Maximum length of rendered record titles in the backend interface. + It is used in several places: page tree, edit masks, workspace module, etc. - One of the language keys. For current options see - :ref:`t3coreapi:i18n_languages`, for example `dk`, `de`, `es` etc. - - -.. index:: Records; Hide at copy - -.. _user-setup-neverHideAtCopy: - -neverHideAtCopy ---------------- - -.. confval:: neverHideAtCopy - :name: user-setup-neverHideAtCopy - :type: boolean - - If set, then the hideAtCopy feature for records in TCE will not be used. - - -.. index:: File list; Show hidden files and folders - -.. _user-setup-showHiddenFilesAndFolders: - -showHiddenFilesAndFolders -------------------------- - -.. confval:: showHiddenFilesAndFolders - :name: user-setup-showHiddenFilesAndFolders - :type: boolean - - If set, hidden files and folders will be shown in the filelist. - - -.. index:: Start module - -.. _user-setup-startModule: - -startModule ------------ - -.. confval:: startModule - :name: user-setup-startModule - :type: string - - Name of the module that is called when the user logs into the backend, for - example `web_layout`, `web_list`, `web_view`, `web_info`, `web_ts` etc. - - -.. index:: Title length, max - -.. _user-setup-titleLen: - -titleLen --------- - -.. confval:: titleLen - :name: user-setup-titleLen - :type: positive integer - - Maximum length of rendered record titles in the backend interface. - It is used in several places: page tree, edit masks, workspace module, etc. - - .. tip:: - To find out where this setting is applied, set it to a low number. + .. tip:: + To find out where this setting is applied, set it to a low number. From ae83f5295e4c2ca79a6f2b44bc2f404a524387a7 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Wed, 20 Nov 2024 09:04:47 +0100 Subject: [PATCH 051/125] [BUGFIX] Fix CGL --- .../_PageTSconfig/_ext_localconf_page_tsconfig_v11.php | 2 +- Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php | 2 +- .../_PhpApi/_MyBackendLoggedInController.php | 1 + .../UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php b/Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php index e08bb9ae1..6a0b59756 100644 --- a/Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php +++ b/Documentation/UsingSettingTSconfig/_PageTSconfig/_ext_localconf_page_tsconfig_v11.php @@ -12,6 +12,6 @@ // Only include page.tsconfig if TYPO3 version is below 12 so that it is not imported twice. if ($versionInformation->getMajorVersion() < 12) { ExtensionManagementUtility::addPageTSConfig( - '@import "EXT:my_sitepackage/Configuration/page.tsconfig"' + '@import "EXT:my_sitepackage/Configuration/page.tsconfig"', ); } diff --git a/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php b/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php index 93ff12814..f0a1368b5 100644 --- a/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php +++ b/Documentation/UsingSettingTSconfig/_PageTSconfig/_pages.php @@ -5,5 +5,5 @@ ExtensionManagementUtility::registerPageTSConfigFile( 'extension_name', 'Configuration/TsConfig/Page/myPageTSconfigFile.tsconfig', - 'My special config' + 'My special config', ); diff --git a/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php index 191742b8d..e68e9dd4a 100644 --- a/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php +++ b/Documentation/UsingSettingTSconfig/_PhpApi/_MyBackendLoggedInController.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace UsingSettingTSconfig\_PhpApi; + final class _MyBackendLoggedInController { public function isUserToggleEnabled(): bool diff --git a/Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php b/Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php index 35b653d53..8711da661 100644 --- a/Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php +++ b/Documentation/UsingSettingTSconfig/_UserTSconfig/_ext_localconf_v12.php @@ -12,6 +12,6 @@ // Only include user.tsconfig if TYPO3 version is below 13 so that it is not imported twice. if ($versionInformation->getMajorVersion() < 13) { ExtensionManagementUtility::addUserTSConfig( - '@import "EXT:my_sitepackage/Configuration/user.tsconfig"' + '@import "EXT:my_sitepackage/Configuration/user.tsconfig"', ); } From 90788ac7965acbf36ee06e11c4f297b82f423162 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Wed, 20 Nov 2024 09:55:43 +0100 Subject: [PATCH 052/125] [TASK] Change references previously going to tsconfig Releases: main, 13.4, 12.4 --- Documentation/About.rst | 3 +-- Documentation/Functions/Stdwrap.rst | 2 +- Documentation/Functions/Typolink.rst | 2 +- Documentation/Guide/Index.rst | 6 ++---- Documentation/Index.rst | 5 ++--- Documentation/Syntax/Conditions/Index.rst | 2 +- Documentation/Syntax/FileImports/Index.rst | 6 +++--- Documentation/TopLevelObjects/Module.rst | 8 ++++---- 8 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Documentation/About.rst b/Documentation/About.rst index 3adbad0f8..05101c77a 100644 --- a/Documentation/About.rst +++ b/Documentation/About.rst @@ -8,8 +8,7 @@ About This Manual ================= This document is a complete reference to all objects types and properties of -TypoScript as used in frontend TypoScript configuration, and not in -:ref:`TSconfig backend configuration <t3tsconfig:start>`. +TypoScript as used in frontend TypoScript and backend TypoScript, also called TSconfig. .. seealso:: diff --git a/Documentation/Functions/Stdwrap.rst b/Documentation/Functions/Stdwrap.rst index 075dbd1d4..daf1e6502 100644 --- a/Documentation/Functions/Stdwrap.rst +++ b/Documentation/Functions/Stdwrap.rst @@ -98,7 +98,7 @@ addPageCacheTags Pages, which have been cached with a tag, can be deleted from cache again with the TSconfig option - :ref:`TCEMAIN.clearCacheCmd <t3tsconfig:pagetcemain-clearcachecmd>`. + :ref:`TCEMAIN.clearCacheCmd <pagetcemain-clearcachecmd>`. .. note:: If you instead want to store rendered content into the diff --git a/Documentation/Functions/Typolink.rst b/Documentation/Functions/Typolink.rst index 2fd769f73..5de231912 100644 --- a/Documentation/Functions/Typolink.rst +++ b/Documentation/Functions/Typolink.rst @@ -882,7 +882,7 @@ record.identifier The same identifier is used as key in the TypoScript configuration of the frontend rendering: :ref:`setup-config-recordLinks` and the :ref:`TSconfig - backend link handler configuration <t3tsconfig:pagetcemaintables-linkhandler>` + backend link handler configuration <pagetcemaintables-linkhandler>` .. _typolink-handler-record-uid: diff --git a/Documentation/Guide/Index.rst b/Documentation/Guide/Index.rst index d3fd4dbee..db4f948fb 100644 --- a/Documentation/Guide/Index.rst +++ b/Documentation/Guide/Index.rst @@ -9,10 +9,8 @@ Getting started: A quick introduction into TypoScript Learn the fundamentals of TypoScript in just 45 minutes. Furthermore, you can find a full reference of all object types and properties of -TypoScript in the :doc:`TypoScript Reference <Index>`, insights into TYPO3 -backend configuration with TypoScript in the :doc:`TSconfig <t3tsconfig:Index>` -documentation and explanations of TypoScript syntax in the -":ref:`TypoScript Syntax <typoscript-syntax>`" chapter. +TypoScript in the menu on the left, including the +:ref:`TypoScript Syntax <typoscript-syntax>` chapter. ---- diff --git a/Documentation/Index.rst b/Documentation/Index.rst index eb3a3f4f2..43da30710 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -25,11 +25,10 @@ TypoScript Explained ---- This document is a complete reference of all object types and properties of -TypoScript as used in frontend TypoScript configuration. +TypoScript as used in frontend TypoScript and backend TypoScript, also called TSconfig. You can find a quick guide to TypoScript configuration at -:ref:`guide`, insights into TYPO3 backend configuration with -TypoScript in the :ref:`TSconfig <t3tsconfig:start>` documentation and +:ref:`guide` and explanations of TypoScript syntax in the ":ref:`TypoScript Syntax <typoscript-syntax>`" chapter. diff --git a/Documentation/Syntax/Conditions/Index.rst b/Documentation/Syntax/Conditions/Index.rst index ba71d2334..b2fc943bb 100644 --- a/Documentation/Syntax/Conditions/Index.rst +++ b/Documentation/Syntax/Conditions/Index.rst @@ -38,7 +38,7 @@ condition that checks for a logged in frontend user. For a reference of allowed condition criteria, please refer to the according chapter in the :ref:`frontend TypoScript Reference <conditions>` and -the :ref:`backend TSconfig Reference <t3tsconfig:conditions>`. These references +the :ref:`backend TSconfig Reference <tsconfig-conditions>`. These references come with examples for single condition criteria as well. The TSconfig and TypoScript backend modules show lists of existing conditions diff --git a/Documentation/Syntax/FileImports/Index.rst b/Documentation/Syntax/FileImports/Index.rst index 7ff9f4c04..0bd7c98a8 100644 --- a/Documentation/Syntax/FileImports/Index.rst +++ b/Documentation/Syntax/FileImports/Index.rst @@ -119,9 +119,9 @@ Alternatives to using file imports The following features can make file inclusion unnecessary: -* :ref:`Automatic global inclusion of user TSconfig of extensions <t3tsconfig:usersettingdefaultusertsconfig>` -* :ref:`Automatic global inclusion of page TSconfig of extensions <t3tsconfig:pagesettingdefaultpagetsconfig>` -* :ref:`Automatic page TSconfig on site level <t3tsconfig:include-static-page-tsconfig-per-site>` +* :ref:`Automatic global inclusion of user TSconfig of extensions <usersettingdefaultusertsconfig>` +* :ref:`Automatic global inclusion of page TSconfig of extensions <pagesettingdefaultpagetsconfig>` +* :ref:`Automatic page TSconfig on site level <include-static-page-tsconfig-per-site>` * :ref:`TypoScript provider for sites and sets <t3coreapi:site-sets-typoscript>` automatically loads TypoScript per site when the site set is included in the site configuration. diff --git a/Documentation/TopLevelObjects/Module.rst b/Documentation/TopLevelObjects/Module.rst index 1088049bc..d9a16a6ae 100644 --- a/Documentation/TopLevelObjects/Module.rst +++ b/Documentation/TopLevelObjects/Module.rst @@ -23,7 +23,7 @@ Therefore they are usually done in the file that switched to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been superseded by a general override strategy based on TSconfig: - :ref:`templates <t3tsconfig:pagetemplates>`. + :ref:`templates <pagetemplates>`. .. _module-options: @@ -33,7 +33,7 @@ Options for simple backend modules .. warning:: It is strongly recommended not to use TypoScript in custom **backend modules**, for example :typoscript:`module.tx_myextension`. Use custom - :ref:`Page TSconfig in namespace tx_* <t3tsconfig:page-tsconfig-extension-namespace>` + :ref:`Page TSconfig in namespace tx_* <page-tsconfig-extension-namespace>` instead. The configuring backend modules via frontend TypoScript @@ -82,7 +82,7 @@ view.templateRootPaths that switch to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been superseded by a general override strategy based on TSconfig: - :ref:`templates <t3tsconfig:pagetemplates>`. + :ref:`templates <pagetemplates>`. Used to define several paths for templates, which are executed in reverse order (the paths are searched from bottom to top). The first folder where @@ -120,7 +120,7 @@ view.partialRootPaths that switch to the :ref:`simplified backend templating <changelog:feature-96812>` no longer use the frontend TypoScript based override approach. This has been superseded by a general override strategy based on TSconfig: - :ref:`templates <t3tsconfig:pagetemplates>`. + :ref:`templates <pagetemplates>`. Used to define several paths for partials, which will be executed in reverse order. The first folder where the desired partial is found, is used. The From 6fb363d065258370c7e08768d82c0cee814ac368 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Wed, 20 Nov 2024 09:00:25 +0100 Subject: [PATCH 053/125] [FEATURE] Add support for AVIF files in GIFBuilder Resolves: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1050 Releases: main, 13.4 --- Documentation/Gifbuilder/Examples.rst | 19 +++++++++++++ Documentation/Gifbuilder/Properties.rst | 27 ++++++++++++++----- .../Gifbuilder/_snippets/_avif.typoscript | 15 +++++++++++ 3 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 Documentation/Gifbuilder/_snippets/_avif.typoscript diff --git a/Documentation/Gifbuilder/Examples.rst b/Documentation/Gifbuilder/Examples.rst index c096b601a..d9da32974 100644 --- a/Documentation/Gifbuilder/Examples.rst +++ b/Documentation/Gifbuilder/Examples.rst @@ -9,6 +9,25 @@ Examples .. contents:: :local: +.. _gifbuilder-examples-avif: + +Using the AVIF format +===================== + +.. versionadded:: 13.3 + +AVIF is an image format, that is supported by most modern browsers, and usually +has a better compression (= smaller file size) than jpg files. + +.. important:: + + Before using this feature, please check whether the used operating system + actually supports de/encoding AVIF files. Especially Debian 11 (Bullseye) + and older or systems forked from that may lack AVIF support. + +.. literalinclude:: _snippets/_avif.typoscript + :caption: EXT:config/sites/my_site/setup.typoscript + Masking semi-transparent images (Logos) onto other images ========================================================= diff --git a/Documentation/Gifbuilder/Properties.rst b/Documentation/Gifbuilder/Properties.rst index b7aa228ad..f0536904e 100644 --- a/Documentation/Gifbuilder/Properties.rst +++ b/Documentation/Gifbuilder/Properties.rst @@ -153,15 +153,9 @@ charRangeMap format ====== -.. versionchanged:: 13.0 - The default format is now "png". Before TYPO3 v13.0 this was "gif". - -.. versionadded:: 13.0 - Support for WebP has been added. - .. confval:: format :name: gifbuilder-properties-format - :type: "gif" / "jpg" / "jpeg" / "png" / "webp" + :type: "gif" / "jpg" / "jpeg" / "png" / "webp" / "avif" :Default: png File type of the output image. @@ -170,9 +164,16 @@ format * :ref:`$TYPO3_CONF_VARS['GFX']['jpg_quality'] <t3coreapi:typo3ConfVars_gfx_jpg_quality>` for a JPG image * :ref:`$TYPO3_CONF_VARS['GFX']['webp_quality'] <t3coreapi:typo3ConfVars_gfx_webp_quality>` for a WebP image + * :ref:`$TYPO3_CONF_VARS['GFX']['avif_quality'] <t3coreapi:typo3ConfVars_gfx_webp_quality>` for a AVIF image or via the :ref:`gifbuilder-properties-quality` property on a per-image basis. + .. versionchanged:: 13.0 + The default format is now "png". Before TYPO3 v13.0 this was "gif". + + .. versionadded:: 13.0 + Support for WebP and AVIF have been added. + .. _gifbuilder-properties-maxHeight: @@ -231,6 +232,18 @@ quality .. _"lossless" compression: https://developers.google.com/speed/webp/docs/compression#lossless_webp +.. _gifbuilder-properties-speed: + +speed +===== + +.. confval:: speed + :name: gifbuilder-properties-speed + :type: integer + + Set the "speed" for files in format AVIF (See + https://www.php.net/manual/en/function.imageavif.php for more details). + .. _gifbuilder-properties-transparentBackground: diff --git a/Documentation/Gifbuilder/_snippets/_avif.typoscript b/Documentation/Gifbuilder/_snippets/_avif.typoscript new file mode 100644 index 000000000..64888edae --- /dev/null +++ b/Documentation/Gifbuilder/_snippets/_avif.typoscript @@ -0,0 +1,15 @@ +page.10 = IMAGE +page.10 { + file = GIFBUILDER + file { + backColor = yellow + XY = 1024,199 + format = avif + quality = 44 + speed = 1 + + 10 = IMAGE + 10.offset = 10,10 + 10.file = 1:/my-image.jpg + } +} From c695e3d1b277ab375c18a906a789b9c9b0ca7a17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2024 13:40:42 +0100 Subject: [PATCH 054/125] Update Index.rst (#1440) Co-authored-by: Torben Hansen <derhansen@gmail.com> --- Documentation/ContentObjects/Hmenu/Tmenu/Index.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst index c2bd98b39..5ada1cf1b 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst @@ -37,6 +37,12 @@ TMENU item states These properties are all the item states used by :typoscript:`TMENU`. +.. warning:: + + Be aware to properly escape menu item content in order to prevent + Cross-site scripting vulnerabilities. It is therefore highly recommended + to use :php:`stdWrap.htmlSpecialChars = 1` in all TMENU item states. + The following Item states are listed from the least to the highest priority: .. confval-menu:: From 94639f996cc967afd196ce9e5df1541522a3a39c Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Sat, 23 Nov 2024 16:00:59 +0100 Subject: [PATCH 055/125] [TASK] Rename to TypoScript Explained Releases: 13.4 --- Documentation/guides.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/guides.xml b/Documentation/guides.xml index 1aed95559..d7f08fc67 100644 --- a/Documentation/guides.xml +++ b/Documentation/guides.xml @@ -13,7 +13,7 @@ interlink-shortcode="t3tsref" confval-default="TypoScript" /> - <project title="TypoScript Reference" + <project title="TypoScript Explained" release="13.4" version="13.4" copyright="since 2012 by the TYPO3 contributors" From b6be7dcbc55cecaa0d67f282dac22209a93ea807 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2024 16:12:36 +0100 Subject: [PATCH 056/125] [TASK] Move constant editor into backend module page (#1442) Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/UsingSetting/Entering.rst | 38 +- Documentation/UsingSetting/Index.rst | 1 - .../UsingSetting/TheConstantEditor.rst | 326 ------------------ 3 files changed, 34 insertions(+), 331 deletions(-) delete mode 100644 Documentation/UsingSetting/TheConstantEditor.rst diff --git a/Documentation/UsingSetting/Entering.rst b/Documentation/UsingSetting/Entering.rst index 5ba4eba71..c5498042b 100644 --- a/Documentation/UsingSetting/Entering.rst +++ b/Documentation/UsingSetting/Entering.rst @@ -43,18 +43,48 @@ a TypoScript record or by having a If TypoScript was added by a record, it is linked. +.. _typoscript-syntax-constant-editor: +.. _constant-editor: + +Submodule "Constant Editor" +=========================== + +.. note:: + The constant editor is only available in sites that are based on a + TypoScript record. + +.. versionchanged:: 13.3 + With the introduction of the site + `Site settings editor <https://docs.typo3.org/permalink/t3coreapi:site-settings-editor>`_ + settings can be edited in a comfortable and type safe way on site level. + + The constant editor is kept for backward compatibility. + +The backend module :guilabel:`Site Management > TypoScript > Constant Editor` +used a special format of +`Comments <https://docs.typo3.org/permalink/t3tsref:typoscript-syntax-syntax-comment-blocks>`_ +to display a form for editing the constants. + +.. figure:: /Images/ManualScreenshots/TypoScriptModule/ConstantEditor.png + :alt: Screenshot of the TYPO3 Backend showing the constant editor + +It is not recommended to newly introduce constants in the constant editor. +The documentation of the constant editors comment format can still be found +at `Comment Syntax <https://docs.typo3.org/permalink/t3tsref:typoscript-syntax-constant-editor-comments@12.4>`_ + + .. _typoscript_module_edit: Submodule "Edit TypoScript Record" ================================== +.. note:: + The constant editor is only available in sites that are based on a + TypoScript record. + This can be done in the :guilabel:`Site Management > TypoScript` module in the submodule :guilabel:`Edit TypoScript Record`. -.. hint:: - It is best practice to use a site package extension to bundle - various configuration in an extension. See :ref:`t3sitepackage:start`. - .. figure:: /Images/ManualScreenshots/TypoScriptModule/EditTypoScriptRecord.png :alt: The submodule "Edit TypoScript Record" in the TYPO3 Backend. diff --git a/Documentation/UsingSetting/Index.rst b/Documentation/UsingSetting/Index.rst index d096eca6a..b1ee46606 100644 --- a/Documentation/UsingSetting/Index.rst +++ b/Documentation/UsingSetting/Index.rst @@ -23,6 +23,5 @@ The TypoScript template configuration can be viewed and edited in the AddTypoScriptWithExtensions AccessTypoScriptWithExtensions Constants - TheConstantEditor Register Debugging diff --git a/Documentation/UsingSetting/TheConstantEditor.rst b/Documentation/UsingSetting/TheConstantEditor.rst deleted file mode 100644 index e897d6e63..000000000 --- a/Documentation/UsingSetting/TheConstantEditor.rst +++ /dev/null @@ -1,326 +0,0 @@ -.. include:: /Includes.rst.txt -.. _typoscript-syntax-constant-editor: -.. _constant-editor: - -=================== -The constant editor -=================== - -It's possible to add comments in TypoScript. Comments are always ignored by the -parser when the TypoScript is processed. But the backend module -:guilabel:`Site Management > TypoScript` -has the ability to use comments in the constant editor to make simple -configuration of a template even easier than constants already make it -themselves. - -.. figure:: /Images/ManualScreenshots/TypoScriptModule/ConstantEditor.png - :alt: Screenshot of the TYPO3 Backend showing the constant editor - -When the :guilabel:`Constant Editor` parses the TypoScript constants, -*all* comments before every constant-definition are registered. - -A certain syntax is available to define -what category the constant should be in, which type it has and to provide a -description for the constant. Comments are bound to the constant in the next line. There must be no -empty line between the comment defining a constant and the constant definition. - -.. code-block:: typoscript - - styles.content { - # cat=content/cHeader/h0; type=int[1-5]; label=Default Header type: Enter the number of the header layout to be used by default - defaultHeaderType = 2 - - # cat=content/cShortcut/t0; type=string; label=List of accepted tables - shortcut.tables = tt_content - - # cat=content/cTextmedia/i1; type=color; label= Media element border, color: Bordercolor of media elements in content elements when "Border"-option for an element is set - textmedia.borderColor = #000000 - - color1 = - color2 = blue - properties = - } - -In the above example, three constants have syntactically correct comments -and will appear in the "Constant Editor". The other three will not. The -syntax is described in the rest of this chapter. - -Making most important constants available for the "Constant Editor" is a real -usability gain. - -.. _typoscript-syntax-constant-editor-default-values: - -Default values -============== - -A constant may be given a default value when it is defined, as is the case for -the :typoscript:`color2` constant in the above example. - -More generally, the default value of a constant is determined by the value the -constant has before the last TypoScript is parsed. - -.. _typoscript-syntax-constant-editor-keys: -.. _typoscript-syntax-constant-editor-comments: - -Comment Syntax -============== - -How the comments are perceived by the module: - -- The comment line before the constant is considered to contain - its definition. - -- Each line is split at the :code:`;` (semicolon) character, that separates - the various parameters - -- Each parameter is split at the :code:`=` (equal) sign to separate the - parameter's key and value. - -The possible keys are described below. - -.. _typoscript-syntax-constant-editor-keys-cat: - -cat -=== - -- Comma-separated list of the categories (case-insensitive) that the constant is - a member of. Only one category should be used, because it usually turns out to - be confusing for users, if the same constant appears in multiple categories. - -- If the chosen category is *not* found among the default categories listed - below, and is not a custom category either, it's regarded a new category. - -- If the category is empty (""), the constant is excluded from the editor. - -.. _typoscript-syntax-constant-editor-keys-cat-predefined-categories: - -Predefined categories ---------------------- - -.. note:: - While the predefined categories still exist for backward compatibility - reasons they are not used anymore by the TYPO3 Core except for "content". - It is suggested to use one or several - :ref:`typoscript-syntax-constant-editor-keys-cat-custom-categories` for - each extension supplying categories. - -========= ====================================================================== -Category Description -========= ====================================================================== -basic Constants of superior importance for the TypoScript. This is typically - dimensions, image files and enabling of various features. The most - basic constants, which would almost always needed to be configured. -menu Menu setup. This includes font files, sizes, background images. - Depending on the menu type. -content All constants related to the display of page content elements. -page General configuration like meta tags, link targets. -advanced Advanced functions, which are seldom used. -========= ====================================================================== - -.. _typoscript-syntax-constant-editor-keys-cat-custom-categories: - -Custom categories ------------------ - -To define a new category, a comment including the parameter :typoscript:`customcategory` -has to be added. Example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - # customcategory=mySitePackage=My Site Package - - #cat=mySitePackage/basic/100; type=boolean; label=Something - tx_my_site_package.basic.enableSomething = 0 - -.. note:: - There has to be a newline after the definition of a custom category or it will - not be considered. See also https://forge.typo3.org/issues/100936. - -This line defines the new category "mysite" which will be available for any -constant defined **after** this line. The :typoscript:`LLL:` reference points to the -localized string used to "name" the custom category in the Constant Editor. -Usage example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - #cat=mysite//a; type=boolean; label=Global no_cache - config.no_cache = 0 - -If a custom category is not defined, its identifier will be used in lowercase -letters. - -.. _typoscript-syntax-constant-editor-keys-cat-subcategories: - -Subcategories -------------- - -There are a number of subcategories one can use. Subcategories are entered -after the category separated by a slash :typoscript:`/`. Example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - "mySitePackage/color/a" - -This will make the constant go into the "BASIC" category and be listed -under the "COLOR" section. - -One of the predefined subcategories can be used or any custom subcategory. If a -non-existing subcategory is used, the constant will go into the subcategory -"Other". - -.. _typoscript-syntax-constant-editor-keys-cat-predefined-subcategories: - -Predefined subcategories ------------------------- - -Standard subcategories (in the order they get listed in the Constant -Editor): - -=========== ======================================================================== -Subcategory Description -=========== ======================================================================== -enable Used for options that enable or disable primary functions of a - TypoScript configuration. -dims Dimensions of all kinds; pixels, widths, heights of images, frames, - cells and so on. -file Files like background images, fonts and so on. Other options related - to the file may also enter. -typo Typography and related constants. -color Color setup. Many colors will be found with related options in other - categories though. -links Links: Targets typically. -language Language specific options. -=========== ======================================================================== - -There also exists a list of subcategories based on the default content elements: - -cheader, cheader\_g, ctext, cimage, ctextmedia, cbullets, ctable, cuploads, -cmultimedia, cmedia, cmailform, csearch, clogin, cmenu, cshortcut, clist, -chtml - -These are all categories reserved for options that relate to content -rendering for each type of :typoscript:`tt_content` element. See the -:t3src:`TypoScript constants <typo3/sysext/fluid_styled_content/Configuration/TypoScript/constants.typoscript>` -of extension :composer:`typo3/cms-fluid-styled-content` for examples. - -.. _typoscript-syntax-constant-editor-keys-cat-custom-subcategories: - -Custom subcategories --------------------- - -Defining a custom subcategory is similar to defining a custom category, -using the :typoscript:`customsubcategory` parameter. Example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - # customsubcategory=something=Some Subcategory - - #cat=mySitePackage/something/a; type=boolean; label=Turn something on - tx_my_site_package.basic.enableSomething = 0 - -.. note:: - There has to be a newline after the definition of a custom subcategory or it will - not be considered. See also https://forge.typo3.org/issues/100936. - -Will look in the Constant Editor like this: - -.. figure:: /Images/ManualScreenshots/TypoScriptModule/ConstantEditorSubCategory.png - :alt: The Constant Editor showing a custom category. - -.. _typoscript-syntax-constant-editor-keys-cat-constants-ordering: - -Ordering --------- - -The third part of the category definition is optional and represents -the order in which the constants are displayed in the Constant Editor. -The values are sorted alphabetically, so it is traditional to use letters. -Example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - #cat=mysite/something/b; type=boolean; label=Special cache - config.no_cache = 0 - #cat=mysite/something/a; type=boolean; label=Global no_cache - config.no_cache = 0 - -The "Special cache" constant will be displayed after the "Global no_cache" -constant, because it is ranked with letter "b" and the other constant -has letter "a". Constants without any ordering information will come last. - -.. _typoscript-syntax-constant-editor-keys-type: - -type -==== - -There exists a number of predefined types, which define what kind of field is -rendered for inputting the constant. - -=========================== ============================================================================ -Type Description -=========================== ============================================================================ -int [low-high] Integer, optional in range "low" to "high". - -int+ Positive integer - -offset [L1,L2,...L6] Comma-separated list of integers. Default is "x,y", but as comma separated - parameters in brackets one can specify up to 6 labels being comma separated. - If wished to omit one of the last 4 fields, leave the label empty - for that element. - -color HTML color - -wrap HTML code that is wrapped around some content. - -options [item1,item2,...] Selectbox with values/labels item1, item2 etc. Comma-separated. Split - by "=" also and in that case, first part is label, second is value. - -boolean [truevalue] Boolean, optional can define the value of "true", default is 1. - -string (the default) A string value - -user Path to the file and method which renders the option HTML, - for example :typoscript:`type=user[Vendor\Extension\Namespace\ClassName->myCustomField]`. - The method should have following signature: - :php:`public function myCustomField(array $params)`. -=========================== ============================================================================ - - -.. _typoscript-syntax-constant-editor-keys-label: - -label -===== - -The label is a trimmed text string. It gets split on the first :typoscript:`:` (colon) -to separate header and body of the comment. The header is displayed on its own -line in bold. - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - #cat=mySitePackage/basic/100; type=boolean; label=Turn something on: This turns on a cool feature! - tx_my_site_package.basic.enableSomething = 0 - -The string can be localized by using the traditional "LLL" syntax. Example: - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/constants.typoscript - - #cat=mySitePackage/basic/100; type=boolean; label=LLL:EXT:my_site_package/Resources/Private/Language/locallang.xlf:config.something - tx_my_site_package.basic.enableSomething = 0 - -Only a single string is referenced, not one for the header and one for the -description. This means that the localized string must contain the colon -separator (:code:`:`). Example: - -.. code-block:: xml - :caption: LLL:EXT:my_site_package/Resources/Private/Language/locallang.xlf - - <trans-unit id="config.something" xml:space="config.something"> - <source>Turn something on: This turns on a cool feature!</source> - </trans-unit> From 31edc123cbb3715d6ca0e9e0ad1e847c79359834 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2024 16:14:58 +0100 Subject: [PATCH 057/125] [TASK] Improve descriptions on how to provide TypoScript (#1443) Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../AddTypoScriptWithExtensions.rst | 233 +++++++++++++----- Documentation/UsingSetting/Entering.rst | 1 + Documentation/UsingSetting/Index.rst | 4 +- .../UsingSetting/SiteTypoScriptProvider.rst | 2 + .../UsingSetting/_Sets/_ext_localconf.php | 10 +- 5 files changed, 184 insertions(+), 66 deletions(-) diff --git a/Documentation/UsingSetting/AddTypoScriptWithExtensions.rst b/Documentation/UsingSetting/AddTypoScriptWithExtensions.rst index d5947f7d5..39714b2e3 100644 --- a/Documentation/UsingSetting/AddTypoScriptWithExtensions.rst +++ b/Documentation/UsingSetting/AddTypoScriptWithExtensions.rst @@ -1,10 +1,12 @@ +:navigation-title: TypoScript in Extensions + .. include:: /Includes.rst.txt .. index:: TypoScript in extensions .. _extdev-add-typoscript: -================================ -Add TypoScript in your extension -================================ +================================================ +Provide frontend TypoScript in a TYPO3 extension +================================================ .. versionchanged:: 13.1 TypoScript on a per-site basis can now be included via @@ -18,8 +20,8 @@ Add TypoScript in your extension .. index:: TypoScript in extensions; File locations .. _extdev-add-typoscript-extension: -Create TypoScript files in your extension -========================================= +Provide TypoScript in your extension or site package +==================================================== TypoScript files **must** have the ending :file:`.typoscript`. @@ -28,10 +30,11 @@ extension. Read more about how to :ref:`provide the TypoScript as set for TYPO3 v13 and above <extdev-add-typoscript-sets>` and :ref:`how to provide TypoScript for both TYPO3 v13 and v12 <extdev-add-typoscript-sets-v12>`. -* :file:`constants.typoscript` contains the constants -* :file:`setup.typoscript` contains the TypoScript setup +* :file:`constants.typoscript` contains the frontend TypoScript constants +* :file:`setup.typoscript` contains the frontend TypoScript .. _extdev-add-typoscript-sets: +.. _extdev-add-typoscript-sets-typoscript: TypoScript provided as site set (only TYPO3 v13.1 and above) ============================================================ @@ -41,10 +44,6 @@ The file structure of the extension could, for example look like this: .. directory-tree:: :show-file-icons: true - * Classes - - * ... - * Configuration * Sets @@ -93,84 +92,187 @@ The sub set for an optional feature :language: yaml :caption: EXT:my_extension/Configuration/Sets/MyExtensionWithACoolFeature/config.yaml -.. _extdev-add-typoscript-sets-typoscript: -TypoScript files provided by the sets -------------------------------------- +.. _extdev-add-typoscript-sets-override: + +Overriding the TypoScript +------------------------- -The TypoScript placed in the same folder like the set, contains your -configurations. +The TypoScript provided in the site set will be loaded exactly once and respect +the dependencies defined in the site set configuration. Therefore if you +have to override the frontend TypoScript of another site set your site set +should depend on the other site set: +.. code-block:: yaml + :caption: packages/my_site_package/Configuration/Sets/MySitePackage/config.yaml + + name: my-vendor/my-site-package + label: My Set + dependencies: + - my-vendor/my-other-set + - some-vendor/some-extension + +Your extension can then safely override frontend TypoScript of the `some_extension`, +for example: + +.. code-block:: typoscript + :caption: packages/my_site_package/Configuration/Sets/MySitePackage/setup.typoscript + + plugin.some_extension_pi1.settings.someSetting = Special setting + +.. _extdev-add-typoscript-sets-v12-static_includes: +.. _extdev-static-includes: .. _extdev-add-typoscript-sets-v12: -TypoScript provided by extensions supporting TYPO3 v12.4 and v13 -================================================================ +Supporting both site sets and TypoScript records +================================================ -When an extension provides TypoScript and should be compatible with both -TYPO3 v12.4 and v13, you can provide site sets but still support including -the TypoScript in the :sql:`sys_template` record via `static_file_include`'s. +.. versionchanged:: 13.1 + With TYPO3 13.1 + `site sets as TypoScript provider <https://docs.typo3.org/permalink/t3coreapi:site-sets-typoscript>`_ + where introduced. Existing extensions **should** support site sets as well as + TypoScript records for backward compatibility reasons. + +.. warning:: + For historic reasons you might still see filenames like :file:`setup.ts` and + :file:`setup.txt`. These files **cannot** be included with the + :ref:`@import <t3tsref:typoscript-syntax-import>` syntax. All frontend + TypoScript files **must** end on `.typoscript`. + +.. _extension-configuration-typoscript-set-record-one: + +One TypoScript include set +-------------------------- -The files in the sets are the same as in the -:ref:`example for TYPO3 v13 only <extdev-add-typoscript-sets>`. +If your extension supported one static file include you should provide the same +files in your main site set as well: -The extended file structure of the extension could, for example look like this: +.. code-block:: php + :caption: EXT:my_extension/Configuration/TCA/Overrides/sys_template.php (before and after) + + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( + 'my_extension', + 'Configuration/TypoScript/', + 'Examples TypoScript' + ); + +In your main site set provide the same files that where provided as includes +by :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile` +until now: .. directory-tree:: + :level: 3 :show-file-icons: true - * Classes + * packages/my_extension/Configuration/ - * ... + * Sets - * Configuration + * MySet - * Sets + * config.yaml + * constants.typoscript + * setup.typoscript - * MyExtension - * :ref:`config.yaml <extdev-add-typoscript-sets-main>` - * :ref:`constants.typoscript <extdev-add-typoscript-sets-typoscript>` - * :ref:`setup.typoscript <extdev-add-typoscript-sets-typoscript>` + * TypoScript - * MyExtensionWithACoolFeature + * constants.typoscript + * setup.typoscript - * :ref:`config.yaml <extdev-add-typoscript-sets-feature>` - * :ref:`setup.typoscript <extdev-add-typoscript-sets-typoscript>` +.. code-block:: typoscript + :caption: packages/my_extension/Configuration/Sets/MySet/constants.typoscript - * TCA + @import 'EXT:my_extension/Configuration/TypoScript/setup.typoscript' - * Overrides +.. code-block:: typoscript + :caption: packages/my_extension/Configuration/Sets/MySet/setup.typoscript - sys_template.php + @import 'EXT:my_extension/Configuration/TypoScript/setup.typoscript' +.. _extension-configuration-typoscript-set-record-multiple: - * Resources +Multiple TypoScript include sets +-------------------------------- - * ... +If there should be more then one set of TypoScript templates that may be +included, they were usually stored in sub folders of +:path:`Configuration/TypoScript` until now. - * composer.json - * ... +When introducing site sets usually one site set per TypoScript record include +set is needed: +.. directory-tree:: + :level: 3 + :show-file-icons: true -.. _extdev-add-typoscript-sets-v12-static_includes: -.. _extdev-static-includes: + * packages/my_extension/Configuration + + * TypoScript + + * SpecialFeature1 + + * constants.typoscript + * setup.typoscript -Only when supporting TYPO3 v12.4: Make TypoScript available for static includes -------------------------------------------------------------------- + * SpecialFeature2 -Make TypoScript available for static includes (only needed if your extensions aims to support TYPO3 v12.4): + * setup.typoscript -.. literalinclude:: _Sets/_TcaOverridesSystemplateV12.php - :language: php - :caption: EXT:my_extension/Configuration/TCA/Overrides/sys_template.php + * constants.typoscript + * setup.typoscript -If you include the TypoScript this way, it will not be automatically loaded. -You MUST load it by adding the static include in the :guilabel:`Web > Template` -module in the backend, see :ref:`static-includes`. This has the advantage of -better configurability. + * Sets -This will load your constants and your setup once the template is -included statically. + * MyMainSet + + * config.yaml + * constants.typoscript + * setup.typoscript + + * MySpecialFeature1Set + + * config.yaml + * constants.typoscript + * setup.typoscript + + * MySpecialFeature2Set + + * config.yaml + * setup.typoscript + +For backward compability reasons :php:`ExtensionManagementUtility::addStaticFile` +still needs to be called for each folder that should be available in the TypoScript +template record: + +.. code-block:: php + :caption: EXT:my_extension/Configuration/TCA/Overrides/sys_template.php + + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( + 'my_extension', + 'Configuration/TypoScript/', + 'My Extension - Main TypoScript' + ); + + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( + 'my_extension', + 'Configuration/TypoScript/Example1/', + 'My Extension - Additional example 1' + ); + + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( + 'my_extension', + 'Configuration/TypoScript/SpecialFeature2/', + 'My Extension - Some special feature' + ); + +Each site set then provides the TypoScript files the according location by +importing it, for example: + +.. code-block:: typoscript + :caption: packages/my_extension/Configuration/Sets/MySet/setup.typoscript + + @import 'EXT:my_extension/Configuration/TypoScript/MySpecialFeature2Set/setup.typoscript' .. index:: TypoScript in extensions; Load always .. _extdev-always-load: @@ -178,18 +280,21 @@ included statically. Make TypoScript available (always load) ======================================= -Only do this, if your TypoScript must really be always loaded in your site. -If this is not the case, use the method described in the previous section -:ref:`extdev-add-typoscript-sets`. + +Use :php:`ExtensionManagementUtility::addTypoScript` if the frontend +TypoScript **must** be available in backend modules without page context, +for example to :ref:`register the YAML of the EXT:form system extension +for the backend <typo3/cms-form:concepts-configuration-yamlregistration-backend>`. .. literalinclude:: _Sets/_ext_localconf.php - :language: php :caption: EXT:my_extension/ext_localconf.php -It is also possible to put your TypoScript in a file called -:ref:`ext_typoscript_setup.typoscript <t3coreapi:ext_typoscript_setup_typoscript>` -or :ref:`ext_typoscript_constants.typoscript <t3coreapi:ext_typoscript_constants_typoscript>` -(for constants). +.. warning:: + While the content from the files + `ext_typoscript_setup.typoscript <https://docs.typo3.org/permalink/t3coreapi:ext_typoscript_setup_typoscript>`_ + and `ext_typoscript_constants.typoscript <https://docs.typo3.org/permalink/t3coreapi:ext_typoscript_constants_typoscript>`_ + is loaded by default in sites based on **TypoScript records** it is not + loaded in sites depending on **site sets as TypoScript providers**. More information diff --git a/Documentation/UsingSetting/Entering.rst b/Documentation/UsingSetting/Entering.rst index c5498042b..3d5d991ce 100644 --- a/Documentation/UsingSetting/Entering.rst +++ b/Documentation/UsingSetting/Entering.rst @@ -1,4 +1,5 @@ :navigation-title: Backend Module + .. include:: /Includes.rst.txt .. index:: TypoScript; TypoScript backend module .. _typoscript_module: diff --git a/Documentation/UsingSetting/Index.rst b/Documentation/UsingSetting/Index.rst index b1ee46606..429d8e83d 100644 --- a/Documentation/UsingSetting/Index.rst +++ b/Documentation/UsingSetting/Index.rst @@ -1,7 +1,9 @@ +:navigation-title: Usage .. include:: /Includes.rst.txt .. index:: TypoScript; Using and setting .. _using-and-setting: +============================ Using and setting TypoScript ============================ @@ -19,8 +21,8 @@ The TypoScript template configuration can be viewed and edited in the :titlesonly: SiteTypoScriptProvider - Entering AddTypoScriptWithExtensions + Entering AccessTypoScriptWithExtensions Constants Register diff --git a/Documentation/UsingSetting/SiteTypoScriptProvider.rst b/Documentation/UsingSetting/SiteTypoScriptProvider.rst index d2f939677..5e16b3dca 100644 --- a/Documentation/UsingSetting/SiteTypoScriptProvider.rst +++ b/Documentation/UsingSetting/SiteTypoScriptProvider.rst @@ -1,3 +1,5 @@ +:navigation-title: TypoScript in Sites + .. include:: /Includes.rst.txt .. _typoscript-site-sets: diff --git a/Documentation/UsingSetting/_Sets/_ext_localconf.php b/Documentation/UsingSetting/_Sets/_ext_localconf.php index ab26afc39..9c3ba0e6a 100644 --- a/Documentation/UsingSetting/_Sets/_ext_localconf.php +++ b/Documentation/UsingSetting/_Sets/_ext_localconf.php @@ -7,5 +7,13 @@ ExtensionManagementUtility::addTypoScript( 'my_extension', 'setup', - "@import 'EXT:my_extension/Configuration/TypoScript/setup.typoscript'", + ' + module.tx_form { + settings { + yamlConfigurations { + 100 = EXT:my_site_package/Configuration/Form/CustomFormSetup.yaml + } + } + } + ', ); From 8aae6e2b0789ba0c794b81eaad256500ebe1d182 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Nov 2024 08:36:25 +0100 Subject: [PATCH 058/125] [TASK] Remove outdated about page (#1446) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/About.rst | 59 ---------------------------- Documentation/Index.rst | 1 - Documentation/Introduction/Index.rst | 1 + 3 files changed, 1 insertion(+), 60 deletions(-) delete mode 100644 Documentation/About.rst diff --git a/Documentation/About.rst b/Documentation/About.rst deleted file mode 100644 index 05101c77a..000000000 --- a/Documentation/About.rst +++ /dev/null @@ -1,59 +0,0 @@ -.. include:: /Includes.rst.txt - - -.. _about: - -================= -About This Manual -================= - -This document is a complete reference to all objects types and properties of -TypoScript as used in frontend TypoScript and backend TypoScript, also called TSconfig. - -.. seealso:: - - * For explanations about the syntax of TypoScript, - please refer to the - :ref:`TypoScript Syntax <typoscript-syntax>` - chapter. - * For an introduction to TypoScript configuration, see :ref:`guide` - -.. _credits: - -Credits -======= - -The manual was originally written by Kasper Skårhøj. Over the years it -has been maintained and updated successively by Michael Stucki, -François Suter and Christopher Stelmaszyk. - - -.. _feedback: -.. _contribute: - -Contribute -========== - -If you find a bug in this manual, please be so kind as to check the -`online version on <https://docs.typo3.org/typo3cms/TyposcriptReference/>`__. -From there you can hit the "Edit me on GitHub" button in the top right corner -and submit a pull request via GitHub. Alternatively you can `file an issue -using the bug tracker <https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-Typoscript/issues>`__. - -Maintaining high quality documentation requires time and effort -and the TYPO3 Documentation Team always appreciates support. - -.. _contact: - -Contact -======= - -If you want to support us, please join the slack channel **#typo3-documentation** -on `Slack <https://typo3.slack.com/>`__. -Visit `forger <https://forger.typo3.com/slack>`__ to gain access to Slack. - -And finally, as a last resort, you can get in touch with the documentation team -`by mail <documentation@typo3.org>`_. - - - diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 43da30710..8c3b3e973 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -73,5 +73,4 @@ chapter. AppendixA/Index Glossary - About Sitemap diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 0f8c46b24..9fe24508d 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -1,5 +1,6 @@ .. include:: /Includes.rst.txt +.. _about: .. _introduction: ============ From 992531d8be6e5c11966e2e27c8484f92a31ee01c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Nov 2024 08:45:49 +0100 Subject: [PATCH 059/125] [TASK] Update introduction (#1448) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Introduction/Index.rst | 87 +++++++++++++--------------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 9fe24508d..f79b26226 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -1,71 +1,64 @@ +:navigation-title: Introduction .. include:: /Includes.rst.txt +.. _typoscript-syntax-typoscript-templates: +.. _typoscript-syntax-typoscript-templates-usage: +.. _introduction: -.. _about: -.. _introduction: +============================ +Introduction into TypoScript +============================ -============ -Introduction -============ +TypoScript is a configuration language used to configure both the frontend +output and the backend of a a TYPO3 web site. -This document serves as a manual for TypoScript and TSconfig, two -essential configuration tools in TYPO3. - -.. _typoscript-syntax-typoscript-templates: - -TypoScript -========== - -TypoScript is a configuration language used to define the frontend rendering -in TYPO3. It is not a programming language but a means of configuring the +TypoScript is not a programming language but a means of configuring the website. -Key sections to explore: - -* :ref:`TypoScript Syntax <typoscript-syntax>` for an introduction to the syntax. -* :ref:`TypoScript Reference <data-types>` for details on data types, object types, functions, and conditions. -* :ref:`guide` for configuring frontend behavior using TypoScript. -* :ref:`using-and-setting` for extending and setting TypoScript properties. +.. contents:: -.. _typoscript-syntax-typoscript-templates-usage: +.. _introduction-frontend-typoscript: -Templating in TYPO3 +Frontend TypoScript =================== -Frontend rendering in TYPO3 can use several methods, each requiring some TypoScript configuration: +Frontend TypoScript is mainly used to configure which data should be send to the +Fluid templates. -**Best Practice:** +It can also be used to define settings send to Extbase plugins, metadata for +a whole page etc. -- **Fluid Templates**: Use the `Fluid <https://typo3.org/fluid>`__ engine with TypoScript's :ref:`cobj-fluidtemplate` to integrate external HTML templates with Fluid variables. - * See :ref:`t3sitepackage:start` for creating site packages and custom themes. - * See :ref:`t3coreapi:adding-your-own-content-elements` to create custom content elements with TypoScript and Fluid. +In the beginning of TYPO3, TypoScript was used as templating language. In modern +project it is not common to do that anymore. -**Other Methods:** +For an introduction see +`Getting started: A quick introduction into TypoScript <https://docs.typo3.org/permalink/t3tsref:guide>`_. -- External templating engines via extensions. -- Custom PHP code for advanced use cases. -- TypoScript content objects for fully configurable rendering. - -**Outdated Method:** +.. _about-tsconfig: -- **HTML Templates** using markers and subparts (:ref:`cobj-template`) are no longer recommended. +Backend TypoScript / TSconfig +============================= -.. _about-tsconfig: +Backend TypoScript, also called TSconfig, can be used to configure the output +of certain forms etc in the TYPO3 backend. -TSconfig -======== +.. _about-page-tsconfig: -TSconfig customizes the TYPO3 backend for pages, users, and groups without requiring PHP code. It is a TypoScript-like syntax, used for backend configuration, distinct from TypoScript, which configures the frontend. +Page TSconfig +------------- -**Key Concepts:** +Page TSconfig can be made available globally, on a per site or per page level. -- **Page TSconfig**: Configures backend behavior on a per-page basis. -- **User TSconfig**: Configures options for specific users or groups. +For the possibilities see the +`Page TSconfig Reference <https://docs.typo3.org/permalink/t3tsref:pagetoplevelobjects>`_. -TSconfig is primarily for integrators to control what backend users see and interact with, including: +.. _about-user-tsconfig: -- Configuring backend options and views. -- Customizing the Admin Panel in the frontend, which is tightly linked to backend user roles. +User TSconfig +------------- -For details on syntax, refer to :ref:`TYPO3 Explained <t3tsref:typoscript-syntax>`. Remember, properties from the :ref:`TypoScript Reference <t3tsref:start>` cannot be used in TSconfig and vice versa. +User TSconfig can be made available globally for certain user groups or certain +users. It cannot be set for just one site or page. It can however override +:ref:`about-page-tsconfig`. -This document provides the foundational concepts and serves as a reference for both TypoScript and TSconfig, empowering developers and integrators to customize TYPO3 effectively. +For the possibilities see the +`User TSconfig reference <https://docs.typo3.org/permalink/t3tsref:usertoplevelobjects>`_. From 3a0b6adf3e90f807cd8007b8f6210b3db6e0feca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 09:41:41 +0100 Subject: [PATCH 060/125] Update tree.pagelayout for multiple (#1453) Co-authored-by: Arun Chandran <arun@spawoz.com> --- Documentation/Conditions/Index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 3df437d1f..bf63da1c9 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -185,6 +185,10 @@ tree.pagelayout # ... [END] + # Using backend layout records multiple + [tree.pagelayout in ['2','3','4','5']] + # ... + [END] .. index:: Conditions; tree.rootLine From 8ab02c3cf482dd8e61ad05afcd495102044e3543 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:24:14 +0100 Subject: [PATCH 061/125] [TASK] Mention "in" strict comparison for tree.pagelayout (#1456) Co-authored-by: Mathias Brodala <mbrodala@pagemachine.de> --- Documentation/Conditions/Index.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index bf63da1c9..bb5a262e1 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -176,12 +176,12 @@ tree.pagelayout :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript # Using backend layout records - [tree.pagelayout == 2] + [tree.pagelayout === "2"] # ... [END] # Using the TSconfig provider of backend layouts - [tree.pagelayout == "pagets__Home"] + [tree.pagelayout === "pagets__Home"] # ... [END] @@ -190,6 +190,12 @@ tree.pagelayout # ... [END] + .. attention:: + The value of `pagelayout` is a string, even when using BE layout records. + This is especially important in conditions using `in` as shown here since + this operator performs a strict comparison by default. For clarity and + consistency strict comparisons should also be used in other cases. + .. index:: Conditions; tree.rootLine .. _condition-tree-rootLine: From 43c9c34ae754b498b22c85edc79f2e4876483819 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:44:49 +0100 Subject: [PATCH 062/125] [TASK] Refine PAGEVIEW descriptions (#1461) Remove experimental flag, use as example in the TypoScript Guide, Always use the Resources/Private/PageView path to reduce confusion. Hint at site package tutorial chapters Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../ContentObjects/Fluidtemplate/Index.rst | 8 +-- .../_AfterMigrationToPageview.typoscript | 4 +- .../ContentObjects/Pageview/Index.rst | 70 ++++++++++--------- .../_includes/_pageWithBreadcrumb.typoscript | 4 +- .../_includes/_pageWithFluid.typoscript | 9 +-- .../_includes/_pageWithVariables.typoscript | 4 +- Documentation/Guide/Menu/_menu.typoscript | 5 +- .../Guide/Page/_fluid-template.typoscript | 12 ++-- 8 files changed, 60 insertions(+), 56 deletions(-) diff --git a/Documentation/ContentObjects/Fluidtemplate/Index.rst b/Documentation/ContentObjects/Fluidtemplate/Index.rst index 189e080e2..945a2c33f 100644 --- a/Documentation/ContentObjects/Fluidtemplate/Index.rst +++ b/Documentation/ContentObjects/Fluidtemplate/Index.rst @@ -424,11 +424,11 @@ as :fluid:`{page.title}`, the subtitle with :fluid:`{page.subtitle}`. In this example some Fluid templates have to be moved: :path:`EXT:my_sitepackage/Resources/Private/Templates/Pages/` - The page templates can stay in this folder. + Move files to :path:`EXT:my_sitepackage/Resources/Private/PageView/Pages/` :path:`EXT:my_sitepackage/Resources/Private/Partials/Pages/` - Move files to :path:`EXT:my_sitepackage/Resources/Private/Templates/Partials/` + Move files to :path:`EXT:my_sitepackage/Resources/Private/PageView/Partials/` :path:`EXT:my_sitepackage/Resources/Private/Layouts/Pages/` - Move files to :path:`EXT:my_sitepackage/Resources/Private/Templates/Layouts/` + Move files to :path:`EXT:my_sitepackage/Resources/Private/PageView/Layouts/` If the :path:`Private` folder previously looked like this: @@ -458,7 +458,7 @@ It should look like this afterwards: * :path:`EXT:my_sitepackage/Resources/Private/` * :path:`Languages` - * :path:`Templates` + * :path:`PageView` * :path:`Layouts` * :path:`Pages` diff --git a/Documentation/ContentObjects/Fluidtemplate/_includes/_AfterMigrationToPageview.typoscript b/Documentation/ContentObjects/Fluidtemplate/_includes/_AfterMigrationToPageview.typoscript index dcc7a602a..b3b5d7497 100644 --- a/Documentation/ContentObjects/Fluidtemplate/_includes/_AfterMigrationToPageview.typoscript +++ b/Documentation/ContentObjects/Fluidtemplate/_includes/_AfterMigrationToPageview.typoscript @@ -3,7 +3,7 @@ page { 10 = PAGEVIEW 10 { paths { - 100 = EXT:my_sitepackage/Resources/Private/Templates/ + 100 = EXT:my_sitepackage/Resources/Private/PageView/ } variables { parentPageTitle = TEXT @@ -14,4 +14,4 @@ page { 10.as = mainMenu } } -} \ No newline at end of file +} diff --git a/Documentation/ContentObjects/Pageview/Index.rst b/Documentation/ContentObjects/Pageview/Index.rst index c86eb0df0..be9653953 100644 --- a/Documentation/ContentObjects/Pageview/Index.rst +++ b/Documentation/ContentObjects/Pageview/Index.rst @@ -7,21 +7,26 @@ PAGEVIEW ======== .. versionadded:: 13.1 + The content object PAGEVIEW can be used in stead of + `FLUIDTEMPLATE <https://docs.typo3.org/permalink/t3tsref:cobj-template>`_ + to configure the HTML body of a page using Fluid templates. - This API is considered experimental until TYPO3 v13 LTS. It will be further - adapted to be used for further rendering of - custom Content Elements and Content Blocks. +This content object has very specific conventions and +defaults, that requires (and allows) less configuration as compared to using +`FLUIDTEMPLATE <https://docs.typo3.org/permalink/t3tsref:cobj-template>`_. -The content object :typoscript:`EXTBASEPLUGIN` allows to render -:ref:`Extbase <t3coreapi:extbase>` plugins. - -The new :typoscript:`PAGEVIEW` content object has very specific conventions and -defaults, that requires (and allows) less configuration. The benefit is that -following these conventions means less boilerplate code to maintain. +The benefit is that following these conventions means less boilerplate code +to maintain. If you follow these conventions, a few directories and files must follow the structure outlined below. +.. tip:: + Chapters `The TYPO3 Fluid version <https://docs.typo3.org/permalink/t3sitepackage:minimal-extension-fluid>`_ + and `Display the content elements on your page <https://docs.typo3.org/permalink/t3sitepackage:content-mapping>`_ + of the Site Package Tutorial give practical examples on how to use + the `PAGEVIEW` object. + .. contents:: Table of contents :local: :depth: 2 @@ -74,7 +79,7 @@ Additional variables can be defined with property The variable :fluid:`{settings}` contains all TypoScript :ref:`constants <typoscript-syntax-constants>` that are set on the current - page. Settings from the site can be accessed via the :confval:`pageview-data-site` with + page. Settings from the site can be accessed via the :confval:`pageview-data-site` with :fluid:`{site.settings}` .. confval:: site @@ -97,7 +102,7 @@ Example: Display the site title in the current language .. literalinclude:: _includes/_DisplaySiteTitle.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html .. _cobj-pageview-data-page-example: @@ -106,7 +111,7 @@ Example: Display the title and abstract of the current page .. literalinclude:: _includes/_DisplayPageInfo.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html .. _cobj-pageview-data-settings-example: @@ -121,7 +126,7 @@ Let us assume, the current page loads the following TypoScript constants: .. literalinclude:: _includes/_PageWithConstant.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html .. _cobj-pageview-data-site-example: @@ -130,7 +135,7 @@ Example: Link to the root page of the current site .. literalinclude:: _includes/_LinkToRootPage.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html .. _cobj-pageview-properties: @@ -169,8 +174,8 @@ Properties :Example 2: :ref:`cobj-pageview-paths-example-extended` Sets an array of paths for the Fluid templates, usually - :file:`EXT:my_extension/Resources/Private/Templates/` or a folder below that - path like :file:`EXT:my_extension/Resources/Private/Templates/MyPages`. + :file:`EXT:my_extension/Resources/Private/PageView/` or a + path like :file:`EXT:my_extension/Resources/Private/PageView/MyPage`. The templates are expected in a subfolder :path:`Pages`. @@ -207,20 +212,20 @@ The page template could look like this: .. literalinclude:: _includes/_PageWithBreadcrumb.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html With the following partials: .. literalinclude:: _includes/_PartialBreadCrumb.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Partials/Navigation/Breadcrumb.html And .. literalinclude:: _includes/_PartialMainNavigation.html :language: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Partials/Navigation/MainNavigation.html + :caption: EXT:my_sitepackage/Resources/Private/PageView/Partials/Navigation/MainNavigation.html .. _cobj-pageview-paths-example: @@ -235,14 +240,14 @@ templates: page = PAGE page.10 = PAGEVIEW - page.10.paths.100 = EXT:my_sitepackage/Resources/Private/Templates/ + page.10.paths.100 = EXT:my_sitepackage/Resources/Private/PageView/ The content of the folder could look like this: .. directory-tree:: :level: 2 - * EXT:my_sitepackage/Resources/Private/Templates/ + * EXT:my_sitepackage/Resources/Private/PageView/ * Layouts @@ -270,17 +275,17 @@ The content of the folder could look like this: So for backend layout named "with_sidebar", the template file is then resolved to -:file:`EXT:my_sitepackage/Resources/Private/Templates/Pages/With_sidebar.html`. +:file:`EXT:my_sitepackage/Resources/Private/PageView/Pages/With_sidebar.html`. If the backend layout is named "TwoColumns" it is resovled to -:file:`EXT:my_sitepackage/Resources/Private/Templates/Pages/TwoColumns.html`. +:file:`EXT:my_sitepackage/Resources/Private/PageView/Pages/TwoColumns.html`. For all these templates :doc:`partial <t3viewhelper:Global/Render#viewhelper-argument-typo3-cms-fluid-viewhelpers-renderviewhelper-partial>` are expected in folder -:path:`EXT:my_sitepackage/Resources/Private/Templates/Pages/Partials` and +:path:`EXT:my_sitepackage/Resources/Private/PageView/Pages/Partials` and :ref:`layouts <t3viewhelper:typo3fluid-fluid-layout>` in -:path:`EXT:my_sitepackage/Resources/Private/Templates/Pages/Layouts`. +:path:`EXT:my_sitepackage/Resources/Private/PageView/Pages/Layouts`. .. _cobj-pageview-paths-example-extended: @@ -296,16 +301,16 @@ define fallback directories for the templates: page { 10 = PAGEVIEW 10.paths { - 100 = EXT:my_basic_sitepackage/Resources/Private/Templates/ - 200 = EXT:my_general_sitepackage/Resources/Private/Templates/ - 300 = EXT:my_special_sitepackage/Resources/Private/Templates/ + 100 = EXT:my_basic_sitepackage/Resources/Private/PageView/ + 200 = EXT:my_general_sitepackage/Resources/Private/PageView/ + 300 = EXT:my_special_sitepackage/Resources/Private/PageView/ } } The template for a page with a certain backend layout is first searched in -:path:`EXT:my_special_sitepackage/Resources/Private/Templates/Pages/` then in -:path:`EXT:my_general_sitepackage/Resources/Private/Templates/Pages/` and last -in :path:`EXT:my_basic_sitepackage/Resources/Private/Templates/Pages/`. +:path:`EXT:my_special_sitepackage/Resources/Private/PageView/Pages/` then in +:path:`EXT:my_general_sitepackage/Resources/Private/PageView/Pages/` and last +in :path:`EXT:my_basic_sitepackage/Resources/Private/PageView/Pages/`. .. _cobj-pageview-variables-example: @@ -320,5 +325,4 @@ The following variables are now available in the Fluid template: .. literalinclude:: _includes/_PageWithVariables.html :langugage: html - :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html - + :caption: EXT:my_sitepackage/Resources/Private/PageView/Pages/Default.html diff --git a/Documentation/ContentObjects/Pageview/_includes/_pageWithBreadcrumb.typoscript b/Documentation/ContentObjects/Pageview/_includes/_pageWithBreadcrumb.typoscript index 5ec979d1a..7e17fc463 100644 --- a/Documentation/ContentObjects/Pageview/_includes/_pageWithBreadcrumb.typoscript +++ b/Documentation/ContentObjects/Pageview/_includes/_pageWithBreadcrumb.typoscript @@ -3,7 +3,7 @@ page { 10 = PAGEVIEW 10 { paths { - 100 = EXT:my_sitepackage/Resources/Private/Templates/ + 100 = EXT:my_sitepackage/Resources/Private/PageView/ } dataProcessing { 10 = menu @@ -21,4 +21,4 @@ page { } } } -} \ No newline at end of file +} diff --git a/Documentation/ContentObjects/Pageview/_includes/_pageWithFluid.typoscript b/Documentation/ContentObjects/Pageview/_includes/_pageWithFluid.typoscript index dcc7a602a..b44bd4fca 100644 --- a/Documentation/ContentObjects/Pageview/_includes/_pageWithFluid.typoscript +++ b/Documentation/ContentObjects/Pageview/_includes/_pageWithFluid.typoscript @@ -3,15 +3,16 @@ page { 10 = PAGEVIEW 10 { paths { - 100 = EXT:my_sitepackage/Resources/Private/Templates/ + 100 = EXT:my_sitepackage/Resources/Private/PageView/ } variables { parentPageTitle = TEXT parentPageTitle.data = levelfield:-1:title } dataProcessing { - 10 = menu - 10.as = mainMenu + 10 = page-content + 20 = menu + 20.as = mainMenu } } -} \ No newline at end of file +} diff --git a/Documentation/ContentObjects/Pageview/_includes/_pageWithVariables.typoscript b/Documentation/ContentObjects/Pageview/_includes/_pageWithVariables.typoscript index d532a45c6..a261b1816 100644 --- a/Documentation/ContentObjects/Pageview/_includes/_pageWithVariables.typoscript +++ b/Documentation/ContentObjects/Pageview/_includes/_pageWithVariables.typoscript @@ -3,7 +3,7 @@ page { 10 = PAGEVIEW 10 { paths { - 100 = EXT:my_sitepackage/Resources/Private/Templates/ + 100 = EXT:my_sitepackage/Resources/Private/PageView/ } variables { parentPageTitle = TEXT @@ -11,4 +11,4 @@ page { another_variable =< lib.anotherVariable } } -} \ No newline at end of file +} diff --git a/Documentation/Guide/Menu/_menu.typoscript b/Documentation/Guide/Menu/_menu.typoscript index 537e9bbc0..2e61e314c 100644 --- a/Documentation/Guide/Menu/_menu.typoscript +++ b/Documentation/Guide/Menu/_menu.typoscript @@ -1,9 +1,8 @@ page = PAGE page { - 10 = FLUIDTEMPLATE + 10 = PAGEVIEW 10 { - templateName = Default - templateRootPaths.10 = EXT:site_package/Resources/Private/Templates/Pages/ + paths.10 = EXT:my_site_package/Resources/Private/Templates/Pages/ # ... dataProcessing { 10 = menu diff --git a/Documentation/Guide/Page/_fluid-template.typoscript b/Documentation/Guide/Page/_fluid-template.typoscript index df4e46a54..bba907095 100644 --- a/Documentation/Guide/Page/_fluid-template.typoscript +++ b/Documentation/Guide/Page/_fluid-template.typoscript @@ -1,12 +1,12 @@ page = 10 page { - 10 = FLUIDTEMPLATE + 10 = PAGEVIEW 10 { - templateName = TEXT - templateName.value = Default - - templateRootPaths { - 0 = EXT:site_package/Resources/Private/Templates/Pages/ + paths { + 100 = EXT:my_site_package/Resources/Private/PageView/ + } + dataProcessing { + 10 = page-content } } } From ef0d87cd023a01f3e9be64da391cf952841af5ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:14:39 +0100 Subject: [PATCH 063/125] [TASK] Extend RecordInterface (#1463) Resovles: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1028 Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../DataProcessing/RecordTransformationProcessor.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/DataProcessing/RecordTransformationProcessor.rst b/Documentation/DataProcessing/RecordTransformationProcessor.rst index de3352f64..2dee82c74 100644 --- a/Documentation/DataProcessing/RecordTransformationProcessor.rst +++ b/Documentation/DataProcessing/RecordTransformationProcessor.rst @@ -64,9 +64,9 @@ is most of all a better organized overview of all available information. E.g. the property `properties` lists all relevant fields for the current Content Type. -We are dealing with an object here, which behaves like an array. In short: you -can access your record properties as you are used to with :html:`{record.title}` -or :html:`{record.uid}`. In addition, you gain special, context-aware properties +We are dealing with an object here. You however can access your record +properties as you are used to with :html:`{record.title}` or +:html:`{record.uid}`. In addition, you gain special, context-aware properties like the language :html:`{record.languageId}` or workspace :html:`{data.versionInfo.workspaceId}`. From 4a142f3f8279c3e256622189a4093be941063b1e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:58:37 +0100 Subject: [PATCH 064/125] [Backport 13.4] [TASK] Move content of "Data Types" (#1464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [TASK] Move content of "Data Types" There are no real data types in TypoScript, there are just certain string formats expected in some properties. Where the former "data type" is an expected input for exactly one function, move the expected input to that function. Where it works like a function itself, move it to functions, Move the rest of expected string formats to the syntax but make clear they are no real types. Releases: main, 13.4 * Apply suggestions from code review Co-authored-by: Stefan Frömken <froemken@gmail.com> * Update Documentation/Functions/Wrap.rst * Apply suggestions from code review Co-authored-by: Stefan Frömken <froemken@gmail.com> * Update Documentation/Functions/Wrap.rst --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Stefan Frömken <froemken@gmail.com> --- .../ContentObjects/Hmenu/Tmenu/Index.rst | 4 +- .../ContentObjects/Hmenu/Tmenu/Tmenuitem.rst | 2 +- Documentation/DataTypes/Index.rst | 565 ------------------ Documentation/Functions/Data.rst | 1 + Documentation/Functions/Imagelinkwrap.rst | 8 +- Documentation/Functions/Imgresource.rst | 55 +- Documentation/Functions/Makelinks.rst | 6 +- Documentation/Functions/Stdwrap.rst | 40 +- Documentation/Functions/Typolink.rst | 6 +- Documentation/Functions/Wrap.rst | 34 ++ Documentation/Gifbuilder/Colors.rst | 33 + Documentation/Gifbuilder/Index.rst | 1 + .../Gifbuilder/ObjectNames/Text/Index.rst | 4 +- Documentation/Index.rst | 1 - Documentation/Syntax/Index.rst | 1 + Documentation/Syntax/StringFormats/Index.rst | 175 ++++++ .../StringFormats}/_FunctionName.php | 0 Documentation/TopLevelObjects/Page/Index.rst | 4 +- 18 files changed, 346 insertions(+), 594 deletions(-) delete mode 100644 Documentation/DataTypes/Index.rst create mode 100644 Documentation/Functions/Wrap.rst create mode 100644 Documentation/Gifbuilder/Colors.rst create mode 100644 Documentation/Syntax/StringFormats/Index.rst rename Documentation/{DataTypes => Syntax/StringFormats}/_FunctionName.php (100%) diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst index 5ada1cf1b..7b3ef8f79 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst @@ -40,7 +40,7 @@ These properties are all the item states used by :typoscript:`TMENU`. .. warning:: Be aware to properly escape menu item content in order to prevent - Cross-site scripting vulnerabilities. It is therefore highly recommended + Cross-site scripting vulnerabilities. It is therefore highly recommended to use :php:`stdWrap.htmlSpecialChars = 1` in all TMENU item states. The following Item states are listed from the least to the highest priority: @@ -287,7 +287,7 @@ Properties .. confval:: target :name: menu-common-properties-target - :type: :ref:`data-type-target` + :type: string :Default: self Target of the menu links diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst index cf4398b7b..fe95e5cac 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst @@ -193,7 +193,7 @@ Properties .. confval:: altTarget :name: tmenuitem-altTarget - :type: :ref:`data-type-target` + :type: string Alternative target overriding the target property of the ref:`TMENU <tmenu>`, if set. diff --git a/Documentation/DataTypes/Index.rst b/Documentation/DataTypes/Index.rst deleted file mode 100644 index a2cd613e7..000000000 --- a/Documentation/DataTypes/Index.rst +++ /dev/null @@ -1,565 +0,0 @@ -.. include:: /Includes.rst.txt -.. index:: Simple data types -.. _data-types: -.. _data-types-reference: - -================= -Simple data types -================= - -The values assigned to properties in TypoScript are often of a -specific format. These formats are described in this chapter. - -For example, if a value is defined as the type :typoscript:`<tag>`, HTML code has to be -supplied. If it is of the type :typoscript:`resource`, it's a reference to a file from -the resource-field in the template. If the type is :typoscript:`GraphicColor`, a -color-definition is expected and an HTML color code or comma-separated -RGB-values have to be provided. - -The following is a list of available data types, their usage, purpose and -examples. - -.. contents:: - :local: - -.. index:: Simple data types; align -.. _data-type-align: - -align -===== - -.. confval:: align - :name: data-type-align - :Default: :typoscript:`left` - :Allowed values: :typoscript:`left`, :typoscript:`center`, :typoscript:`right` - - Decides about alignment. - - -.. index:: Simple data types; boolean -.. _data-type-boolean: - -boolean -======= - -.. confval:: boolean - :name: data-type-boolean - - Possible values for boolean variables are `1` and `0` - meaning TRUE and FALSE. - - Everything else is `evaluated to one of these values by PHP`__: - Non-empty strings (except `0` [zero]) are treated as TRUE, - empty strings are evaluated to FALSE. - - __ https://www.php.net/manual/en/language.types.boolean.php - - .. rubric:: Examples - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - dummy.enable = 0 # false, preferred notation - dummy.enable = 1 # true, preferred notation - dummy.enable = # false, because the value is empty - - -.. index:: Simple data types; case -.. _data-type-case: - -case -==== - -.. confval:: case - :name: data-type-case - - Do a case conversion. - - .. rubric:: Possible values: - - ============================= ========================================================== - Value Effect - ============================= ========================================================== - :typoscript:`upper` Convert all letters of the string to upper case - :typoscript:`lower` Convert all letters of the string to lower case - :typoscript:`capitalize` Uppercase the first character of each word in the string - :typoscript:`ucfirst` Convert the first letter of the string to upper case - :typoscript:`lcfirst` Convert the first letter of the string to lower case - :typoscript:`uppercamelcase` Convert underscored `upper_camel_case` to `UpperCamelCase` - :typoscript:`lowercamelcase` Convert underscored `lower_camel_case` to `lowerCamelCase` - ============================= ========================================================== - - .. rubric:: Example - - Code: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - 10 = TEXT - 10.value = Hello world! - 10.case = upper - - Result: - - .. code-block:: text - :caption: Example Output - - HELLO WORLD! - - -.. index:: Simple data types; date-conf -.. _data-type-date-conf: - -date-conf -========= - -.. confval:: date-conf - :name: data-type-date-conf - - Used to format a date, see PHP function :php:`date()`. See the - documentation of `allowed date time formats in - PHP <https://www.php.net/manual/en/datetime.format.php>`__. - - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.date-conf = d-m-y - - -.. index:: Simple data types; degree -.. _data-type-degree: - -degree -====== - -.. confval:: degree - :name: data-type-degree - - `-90` to `90`, integers - - Example: `45` - - -.. index:: Simple data types; dir -.. _data-type-dir: - -dir -=== - -.. confval:: dir - :name: data-type-dir - - .. rubric:: Syntax - - [path relative to the web root of the site] \| [list of valid - extensions] \| [sorting: name, size, ext, date] \| [reverse: "r"] \| - [return full path: boolean] - - - Files matching are returned in a comma-separated string. - - .. rubric:: Example - - This example returns a list of all pdf, gif and jpg-files from - :file:`fileadmin/files/` sorted by their name reversely and with the full path (with - :file:`fileadmin/files/` prepended): - - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.dir = fileadmin/files/ | pdf,gif,jpg | name | r | true - - -.. index:: Simple data types; function name -.. _data-type-function-name: - -function name -============= - -.. confval:: function name - :name: data-type-function-name - - Indicates a function or method in a class to call. See more information at - the :ref:`USER cObject <cobj-user>`. - - If no namespaces are used, then the class or function name, but not the method - name, should probably be prefixed with :php:`user_`. The prefix can be - changed in the :php:`$GLOBALS['TYPO3_CONF_VARS']` config though. The function - / method is normally called with 2 parameters, :php:`$conf` which is the - TypoScript configuration and :php:`$content`, some content to be processed and - returned. - - .. todo: Which entry in TYPO3_CONF_VARS enables the user-prefix to be changed? This - should be mentioned. Looks like this entry has gone and this info no - longer valid. - - If no namespaces are used and if a method in a class is called, it is checked (when using the - :typoscript:`USER`/:typoscript:`USER_INT` objects) whether a class with the same name, but - prefixed with :php:`ux_` is present and if so, *this* class is instantiated - instead. See the document "Inside TYPO3" for more information on extending - classes in TYPO3! - - .. todo: Where is this feature mentioned? We should add a reference here. - - .. rubric:: Examples - - Method in namespaced class. This is the preferred version: - - .. code-block:: typoscript - - lib.someThing = USER_INT - lib.someThing.userFunc = MyVendor\MyExtension\SomeNamespace\SomeClass->someFunction - - .. literalinclude:: _FunctionName.php - :language: php - :caption: EXT:my_extension/Classes/SomeNamespace/SomeClass.php - - Single Function: - - .. code-block:: text - - user_reverseString - - Method in class without namespace: - - .. code-block:: text - - user_yourClass->reverseString - - -.. index:: Simple data types; getText -.. _data-type-function-getText: - -getText -======= - -The getText data type is some kind of tool box allowing to retrieve -values from a variety of sources. Read more: :ref:`data-type-gettext` - - -.. index:: Simple data types; GraphicColor -.. _data-type-GraphicColor: - -GraphicColor -============ - -.. confval:: GraphicColor - :name: data-type-GraphicColor - - .. rubric:: Syntax: - - [colordef] : [modifier] - - Where modifier can be an integer which is added or subtracted to the three - RGB-channels or a floating point with an :typoscript:`*` before, which will then - multiply the values with that factor. - - - The color can be given as HTML-color or as a comma-separated list of - RGB-values (integers). An extra parameter can be given, that will modify the - color mathematically: - - .. rubric:: Examples - - * :typoscript:`red` (HTML color) - * :typoscript:`#ffeecc` (HTML color as hexadecimal notation) - * :typoscript:`255,0,255` (HTML color as decimal notation) - - *Extra:* - - * :typoscript:`red : *0.8` ("red" is darkened by factor 0.8) - * :typoscript:`#ffeecc : +16` ("ffeecc" is going to #fffedc because 16 is added) - - -.. index:: Simple data types; imageExtension -.. _data-type-imageExtension: - -imageExtension -============== - -.. confval:: imageExtension - :name: data-type-imageExtension - - Image extensions can be anything among the allowed types defined in the - global variable :php:`$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']`. - Standard is pdf, gif, jpg, jpeg, tif, bmp, ai, pcx, tga, png. - - The value **"web"** is special. This will ensure that an image is - converted to a web image format (gif or jpg) if it happens not to be already! - - .. rubric:: Examples - - jpg - - web *(gif or jpg ..)* - - -.. index:: Simple data types; imgResource -.. _data-type-imgResource: - -imgResource -=========== - -.. todo: This seems to be a duplicate of Documentation/Functions/Imgresource.rst? - -.. confval:: imgResource - :name: data-type-imgResource - - #. A :confval:`data-type-resource` plus imgResource properties. - - Filetypes can be anything among the allowed types defined in the - configuration variable - :php:`$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']`. Standard is - pdf, gif, jpg, jpeg, tif, bmp, ai, pcx, tga, png. - - #. A GIFBUILDER object. See the object reference for :ref:`gifbuilder`. - - .. rubric:: Examples - - Here "file" is an imgResource: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - 10 = IMAGE - 10 { - file = fileadmin/toplogo.gif - file.width = 200 - } - - GIFBUILDER: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - 10 = IMAGE - 10.file = GIFBUILDER - 10.file { - # GIFBUILDER properties here... - } - - -.. index:: Simple data types; integer -.. _data-type-integer: - -integer -======= - -.. confval:: integer - :name: data-type-integer - - .. rubric:: Examples - - 42, -8, -9, 0 - - - This data type is sometimes used generally though another type would have - been more appropriate, like :ref:`pixels <data-type-pixels>`. - - -.. index:: Simple data types; path -.. _data-type-path: - -path -==== - -.. confval:: path - :name: data-type-path - - - Path relative to the root directory from which we operate. - Also resolves `EXT:` syntax. - - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.settings.somePath = fileadmin/stuff/ - - -.. index:: Simple data types; pixels -.. _data-type-pixels: - -pixels -====== - -.. confval:: pixels - :name: data-type-pixels - - pixel-distance - - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.someWidth = 345 - - -.. index:: Simple data types; positive integer -.. _data-type-positive-integer: - -positive integer -================ - -.. confval:: positive integer - :name: data-type-positive-integer - - - Positive :confval:`data-type-integer`. - - .. rubric:: Examples - - 42, 8, 9 - - -.. index:: Simple data types; resource -.. _data-type-resource: - -resource -======== - -.. confval:: resource - :name: data-type-resource - - If the value contains a "/", it is expected to be a reference (absolute or - relative) to a file in the file system. There is no support for wildcard - characters in the name of the reference. - - .. rubric:: Example - - Reference to a file in the file system: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.settings.someFile = fileadmin/picture.gif - -.. index:: Simple data types; strftime-conf -.. _data-type-strftime-conf: - -strftime-conf -============= - -.. confval:: strftime-conf - :name: data-type-strftime-conf - - See function `strftime on php.net <https://www.php.net/manual/en/function.strftime>`__. - - -.. index:: Simple data types; string -.. _data-type-string: - -string -====== - -.. confval:: string - :name: data-type-string - - Sometimes used generally though another type would have been more - appropriate, like "align". - - .. rubric:: Example - - The quick brown fox jumps over the lazy dog. - - -.. index:: Simple data types; tag -.. _data-type-tag: - -tag -=== - -.. confval:: tag - :name: data-type-tag - - An HTML tag. - - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.settings.bodyTag = <body lang="de"> - - -.. index:: Simple data types; tag-params -.. _data-type-tag-params: - -tag-params -========== - -.. confval:: tag-params - :name: data-type-tag-params - - Parameters for a tag. - - .. rubric:: Examples - - For <frameset>-params: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.settings.someParams = border="0" framespacing="0" - - -.. index:: Simple data types; target -.. _data-type-target: - -target -====== - -.. confval:: target - :name: data-type-target - - .. rubric:: Examples - - :typoscript:`_top`, :typoscript:`_blank`, :typoscript:`content` - - - Target in an :html:`<a>`-tag. - - This is normally the same value as the name of the root-level object - that defines the frame. - - -.. index:: Simple data types; wrap -.. _data-type-wrap: - -wrap -==== - -.. confval:: wrap - :name: data-type-wrap - - :Syntax: <...> \| </...> - - - Used to wrap something. The vertical bar ("|") is the place, where - your content will be inserted; the parts on the left and right of the - vertical line are placed on the left and right side of the content. - - Spaces between the wrap-parts and the divider ("|") are trimmed off - from each part of the wrap. - - If you want to use more sophisticated data functions, then you - should use `stdWrap.dataWrap` instead of `wrap`. - - A `wrap` is processed and rendered as the last of the other components of - a cObject. - - .. rubric:: Examples - - This will cause the value to be wrapped in a p-tag coloring the - value red: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.stdWrap.wrap = <p class="bg-red"> | </p> diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index 4e5f92d82..27ad97ac2 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -1,5 +1,6 @@ .. include:: /Includes.rst.txt .. index:: Function; getText +.. _data-type-function-getText: .. _data-type-gettext: ============== diff --git a/Documentation/Functions/Imagelinkwrap.rst b/Documentation/Functions/Imagelinkwrap.rst index be8630cc5..38bec9505 100644 --- a/Documentation/Functions/Imagelinkwrap.rst +++ b/Documentation/Functions/Imagelinkwrap.rst @@ -143,7 +143,7 @@ bodyTag .. confval:: imageLinkWrap.bodyTag :name: imagelinkwrap-bodyTag - :type: :ref:`data-type-tag` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` This is the `<body>`-tag of the preview window. Needs :typoscript:`JSwindow = 1`. @@ -181,7 +181,7 @@ target .. confval:: imageLinkWrap.target :name: imagelinkwrap-target - :type: :ref:`data-type-target` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` :Default: :typoscript:`thePicture` This specifies the `target` attribute of the link. The attribute @@ -243,10 +243,10 @@ JSwindow.newWindow :type: :ref:`data-type-boolean` / :ref:`stdwrap` :Default: 0 - If the :ref:`Doctype <setup-config-doctype>` allows the :ref:`data-type-target` + If the :ref:`Doctype <setup-config-doctype>` allows the string attribute then the image will be opened in a window with the name given by `target`. If that windows is kept open and the next image with the - same :ref:`data-type-target` attribute is to be shown then it will appear + same string attribute is to be shown then it will appear in the same preview window. If :typoscript:`JSwindow.newWindow` is set to True, then a unique hash value is used as `target` value for each image. diff --git a/Documentation/Functions/Imgresource.rst b/Documentation/Functions/Imgresource.rst index 2c115a404..9ae994afd 100644 --- a/Documentation/Functions/Imgresource.rst +++ b/Documentation/Functions/Imgresource.rst @@ -2,14 +2,48 @@ .. index:: Functions; imgResource imgResource +.. _data-type-imgResource: .. _imgresource: =========== imgResource =========== -imgResource contains the properties that are used with the data type -imgResource. +An imgResource one of the following: + +#. A :confval:`data-type-resource` plus imgResource properties. + + Filetypes can be anything among the allowed types defined in the + configuration variable + :php:`$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']`. Standard is + gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg,webp. + +#. A GIFBUILDER object. See the object reference for :ref:`gifbuilder`. + +.. rubric:: Examples + +Here "file" is an imgResource: + +.. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + 10 = IMAGE + 10 { + file = fileadmin/toplogo.gif + file.width = 200 + } + +GIFBUILDER: + +.. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + 10 = IMAGE + 10.file = GIFBUILDER + 10.file { + # GIFBUILDER properties here... + } + .. contents:: :local: @@ -20,6 +54,7 @@ imgResource. Properties ========== +.. _data-type-imageExtension: .. _imgresource-ext: ext @@ -27,7 +62,7 @@ ext .. confval:: ext :name: imgresource-ext - :type: :ref:`data-type-imageExtension` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` :Default: web Target file extension for the processed image. The value :typoscript:`web` checks if @@ -37,6 +72,8 @@ ext :php:`$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']` in the install tool. + Standard is gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg,webp. + .. _imgresource-width: @@ -45,7 +82,7 @@ width .. confval:: width :name: imgresource-width - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` If both the width and the height are set and one of the numbers is appended by an :typoscript:`m`, the proportions will be preserved and thus @@ -107,7 +144,7 @@ height .. confval:: height :name: imgresource-height - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` See :ref:`imgresource-width`. @@ -315,7 +352,7 @@ maxW .. confval:: maxW :name: imgresource-maxW - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` Maximum width @@ -327,7 +364,7 @@ maxH .. confval:: maxH :name: imgresource-maxH - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` Maximum height @@ -339,7 +376,7 @@ minW .. confval:: minW :name: imgresource-minW - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` Minimum width (overrules maxW/maxH) @@ -351,7 +388,7 @@ minH .. confval:: minH :name: imgresource-minH - :type: :ref:`data-type-pixels` / :ref:`stdwrap` + :type: integer / :ref:`stdwrap` Minimum height (overrules maxW/maxH) diff --git a/Documentation/Functions/Makelinks.rst b/Documentation/Functions/Makelinks.rst index a2da999b1..fc8b22c52 100644 --- a/Documentation/Functions/Makelinks.rst +++ b/Documentation/Functions/Makelinks.rst @@ -49,7 +49,7 @@ http.extTarget .. confval:: http.extTarget :name: makelinks-http-extTarget - :type: :ref:`data-type-target` + :type: string :Default: \_top The target of the link. @@ -111,7 +111,7 @@ http.ATagParams .. confval:: http.ATagParams :name: makelinks-http-ATagParams - :type: :ref:`data-type-tag-params` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` Additional parameters @@ -167,7 +167,7 @@ mailto.ATagParams .. confval:: mailto.ATagParams :name: makelinks-mailto.ATagParams - :type: :ref:`data-type-tag-params` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` Additional parameters diff --git a/Documentation/Functions/Stdwrap.rst b/Documentation/Functions/Stdwrap.rst index daf1e6502..895671263 100644 --- a/Documentation/Functions/Stdwrap.rst +++ b/Documentation/Functions/Stdwrap.rst @@ -830,6 +830,7 @@ strtotime } +.. _data-type-strftime-conf: .. _stdwrap-strftime: strftime @@ -996,6 +997,7 @@ age lib.ageFormat.stdWrap.age = " Minuten | Stunden | Tage | Jahre | Minute | Stunde | Tag | Jahr" +.. _data-type-case: .. _stdwrap-case: case @@ -1003,12 +1005,44 @@ case .. confval:: case :name: stdwrap-case - :type: :ref:`data-type-case` / :ref:`stdWrap` + :type: string / :ref:`stdWrap` Converts case Uses "UTF-8" for the operation. + .. rubric:: Possible values: + + ============================= ========================================================== + Value Effect + ============================= ========================================================== + :typoscript:`upper` Convert all letters of the string to upper case + :typoscript:`lower` Convert all letters of the string to lower case + :typoscript:`capitalize` Uppercase the first character of each word in the string + :typoscript:`ucfirst` Convert the first letter of the string to upper case + :typoscript:`lcfirst` Convert the first letter of the string to lower case + :typoscript:`uppercamelcase` Convert underscored `upper_camel_case` to `UpperCamelCase` + :typoscript:`lowercamelcase` Convert underscored `lower_camel_case` to `lowerCamelCase` + ============================= ========================================================== + + .. rubric:: Example + + Code: + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + 10 = TEXT + 10.value = Hello world! + 10.case = upper + + Result: + + .. code-block:: text + :caption: Example Output + + HELLO WORLD! + .. _stdwrap-bytes: @@ -1437,6 +1471,7 @@ postCObject :ref:`stdwrap-cObject` appended the content. +.. _data-type-align: .. _stdwrap-wrapAlign: wrapAlign @@ -1444,7 +1479,8 @@ wrapAlign .. confval:: wrapAlign :name: stdwrap-wrapAlign - :type: :ref:`data-type-align` / :ref:`stdWrap` + :type: string / :ref:`stdWrap` + :Allowed values: :typoscript:`left`, :typoscript:`center`, :typoscript:`right` Wraps content with :typoscript:`<div style=text-align:[*value*];"> | </div>` *if* align is set. diff --git a/Documentation/Functions/Typolink.rst b/Documentation/Functions/Typolink.rst index 5de231912..254369e78 100644 --- a/Documentation/Functions/Typolink.rst +++ b/Documentation/Functions/Typolink.rst @@ -35,7 +35,7 @@ extTarget .. confval:: extTarget :name: typolink-extTarget - :type: :ref:`data-type-target` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` :Default: "" (no target set) Target used for external links @@ -48,7 +48,7 @@ fileTarget .. confval:: fileTarget :name: typolink-fileTarget - :type: :ref:`data-type-target` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` Target used for file links @@ -87,7 +87,7 @@ target .. confval:: target :name: typolink-target - :type: :ref:`data-type-target` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` Target used for internal links diff --git a/Documentation/Functions/Wrap.rst b/Documentation/Functions/Wrap.rst new file mode 100644 index 000000000..36f49c4c3 --- /dev/null +++ b/Documentation/Functions/Wrap.rst @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +.. _data-type-wrap: + +==== +Wrap +==== + +.. confval:: wrap + :name: data-type-wrap + + :Syntax: <...> \| </...> + + Used to wrap something. The vertical bar ("|") is the place, where + your content will be inserted; the parts on the left and right of the + vertical line are placed on the left and right side of the content. + + Spaces between the wrap-parts and the divider ("|") are trimmed off + from each part of the wrap. + + If you want to use more sophisticated data functions, then you + should use `stdWrap.dataWrap` instead of `wrap`. + + A `wrap` is applied as one of the last of properties + a cObject. + + .. rubric:: Examples + + This will cause the value to be wrapped in a p-tag coloring the + value red: + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.wrap = <p class="bg-red"> | </p> diff --git a/Documentation/Gifbuilder/Colors.rst b/Documentation/Gifbuilder/Colors.rst new file mode 100644 index 000000000..2f4b34bb7 --- /dev/null +++ b/Documentation/Gifbuilder/Colors.rst @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt +.. index:: GIFBUILDER; +calc +.. _gifbuilder-colors: + +=============================== +Colors in TypoScript GIFBUILDER +=============================== + +.. _data-type-GraphicColor: +.. confval:: GraphicColor + :name: data-type-GraphicColor + + .. rubric:: Syntax: + + [colordef] : [modifier] + + Where modifier can be an integer which is added or subtracted to the three + RGB-channels or a floating point with an :typoscript:`*` before, which will then + multiply the values with that factor. + The color can be given as HTML-color or as a comma-separated list of + RGB-values (integers). An extra parameter can be given, that will modify the + color mathematically: + + .. rubric:: Examples + + * :typoscript:`red` (HTML color) + * :typoscript:`#ffeecc` (HTML color as hexadecimal notation) + * :typoscript:`255,0,255` (HTML color as decimal notation) + + *Extra:* + + * :typoscript:`red : *0.8` ("red" is darkened by factor 0.8) + * :typoscript:`#ffeecc : +16` ("ffeecc" is going to #fffedc because 16 is added) diff --git a/Documentation/Gifbuilder/Index.rst b/Documentation/Gifbuilder/Index.rst index 378b0b0ec..f295457e3 100644 --- a/Documentation/Gifbuilder/Index.rst +++ b/Documentation/Gifbuilder/Index.rst @@ -27,6 +27,7 @@ supported file format. PNG and JPG can be created as well today (configured with :glob: Examples + Colors Calc Properties ObjectNames/Index diff --git a/Documentation/Gifbuilder/ObjectNames/Text/Index.rst b/Documentation/Gifbuilder/ObjectNames/Text/Index.rst index 7229aafe2..a4be1b184 100644 --- a/Documentation/Gifbuilder/ObjectNames/Text/Index.rst +++ b/Documentation/Gifbuilder/ObjectNames/Text/Index.rst @@ -35,7 +35,7 @@ align * :typoscript:`center` * :typoscript:`right` - +.. _data-type-degree: .. _gifbuilder-text-angle: angle @@ -43,7 +43,7 @@ angle .. confval:: angle :name: gifbuilder-text-angle - :type: :ref:`data-type-degree` + :type: integer :Default: 0 :Range: -90 to 90 diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 8c3b3e973..356931afc 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -56,7 +56,6 @@ chapter. DataProcessing/Index TopLevelObjects/Index Functions/Index - DataTypes/Index Conditions/Index .. toctree:: diff --git a/Documentation/Syntax/Index.rst b/Documentation/Syntax/Index.rst index 682290f54..dac51bc16 100644 --- a/Documentation/Syntax/Index.rst +++ b/Documentation/Syntax/Index.rst @@ -20,3 +20,4 @@ store configuration in this structure. Comments/Index Conditions/Index FileImports/Index + StringFormats/Index diff --git a/Documentation/Syntax/StringFormats/Index.rst b/Documentation/Syntax/StringFormats/Index.rst new file mode 100644 index 000000000..7e0d3af9b --- /dev/null +++ b/Documentation/Syntax/StringFormats/Index.rst @@ -0,0 +1,175 @@ +:navigation-title: String formats +.. include:: /Includes.rst.txt +.. _data-types: +.. _data-types-reference: +.. _string-formats: + +========================= +TypoScript string formats +========================= + +The values assigned to properties in TypoScript are internally handled as +strings. + +Some properties expect a certain format of string. These formats are described +in this chapter. + +Enforcing these string formats is up to the implementation of the property using +them. They are therefore no real constructs of the TypoScript syntax. + +.. contents:: + :local: + +.. index:: Simple data types; boolean +.. _data-type-boolean: + +boolean +======= + +.. confval:: boolean + :name: data-type-boolean + + Possible values for boolean variables are `1` and `0` + meaning TRUE and FALSE. + + Everything else is `evaluated to one of these values by PHP`__: + Non-empty strings (except `0` [zero]) are treated as TRUE, + empty strings are evaluated to FALSE. + + __ https://www.php.net/manual/en/language.types.boolean.php + + .. rubric:: Examples + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + dummy.enable = 0 # false, preferred notation + dummy.enable = 1 # true, preferred notation + dummy.enable = # false, because the value is empty + +.. index:: Simple data types; date-conf +.. _data-type-date-conf: + +date-conf +========= + +.. confval:: date-conf + :name: data-type-date-conf + + Used to format a date, see PHP function :php:`date()`. See the + documentation of `allowed date time formats in + PHP <https://www.php.net/manual/en/datetime.format.php>`__. + + .. rubric:: Example + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.date-conf = d-m-y + + +.. index:: Simple data types; function name +.. _data-type-function-name: + +function name +============= + +.. confval:: function name + :name: data-type-function-name + + Indicates a function or method in a class to call. See more information at + the :ref:`USER cObject <cobj-user>`. + + .. rubric:: Examples + + Method name in a namespaced class: + + .. code-block:: typoscript + + lib.someThing = USER_INT + lib.someThing.userFunc = MyVendor\MyExtension\SomeNamespace\SomeClass->someFunction + + .. literalinclude:: _FunctionName.php + :language: php + :caption: EXT:my_extension/Classes/SomeNamespace/SomeClass.php + +.. index:: Simple data types; integer +.. _data-type-positive-integer: +.. _data-type-integer: + +integer +======= + +.. confval:: integer + :name: data-type-integer + + .. rubric:: Examples + + 42, -8, -9, 0 + + Positive integers expect to be greater or equal zero. + + +.. index:: Simple data types; path +.. _data-type-path: + +path +==== + +.. confval:: path + :name: data-type-path + + Path relative to the root directory from which we operate. + Also resolves `EXT:` syntax. + + .. rubric:: Example + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.settings.somePath = fileadmin/stuff/ + + +.. index:: Simple data types; resource +.. _data-type-resource: + +resource +======== + +.. confval:: resource + :name: data-type-resource + + If the value contains a "/", it is expected to be a reference (absolute or + relative) to a file in the file system. There is no support for wildcard + characters in the name of the reference. + + .. rubric:: Example + + Reference to a file in the file system: + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.settings.someFile = fileadmin/picture.gif + +.. index:: Simple data types; string +.. _data-type-string: + +string +====== + +.. confval:: string + :name: data-type-string + + Any property in TypoScript is a string technically. String can be defined + in a single line or with multiple lines, using the + :ref:`typoscript-syntax-syntax-multiline-values`. + + .. rubric:: Example + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.value = The quick brown fox jumps over the lazy dog. + + .. include:: /CodeSnippets/TypoScriptSyntax/OperatorUnset.rst.txt diff --git a/Documentation/DataTypes/_FunctionName.php b/Documentation/Syntax/StringFormats/_FunctionName.php similarity index 100% rename from Documentation/DataTypes/_FunctionName.php rename to Documentation/Syntax/StringFormats/_FunctionName.php diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index f0c58ac42..718e62224 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -204,7 +204,7 @@ Properties .. confval:: bodyTag :name: page-bodyTag - :type: :ref:`data-type-tag` + :type: string :Default: `<body>` :Example: :ref:`Set a class on the body tag <setup-page-bodytag-example>` @@ -284,7 +284,7 @@ Properties .. confval:: headTag :name: page-headTag - :type: :ref:`data-type-tag` / :ref:`stdwrap` + :type: string / :ref:`stdwrap` :Default: `<head>` Head-tag if alternatives are wanted From e53c778fd6495f7de74eab3a173f76ae4f15311e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:43:25 +0100 Subject: [PATCH 065/125] [BUGFIX] Fix duplicate row identifiers (#1466) Co-authored-by: Eric Harrer <info@eric-harrer.de> --- .../_PageContentFetchingProcessor/_BackendLayout.tsconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/DataProcessing/_PageContentFetchingProcessor/_BackendLayout.tsconfig b/Documentation/DataProcessing/_PageContentFetchingProcessor/_BackendLayout.tsconfig index 2891fd19f..29a7f5fd6 100644 --- a/Documentation/DataProcessing/_PageContentFetchingProcessor/_BackendLayout.tsconfig +++ b/Documentation/DataProcessing/_PageContentFetchingProcessor/_BackendLayout.tsconfig @@ -18,7 +18,7 @@ mod.web_layout.BackendLayouts { } } - 1 { + 2 { columns { 1 { name = Left @@ -38,4 +38,4 @@ mod.web_layout.BackendLayouts { } } } -} \ No newline at end of file +} From 8dcc257e4b7027bd39c257cf171aee2df3c121c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Dec 2024 15:16:11 +0100 Subject: [PATCH 066/125] Prevent citation box (#1469) Releases main, 13.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/TopLevelObjects/Config.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index a5ae0999a..1ae2e2f72 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -1544,7 +1544,6 @@ Spam protect email addresses automatically ------------------------------------------ Demonstrates: - * :confval:`config.spamProtectEmailAddresses <config-spamProtectEmailAddresses>` * :confval:`config.spamProtectEmailAddresses_atSubst <config-spamProtectEmailAddresses_atSubst>` * :confval:`config.spamProtectEmailAddresses_lastDotSubst <config-spamProtectEmailAddresses_lastDotSubst>` From 94c64d7df72ff64be15ccd79e3a392394d76b71b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Dec 2024 15:16:23 +0100 Subject: [PATCH 067/125] fix: correct anchors in PAGE properties (#1471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, they are linked to the "Properties" heading instead of the according section. Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/TopLevelObjects/Page/Index.rst | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index 718e62224..f04492cbb 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -227,7 +227,7 @@ Properties if that is set. .. note:: Additionally to the body tag properties noted here, - there also is the property :ref:`setup-config-disableBodyTag`, + there also is the property :confval:`config.disableBodyTag <config-disableBodyTag>`, which, if set, disables body tag generation independently from what might be set here. @@ -270,12 +270,12 @@ Properties Inserts custom content in the head section of the website. While you can also use this to include stylesheet references or JavaScript, - you should better use :ref:`page.includeCSS <setup-page-includecss-array>` - and :ref:`page.includeJS <setup-page-includejs-array>` for such files. + you should better use :confval:`page.includeCSS <page-includeCSS>` + and :confval:`page.includeJS <page-includeJS>` for such files. Features like file concatenation and file compression will not work on files, which are included using :typoscript:`headerData`. - For meta tags, use the dedicated configuration :ref:`page.meta <meta>`. + For meta tags, use the dedicated configuration :confval:`page.meta <page-meta>`. By default, gets inserted after all the style definitions. @@ -459,9 +459,9 @@ Properties :name: page-includeJSFooter :type: :ref:`data-type-resource` - Add JavaScript files to footer (after files set in :ref:`includeJSFooterlibs <setup-page-includejsfooterlibs-array>`) + Add JavaScript files to footer (after files set in :confval:`includeJSFooterlibs <page-includeJSFooterlibs>`) - Same as :ref:`includeJS <setup-page-includejs-array>` above, except that this block gets + Same as :confval:`includeJS <page-includeJS>` above, except that this block gets included at the bottom of the page (just before the closing :html:`</body>` tag). @@ -471,15 +471,15 @@ Properties Add JavaScript library files to footer. - Same as :ref:`includeJSLibs <setup-page-includejslibs-array>`, except that this block gets + Same as :confval:`includeJSLibs <page-includeJSLibs>`, except that this block gets included at the bottom of the page (just before the closing :html:`</body>` tag). - The optional properties from :ref:`includeJS <setup-page-includejs-array>` + The optional properties from :confval:`includeJS <page-includeJS>` can be applied. Currently one difference between :typoscript:`includeJS` and :typoscript:`includeJSFooterlibs` exists: - There is no :typoscript:`data`-array as optional parameter but all keys not explicitly mentioned as parameters are used as additional attributes - behaviour is the same as in :ref:`includeCSS <setup-page-includecss-array>`. + There is no :typoscript:`data`-array as optional parameter but all keys not explicitly mentioned as parameters are used as additional attributes - behaviour is the same as in :confval:`includeCSS <page-includeCSS>`. .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -497,15 +497,15 @@ Properties Adds JavaScript library files to head of page. - Same as :ref:`includeJSFooterlibs <setup-page-includejsfooterlibs-array>`, except that this block gets + Same as :confval:`includeJSFooterlibs <page-includeJSFooterlibs>`, except that this block gets included inside :html:`<head>`. tag). - The optional properties from :ref:`includeJS <setup-page-includejs-array>` + The optional properties from :confval:`includeJS <page-includeJS>` can be applied. Currently one difference between :typoscript:`includeJS` and :typoscript:`includeJSLibs` exists: - There is no :typoscript:`data`-array as optional parameter but all keys not explicitly mentioned as parameters are used as additional attributes - behaviour is the same as in :ref:`includeCSS <setup-page-includecss-array>`. + There is no :typoscript:`data`-array as optional parameter but all keys not explicitly mentioned as parameters are used as additional attributes - behaviour is the same as in :confval:`includeCSS <page-includeCSS>`. .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript From ab2d30c36fcad8807ec45a29473ad237b392e088 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:42:01 +0100 Subject: [PATCH 068/125] [Backport 13.4] [FEATURE] Allow modifying fetched page content (#1473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FEATURE] Allow modifying fetched page content Resolves: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1165 Releases: main, 13.4 * Update Documentation/DataProcessing/PageContentFetchingProcessor.rst Co-authored-by: Stefan Frömken <froemken@gmail.com> --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Stefan Frömken <froemken@gmail.com> --- .../PageContentFetchingProcessor.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Documentation/DataProcessing/PageContentFetchingProcessor.rst b/Documentation/DataProcessing/PageContentFetchingProcessor.rst index 140c5f2b9..d831e3319 100644 --- a/Documentation/DataProcessing/PageContentFetchingProcessor.rst +++ b/Documentation/DataProcessing/PageContentFetchingProcessor.rst @@ -74,3 +74,20 @@ The :ref:`backend layout <t3coreapi:be-layout>` is defined like this: .. literalinclude:: _PageContentFetchingProcessor/_BackendLayout.tsconfig :caption: config/sites/my-site/page.tsconfig + +.. _PageContentFetchingProcessor-AfterContentHasBeenFetchedEvent: + +Modify the result via AfterContentHasBeenFetchedEvent +===================================================== + +.. versionadded:: 13.4.2 | 14.0 + The event `AfterContentHasBeenFetchedEvent <https://docs.typo3.org/permalink/t3coreapi:aftercontenthasbeenfetchedevent>`_ + has been introduced to adjust the page content fetched by the `page-content` + data processor. + +The event `AfterContentHasBeenFetchedEvent <https://docs.typo3.org/permalink/t3coreapi:aftercontenthasbeenfetchedevent>`_ +can be used to modify the content elements fetched by the `page-content` +data processor. + +See the following example: +`Filter content elements provided by the page-content data processor <https://docs.typo3.org/permalink/t3coreapi:aftercontenthasbeenfetchedevent-example>`_. From 2823806217407ec4b44075357e8c4fb1324d5cbf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:46:06 +0100 Subject: [PATCH 069/125] [Backport 13.4] [TASK] Document page TSconfig setting mod.web_list.disableSearchBox #1474 (#1476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [TASK] Document page TSconfig setting `mod.web_list.disableSearchBox` * [BUGFIX] Restore index of `disableSingleTableView` --------- Co-authored-by: Jasmina Ließmann <19210345+minapok@users.noreply.github.com> --- Documentation/PageTsconfig/Mod/WebList.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/PageTsconfig/Mod/WebList.rst index 1df37a6d2..a85f6b5e0 100644 --- a/Documentation/PageTsconfig/Mod/WebList.rst +++ b/Documentation/PageTsconfig/Mod/WebList.rst @@ -159,6 +159,19 @@ Hide "Create new record" links in tables sys_category and tt_content } +.. index:: disableSearchBox +.. _pageTsConfigWebList-disableSearchBox: + +disableSearchBox +====================== + +.. confval:: disableSearchBox + :name: mod-web-list-disableSearchBox + :type: boolean + + If set, the checkbox "Show search" in the list module is hidden. + + .. index:: disableSingleTableView .. _pageTsConfigWebList-disableSingleTableView: From becd02db5bc8a430284ad3494457a2d1a4e43696 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:53:00 +0100 Subject: [PATCH 070/125] [TASK] Automatically fix whitespace issues (#1479) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .github/workflows/apply-precommit.yml | 59 +++++++++++++++++++++++++++ .pre-commit-config.yaml | 6 +++ 2 files changed, 65 insertions(+) create mode 100644 .github/workflows/apply-precommit.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/apply-precommit.yml b/.github/workflows/apply-precommit.yml new file mode 100644 index 000000000..44019f6f0 --- /dev/null +++ b/.github/workflows/apply-precommit.yml @@ -0,0 +1,59 @@ +name: Check and Fix Whitespace on Schedule + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Install pre-commit + run: pip install pre-commit + + - name: Run pre-commit hooks and apply fixes + id: pre-commit + run: | + # Run pre-commit with auto-fix and ignore exit code + pre-commit run --all-files --hook-stage=manual --show-diff-on-failure || true + # Check if any files were modified + git diff --exit-code || echo "FIX_NEEDED=true" >> $GITHUB_ENV + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create and push changes if needed + if: env.FIX_NEEDED == 'true' + id: create_branch + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + # Create a new branch for the changes + BRANCH_NAME="fix/whitespace-$(date +'%Y%m%d%H%M%S')" + git checkout -b "$BRANCH_NAME" + git add . + git commit -m "fix: apply whitespace fixes" + git push origin "$BRANCH_NAME" + echo "branch_name=$BRANCH_NAME" >> $GITHUB_ENV + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Open Pull Request + if: env.FIX_NEEDED == 'true' + uses: repo-sync/pull-request@v2 + with: + source_branch: ${{ env.branch_name }} + destination_branch: ${{ github.ref_name }} + pr_title: "Fix whitespace issues" + pr_body: "This PR automatically applies whitespace fixes." + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..7be147642 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 # Use the latest version + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer From 5a5e6a2513b85eb2f868e2fac36a9f1d9c2cd431 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Dec 2024 10:12:43 +0100 Subject: [PATCH 071/125] [!!!][TASK] Move menus properties into dataprocessor (#1485) Keep HMENU / TMENU for backward compability reasons but remove outdated examples. Some special menu types still rely on HMENU, I will work on them in follow-ups. Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/ContentObjects/Hmenu/Index.rst | 441 +++++------------- .../ContentObjects/Hmenu/Tmenu/Index.rst | 218 +-------- .../ContentObjects/Hmenu/Tmenu/Tmenuitem.rst | 28 +- Documentation/DataProcessing/Index.rst | 2 +- .../DataProcessing/MenuProcessor.rst | 120 ----- .../MenuProcessor}/Browse.rst | 2 +- .../MenuProcessor}/Categories.rst | 7 +- .../MenuProcessor}/Directory.rst | 1 + .../DataProcessing/MenuProcessor/Index.rst | 238 ++++++++++ .../MenuProcessor}/Keywords.rst | 1 + .../MenuProcessor}/Language.rst | 9 + .../MenuProcessor}/List.rst | 1 + .../MenuProcessor}/Rootline.rst | 1 + .../MenuProcessor}/Updated.rst | 1 + .../MenuProcessor}/Userfunction.rst | 20 +- .../_BreadcrumbDataProcessor.typoscript | 0 .../_code-snippets/_BreadcrumbLib.typoscript | 0 .../_LanguageMenuLib.typoscript | 0 .../_RelPrevNextMenu.typoscript | 0 .../_code-snippets/_entryLevel.typoscript | 14 + ...ectsCommonPropertiesSubmenuObjSuffixes.png | Bin 15333 -> 0 bytes 21 files changed, 433 insertions(+), 671 deletions(-) delete mode 100644 Documentation/DataProcessing/MenuProcessor.rst rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Browse.rst (99%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Categories.rst (98%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Directory.rst (98%) create mode 100644 Documentation/DataProcessing/MenuProcessor/Index.rst rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Keywords.rst (99%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Language.rst (91%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/List.rst (98%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Rootline.rst (98%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Updated.rst (99%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/Userfunction.rst (68%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/_code-snippets/_BreadcrumbDataProcessor.typoscript (100%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/_code-snippets/_BreadcrumbLib.typoscript (100%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/_code-snippets/_LanguageMenuLib.typoscript (100%) rename Documentation/{ContentObjects/Hmenu => DataProcessing/MenuProcessor}/_code-snippets/_RelPrevNextMenu.typoscript (100%) create mode 100644 Documentation/DataProcessing/MenuProcessor/_code-snippets/_entryLevel.typoscript delete mode 100644 Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/MenuObjectsCommonPropertiesSubmenuObjSuffixes.png diff --git a/Documentation/ContentObjects/Hmenu/Index.rst b/Documentation/ContentObjects/Hmenu/Index.rst index eed18f994..324bde13c 100644 --- a/Documentation/ContentObjects/Hmenu/Index.rst +++ b/Documentation/ContentObjects/Hmenu/Index.rst @@ -9,6 +9,12 @@ HMENU ===== +.. warning:: + This TypoScript object is still available to provide backward compatibility + for old sites. When creating a new menu or refactoring an existing one + always use the `menu data processor <https://docs.typo3.org/permalink/t3tsref:menuprocessor>`_ + and a Fluid template. + Objects of type HMENU generate hierarchical menus. In a :ref:`FLUIDTEMPLATE <cobj-fluidtemplate>` the HMENU can be used as a DataProcessor called :ref:`MenuProcessor <MenuProcessor>`, which @@ -24,9 +30,6 @@ structured in the page tree, HMENU also allows you to use the menus. These special menus take characteristics of special menu types into account. -.. contents:: - :local: - .. _cobj-hmenu-options: Properties @@ -36,375 +39,189 @@ Properties :display: table :type: -.. _hmenu-number: - -.. confval:: 1, 2, 3, ... - :name: hmenu-array - :type: :ref:`menu object <data-type-menuobj>` - :Default: (no menu) - - For every menu level, that should be rendered, an according entry must - exist. It defines the menu object that should render the menu items on - the according level. 1 is the first level, 2 is the second level, 3 is - the third level and so on. - - **The property "1" is required!** - - The entry 1 for the first level always must exist. All other levels only - will be generated when they are configured. - - **Example:** - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - temp.sidemenu = HMENU - temp.sidemenu.1 = TMENU - temp.sidemenu.1 { - # Configuration of that TMENU here... - } - temp.sidemenu.2 = TMENU - temp.sidemenu.2 { - # Configuration of that TMENU here... - } - temp.sidemenu.3 = TMENU - temp.sidemenu.3 { - # Configuration of that TMENU here... - } - - This creates a menu with up to three levels: Each TMENU level can hold a - different menu configuration. - - TYPO3 offers :ref:`a variety of menu objects <menu-objects>`. - - -.. _hmenu-cache-period: - -.. confval:: cache_period - :name: hmenu-cache-period - :type: :ref:`data-type-integer` - - The number of seconds a menu may remain in cache. If this value is not - set, the first available value of the following will be used: - - 1) cache\_timeout of the current page - - 2) config.cache\_period defined globally - - 3) 86400 (= 1 day) - - -.. _hmenu-cache: - -.. confval:: cache - :name: hmenu-cache - :type: :ref:`cache <cache>` - - See :ref:`cache function description <cache>` for details. - - -.. _hmenu-entrylevel: - -.. confval:: entryLevel - :name: hmenu-entryLevel - :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` - :Default: 0 - - Defines at which level in the rootLine the menu should start. - - Default is "0" which gives us a menu of the very first pages on the - site. - - If the value is < 0, entryLevel is chosen from "behind" in the - rootLine. Thus "-1" is a menu with items from the outermost level, - "-2" is the level before the outermost... - - **Note:** :typoscript:`entryLevel` does not show a menu **of a certain level of pages** - (use :typoscript:`special = directory` for that) - but it means that it will start to be visible **from that level on**. - - So, for example if you build a simple "sitemap" menu like this one: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10 = HMENU - page.10 { - entryLevel = 4 - 1 = TMENU - 1.wrap = <ul> | </ul> - 1.NO.wrapItemAndSub = <li> | </li> - 1.expAll = 1 - 2 < .1 - 3 < .2 - 4 < .3 - 5 < .4 - 6 < .5 - 7 < .6 - } - - it will start to be visible from the 4th level (and will contain only the subpages from that level). - Please note also that this affects also the menu generated with :typoscript:`MenuProcessor`. Example: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10 { - dataProcessing { - 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 10 { - special = list - special.value.field = pages - levels = 7 - entryLevel = 4 - as = menu - expandAll = 1 - titleField = nav_title // title - } - } - } - -.. _hmenu-special: - -.. confval:: special - :name: hmenu-special - :type: *"directory" / "list" / "updated" / "rootline" / "browse" / "keywords" - / "categories" / "language" / "userfunction"* - - Lets you define special types of menus. - - See the section about the :ref:`.special property <hmenu-special-property>`! - - -.. _hmenu-special-value: - -.. confval:: special.value - :name: hmenu-special-value - :type: *list of page-uid's* / :ref:`stdWrap <stdwrap>` - - List of page uid's to use for the special menu. What they are used - for depends on the menu type as defined by ".special"; see the - section about the :ref:`.special property <hmenu-special-property>`! - - -.. _hmenu-minitems: - -.. confval:: minItems - :name: hmenu-minItems - :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` - - The minimum number of items in the menu. If the number of pages does - not reach this level, a dummy-page with the title "..." and - uid=[currentpage\_id] is inserted. - - **Note:** Affects all sub menus as well. To set the value for each - menu level individually, set the properties in the menu objects (see - "Common properties" table). - - -.. _hmenu-maxitems: - -.. confval:: maxItems - :name: hmenu-maxItems - :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` - - The maximum number of items in the menu. Additional items will be - ignored. - - **Note:** Affects all sub menus as well. (See "minItems" for a - notice.) - - -.. _hmenu-begin: - -.. confval:: begin - :name: hmenu-begin - :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` :ref:`+calc <objects-calc>` + .. _hmenu-number: - The first item in the menu. + .. confval:: 1, 2, 3, ... + :name: hmenu-array + :type: :ref:`menu object <data-type-menuobj>` + :Default: (no menu) - **Example:** + For every menu level, that should be rendered, an according entry must + exist. It defines the menu object that should render the menu items on + the according level. 1 is the first level, 2 is the second level, 3 is + the third level and so on. - This results in a menu, where the first two items are skipped starting - with item number 3: + **The property "1" is required!** - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + The entry 1 for the first level always must exist. All other levels only + will be generated when they are configured. - begin = 3 + TYPO3 offers :ref:`the menu object TMENU <menu-objects>`. - **Note:** Affects all sub menus as well. (See "minItems" for a - notice.) + .. _hmenu-cache-period: + .. confval:: cache_period + :name: hmenu-cache-period + :type: :ref:`data-type-integer` -.. _hmenu-excludeuidlist: + The number of seconds a menu may remain in cache. If this value is not + set, the first available value of the following will be used: -.. confval:: excludeUidList - :name: hmenu-excludeUidList - :type: list of :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` + 1) cache\_timeout of the current page - This is a list of page uids to exclude when the select statement is - done. Comma-separated. You may add "current" to the list to exclude - the current page. + 2) config.cache\_period defined globally - **Example:** + 3) 86400 (= 1 day) - The pages with these uid-numbers will **not** be within the menu! - Additionally the current page is always excluded too. + .. _hmenu-cache: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. confval:: cache + :name: hmenu-cache + :type: :ref:`cache <cache>` - excludeUidList = 34,2,current + See :ref:`cache function description <cache>` for details. + .. _hmenu-entrylevel: -.. _hmenu-excludedoktypes: + .. confval:: entryLevel + :name: hmenu-entryLevel + :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` + :Default: 0 -.. confval:: excludeDoktypes - :name: hmenu-excludeDoktypes - :type: list of :ref:`data-type-integer` - :Default: 6,254 + Defines at which level in the rootLine the menu should start. - Enter the list of page document types (doktype) to exclude from menus. - By default pages that are "backend user access only" (6) or "folder" - (254) are excluded. + .. _hmenu-special: -.. _hmenu-includenotinmenu: + .. confval:: special + :name: hmenu-special + :type: *"directory" / "list" / "updated" / "rootline" / "browse" / "keywords" + / "categories" / "language" / "userfunction"* -.. confval:: includeNotInMenu - :name: hmenu-includeNotInMenu - :type: :ref:`data-type-boolean` / :ref:`stdWrap <stdwrap>` + Lets you define special types of menus. - If set, pages with the checkbox "Page enabled in menus" disabled will still be included - in menus. + See the section about the :ref:`.special property <hmenu-special-property>`! -.. _hmenu-alwaysactivepidlist: + .. _hmenu-special-value: -.. confval:: alwaysActivePIDlist - :name: hmenu-alwaysActivePIDlist - :type: list of :ref:`data-type-integer` /:ref:`stdWrap <stdwrap>` + .. confval:: special.value + :name: hmenu-special-value + :type: *list of page-uid's* / :ref:`stdWrap <stdwrap>` - This is a list of page UID numbers that will always be regarded as - active menu items and thereby automatically opened regardless of the - rootline. + List of page uid's to use for the special menu. What they are used + for depends on the menu type as defined by ".special"; see the + section about the :ref:`.special property <hmenu-special-property>`! + .. _hmenu-minitems: -.. _hmenu-protectlvar: + .. confval:: minItems + :name: hmenu-minItems + :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` -.. confval:: protectLvar - :name: hmenu-protectlvar - :type: :ref:`data-type-boolean` / keyword + The minimum number of items in the menu. If the number of pages does + not reach this level, a dummy-page with the title "..." and + `uid=[currentpage\_id]` is inserted. - If set, then for each page in the menu it will be checked if an - Alternative Page Language record for the language defined in - "config.sys\_language\_uid" exists for the - page. If that is not the case and the pages "Localization settings" - have the "Hide page if no translation for current language exists" - flag set, then the menu item will link to a non accessible page that - will yield an error page to the user. Setting this option will prevent - that situation by adding "&L=0" for such pages, meaning that - they will switch to the default language rather than keeping the - current language. + **Note:** Affects all sub menus as well. To set the value for each + menu level individually, set the properties in the menu objects (see + "Common properties" table). - The check is only carried out if a translation is requested - ("config.sys\_language\_uid" is not zero). + .. _hmenu-maxitems: - **Keyword: "all"** + .. confval:: maxItems + :name: hmenu-maxItems + :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` - When set to "all" the same check is carried out but it will not look - if "Hide page if no translation for current language exists" is set - - it always reverts to default language if no translation is found. + The maximum number of items in the menu. Additional items will be + ignored. - For these options to make sense, they should only be used when - "config.sys\_language\_mode" is not set to "content\_fallback". + **Note:** Affects all sub menus as well. (See "minItems" for a + notice.) + .. _hmenu-begin: -.. _hmenu-addquerystring: + .. confval:: begin + :name: hmenu-begin + :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` :ref:`+calc <objects-calc>` -.. confval:: addQueryString - :name: hmenu-addquerystring - :type: :ref:`->addQueryString <typolink-addQueryString>` + The first item in the menu. - **Note:** This works only for *special=language*. + **Note:** Affects all sub menus as well. (See "minItems" for a + notice.) + .. _hmenu-excludeuidlist: -.. _hmenu-if: + .. confval:: excludeUidList + :name: hmenu-excludeUidList + :type: list of :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` -.. confval:: if - :name: hmenu-if - :type: :ref:`->if <if>` + See :confval:`MenuProcessor-excludeUidList`. - If "if" returns false, the menu is not generated. + .. _hmenu-excludedoktypes: + .. confval:: excludeDoktypes + :name: hmenu-excludeDoktypes + :type: list of :ref:`data-type-integer` + :Default: 6,254 -.. _hmenu-wrap: + See :confval:`MenuProcessor-excludeDoktypes`. -.. confval:: wrap - :name: hmenu-wrap - :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap <stdwrap>` + .. _hmenu-includenotinmenu: - Wrap for the HMENU. + .. confval:: includeNotInMenu + :name: hmenu-includeNotInMenu + :type: :ref:`data-type-boolean` / :ref:`stdWrap <stdwrap>` + See :confval:`MenuProcessor-includeNotInMenu` -.. _hmenu-stdwrap: + .. _hmenu-alwaysactivepidlist: -.. confval:: stdWrap - :name: hmenu-stdWrap - :type: :ref:`->stdWrap <stdwrap>` + .. confval:: alwaysActivePIDlist + :name: hmenu-alwaysActivePIDlist + :type: list of :ref:`data-type-integer` /:ref:`stdWrap <stdwrap>` - (Executed after ".wrap".) + See :confval:`MenuProcessor-alwaysActivePIDlist` + .. _hmenu-protectlvar: -.. _hmenu-examples: + .. confval:: protectLvar + :name: hmenu-protectlvar + :type: :ref:`data-type-boolean` / keyword -Example -======= + See :confval:`MenuProcessor-protectlvar`. -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. _hmenu-if: - temp.sidemenu = HMENU - temp.sidemenu.entryLevel = 1 - temp.sidemenu.1 = TMENU - temp.sidemenu.1 { - target = page - NO.afterImg = media/bullets/dots2.gif |*||*| _ - NO.afterImgTagParams = style="margin: 0px 20px;" - NO.linkWrap = {$fontTag} - NO.ATagBeforeWrap = 1 + .. confval:: if + :name: hmenu-if + :type: :ref:`->if <if>` - ACT < .NO - ACT = 1 - ACT.linkWrap = <b>{$fontTag}</b> - } + If "if" returns false, the menu is not generated. + .. _hmenu-wrap: + .. confval:: wrap + :name: hmenu-wrap + :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap <stdwrap>` -.. index:: HMENU; special -.. _hmenu-special-property: + Wrap for the HMENU. -The .special property -===================== + .. _hmenu-stdwrap: -This property makes it possible to create menus that are not strictly -reflecting the current page-structure, but rather creating a -:ref:`breadcrumb menu <hmenu-special-rootline>`, a -:ref:`language menu <hmenu-special-language>` or menus with -links to pages like :ref:`next/previous <hmenu-special-browse>`, -:ref:`last modified <hmenu-special-updated-examples>`, -:ref:`all subpages of a page <hmenu-special-directory>` and so on. + .. confval:: stdWrap + :name: hmenu-stdWrap + :type: :ref:`->stdWrap <stdwrap>` -.. note:: - :typoscript:`.entryLevel` generally is not supported together with the - :typoscript:`.special` property! The only exception is :typoscript:`special = keywords`. + (Executed after ".wrap".) -Also be aware that this property selects pages for the first level in -the menu. Submenus by menuObjects 2+ will be created as usual. + .. _hmenu-examples: + .. _hmenu-special-property: -See the following menus types based on the :typoscript:`special` property: + For examples on how to use the HMENU please refer to old version of this + document, for example :ref:`HMENU <t3tsref/11.5:cobj-hmenu>` -.. toctree:: - :titlesonly: - :glob: + .. toctree:: + :titlesonly: + :glob: + :hidden: - Tmenu/Index - * + Tmenu/Index + * diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst index 7b3ef8f79..42ba8ceb1 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Index.rst @@ -8,7 +8,14 @@ TMENU ===== -:typoscript:`TMENU` is a menu object type. +.. warning:: + This TypoScript object is still available to provide backward compatibility + for old sites. When creating a new menu or refactoring an existing one + always use the `menu data processor <https://docs.typo3.org/permalink/t3tsref:menuprocessor>`_ + and a Fluid template. + +For examples on how to use the TMENU please refer to old version of this +document, for example :ref:`TMENU <t3tsref/11.5:tmenu>`-. .. toctree:: :glob: @@ -20,16 +27,16 @@ TMENU .. index:: TMENU; Item states -.. _tmenu-common-property-no: -.. _tmenu-common-property-ifsub: -.. _tmenu-common-property-act: -.. _tmenu-common-property-actifsub: -.. _tmenu-common-property-cur: -.. _tmenu-common-property-curifsub: -.. _tmenu-common-property-usr: -.. _tmenu-common-property-spc: -.. _tmenu-common-property-userdef1: -.. _tmenu-common-property-userdef2: +.. _tmenu-common-property-no: +.. _tmenu-common-property-ifsub: +.. _tmenu-common-property-act: +.. _tmenu-common-property-actifsub: +.. _tmenu-common-property-cur: +.. _tmenu-common-property-curifsub: +.. _tmenu-common-property-usr: +.. _tmenu-common-property-spc: +.. _tmenu-common-property-userdef1: +.. _tmenu-common-property-userdef2: .. _tmenu-common-properties: TMENU item states @@ -61,23 +68,6 @@ The following Item states are listed from the least to the highest priority: The default "Normal" state rendering of Item. This is required for all menus. - If you specify properties for the "NO" property you do not have to set - it "1". Otherwise with no properties setting "NO=1" will render the - menu anyways (for TMENU this may make sense). - - The simplest menu TYPO3 can generate is then: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.20 = HMENU - page.20.1 = TMENU - page.20.1.NO = 1 - - That will be pure `<a>` tags wrapped around page titles. - - - .. confval:: IFSUB :name: tmenu-common-property-ifsub :type: :ref:`data-type-boolean` / :ref:`tmenuitem` @@ -85,8 +75,6 @@ The following Item states are listed from the least to the highest priority: Enable/Configuration for menu items which has subpages. - - .. confval:: ACT :name: tmenu-common-property-act :type: :ref:`data-type-boolean` / :ref:`tmenuitem` @@ -107,7 +95,6 @@ The following Item states are listed from the least to the highest priority: :type: :ref:`data-type-boolean` / :ref:`tmenuitem` :Default: 0 - Enable/Configuration for a menu item if the item is the current page. .. confval:: CURIFSUB @@ -236,55 +223,6 @@ Properties tt_content.menu.20.3.1.sectionIndex.useColPos = -1 - - .. rubric:: The data record in sectionIndex menus - - When the menu-records are selected it works like this: The parent page - record is used as the "base" for the menu-record. That means that any - "no\_cache" or "target"-properties of the parent page are used for the - whole menu. - - But of course some fields from the tt\_content records are - transferred. This is how it is mapped: - - .. code-block:: none - :caption: Example of data mapping - - $temp[$row[uid]]=$basePageRow; - $temp[$row[uid]]['title']=$row['header']; - $temp[$row[uid]]['subtitle']=$row['subheader']; - $temp[$row[uid]]['starttime']=$row['starttime']; - $temp[$row[uid]]['endtime']=$row['endtime']; - $temp[$row[uid]]['fe_group']=$row['fe_group']; - $temp[$row[uid]]['media']=$row['media']; - $temp[$row[uid]]['header_layout']=$row['header_layout']; - $temp[$row[uid]]['bodytext']=$row['bodytext']; - $temp[$row[uid]]['image']=$row['image']; - $temp[$row[uid]]['sectionIndex_uid']=$row['uid']; - - Basically this shows that - - - the field "header" and "subheader" from tt\_content are mapped to - "title" and "subtitle" in the pages-record. Thus you shouldn't need to - change your standard menu objects to fit this thing. - - - the fields "starttime", "endtime", "fe\_group", "media" from - tt\_content are mapped to the same fields in a pages-record. - - - the fields "header\_layout", "bodytext" and "image" are mapped to - non-existing fields in the page-record - - - a new field, "sectionIndex\_uid" is introduced in the page record - which is detected by the `\TYPO3\CMS\Frontend\Typolink\PageLinkBuilder`. If this field - is present in a page record, the `PageLinkBuilder` will prepend a - hash-mark and the number of the field. - - .. note:: - You cannot create submenus to sectionIndex menus. These elements are not - pages and thereby have no children. - - - .. confval:: target :name: menu-common-properties-target :type: string @@ -292,8 +230,6 @@ Properties Target of the menu links - - .. confval:: forceTypeValue :name: menu-common-properties-forceTypeValue :type: :ref:`data-type-integer` @@ -309,29 +245,12 @@ Properties Wraps the whole block of sub items. - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - 2 = TMENU - 2 { - stdWrap.dataWrap = <ul class="{register : parentProperty}"> | </ul> - NO { - // ... - } - } - - - .. confval:: wrap :name: menu-common-properties-wrap :type: :ref:`wrap <data-type-wrap>` Wraps the whole block of sub items, but only if there were items in the menu! - - .. confval:: IProcFunc :name: menu-common-properties-IProcFunc :type: function name @@ -341,7 +260,6 @@ Properties compiled by implode()'ing the array $I[parts] in the passed array. Thus you may modify this if you need to. - .. confval:: alternativeSortingField :name: menu-common-properties-alternativeSortingField :type: :ref:`data-type-string` @@ -351,19 +269,11 @@ Properties is used in the SQL- "ORDER BY" statement instead. You can also provide the sorting order. - **Examples (for "pages" table):** - - alternativeSortingField = title desc - - (This will render the menu in reversed alphabetical order.) - **Limitations:** This property works with normal menus, sectionsIndex menus and special-menus of type "directory". - - .. confval:: minItems :name: menu-common-properties-minItems :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` @@ -378,34 +288,16 @@ Properties :name: menu-common-properties-maxItems :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` - The maximum items in the menu. More items will be ignored. Takes precedence over HMENU property :ref:`hmenu-maxitems`. - - .. confval:: begin :name: menu-common-properties-begin :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` :ref:`+calc <objects-calc>` - The first item in the menu. - **Example:** - - This results in a menu, where the first two items are skipped starting - with item number 3: - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - begin = 3 - - Takes precedence over :HMENU property :ref:`hmenu-begin`. - - - .. confval:: debugItemConf :name: menu-common-properties-debugItemConf :type: :ref:`data-type-boolean` @@ -413,8 +305,6 @@ Properties Outputs (by the :php:`debug()` function) the configuration arrays for each menu item. Useful to debug :ref:`optionsplit` things and such... - - .. confval:: overrideId :name: menu-common-properties-overrideId :type: :ref:`data-type-integer` (page id) @@ -432,17 +322,12 @@ Properties Additional parameter for the menu links. - **Example:** - - "&some\_var=some%20value" - Must be rawurlencoded. .. confval:: showAccessRestrictedPages :name: menu-common-properties-showaccessrestrictedpages :type: :ref:`data-type-integer` (page ID) / keyword "NONE" - If set, pages in the menu will include pages with frontend user group access enabled. However the page is of course not accessible and therefore the URL in the menu will be linked to the page with the ID @@ -466,20 +351,6 @@ Properties **.ATagParams**: Add custom attributes to the anchor tag. - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - showAccessRestrictedPages = 22 - showAccessRestrictedPages.addParams = &return_url=###RETURN_URL###&pageId=###PAGE_ID### - showAccessRestrictedPages.ATagParams = class="restricted" - - The example will link access restricted menu items to page ID 22 with - the return URL in the GET variable `return_url` and the page ID in the GET - variable "pageId". Additionally, a CSS class "restricted" is added to the - anchor tag. - .. confval:: additionalWhere :name: menu-common-properties-additionalWhere :type: :ref:`data-type-string` / :ref:`stdWrap <stdwrap>` @@ -487,20 +358,10 @@ Properties Adds an additional part to the WHERE clause for this menu. Make sure to start the part with "AND "! - .. rubric:: Example - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - lib.authormenu = HMENU - lib.authormenu.1 = TMENU - lib.authormenu.1.additionalWhere = AND author!="" - .. confval:: itemArrayProcFunc :name: menu-common-properties-itemArrayProcFunc :type: function name - The first variable passed to this function is the "menuArr" array with the menu items as they are collected based on the type of menu. @@ -523,45 +384,4 @@ Properties :name: menu-common-properties-submenuObjSuffixes :type: :ref:`data-type-string` / :ref:`optionsplit` - Defines a suffix for alternative sub-level menu objects. Useful to - create special submenus depending on their parent menu element. See - example below. - - .. rubric:: Example - - This example will generate a menu where the menu objects for the - second level will differ depending on the number of the first level - item for which the submenu is rendered. The second level objects used - are "2" (the default), "2a" and "2b" (the alternatives). Which of them - is used is defined by "1.submenuObjSuffixes" which has the - configuration "a \|\*\| \|\*\| b". This configuration means that the - first menu element will use configuration "2a" and the last will use - "2b" while anything in between will use "2" (no suffix applied) : - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.200 = HMENU - page.200 { - 1 = TMENU - 1.wrap = <div style="width:200px; border: 1px solid;">|</div> - 1.expAll = 1 - 1.submenuObjSuffixes = a |*| |*| b - 1.NO.allWrap = <b>|</b><br/> - - 2 = TMENU - 2.NO.allWrap = <div style="background:red;">|</div> - - 2a = TMENU - 2a.NO.allWrap = <div style="background:yellow;">|</div> - - 2b = TMENU - 2b.NO.allWrap = <div style="background:green;">|</div> - } - - The result can be seen in the image below: - - .. figure:: /Images/ManualScreenshots/FrontendOutput/Hmenu/MenuObjectsCommonPropertiesSubmenuObjSuffixes.png - :alt: Output of the above example. - - Applies to TMENU on >= 2 :sup:`nd` level in a menu. + Defines a suffix for alternative sub-level menu objects. diff --git a/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst b/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst index fe95e5cac..753e5070a 100644 --- a/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst +++ b/Documentation/ContentObjects/Hmenu/Tmenu/Tmenuitem.rst @@ -6,10 +6,21 @@ TMENUITEM ========= +.. warning:: + This TypoScript object is still available to provide backward compatibility + for old sites. When creating a new menu or refactoring an existing one + always use the `menu data processor <https://docs.typo3.org/permalink/t3tsref:menuprocessor>`_ + and a Fluid template. + +For examples on how to use the TMENUITEM please refer to old version of this +document, for example :ref:`TMENUITEM <t3tsref/11.5:tmenuitem>`-. + The current record is the page record of the menu item. If you would like to get data from the current menu item's page record, use :typoscript:`stdWrap.data = field : [field name]`. +.. _tmenuitem-properties: + Properties ========== @@ -118,13 +129,6 @@ Properties Additional parameters - **Example:** : - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - ATagParams = class="board" - .. _tmenuitem-ATagTitle: @@ -135,16 +139,6 @@ Properties Allows you to specify the "title" attribute of the :html:`<a>` tag around the menu item. - **Example:** : - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - ATagTitle.field = abstract // description - - This would use the abstract or description field for the - :html:`<a title="">` attribute. - .. _tmenuitem-additionalParams: diff --git a/Documentation/DataProcessing/Index.rst b/Documentation/DataProcessing/Index.rst index 27e3e7b83..232b8b270 100644 --- a/Documentation/DataProcessing/Index.rst +++ b/Documentation/DataProcessing/Index.rst @@ -27,7 +27,7 @@ for example for comma-separated values, related files or related records. FlexFormProcessor GalleryProcessor LanguageMenuProcessor - MenuProcessor + MenuProcessor/Index PageContentFetchingProcessor RecordTransformationProcessor SiteProcessor diff --git a/Documentation/DataProcessing/MenuProcessor.rst b/Documentation/DataProcessing/MenuProcessor.rst deleted file mode 100644 index 6864c7908..000000000 --- a/Documentation/DataProcessing/MenuProcessor.rst +++ /dev/null @@ -1,120 +0,0 @@ -:navigation-title: menu -.. include:: /Includes.rst.txt -.. _MenuProcessor: - -===================== -`menu` data processor -===================== - -The :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`, -alias `menu`, utilizes :ref:`HMENU <cobj-hmenu>` to generate a list -of menu items which can be assigned to :typoscript:`FLUIDTEMPLATE` as a -variable. - -Additional data processing is supported and will be applied to each record. - -.. contents:: Table of contents - -.. hint:: - The third party extension `b13/menus - <https://extensions.typo3.org/extension/menus>`__ also provides menu - processors like :php:`\B13\Menus\DataProcessing\TreeMenu` and - :php:`\B13\Menus\DataProcessing\BreadcrumbsMenu`. - - Refer to the `manual of the extension b13/menus - <https://github.com/b13/menus/blob/master/README.md>`__ for more - information. - -.. _MenuProcessor-options: - -Options -======= - -.. confval-menu:: - :display: table - :type: - :Default: - - .. _MenuProcessor-levels: - - .. confval:: levels - :name: MenuProcessor-levels - :Required: true - :type: :ref:`data-type-integer` / :ref:`stdWrap` - :Default: 1 - :Example: 5 - - Maximal number of levels to be included in the output array. - - .. _MenuProcessor-expandAll: - - .. confval:: expandAll - :name: MenuProcessor-expandAll - :Required: true - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 1 - :Example: 0 - - Include all submenus (`1`) or only those of the active pages (`0`). - - .. _MenuProcessor-includeSpacer: - - .. confval:: includeSpacer - :name: MenuProcessor-includeSpacer - :Required: true - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: 0 - :Example: 1 - - Include pages with type "spacer". - - .. _MenuProcessor-titleField: - - .. confval:: titleField - :name: MenuProcessor-titleField - :Required: true - :type: :ref:`data-type-string` / :ref:`stdWrap` - :Default: "nav_title // title" - :Example: "subtitle" - - Fields to be used as title. - - - .. _MenuProcessor-as: - - .. confval:: as - :name: MenuProcessor-as - :Required: false - :type: :ref:`data-type-string` - :Default: "menu" - - Name for the variable in the Fluid template. - - .. hint:: - Additionally, all :ref:`HMENU options <cobj-hmenu-options>` are available. - -.. _MenuProcessor-example-two-levels: - -Example: Two level menu of the web page -======================================= - -Please see also :ref:`dataProcessing-about-examples`. - -.. rubric:: TypoScript - -Using the :php:`MenuProcessor` the following scenario is possible: - -.. include:: /CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt - -.. rubric:: The Fluid template - -This generated menu can be used in Fluid like this: - -.. include:: /CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt - -.. rubric:: Output - -The array now contains the menu items on level one. Each item in return has the -menu items of level 2 in an array called :php:`children`. - -.. include:: /Images/AutomaticScreenshots/DataProcessing/MenuProcessor.rst.txt diff --git a/Documentation/ContentObjects/Hmenu/Browse.rst b/Documentation/DataProcessing/MenuProcessor/Browse.rst similarity index 99% rename from Documentation/ContentObjects/Hmenu/Browse.rst rename to Documentation/DataProcessing/MenuProcessor/Browse.rst index a6fa53a8b..a4cd6fb51 100644 --- a/Documentation/ContentObjects/Hmenu/Browse.rst +++ b/Documentation/DataProcessing/MenuProcessor/Browse.rst @@ -1,5 +1,5 @@ +:navigation-title: Browse .. include:: /Includes.rst.txt -.. index:: HMENU; special = browse .. _hmenu-special-browse: ================================ diff --git a/Documentation/ContentObjects/Hmenu/Categories.rst b/Documentation/DataProcessing/MenuProcessor/Categories.rst similarity index 98% rename from Documentation/ContentObjects/Hmenu/Categories.rst rename to Documentation/DataProcessing/MenuProcessor/Categories.rst index 0d4c03b9b..e80bceb5a 100644 --- a/Documentation/ContentObjects/Hmenu/Categories.rst +++ b/Documentation/DataProcessing/MenuProcessor/Categories.rst @@ -1,11 +1,12 @@ +:navigation-title: Categories .. include:: /Includes.rst.txt .. index:: HMENU; special = categories .. _hmenu-special-categories: -================ -Categories HMENU -================ +========== +Categories +========== Makes a menu of pages belonging to one or more categories. If a page belongs to several of the selected categories, it will appear only once. diff --git a/Documentation/ContentObjects/Hmenu/Directory.rst b/Documentation/DataProcessing/MenuProcessor/Directory.rst similarity index 98% rename from Documentation/ContentObjects/Hmenu/Directory.rst rename to Documentation/DataProcessing/MenuProcessor/Directory.rst index 72199c217..b28218068 100644 --- a/Documentation/ContentObjects/Hmenu/Directory.rst +++ b/Documentation/DataProcessing/MenuProcessor/Directory.rst @@ -1,3 +1,4 @@ +:navigation-title: Directory .. include:: /Includes.rst.txt .. index:: HMENU; special = directory .. _hmenu-special-directory: diff --git a/Documentation/DataProcessing/MenuProcessor/Index.rst b/Documentation/DataProcessing/MenuProcessor/Index.rst new file mode 100644 index 000000000..fde8220c9 --- /dev/null +++ b/Documentation/DataProcessing/MenuProcessor/Index.rst @@ -0,0 +1,238 @@ +:navigation-title: menu +.. include:: /Includes.rst.txt +.. _MenuProcessor: + +===================== +`menu` data processor +===================== + +The :php:`\TYPO3\CMS\Frontend\DataProcessing\MenuProcessor`, +alias `menu`, utilizes :ref:`HMENU <cobj-hmenu>` to generate a list +of menu items which can be assigned to :typoscript:`FLUIDTEMPLATE` as a +variable. + +Additional data processing is supported and will be applied to each record. + +.. contents:: Table of contents + +.. hint:: + The third party extension `b13/menus + <https://extensions.typo3.org/extension/menus>`__ also provides menu + processors like :php:`\B13\Menus\DataProcessing\TreeMenu` and + :php:`\B13\Menus\DataProcessing\BreadcrumbsMenu`. + + Refer to the `manual of the extension b13/menus + <https://github.com/b13/menus/blob/master/README.md>`__ for more + information. + +.. _MenuProcessor-options: + +Options +======= + +.. confval-menu:: + :display: table + :type: + :Default: + + .. _MenuProcessor-as: + + .. confval:: as + :name: MenuProcessor-as + :Required: false + :type: :ref:`data-type-string` + :Default: "menu" + + Name for the variable in the Fluid template. + + .. confval:: alwaysActivePIDlist + :name: MenuProcessor-alwaysActivePIDlist + :type: list of :ref:`data-type-integer` /:ref:`stdWrap <stdwrap>` + + This is a list of page UID numbers that will always be regarded as + active menu items and thereby automatically opened regardless of the + rootline. + + .. confval:: entryLevel + :name: MenuProcessor-entryLevel + :type: :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` + :Default: 0 + + Defines at which level in the rootLine the menu should start. + + Default is "0" which gives us a menu of the very first pages on the + site. + + If the value is < 0, entryLevel is chosen from "behind" in the + rootLine. Thus "-1" is a menu with items from the outermost level, + "-2" is the level before the outermost... + + **Note:** :typoscript:`entryLevel` does not show a menu **of a certain level of pages** + (use :typoscript:`special = directory` for that) + but it means that it will start to be visible **from that level on**. + + So, for example if you build a simple "sitemap" menu like this one: + + .. literalinclude:: _code-snippets/_entryLevel.typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + it will start to be visible from the 4th level (and will contain only + the subpages from that level). + + .. confval:: excludeDoktypes + :name: MenuProcessor-excludeDoktypes + :type: list of :ref:`data-type-integer` + :Default: 6,254 + + Enter the list of page document types (doktype) to exclude from menus. + By default pages that are "backend user access only" (6) or "folder" + (254) are excluded. + + .. confval:: excludeUidList + :name: MenuProcessor-excludeUidList + :type: list of :ref:`data-type-integer` / :ref:`stdWrap <stdwrap>` + + This is a list of page uids to exclude when the select statement is + done. Comma-separated. You may add "current" to the list to exclude + the current page. + + **Example:** + + The pages with these uid-numbers will **not** be within the menu! + Additionally the current page is always excluded too. + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page.10.dataProcessing.20.excludeUidList = 34,2,current + + .. _MenuProcessor-expandAll: + + .. confval:: expandAll + :name: MenuProcessor-expandAll + :Required: true + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 1 + :Example: 0 + + Include all submenus (`1`) or only those of the active pages (`0`). + + .. _MenuProcessor-levels: + + .. confval:: levels + :name: MenuProcessor-levels + :Required: true + :type: :ref:`data-type-integer` / :ref:`stdWrap` + :Default: 1 + :Example: 5 + + Maximal number of levels to be included in the output array. + + .. confval:: includeNotInMenu + :name: MenuProcessor-includeNotInMenu + :type: :ref:`data-type-boolean` / :ref:`stdWrap <stdwrap>` + + If set, pages with the checkbox "Page enabled in menus" disabled will still be included + in menus. + + .. _MenuProcessor-includeSpacer: + + .. confval:: includeSpacer + :name: MenuProcessor-includeSpacer + :Required: true + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: 0 + :Example: 1 + + Include pages with type "spacer". + + .. confval:: protectLvar + :name: MenuProcessor-protectlvar + :type: :ref:`data-type-boolean` / keyword + + If set, then for each page in the menu it will be checked if an + Alternative Page Language record for the language defined in + the site exists for the + page. If that is not the case and the pages "Localization settings" + have the "Hide page if no translation for current language exists" + flag set, then the menu item will link to a non accessible page that + will yield an error page to the user. Setting this option will prevent + that situation by adding "&L=0" for such pages, meaning that + they will switch to the default language rather than keeping the + current language. + + The check is only carried out if a translation is requested, not for the + standard language. + + **Keyword: "all"** + + When set to "all" the same check is carried out but it will not look + if "Hide page if no translation for current language exists" is set - + it always reverts to default language if no translation is found. + + .. confval:: special + :name: MenuProcessor-special + :type: *"directory" / "list" / "updated" / "rootline" / "browse" / "keywords" + / "categories" / "language" / "userfunction"* + + Lets you define special types of menus. + + See the section about the :ref:`.special property <hmenu-special-property>`! + + .. confval:: value + :name: MenuProcessor-special-value + :type: *list of page-uid's* / :ref:`stdWrap <stdwrap>` + + List of page uid's to use for the special menu. What they are used + for depends on the menu type as defined by ".special"; see the + section about the :ref:`.special property <hmenu-special-property>`! + + .. _MenuProcessor-titleField: + + .. confval:: titleField + :name: MenuProcessor-titleField + :Required: true + :type: :ref:`data-type-string` / :ref:`stdWrap` + :Default: "nav_title // title" + :Example: "subtitle" + + Fields to be used as title. + +.. _MenuProcessor-special: + +Special menu types +================== + +The following special menu types are available: + +.. toctree:: + :glob: + :titlesonly: + + * + +.. _MenuProcessor-example-two-levels: + +Example: Two level menu of the web page +======================================= + +Please see also :ref:`dataProcessing-about-examples`. + +.. rubric:: TypoScript + +Using the :php:`MenuProcessor` the following scenario is possible: + +.. include:: /CodeSnippets/DataProcessing/TypoScript/MenuProcessor.rst.txt + +.. rubric:: The Fluid template + +This generated menu can be used in Fluid like this: + +.. include:: /CodeSnippets/DataProcessing/Template/DataProcMenu.rst.txt + +.. rubric:: Output + +The array now contains the menu items on level one. Each item in return has the +menu items of level 2 in an array called :php:`children`. + +.. include:: /Images/AutomaticScreenshots/DataProcessing/MenuProcessor.rst.txt diff --git a/Documentation/ContentObjects/Hmenu/Keywords.rst b/Documentation/DataProcessing/MenuProcessor/Keywords.rst similarity index 99% rename from Documentation/ContentObjects/Hmenu/Keywords.rst rename to Documentation/DataProcessing/MenuProcessor/Keywords.rst index bbcc89fbf..b06ec563a 100644 --- a/Documentation/ContentObjects/Hmenu/Keywords.rst +++ b/Documentation/DataProcessing/MenuProcessor/Keywords.rst @@ -1,3 +1,4 @@ +:navigation-title: Keywords .. include:: /Includes.rst.txt .. index:: HMENU; special = keywords .. _hmenu-special-keywords: diff --git a/Documentation/ContentObjects/Hmenu/Language.rst b/Documentation/DataProcessing/MenuProcessor/Language.rst similarity index 91% rename from Documentation/ContentObjects/Hmenu/Language.rst rename to Documentation/DataProcessing/MenuProcessor/Language.rst index 0cd6f3250..d50d4e87c 100644 --- a/Documentation/ContentObjects/Hmenu/Language.rst +++ b/Documentation/DataProcessing/MenuProcessor/Language.rst @@ -1,3 +1,4 @@ +:navigation-title: Language .. include:: /Includes.rst.txt .. index:: HMENU; special = categories .. _hmenu-special-language: @@ -47,6 +48,14 @@ Properties If set, the button for a language will be rendered as a non- disabled button even if no translation is found for the language. +.. _hmenu-addquerystring: + +.. confval:: addQueryString + :name: hmenu-addquerystring + :type: :ref:`->addQueryString <typolink-addQueryString>` + + **Note:** This works only for *special=language*. + .. _hmenu-special-language-examples: diff --git a/Documentation/ContentObjects/Hmenu/List.rst b/Documentation/DataProcessing/MenuProcessor/List.rst similarity index 98% rename from Documentation/ContentObjects/Hmenu/List.rst rename to Documentation/DataProcessing/MenuProcessor/List.rst index 69ae4c7d6..f168a9b59 100644 --- a/Documentation/ContentObjects/Hmenu/List.rst +++ b/Documentation/DataProcessing/MenuProcessor/List.rst @@ -1,3 +1,4 @@ +:navigation-title: List .. include:: /Includes.rst.txt .. index:: HMENU; special = list .. _hmenu-special-list: diff --git a/Documentation/ContentObjects/Hmenu/Rootline.rst b/Documentation/DataProcessing/MenuProcessor/Rootline.rst similarity index 98% rename from Documentation/ContentObjects/Hmenu/Rootline.rst rename to Documentation/DataProcessing/MenuProcessor/Rootline.rst index 43c2f222b..7986d37d7 100644 --- a/Documentation/ContentObjects/Hmenu/Rootline.rst +++ b/Documentation/DataProcessing/MenuProcessor/Rootline.rst @@ -1,3 +1,4 @@ +:navigation-title: Rootline / Breadcrumb .. include:: /Includes.rst.txt .. index:: HMENU; special = rootline .. _hmenu-special-rootline: diff --git a/Documentation/ContentObjects/Hmenu/Updated.rst b/Documentation/DataProcessing/MenuProcessor/Updated.rst similarity index 99% rename from Documentation/ContentObjects/Hmenu/Updated.rst rename to Documentation/DataProcessing/MenuProcessor/Updated.rst index 1a2bfbaef..0b6670e56 100644 --- a/Documentation/ContentObjects/Hmenu/Updated.rst +++ b/Documentation/DataProcessing/MenuProcessor/Updated.rst @@ -1,3 +1,4 @@ +:navigation-title: Updated .. include:: /Includes.rst.txt .. index:: HMENU; special = updated .. _hmenu-special-updated: diff --git a/Documentation/ContentObjects/Hmenu/Userfunction.rst b/Documentation/DataProcessing/MenuProcessor/Userfunction.rst similarity index 68% rename from Documentation/ContentObjects/Hmenu/Userfunction.rst rename to Documentation/DataProcessing/MenuProcessor/Userfunction.rst index 99f0fe42d..83befa48f 100644 --- a/Documentation/ContentObjects/Hmenu/Userfunction.rst +++ b/Documentation/DataProcessing/MenuProcessor/Userfunction.rst @@ -1,6 +1,8 @@ +:navigation-title: Userfunction .. include:: /Includes.rst.txt .. index:: HMENU; special = userfunction .. _hmenu-special-userfunction: +.. _hmenu-special-userfunction-examples: ================= Userfunction menu @@ -24,10 +26,6 @@ page records for the menu. Properties ========== -.. confval-menu:: - :display: table - :type: - .. _hmenu-special-userfunction-userfunc: .. confval:: special.userFunc @@ -35,17 +33,3 @@ Properties :type: string Name of the user function - -.. _hmenu-special-userfunction-examples: - -Example: Set a userFunc -======================= - -.. code-block:: typoscript - :caption: This is still possible for backward compability reasons but not recommended: - - lib.custommenu = HMENU - lib.custommenu { - special = userfunction - special.userFunc = MyVendor\MyExtension\Userfuncs\CustomMenu->makeMenuArray - } diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript similarity index 100% rename from Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbDataProcessor.typoscript rename to Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbLib.typoscript similarity index 100% rename from Documentation/ContentObjects/Hmenu/_code-snippets/_BreadcrumbLib.typoscript rename to Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbLib.typoscript diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript similarity index 100% rename from Documentation/ContentObjects/Hmenu/_code-snippets/_LanguageMenuLib.typoscript rename to Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript diff --git a/Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript similarity index 100% rename from Documentation/ContentObjects/Hmenu/_code-snippets/_RelPrevNextMenu.typoscript rename to Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_entryLevel.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_entryLevel.typoscript new file mode 100644 index 000000000..389273d07 --- /dev/null +++ b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_entryLevel.typoscript @@ -0,0 +1,14 @@ +page.10 { + dataProcessing { + 10 = menu + 10 { + special = list + special.value.field = pages + levels = 7 + entryLevel = 4 + as = menu + expandAll = 1 + titleField = nav_title // title + } + } +} diff --git a/Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/MenuObjectsCommonPropertiesSubmenuObjSuffixes.png b/Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/MenuObjectsCommonPropertiesSubmenuObjSuffixes.png deleted file mode 100644 index 2e5ceb489f2c80f05fa8f464d1c42186c900e616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15333 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 Z&P!%hyoFP8{@T6^5EGITtmN16`(M5--kJaa From c8d96c63ceed99b36dc9077bfea7c064f447213e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 09:16:11 +0100 Subject: [PATCH 072/125] [BUGFIX] Fix "if" examples (#1491) Resolves https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-Typoscript/issues/1488 Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Functions/If.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/Functions/If.rst b/Documentation/Functions/If.rst index adbbe298f..5556fbe74 100644 --- a/Documentation/Functions/If.rst +++ b/Documentation/Functions/If.rst @@ -52,8 +52,8 @@ bitAnd .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - hideDefaultLanguageOfPage = TEXT - hideDefaultLanguageOfPage { + lib.hideDefaultLanguageOfPage = TEXT + lib.hideDefaultLanguageOfPage { value = 0 value { override = 1 @@ -356,8 +356,8 @@ If you want to compare values, you must load a base-value in the .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10.value = 10 - page.10.isGreaterThan = 11 + page.10.if.value = 10 + page.10.if.isGreaterThan = 11 This would return true because the value of :typoscript:`isGreaterThan` is greater than 10, which is the base-value. @@ -367,7 +367,7 @@ More complex is this: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10 { + page.10.if { value = 10 isGreaterThan = 11 isTrue.field = header From 5cf3d8a1923e09da6ac0160940dde33cde46f8d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 05:34:18 +0100 Subject: [PATCH 073/125] [TASK] Clean up and order stdwrap (#1493) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Functions/Stdwrap.rst | 2416 ++++++++++++--------------- 1 file changed, 1112 insertions(+), 1304 deletions(-) diff --git a/Documentation/Functions/Stdwrap.rst b/Documentation/Functions/Stdwrap.rst index 895671263..fcc3114b3 100644 --- a/Documentation/Functions/Stdwrap.rst +++ b/Documentation/Functions/Stdwrap.rst @@ -64,186 +64,159 @@ Properties Properties for getting data ---------------------------- -.. _stdwrap-setContentToCurrent: +.. confval-menu:: + :name: stdwrap-get + :display: table + :type: -setContentToCurrent -~~~~~~~~~~~~~~~~~~~ + .. _stdwrap-setContentToCurrent: -.. confval:: setContentToCurrent - :name: stdwrap-setContentToCurrent - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + .. confval:: setContentToCurrent + :name: stdwrap-setContentToCurrent + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Sets the current value to the incoming content of the function. + Sets the current value to the incoming content of the function. -.. _stdwrap-addpagecachetags: + .. _stdwrap-addpagecachetags: -addPageCacheTags -~~~~~~~~~~~~~~~~ + .. confval:: addPageCacheTags + :name: stdwrap-addpagecachetags + :type: :ref:`data-type-string` / :ref:`stdWrap` -.. confval:: addPageCacheTags - :name: stdwrap-addpagecachetags - :type: :ref:`data-type-string` / :ref:`stdWrap` + Comma-separated list of cache tags, which should be added to the page + cache. - Comma-separated list of cache tags, which should be added to the page - cache. + .. rubric:: Examples - .. rubric:: Examples + .. code-block:: typoscript - .. code-block:: typoscript + addPageCacheTags = pagetag1,pagetag2,pagetag3 - addPageCacheTags = pagetag1,pagetag2,pagetag3 + This will add the tags "pagetag1", "pagetag2" and "pagetag3" to the + according cached pages in cache_pages. - This will add the tags "pagetag1", "pagetag2" and "pagetag3" to the - according cached pages in cache_pages. + Pages, which have been cached with a tag, can be deleted from cache + again with the TSconfig option + :ref:`TCEMAIN.clearCacheCmd <pagetcemain-clearcachecmd>`. - Pages, which have been cached with a tag, can be deleted from cache - again with the TSconfig option - :ref:`TCEMAIN.clearCacheCmd <pagetcemain-clearcachecmd>`. + .. note:: + If you instead want to store rendered content into the + caching framework, see the stdWrap feature :ref:`stdwrap-cache`. - .. note:: - If you instead want to store rendered content into the - caching framework, see the stdWrap feature :ref:`stdwrap-cache`. + .. _stdwrap-setCurrent: -.. _stdwrap-setCurrent: + .. confval:: setCurrent + :name: stdwrap-setCurrent + :type: :ref:`data-type-string` / :ref:`stdWrap` -setCurrent -~~~~~~~~~~ + Sets the "current"-value. This is normally set from some outside + routine, so be careful with this. But it might be handy to do this -.. confval:: setCurrent - :name: stdwrap-setCurrent - :type: :ref:`data-type-string` / :ref:`stdWrap` - Sets the "current"-value. This is normally set from some outside - routine, so be careful with this. But it might be handy to do this + .. _stdwrap-lang: + .. confval:: lang + :name: stdwrap-lang + :type: Array of language keys / :ref:`stdWrap` -.. _stdwrap-lang: + This is used to define optional language specific values based on the + :ref:`current site language <t3coreapi:sitehandling-addingLanguages>`. -lang -~~~~ + .. rubric:: Examples -.. confval:: lang - :name: stdwrap-lang - :type: Array of language keys / :ref:`stdWrap` + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - This is used to define optional language specific values based on the - :ref:`current site language <t3coreapi:sitehandling-addingLanguages>`. + page.10 = TEXT + page.10.value = I am a Berliner! + page.10.stdWrap.lang.de = Ich bin ein Berliner! - .. rubric:: Examples + Output will be "Ich bin..." instead of "I am..." - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10 = TEXT - page.10.value = I am a Berliner! - page.10.stdWrap.lang.de = Ich bin ein Berliner! - - Output will be "Ich bin..." instead of "I am..." + .. _stdwrap-data: + .. confval:: data + :name: stdwrap-data + :type: :ref:`data-type-gettext` / :ref:`stdWrap` -.. _stdwrap-data: + .. _stdwrap-field: -data -~~~~ + .. confval:: field + :name: stdwrap-field + :type: Field name / :ref:`stdWrap` -.. confval:: data - :name: stdwrap-data - :type: :ref:`data-type-gettext` / :ref:`stdWrap` + Sets the content to the value of the according field + (which comes from :php:`$cObj->data[*field*]`). + .. note:: + :php:`$cObj->data` changes depending on the context. + See the description for the data type ":ref:`data-type-gettext`"/field! -.. _stdwrap-field: + .. rubric:: Examples -field -~~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: field - :name: stdwrap-field - :type: Field name / :ref:`stdWrap` + page.10.field = title - Sets the content to the value of the according field - (which comes from :php:`$cObj->data[*field*]`). + This sets the content to the value of the field "title". - .. note:: - :php:`$cObj->data` changes depending on the context. - See the description for the data type ":ref:`data-type-gettext`"/field! + You can also check multiple field names, if you divide them + by "//". - .. rubric:: Examples - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10.field = title - - This sets the content to the value of the field "title". - - You can also check multiple field names, if you divide them - by "//". - - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10.field = nav_title // title + page.10.field = nav_title // title - Here the content from the field nav\_title will be returned - unless it is a blank string. If a blank string, the value of - the title field is returned. + Here the content from the field nav\_title will be returned + unless it is a blank string. If a blank string, the value of + the title field is returned. -.. _stdwrap-current: + .. _stdwrap-current: -current -~~~~~~~ + .. confval:: current + :name: stdwrap-current + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -.. confval:: current - :name: stdwrap-current - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + Sets the content to the "current" value (see :ref:`->split <split>`) - Sets the content to the "current" value (see :ref:`->split <split>`) + .. _stdwrap-cObject: -.. _stdwrap-cObject: + .. confval:: cObject + :name: stdwrap-cObject + :type: :ref:`data-type-cobject` -cObject -~~~~~~~ + Loads content from a content object. -.. confval:: cObject - :name: stdwrap-cObject - :type: :ref:`data-type-cobject` - Loads content from a content object. + .. _stdwrap-numRows: + .. confval:: numRows + :name: stdwrap-numRows + :type: :ref:`->numRows <numrows>` / :ref:`stdWrap` -.. _stdwrap-numRows: + Returns the number of rows resulting from the supplied :sql:`SELECT` query. -numRows -~~~~~~~ -.. confval:: numRows - :name: stdwrap-numRows - :type: :ref:`->numRows <numrows>` / :ref:`stdWrap` + .. _stdwrap-preUserFunc: - Returns the number of rows resulting from the supplied :sql:`SELECT` query. + .. confval:: preUserFunc + :name: stdwrap-preUserFunc + :type: :ref:`data-type-function-name` + Calls the provided PHP function. If you specify the name with a '->' + in it, then it is interpreted as a call to a method in a class. -.. _stdwrap-preUserFunc: + Two parameters are sent to the PHP function: As first parameter a + content variable, which contains the current content. This is the + value to be processed. As second parameter any sub-properties of + preUserFunc are provided to the function. -preUserFunc -~~~~~~~~~~~ - -.. confval:: preUserFunc - :name: stdwrap-preUserFunc - :type: :ref:`data-type-function-name` - - Calls the provided PHP function. If you specify the name with a '->' - in it, then it is interpreted as a call to a method in a class. - - Two parameters are sent to the PHP function: As first parameter a - content variable, which contains the current content. This is the - value to be processed. As second parameter any sub-properties of - preUserFunc are provided to the function. - - See :ref:`stdwrap-postUserFunc`. + See :ref:`stdwrap-postUserFunc`. .. index:: Function stdWrap; Override and conditions @@ -252,1681 +225,1516 @@ preUserFunc Properties for overriding and conditions ---------------------------------------- -.. _stdwrap-override: - -override -~~~~~~~~ - -.. confval:: override +.. confval-menu:: :name: stdwrap-override - :type: :ref:`data-type-string` / :ref:`stdWrap` - - If `override` returns something else than "" or zero (trimmed), the - content is loaded with this! - - -.. _stdwrap-preIfEmptyListNum: - -preIfEmptyListNum -~~~~~~~~~~~~~~~~~ - -.. confval:: preIfEmptyListNum - :name: stdwrap-preIfEmptyListNum - :type: (as ":ref:`stdwrap-listNum`" below) - + :display: table + :type: -.. _stdwrap-ifNull: + .. _stdwrap-override: -ifNull -~~~~~~ + .. confval:: override + :name: stdwrap-override + :type: :ref:`data-type-string` / :ref:`stdWrap` -.. confval:: ifNull - :name: stdwrap-ifNull - :type: :ref:`data-type-string` / :ref:`stdWrap` + If `override` returns something else than "" or zero (trimmed), the + content is loaded with this! - If the content is null (:php:`NULL` type in PHP), the content is overridden - with the value defined here. - .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. _stdwrap-preIfEmptyListNum: - page.10 = COA_INT - page.10 { - 10 = TEXT - 10 { - stdWrap.field = description - stdWrap.ifNull = No description defined. - } - } + .. confval:: preIfEmptyListNum + :name: stdwrap-preIfEmptyListNum + :type: (as ":ref:`stdwrap-listNum`" below) - This example shows the content of the field description or, if that - field contains the value :php:`NULL`, the text "No description defined.". + .. _stdwrap-ifNull: -.. _stdwrap-ifEmpty: + .. confval:: ifNull + :name: stdwrap-ifNull + :type: :ref:`data-type-string` / :ref:`stdWrap` -ifEmpty -~~~~~~~ + If the content is null (:php:`NULL` type in PHP), the content is overridden + with the value defined here. -.. confval:: ifEmpty - :name: stdwrap-ifEmpty - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - If the trimmed content is empty at this point, the content is loaded - with :typoscript:`ifEmpty`. Zeros are treated as empty values! + page.10 = COA_INT + page.10 { + 10 = TEXT + 10 { + stdWrap.field = description + stdWrap.ifNull = No description defined. + } + } + This example shows the content of the field description or, if that + field contains the value :php:`NULL`, the text "No description defined.". -.. _stdwrap-ifBlank: -ifBlank -~~~~~~~ + .. _stdwrap-ifEmpty: -.. confval:: ifBlank - :name: stdwrap-ifBlank - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. confval:: ifEmpty + :name: stdwrap-ifEmpty + :type: :ref:`data-type-string` / :ref:`stdWrap` - Same as :typoscript:`ifEmpty` but the check is done against ''. Zeros are not - treated as blank values! + If the trimmed content is empty at this point, the content is loaded + with :typoscript:`ifEmpty`. Zeros are treated as empty values! -.. _stdwrap-listNum: + .. _stdwrap-ifBlank: -listNum -~~~~~~~ + .. confval:: ifBlank + :name: stdwrap-ifBlank + :type: :ref:`data-type-string` / :ref:`stdWrap` -.. confval:: listNum - :name: stdwrap-listNum - :type: :ref:`data-type-string` / :ref:`stdWrap` + Same as :typoscript:`ifEmpty` but the check is done against ''. Zeros are not + treated as blank values! - Explodes the current content :ref:`stdwrap-listNum-splitChar` - (Default: `,`) and returns the object specified by `listNum`. - Possible values: + .. _stdwrap-listNum: - :typoscript:`last` - The special keyword :typoscript:`last` is replaced with the index of - the last element in the exploded content. + .. confval:: listNum + :name: stdwrap-listNum + :type: :ref:`data-type-string` / :ref:`stdWrap` - :typoscript:`rand` - The special keyword :typoscript:`rand` is replaced with the index of - a random element in the exploded content. + Explodes the current content :ref:`stdwrap-listNum-splitChar` + (Default: `,`) and returns the object specified by `listNum`. - :ref:`calc` - After the special keywords are replaced with their according numeric - values the + Possible values: - 0 - last - If the content of `listNum` can be interpreted as integer the according - index of the exploded content is returned. Counting starts with 0. + :typoscript:`last` + The special keyword :typoscript:`last` is replaced with the index of + the last element in the exploded content. - .. rubric:: Examples + :typoscript:`rand` + The special keyword :typoscript:`rand` is replaced with the index of + a random element in the exploded content. - This would return "item 1": + :ref:`calc` + After the special keywords are replaced with their according numeric + values the - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + 0 - last + If the content of `listNum` can be interpreted as integer the according + index of the exploded content is returned. Counting starts with 0. - page.10 = TEXT - page.10.value = item 1, item 2, item 3, item 4 - page.10.listNum = 0 + .. rubric:: Examples - This would return "item 3" + This would return "item 1": - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10 = TEXT - page.10.value = item 1, item 2, item 3, item 4 - page.10.listNum = last – 1 + page.10 = TEXT + page.10.value = item 1, item 2, item 3, item 4 + page.10.listNum = 0 + This would return "item 3" -.. _stdwrap-listNum-splitChar: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -listNum.splitChar -""""""""""""""""" + page.10 = TEXT + page.10.value = item 1, item 2, item 3, item 4 + page.10.listNum = last – 1 -.. confval:: listNum.splitChar - :name: stdwrap-listNum-splitChar - :type: :ref:`data-type-string` - :Default: `,` (comma) - .. rubric:: Examples + .. _stdwrap-listNum-splitChar: - Splits the content of the field `subtitle` by the pipe character and returns - a random element + .. confval:: listNum.splitChar + :name: stdwrap-listNum-splitChar + :type: :ref:`data-type-string` + :Default: `,` (comma) - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. rubric:: Examples - page.5 = COA_INT - page.5 { - 10 = TEXT - 10 { - stdWrap.field = subtitle - stdWrap.listNum = rand - stdWrap.listNum.splitChar = | - } - } - - -.. _stdwrap-trim: + Splits the content of the field `subtitle` by the pipe character and returns + a random element -trim -~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: trim - :name: stdwrap-trim - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + page.5 = COA_INT + page.5 { + 10 = TEXT + 10 { + stdWrap.field = subtitle + stdWrap.listNum = rand + stdWrap.listNum.splitChar = | + } + } - If set, the PHP-function :php:`trim()` will be used to remove whitespaces - around the value. + .. _stdwrap-trim: -.. _stdwrap-strPad: + .. confval:: trim + :name: stdwrap-trim + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -strPad -~~~~~~ + If set, the PHP-function :php:`trim()` will be used to remove whitespaces + around the value. -.. confval:: strPad - :name: stdwrap-strPad - :type: :ref:`strPad` - Pads the current content to a certain length. You can define the padding - characters and the side(s), on which the padding should be added. + .. _stdwrap-strPad: + .. confval:: strPad + :name: stdwrap-strPad + :type: :ref:`strPad` -.. _stdwrap-stdWrap: - -stdWrap -~~~~~~~ - -.. confval:: stdWrap - :name: stdwrap-stdWrap - :type: :ref:`stdWrap` + Pads the current content to a certain length. You can define the padding + characters and the side(s), on which the padding should be added. - Recursive call to the :typoscript:`stdWrap` function. + .. _stdwrap-stdWrap: -.. _stdwrap-required: + .. confval:: stdWrap + :name: stdwrap-stdWrap + :type: :ref:`stdWrap` -required -~~~~~~~~ + Recursive call to the :typoscript:`stdWrap` function. -.. confval:: required - :name: stdwrap-required - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - This flag requires the content to be set to some value after any - content-import and treatment that might have happened until now - (data, field, current, listNum, trim). Zero is **not** regarded as - empty! Use "if" instead! + .. _stdwrap-required: - If the content is empty, "" is returned immediately. + .. confval:: required + :name: stdwrap-required + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + This flag requires the content to be set to some value after any + content-import and treatment that might have happened until now + (data, field, current, listNum, trim). Zero is **not** regarded as + empty! Use "if" instead! -.. _stdwrap-if: + If the content is empty, "" is returned immediately. -if --- -.. confval:: if - :name: stdwrap-if - :type: :ref:`if` + .. _stdwrap-if: - If the if-object returns false, stdWrap returns "" immediately. + .. confval:: if + :name: stdwrap-if + :type: :ref:`if` + If the if-object returns false, stdWrap returns "" immediately. -.. _stdwrap-fieldRequired: -fieldRequired -~~~~~~~~~~~~~ + .. _stdwrap-fieldRequired: -.. confval:: fieldRequired - :name: stdwrap-fieldRequired - :type: Field name / :ref:`stdWrap` + .. confval:: fieldRequired + :name: stdwrap-fieldRequired + :type: Field name / :ref:`stdWrap` - The value in this field **must** be set. + The value in this field **must** be set. .. _stdwrap-properties-parsing: Properties for parsing data --------------------------- -.. _stdwrap-csConv: +.. confval-menu:: + :name: stdwrap-parse + :display: table + :type: -csConv -~~~~~~ + .. _stdwrap-csConv: -.. confval:: csConv - :name: stdwrap-csConv - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. confval:: csConv + :name: stdwrap-csConv + :type: :ref:`data-type-string` / :ref:`stdWrap` - Convert the charset of the string from the charset given as value to - the current rendering charset of the frontend (UTF-8). + Convert the charset of the string from the charset given as value to + the current rendering charset of the frontend (UTF-8). -.. _stdwrap-parseFunc: + .. _stdwrap-parseFunc: -parseFunc -~~~~~~~~~ + .. confval:: parseFunc + :name: stdwrap-parseFunc + :type: object path reference / :ref:`parsefunc` / :ref:`stdWrap` -.. confval:: parseFunc - :name: stdwrap-parseFunc - :type: object path reference / :ref:`parsefunc` / :ref:`stdWrap` + Processing instructions for the content. - Processing instructions for the content. + .. Note:: + If you enter a string as value, this will be taken as a + reference to an object path globally in the TypoScript object tree. + This will be the basis configuration for parseFunc merged with any + properties you add here. It works exactly like references does for + content elements. - .. Note:: - If you enter a string as value, this will be taken as a - reference to an object path globally in the TypoScript object tree. - This will be the basis configuration for parseFunc merged with any - properties you add here. It works exactly like references does for - content elements. + .. rubric:: Examples - .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - page.10 { - parseFunc = < lib.parseFunc_RTE - parseFunc.tags.myTag = TEXT - parseFunc.tags.myTag.value = This will be inserted when <myTag> is found! - } - -.. _stdwrap-parseFunc-sanitization: + page.10 { + parseFunc = < lib.parseFunc_RTE + parseFunc.tags.myTag = TEXT + parseFunc.tags.myTag.value = This will be inserted when <myTag> is found! + } -Sanitization -"""""""""""" + .. _stdwrap-parseFunc-sanitization: -:ref:`stdwrap-htmlSanitize` is enabled by default when -:ref:`stdwrap-parseFunc` is invoked. This also includes the Fluid Viewhelper -:html:`<f:format.html>`, since it invokes :ref:`stdwrap-parseFunc` -directly using :typoscript:`lib.parseFunc_RTE`. + :ref:`stdwrap-htmlSanitize` is enabled by default when + :ref:`stdwrap-parseFunc` is invoked. This also includes the Fluid Viewhelper + :html:`<f:format.html>`, since it invokes :ref:`stdwrap-parseFunc` + directly using :typoscript:`lib.parseFunc_RTE`. -The following example shows how to disable the sanitization behavior that is -enabled by default. This is not recommended, but it can be disabled when required. + The following example shows how to disable the sanitization behavior that is + enabled by default. This is not recommended, but it can be disabled when required. -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - // either disable globally - lib.parseFunc.htmlSanitize = 0 - lib.parseFunc_RTE.htmlSanitize = 0 - - // or disable individually per use case - 10 = TEXT - 10 { - value = <div><img src="invalid.file" onerror="alert(1)"></div> - parseFunc =< lib.parseFunc_RTE - parseFunc.htmlSanitize = 0 - } + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -Since any invocation of :typoscript:`stdWrap.parseFunc` triggers HTML -sanitization automatically; unless explicitly disabled -the following example causes a lot of generated markup to be sanitized and can be -solved by explicitly disabling it with :typoscript:`htmlSanitize = 0`. + // either disable globally + lib.parseFunc.htmlSanitize = 0 + lib.parseFunc_RTE.htmlSanitize = 0 -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - 10 = FLUIDTEMPLATE - 10 { - templateRootPaths { - // ... - } - variables { - // ... - } - stdWrap.parseFunc { - // replace --- with soft-hyphen - short.--- = ­ - // sanitization of ALL MARKUP is NOT DESIRED here - htmlSanitize = 0 + // or disable individually per use case + 10 = TEXT + 10 { + value = <div><img src="invalid.file" onerror="alert(1)"></div> + parseFunc =< lib.parseFunc_RTE + parseFunc.htmlSanitize = 0 } - } - -.. _stdwrap-htmlparser: - -HTMLparser -~~~~~~~~~~ - -.. confval:: HTMLparser - :name: stdwrap-htmlparser - :type: :ref:`data-type-boolean` / :ref:`htmlparser` / :ref:`stdWrap` - - This object allows you to parse the HTML-content and perform all kinds of - advanced filtering on the content. - - Value must be set and properties are those of :ref:`htmlparser`. - - (See :ref:`t3coreapi:rte` for more information about RTE transformations) - - -.. _stdwrap-split: - -split -~~~~~ - -.. confval:: split - :name: stdwrap-split - :type: :ref:`split` / :ref:`stdWrap` - - -.. _stdwrap-replacement: - -replacement -~~~~~~~~~~~ - -.. confval:: replacement - :name: stdwrap-replacement - :type: :ref:`replacement` / :ref:`stdWrap` - - Performs an ordered search/replace on the current content with the - possibility of using PCRE regular expressions. An array with numeric - indices defines the order of actions and thus allows multiple - replacements at once. - - -.. _stdwrap-prioriCalc: - -prioriCalc -~~~~~~~~~~ - -.. confval:: prioriCalc - :name: stdwrap-prioriCalc - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - - Calculation of the value using operators -+\*/%^ plus respects - priority to + and - operators and parenthesis levels (). - - . (period) is decimal delimiter. - - Returns a doublevalue. - - If :typoscript:`prioriCalc` is set to "intval" an integer is returned. - - There is no error checking and division by zero or other invalid - values may generate strange results. Also you should use a proper syntax - because future modifications to the function used may allow for more - operators and features. - - .. rubric:: Examples - - .. code-block:: none - :caption: Example Output for different calculations - - 100%7 = 2 - -5*-4 = 20 - +6^2 = 36 - 6 ^(1+1) = 36 - -5*-4+6^2-100%7 = 54 - -5 * (-4+6) ^ 2 - 100%7 = 98 - -5 * ((-4+6) ^ 2) - 100%7 = -22 - - -.. _stdwrap-char: - -char -~~~~ - -.. confval:: char - :name: stdwrap-char - :type: :ref:`data-type-integer` / :ref:`stdWrap` - - Content is set to :php:`chr(*value*)`. This returns a one-character - string containing the character specified by ascii code. Reliable - results will be obtained only for character codes in the integer - range 0 - 127. See - `the PHP manual <https://php.net/manual/en/function.chr.php>`_: - - .. code-block:: php - - $content = chr((int)$conf['char']); - -.. _stdwrap-intval: + Since any invocation of :typoscript:`stdWrap.parseFunc` triggers HTML + sanitization automatically; unless explicitly disabled + the following example causes a lot of generated markup to be sanitized and can be + solved by explicitly disabling it with :typoscript:`htmlSanitize = 0`. -intval -~~~~~~ - -.. confval:: intval - :name: stdwrap-intval - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - - PHP function :php:`intval()` returns an integer: - - .. code-block:: php - - $content = intval($content); - - -.. _stdwrap-hash: - -hash -~~~~ - -.. confval:: hash - :name: stdwrap-hash - :type: :ref:`data-type-string` / :ref:`stdWrap` - - Returns a hashed value of the current content. Set to one of the - algorithms which are available in PHP. For a list of supported - algorithms see https://www.php.net/manual/en/function.hash-algos.php. - - .. rubric:: Examples .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10 = TEXT - page.10 { - value = test@example.org - stdWrap.hash = md5 - stdWrap.wrap = <img src="https://www.gravatar.com/avatar/|" /> + 10 = FLUIDTEMPLATE + 10 { + templateRootPaths { + // ... + } + variables { + // ... + } + stdWrap.parseFunc { + // replace --- with soft-hyphen + short.--- = ­ + // sanitization of ALL MARKUP is NOT DESIRED here + htmlSanitize = 0 + } } + .. _stdwrap-htmlparser: -.. _stdwrap-round: + .. confval:: HTMLparser + :name: stdwrap-htmlparser + :type: :ref:`data-type-boolean` / :ref:`htmlparser` / :ref:`stdWrap` -round -~~~~~ + This object allows you to parse the HTML-content and perform all kinds of + advanced filtering on the content. -.. confval:: round - :name: stdwrap-round - :type: :ref:`round` / :ref:`stdWrap` + Value must be set and properties are those of :ref:`htmlparser`. - Round the value with the selected method to the given number of - decimals. + (See :ref:`t3coreapi:rte` for more information about RTE transformations) -.. _stdwrap-numberFormat: + .. _stdwrap-split: -numberFormat -~~~~~~~~~~~~ + .. confval:: split + :name: stdwrap-split + :type: :ref:`split` / :ref:`stdWrap` -.. confval:: numberFormat - :name: stdwrap-numberFormat - :type: :ref:`numberformat` - Format a float value to any number format you need (e.g. useful for - prices). + .. _stdwrap-replacement: + .. confval:: replacement + :name: stdwrap-replacement + :type: :ref:`replacement` / :ref:`stdWrap` -.. _stdwrap-date: + Performs an ordered search/replace on the current content with the + possibility of using PCRE regular expressions. An array with numeric + indices defines the order of actions and thus allows multiple + replacements at once. -date -~~~~ -.. confval:: date - :name: stdwrap-date - :type: :ref:`data-type-date-conf` / :ref:`stdWrap` + .. _stdwrap-prioriCalc: - The content should be data-type "UNIX-time". Returns the content - formatted as a date. See the PHP manual (`datetime.format <https://www.php.net/manual/en/datetime.createfromformat.php>`_) - for the format codes. + .. confval:: prioriCalc + :name: stdwrap-prioriCalc + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + Calculation of the value using operators -+\*/%^ plus respects + priority to + and - operators and parenthesis levels (). - .. code-block:: php + . (period) is decimal delimiter. - $content = date($conf['date'], $content); + Returns a doublevalue. - Properties: + If :typoscript:`prioriCalc` is set to "intval" an integer is returned. - **.GMT:** If set, the PHP function `gmdate() <https://www.php.net/gmdate>`_ will be - used instead of `date() <https://www.php.net/date>`_. + There is no error checking and division by zero or other invalid + values may generate strange results. Also you should use a proper syntax + because future modifications to the function used may allow for more + operators and features. - .. rubric:: Examples + .. rubric:: Examples - Render in human readable form: + .. code-block:: none + :caption: Example Output for different calculations - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + 100%7 = 2 + -5*-4 = 20 + +6^2 = 36 + 6 ^(1+1) = 36 + -5*-4+6^2-100%7 = 54 + -5 * (-4+6) ^ 2 - 100%7 = 98 + -5 * ((-4+6) ^ 2) - 100%7 = -22 - page.10 = TEXT - page.10.value { - # format like 2017-05-31 09:08 - field = tstamp - date = Y-m-d H:i - } - .. note:: - You should consider using the more flexible function - :ref:`stdwrap-formattedDate`. + .. _stdwrap-char: + .. confval:: char + :name: stdwrap-char + :type: :ref:`data-type-integer` / :ref:`stdWrap` -.. _stdwrap-strtotime: + Content is set to :php:`chr(*value*)`. This returns a one-character + string containing the character specified by ascii code. Reliable + results will be obtained only for character codes in the integer + range 0 - 127. See + `the PHP manual <https://php.net/manual/en/function.chr.php>`_: -strtotime -~~~~~~~~~ + .. code-block:: php -.. confval:: strtotime - :name: stdwrap-strtotime - :type: :ref:`data-type-string` + $content = chr((int)$conf['char']); - Allows conversion of formatted dates to timestamp, e.g. to perform date calculations. - Possible values are :typoscript:`1` or any time string valid as first argument of the PHP :php:`strtotime()` function. + .. _stdwrap-intval: - .. rubric:: Examples + .. confval:: intval + :name: stdwrap-intval + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + PHP function :php:`intval()` returns an integer: - lib.date_as_timestamp = TEXT - lib.date_as_timestamp { - value = 2015-04-15 - strtotime = 1 - } + .. code-block:: php - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + $content = intval($content); - lib.next_weekday = TEXT - lib.next_weekday { - data = GP:selected_date - strtotime = + 2 weekdays - strftime = %Y-%m-%d - } + .. _stdwrap-hash: -.. _data-type-strftime-conf: -.. _stdwrap-strftime: + .. confval:: hash + :name: stdwrap-hash + :type: :ref:`data-type-string` / :ref:`stdWrap` -strftime -~~~~~~~~ + Returns a hashed value of the current content. Set to one of the + algorithms which are available in PHP. For a list of supported + algorithms see https://www.php.net/manual/en/function.hash-algos.php. -.. confval:: strftime - :name: stdwrap-strftime - :type: :ref:`data-type-strftime-conf` / :ref:`stdWrap` + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Very similar to "date", but using a different format. See the PHP manual (`strftime <https://www.php.net/strftime>`_) for the - format codes. + page.10 = TEXT + page.10 { + value = test@example.org + stdWrap.hash = md5 + stdWrap.wrap = <img src="https://www.gravatar.com/avatar/|" /> + } - This formatting is useful if the locale is set in advance in the - :ref:`CONFIG <config>` object. See there. - Properties: + .. _stdwrap-round: - .charset - Can be set to the charset of the output string if you need to - convert it to UTF-8. Default is to take the intelligently guessed - charset from :php:`TYPO3\CMS\Core\Charset\CharsetConverter`. + .. confval:: round + :name: stdwrap-round + :type: :ref:`round` / :ref:`stdWrap` - .GMT - If set, the PHP function `gmstrftime() - <https://www.php.net/gmstrftime>`_ will be used instead of - `strftime() <https://www.php.net/strftime>`_. + Round the value with the selected method to the given number of + decimals. - .. note:: - You should consider using the more flexible function - :ref:`stdwrap-formattedDate`. + .. _stdwrap-numberFormat: -.. _stdwrap-formattedDate: + .. confval:: numberFormat + :name: stdwrap-numberFormat + :type: :ref:`numberformat` -formattedDate -~~~~~~~~~~~~~ + Format a float value to any number format you need (e.g. useful for + prices). -.. confval:: formattedDate - :name: stdwrap-formattedDate - :type: :ref:`data-type-string` - The function renders date and time based on formats/patterns defined by - the International Components for Unicode standard (ICU). ICU-based date and - time formatting is much more flexible in rendering as - :ref:`stdwrap-date` or :ref:`stdwrap-strftime`, as it ships - with default patterns for date and time based on the given locale (given - examples for locale `en-US` and timezone `America/Los_Angeles`): + .. _stdwrap-date: - * `FULL`, for example: `Friday, March 17, 2023 at 3:00:00 AM Pacific Daylight Time` - * `LONG`, for example: `March 17, 2023 at 3:00:00 AM PDT` - * `MEDIUM`, for example: `Mar 17, 2023, 3:00:00 AM` - * `SHORT`, for example: `3/17/23, 3:00 AM` + .. confval:: date + :name: stdwrap-date + :type: :ref:`data-type-date-conf` / :ref:`stdWrap` - TYPO3 also adds prepared custom patterns: + The content should be data-type "UNIX-time". Returns the content + formatted as a date. See the PHP manual (`datetime.format <https://www.php.net/manual/en/datetime.createfromformat.php>`_) + for the format codes. - * `FULLDATE`, for example: `Friday, March 17, 2023` - * `FULLTIME`, for example: `3:00:00 AM Pacific Daylight Time` - * `LONGDATE`, for example: `March 17, 2023` - * `LONGTIME`, for example: `3:00:00 AM PDT` - * `MEDIUMDATE`, for example: `Mar 17, 2023` - * `MEDIUMTIME`, for example: `3:00:00 AM` - * `SHORTDATE`, for example: `3/17/23` - * `SHORTTIME`, for example: `3:00 AM` - .. note:: - You can specify an own pattern to suit your requirements, for example: - `qqqq, yyyy` will result in `1st quarter, 2023`. Have a look into the - `available options <https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax>`__. + .. code-block:: php - The locale is typically fetched from the - :ref:`locale setting <t3coreapi:sitehandling-addingLanguages-locale>` in the - site configuration. + $content = date($conf['date'], $content); - Properties: + Properties: - .locale - A locale other than the locale of the site language. + **.GMT:** If set, the PHP function `gmdate() <https://www.php.net/gmdate>`_ will be + used instead of `date() <https://www.php.net/date>`_. - .. rubric:: Example: Full German output from a date/time value + .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Render in human readable form: - lib.my_formatted_date = TEXT - lib.my_formatted_date { - value = 2023-03-17 3:00:00 - formattedDate = FULL - # Optional, if a different locale is wanted other than the site language's locale - formattedDate.locale = de-DE - } + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - will result in "Freitag, 17. März 2023 um 03:00:00 Nordamerikanische Westküsten-Sommerzeit". + page.10 = TEXT + page.10.value { + # format like 2017-05-31 09:08 + field = tstamp + date = Y-m-d H:i + } - .. rubric:: Example: Full French output from a relative date value + .. note:: + You should consider using the more flexible function + :ref:`stdwrap-formattedDate`. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - lib.my_formatted_date = TEXT - lib.my_formatted_date { - value = -5 days - formattedDate = FULL - formattedDate.locale = fr-FR - } + .. _stdwrap-strtotime: - will result in "dimanche 12 mars 2023 à 11:16:44 heure d’été du Pacifique". + .. confval:: strtotime + :name: stdwrap-strtotime + :type: :ref:`data-type-string` - .. rubric:: Example: Custom format from a timestamp + Allows conversion of formatted dates to timestamp, e.g. to perform date calculations. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Possible values are :typoscript:`1` or any time string valid as first argument of the PHP :php:`strtotime()` function. - lib.my_formatted_date = TEXT - lib.my_formatted_date { - value = 1679022000 - formattedDate = Y-MM-dd'T'HH:mm:ssZ - } + .. rubric:: Examples - will return the date in the ISO 8601 format: "2023-03-17T03:00:00+00:00" + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - .. note:: - The timezone will be taken from the setting `date.timezone` in your - :file:`php.ini`. + lib.date_as_timestamp = TEXT + lib.date_as_timestamp { + value = 2015-04-15 + strtotime = 1 + } + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. _stdwrap-age: + lib.next_weekday = TEXT + lib.next_weekday { + data = GP:selected_date + strtotime = + 2 weekdays + strftime = %Y-%m-%d + } -age -~~~ -.. confval:: age - :name: stdwrap-age - :type: :ref:`data-type-boolean` or :ref:`data-type-string` / :ref:`stdWrap` + .. _data-type-strftime-conf: + .. _stdwrap-strftime: - If enabled with a "1" (number, integer) the content is seen as a date - (UNIX-time) and the difference from present time and the content-time - is returned as one of these eight variations: + .. confval:: strftime + :name: stdwrap-strftime + :type: :ref:`data-type-strftime-conf` / :ref:`stdWrap` - "xx min" or "xx hrs" or "xx days" or "xx yrs" or "xx min" or "xx hour" - or "xx day" or "year" + Very similar to "date", but using a different format. See the PHP manual (`strftime <https://www.php.net/strftime>`_) for the + format codes. - The limits between which layout is used are 60 minutes, 24 hours and - 365 days. + This formatting is useful if the locale is set in advance in the + :ref:`CONFIG <config>` object. See there. - If you set this property with a non-integer, it is used to format the - eight units. The first four values are the plural values and the last - four are singular. This is the default string: + Properties: - .. code-block:: none - :caption: Default string for age format + .charset + Can be set to the charset of the output string if you need to + convert it to UTF-8. Default is to take the intelligently guessed + charset from :php:`TYPO3\CMS\Core\Charset\CharsetConverter`. - min| hrs| days| yrs| min| hour| day| year + .GMT + If set, the PHP function `gmstrftime() + <https://www.php.net/gmstrftime>`_ will be used instead of + `strftime() <https://www.php.net/strftime>`_. - Set another string if you want to change the units. You may include - the "-signs. They are removed anyway, but they make sure that a space - which you might want between the number and the unit stays. + .. note:: + You should consider using the more flexible function + :ref:`stdwrap-formattedDate`. - .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - lib.ageFormat = TEXT - lib.ageFormat.stdWrap.data = page:tstamp - lib.ageFormat.stdWrap.age = " Minuten | Stunden | Tage | Jahre | Minute | Stunde | Tag | Jahr" + .. _stdwrap-formattedDate: + .. confval:: formattedDate + :name: stdwrap-formattedDate + :type: :ref:`data-type-string` -.. _data-type-case: -.. _stdwrap-case: + The function renders date and time based on formats/patterns defined by + the International Components for Unicode standard (ICU). ICU-based date and + time formatting is much more flexible in rendering as + :ref:`stdwrap-date` or :ref:`stdwrap-strftime`, as it ships + with default patterns for date and time based on the given locale (given + examples for locale `en-US` and timezone `America/Los_Angeles`): -case -~~~~ + * `FULL`, for example: `Friday, March 17, 2023 at 3:00:00 AM Pacific Daylight Time` + * `LONG`, for example: `March 17, 2023 at 3:00:00 AM PDT` + * `MEDIUM`, for example: `Mar 17, 2023, 3:00:00 AM` + * `SHORT`, for example: `3/17/23, 3:00 AM` -.. confval:: case - :name: stdwrap-case - :type: string / :ref:`stdWrap` + TYPO3 also adds prepared custom patterns: - Converts case + * `FULLDATE`, for example: `Friday, March 17, 2023` + * `FULLTIME`, for example: `3:00:00 AM Pacific Daylight Time` + * `LONGDATE`, for example: `March 17, 2023` + * `LONGTIME`, for example: `3:00:00 AM PDT` + * `MEDIUMDATE`, for example: `Mar 17, 2023` + * `MEDIUMTIME`, for example: `3:00:00 AM` + * `SHORTDATE`, for example: `3/17/23` + * `SHORTTIME`, for example: `3:00 AM` - Uses "UTF-8" for the operation. + .. note:: + You can specify an own pattern to suit your requirements, for example: + `qqqq, yyyy` will result in `1st quarter, 2023`. Have a look into the + `available options <https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax>`__. - .. rubric:: Possible values: + The locale is typically fetched from the + :ref:`locale setting <t3coreapi:sitehandling-addingLanguages-locale>` in the + site configuration. - ============================= ========================================================== - Value Effect - ============================= ========================================================== - :typoscript:`upper` Convert all letters of the string to upper case - :typoscript:`lower` Convert all letters of the string to lower case - :typoscript:`capitalize` Uppercase the first character of each word in the string - :typoscript:`ucfirst` Convert the first letter of the string to upper case - :typoscript:`lcfirst` Convert the first letter of the string to lower case - :typoscript:`uppercamelcase` Convert underscored `upper_camel_case` to `UpperCamelCase` - :typoscript:`lowercamelcase` Convert underscored `lower_camel_case` to `lowerCamelCase` - ============================= ========================================================== + Properties: - .. rubric:: Example + .locale + A locale other than the locale of the site language. - Code: + .. rubric:: Example: Full German output from a date/time value - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - 10 = TEXT - 10.value = Hello world! - 10.case = upper + lib.my_formatted_date = TEXT + lib.my_formatted_date { + value = 2023-03-17 3:00:00 + formattedDate = FULL + # Optional, if a different locale is wanted other than the site language's locale + formattedDate.locale = de-DE + } - Result: + will result in "Freitag, 17. März 2023 um 03:00:00 Nordamerikanische Westküsten-Sommerzeit". - .. code-block:: text - :caption: Example Output + .. rubric:: Example: Full French output from a relative date value - HELLO WORLD! + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + lib.my_formatted_date = TEXT + lib.my_formatted_date { + value = -5 days + formattedDate = FULL + formattedDate.locale = fr-FR + } -.. _stdwrap-bytes: + will result in "dimanche 12 mars 2023 à 11:16:44 heure d’été du Pacifique". -bytes -~~~~~ + .. rubric:: Example: Custom format from a timestamp -.. confval:: bytes - :name: stdwrap-bytes - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - :Default: iec, 1024 + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - This is for number values. When the 'bytes' property is added and set - to 'true' then a number will be formatted in 'bytes' style with two - decimals like '1.53 KiB' or '1.00 MiB'. - Learn about common notations at - `Wikipedia "Kibibyte" <https://en.wikipedia.org/wiki/Kibibyte>`__. - IEC naming with base 1024 is the default. Use sub-properties for - customisation. + lib.my_formatted_date = TEXT + lib.my_formatted_date { + value = 1679022000 + formattedDate = Y-MM-dd'T'HH:mm:ssZ + } - .labels = iec - This is the default. IEC labels and base 1024 are used. - Built in IEC labels are :typoscript:`" | Ki| Mi| Gi| Ti| Pi| Ei| Zi| Yi"`. - You need to append a final string like 'B' or '-Bytes' yourself. + will return the date in the ISO 8601 format: "2023-03-17T03:00:00+00:00" - .labels = si - In this case SI labels and base 1000 are used. - Built in IEC labels are :typoscript:`" | k| M| G| T| P| E| Z| Y"`. - You need to append a final string like 'B' yourself. + .. note:: + The timezone will be taken from the setting `date.timezone` in your + :file:`php.ini`. - .labels = "..." - Custom values can be defined as well like with - :typoscript:`.labels = " Byte| Kilobyte| Megabyte| Gigabyte"`. Use a - vertical bar to separate the labels. Enclose the whole string in - double quotes. - .base = 1000 - Only with custom labels you can choose to set a base of1000. All - other values, including the default, mean base 1024. + .. _stdwrap-age: - .. attention:: + .. confval:: age + :name: stdwrap-age + :type: :ref:`data-type-boolean` or :ref:`data-type-string` / :ref:`stdWrap` - If the value isn't a number the internal PHP function may issue a - warning which - depending on you error handling settings - can - interrupt execution. Example: + If enabled with a "1" (number, integer) the content is seen as a date + (UNIX-time) and the difference from present time and the content-time + is returned as one of these eight variations: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + "xx min" or "xx hrs" or "xx days" or "xx yrs" or "xx min" or "xx hour" + or "xx day" or "year" - page.10 { - value = abc - bytes = 1 - } + The limits between which layout is used are 60 minutes, 24 hours and + 365 days. - will show `0` but may raise a warning or an exception. + If you set this property with a non-integer, it is used to format the + eight units. The first four values are the plural values and the last + four are singular. This is the default string: - .. rubric:: Examples + .. code-block:: none + :caption: Default string for age format - Output value 1000 without special formatting. Shows `1000`: + min| hrs| days| yrs| min| hour| day| year - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Set another string if you want to change the units. You may include + the "-signs. They are removed anyway, but they make sure that a space + which you might want between the number and the unit stays. - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - } + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Format value 1000 in IEC style with base=1024. Shows `0.98 Ki`: + lib.ageFormat = TEXT + lib.ageFormat.stdWrap.data = page:tstamp + lib.ageFormat.stdWrap.age = " Minuten | Stunden | Tage | Jahre | Minute | Stunde | Tag | Jahr" - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - } + .. _data-type-case: + .. _stdwrap-case: - Format value 1000 in IEC style with base=1024 and 'B' supplied by us. - Shows `0.98 KiB`: + .. confval:: case + :name: stdwrap-case + :type: string / :ref:`stdWrap` - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Converts case - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - noTrimWrap = ||B| - } + Uses "UTF-8" for the operation. - Format value 1000 in SI style with base=1000. Shows `1.00 k`: + .. rubric:: Possible values: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + ============================= ========================================================== + Value Effect + ============================= ========================================================== + :typoscript:`upper` Convert all letters of the string to upper case + :typoscript:`lower` Convert all letters of the string to lower case + :typoscript:`capitalize` Uppercase the first character of each word in the string + :typoscript:`ucfirst` Convert the first letter of the string to upper case + :typoscript:`lcfirst` Convert the first letter of the string to lower case + :typoscript:`uppercamelcase` Convert underscored `upper_camel_case` to `UpperCamelCase` + :typoscript:`lowercamelcase` Convert underscored `lower_camel_case` to `lowerCamelCase` + ============================= ========================================================== - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - bytes.labels = si - } + .. rubric:: Example - Format value 1000 in SI style with base=1000 and 'b' supplied by us. - Shows `1.00 kb`: + Code: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - bytes.labels = si - noTrimWrap = ||b| - } + 10 = TEXT + 10.value = Hello world! + 10.case = upper - Format value 1000 with custom label and base=1000. Shows - `1.00 x 1000 Bytes`: + Result: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. code-block:: text + :caption: Example Output - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - bytes.labels = " x 1 Byte| x 1000 Bytes" - bytes.base = 1000 - } + HELLO WORLD! - Format value 1000 with custom label and base=1000. Shows - `1.00 kilobyte (kB)`: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. _stdwrap-bytes: - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - bytes.labels = " byte (B)| kilobyte (kB)| megabyte (MB)| gigabyte (GB)| terabyte (TB)| petabyte (PB)| exabyte (EB)| zettabyte (ZB)| yottabyte YB" - bytes.base = 1000 - } + .. confval:: bytes + :name: stdwrap-bytes + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :Default: iec, 1024 - Format value 1000 with custom label and base=1024. Shows - `0.98 kibibyte (KiB)`: + This is for number values. When the 'bytes' property is added and set + to 'true' then a number will be formatted in 'bytes' style with two + decimals like '1.53 KiB' or '1.00 MiB'. + Learn about common notations at + `Wikipedia "Kibibyte" <https://en.wikipedia.org/wiki/Kibibyte>`__. + IEC naming with base 1024 is the default. Use sub-properties for + customisation. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .labels = iec + This is the default. IEC labels and base 1024 are used. + Built in IEC labels are :typoscript:`" | Ki| Mi| Gi| Ti| Pi| Ei| Zi| Yi"`. + You need to append a final string like 'B' or '-Bytes' yourself. - page = PAGE - page.10 = TEXT - page.10 { - value = 1000 - bytes = 1 - bytes.labels = " byte (B)| kibibyte (KiB)| mebibyte (MiB)| gibibyte (GiB)| tebibyte (TiB)| pepibyte (PiB)| exbibyte (EiB)| zebibyte (ZiB)| yobibyte YiB" - bytes.base = 1024 - } + .labels = si + In this case SI labels and base 1000 are used. + Built in IEC labels are :typoscript:`" | k| M| G| T| P| E| Z| Y"`. + You need to append a final string like 'B' yourself. + .labels = "..." + Custom values can be defined as well like with + :typoscript:`.labels = " Byte| Kilobyte| Megabyte| Gigabyte"`. Use a + vertical bar to separate the labels. Enclose the whole string in + double quotes. -.. _stdwrap-substring: + .base = 1000 + Only with custom labels you can choose to set a base of1000. All + other values, including the default, mean base 1024. -substring -~~~~~~~~~ + .. attention:: -.. confval:: substring - :name: stdwrap-substring - :type: [p1], [p2] / :ref:`stdWrap` + If the value isn't a number the internal PHP function may issue a + warning which - depending on you error handling settings - can + interrupt execution. Example: - Returns the substring with [p1] and [p2] sent as the 2nd and 3rd - parameter to the PHP `mb_substr <https://www.php.net/mb_substr>`__ function. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Uses "UTF-8" for the operation. + page.10 { + value = abc + bytes = 1 + } + will show `0` but may raise a warning or an exception. -.. _stdwrap-cropHTML: + .. rubric:: Examples -cropHTML -~~~~~~~~ + Output value 1000 without special formatting. Shows `1000`: -.. confval:: cropHTML - :name: stdwrap-cropHTML - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Crops the content to a certain length. In contrast to :typoscript:`stdWrap.crop` it - respects HTML tags. It does not crop inside tags and closes open tags. - Entities (like ">") are counted as one char. See :typoscript:`stdWrap.crop` below - for a syntax description and examples. + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + } - Note that :typoscript:`stdWrap.crop` should not be used if :typoscript:`stdWrap.cropHTML` is - already used. + Format value 1000 in IEC style with base=1024. Shows `0.98 Ki`: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + } -.. _stdwrap-stripHtml: + Format value 1000 in IEC style with base=1024 and 'B' supplied by us. + Shows `0.98 KiB`: -stripHtml -~~~~~~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: stripHtml - :name: stdwrap-stripHtml - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + noTrimWrap = ||B| + } - Strips all HTML tags. + Format value 1000 in SI style with base=1000. Shows `1.00 k`: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. _stdwrap-crop: + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + bytes.labels = si + } -crop -~~~~ + Format value 1000 in SI style with base=1000 and 'b' supplied by us. + Shows `1.00 kb`: -.. confval:: crop - :name: stdwrap-crop - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Crops the content to a certain length. + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + bytes.labels = si + noTrimWrap = ||b| + } - You can define up to three parameters, of which the third one is - optional. The syntax is: - [numbers of characters to keep] \| [ellipsis] \| [keep whole words] + Format value 1000 with custom label and base=1000. Shows + `1.00 x 1000 Bytes`: - numbers of characters to keep (integer): Define the number of characters - you want to keep. For positive numbers, the first characters from the - beginning of the string will be kept, for negative numbers the last - characters from the end will be kept. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - ellipsis (string): The signs to be added instead of the part, which was - cropped of. If the number of characters was positive, the string will - be *prepended* with the ellipsis, if it was negative, the string will - be *appended* with the ellipsis. + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + bytes.labels = " x 1 Byte| x 1000 Bytes" + bytes.base = 1000 + } - keep whole words (boolean): If set to 0 (default), the string is always - cropped directly after the defined number of characters. If set to 1, - only complete words are kept. Then a word, which would normally be cut - in the middle, is removed completely. + Format value 1000 with custom label and base=1000. Shows + `1.00 kilobyte (kB)`: - .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - :typoscript:`20 | ...` => max 20 characters. If more, the value will be truncated - to the first 20 characters and prepended with "..." + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + bytes.labels = " byte (B)| kilobyte (kB)| megabyte (MB)| gigabyte (GB)| terabyte (TB)| petabyte (PB)| exabyte (EB)| zettabyte (ZB)| yottabyte YB" + bytes.base = 1000 + } - :typoscript:`-20 | ...` => max 20 characters. If more, the value will be truncated - to the last 20 characters and appended with "..." + Format value 1000 with custom label and base=1024. Shows + `0.98 kibibyte (KiB)`: - :typoscript:`20 | ... | 1` => max 20 characters. If more, the value will be - truncated to the first 20 characters and prepended with "...". If - the division is in the middle of a word, the remains of that word is - removed. + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - Uses "UTF-8" for the operation. + page = PAGE + page.10 = TEXT + page.10 { + value = 1000 + bytes = 1 + bytes.labels = " byte (B)| kibibyte (KiB)| mebibyte (MiB)| gibibyte (GiB)| tebibyte (TiB)| pepibyte (PiB)| exbibyte (EiB)| zebibyte (ZiB)| yobibyte YiB" + bytes.base = 1024 + } -.. _stdwrap-rawUrlEncode: + .. _stdwrap-substring: -rawUrlEncode -~~~~~~~~~~~~ + .. confval:: substring + :name: stdwrap-substring + :type: [p1], [p2] / :ref:`stdWrap` -.. confval:: rawUrlEncode - :name: stdwrap-rawUrlEncode - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + Returns the substring with [p1] and [p2] sent as the 2nd and 3rd + parameter to the PHP `mb_substr <https://www.php.net/mb_substr>`__ function. - Passes the content through the PHP function `rawurlencode() <https://www.php.net/rawurlencode>`_. + Uses "UTF-8" for the operation. -.. _stdwrap-htmlSpecialChars: + .. _stdwrap-cropHTML: -htmlSpecialChars -~~~~~~~~~~~~~~~~ + .. confval:: cropHTML + :name: stdwrap-cropHTML + :type: :ref:`data-type-string` / :ref:`stdWrap` -.. confval:: htmlSpecialChars - :name: stdwrap-htmlSpecialChars - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + Crops the content to a certain length. In contrast to :typoscript:`stdWrap.crop` it + respects HTML tags. It does not crop inside tags and closes open tags. + Entities (like ">") are counted as one char. See :typoscript:`stdWrap.crop` below + for a syntax description and examples. - Passes the content through the PHP function `htmlspecialchars() <https://www.php.net/htmlspecialchars>`_. + Note that :typoscript:`stdWrap.crop` should not be used if :typoscript:`stdWrap.cropHTML` is + already used. - Additional property :typoscript:`preserveEntities` will preserve entities so only - non-entity characters are affected. + .. _stdwrap-stripHtml: -.. _stdwrap-encodeForJavaScriptValue: + .. confval:: stripHtml + :name: stdwrap-stripHtml + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -encodeForJavaScriptValue -~~~~~~~~~~~~~~~~~~~~~~~~ + Strips all HTML tags. -.. confval:: encodeForJavaScriptValue - :name: stdwrap-encodeForJavaScriptValue - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Encodes content to be used safely inside strings in JavaScript. - Characters, which can cause problems inside JavaScript strings, are - replaced with their encoded equivalents. The resulting string is - already quoted with single quotes. + .. _stdwrap-crop: - Passes the content through the core function - :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::quoteJSvalue()`. + .. confval:: crop + :name: stdwrap-crop + :type: :ref:`data-type-string` / :ref:`stdWrap` - .. rubric:: Examples + Crops the content to a certain length. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + You can define up to three parameters, of which the third one is + optional. The syntax is: + [numbers of characters to keep] \| [ellipsis] \| [keep whole words] - 10 = TEXT - 10.stdWrap { - data = GP:sWord - encodeForJavaScriptValue = 1 - wrap = setSearchWord(|); - } + numbers of characters to keep (integer): Define the number of characters + you want to keep. For positive numbers, the first characters from the + beginning of the string will be kept, for negative numbers the last + characters from the end will be kept. + ellipsis (string): The signs to be added instead of the part, which was + cropped of. If the number of characters was positive, the string will + be *prepended* with the ellipsis, if it was negative, the string will + be *appended* with the ellipsis. -.. _stdwrap-doubleBrTag: + keep whole words (boolean): If set to 0 (default), the string is always + cropped directly after the defined number of characters. If set to 1, + only complete words are kept. Then a word, which would normally be cut + in the middle, is removed completely. -doubleBrTag -~~~~~~~~~~~ + .. rubric:: Examples -.. confval:: doubleBrTag - :name: stdwrap-doubleBrTag - :type: :ref:`data-type-string` / :ref:`stdWrap` + :typoscript:`20 | ...` => max 20 characters. If more, the value will be truncated + to the first 20 characters and prepended with "..." - All double line breaks are substituted with this value. + :typoscript:`-20 | ...` => max 20 characters. If more, the value will be truncated + to the last 20 characters and appended with "..." + :typoscript:`20 | ... | 1` => max 20 characters. If more, the value will be + truncated to the first 20 characters and prepended with "...". If + the division is in the middle of a word, the remains of that word is + removed. -.. _stdwrap-br: + Uses "UTF-8" for the operation. -br -~~ -.. confval:: br - :name: stdwrap-br - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + .. _stdwrap-rawUrlEncode: - Pass the value through the PHP function `nl2br() <https://www.php.net/nl2br>`__. This - converts each line break to a :html:`<br />` or a :html:`<br>` tag depending on doctype. + .. confval:: rawUrlEncode + :name: stdwrap-rawUrlEncode + :type: :ref:`data-type-boolean` / :ref:`stdWrap` + Passes the content through the PHP function `rawurlencode() <https://www.php.net/rawurlencode>`_. -.. _stdwrap-brTag: -brTag -~~~~~ + .. _stdwrap-htmlSpecialChars: -.. confval:: brTag - :name: stdwrap-brTag - :type: :ref:`data-type-string` / :ref:`stdWrap` + .. confval:: htmlSpecialChars + :name: stdwrap-htmlSpecialChars + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - All ASCII codes of "10" (line feed, LF) are substituted with the - *value*, which has been provided in this property. + Passes the content through the PHP function `htmlspecialchars() <https://www.php.net/htmlspecialchars>`_. + Additional property :typoscript:`preserveEntities` will preserve entities so only + non-entity characters are affected. -.. _stdwrap-encapsLines: -encapsLines -~~~~~~~~~~~ + .. _stdwrap-encodeForJavaScriptValue: -.. confval:: encapsLines - :name: stdwrap-encapsLines - :type: :ref:`encapslines` / :ref:`stdWrap` + .. confval:: encodeForJavaScriptValue + :name: stdwrap-encodeForJavaScriptValue + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Lets you split the content by :php:`chr(10)` and process each line - independently. Used to format content made with the RTE. + Encodes content to be used safely inside strings in JavaScript. + Characters, which can cause problems inside JavaScript strings, are + replaced with their encoded equivalents. The resulting string is + already quoted with single quotes. + Passes the content through the core function + :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::quoteJSvalue()`. -.. _stdwrap-keywords: + .. rubric:: Examples -keywords -~~~~~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: keywords - :name: stdwrap-keywords - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + 10 = TEXT + 10.stdWrap { + data = GP:sWord + encodeForJavaScriptValue = 1 + wrap = setSearchWord(|); + } - Splits the content by characters "," ";" and php:`chr(10)` (return), trims - each value and returns a comma-separated list of the values. + .. _stdwrap-doubleBrTag: -.. _stdwrap-innerWrap: + .. confval:: doubleBrTag + :name: stdwrap-doubleBrTag + :type: :ref:`data-type-string` / :ref:`stdWrap` -innerWrap -~~~~~~~~~ + All double line breaks are substituted with this value. -.. confval:: innerWrap - :name: stdwrap-innerWrap - :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` - Wraps the content. + .. _stdwrap-br: + .. confval:: br + :name: stdwrap-br + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -.. _stdwrap-innerWrap2: + Pass the value through the PHP function `nl2br() <https://www.php.net/nl2br>`__. This + converts each line break to a :html:`<br />` or a :html:`<br>` tag depending on doctype. -innerWrap2 -~~~~~~~~~~ -.. confval:: innerWrap2 - :name: stdwrap-innerWrap2 - :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` + .. _stdwrap-brTag: - Same as :typoscript:`innerWrap` (but watch the order in which they are executed). + .. confval:: brTag + :name: stdwrap-brTag + :type: :ref:`data-type-string` / :ref:`stdWrap` + All ASCII codes of "10" (line feed, LF) are substituted with the + *value*, which has been provided in this property. -.. _stdwrap-preCObject: -preCObject -~~~~~~~~~~ + .. _stdwrap-encapsLines: -.. confval:: preCObject - :name: stdwrap-preCObject - :type: :ref:`data-type-cobject` + .. confval:: encapsLines + :name: stdwrap-encapsLines + :type: :ref:`encapslines` / :ref:`stdWrap` - :ref:`stdwrap-cObject` prepended the content. + Lets you split the content by :php:`chr(10)` and process each line + independently. Used to format content made with the RTE. -.. _stdwrap-postCObject: + .. _stdwrap-keywords: -postCObject -~~~~~~~~~~~ + .. confval:: keywords + :name: stdwrap-keywords + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -.. confval:: postCObject - :name: stdwrap-postCObject - :type: :ref:`data-type-cobject` + Splits the content by characters "," ";" and php:`chr(10)` (return), trims + each value and returns a comma-separated list of the values. - :ref:`stdwrap-cObject` appended the content. +.. _stdwrap-properties-wrap: -.. _data-type-align: -.. _stdwrap-wrapAlign: +Properties for wrapping data +---------------------------- -wrapAlign -~~~~~~~~~ +.. confval-menu:: + :name: stdwrap-wrap + :display: table + :type: -.. confval:: wrapAlign - :name: stdwrap-wrapAlign - :type: string / :ref:`stdWrap` - :Allowed values: :typoscript:`left`, :typoscript:`center`, :typoscript:`right` + .. _stdwrap-innerWrap: - Wraps content with :typoscript:`<div style=text-align:[*value*];"> | </div>` - *if* align is set. + .. confval:: innerWrap + :name: stdwrap-innerWrap + :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` + Wraps the content. -.. _stdwrap-typolink: -typolink -~~~~~~~~ + .. _stdwrap-innerWrap2: -.. confval:: typolink - :name: stdwrap-typolink - :type: :ref:`typolink` / :ref:`stdWrap` + .. confval:: innerWrap2 + :name: stdwrap-innerWrap2 + :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` - Wraps the content with a link tag. + Same as :typoscript:`innerWrap` (but watch the order in which they are executed). -.. _stdwrap-wrap: + .. _stdwrap-preCObject: -wrap -~~~~ + .. confval:: preCObject + :name: stdwrap-preCObject + :type: :ref:`data-type-cobject` -.. confval:: wrap - :name: stdwrap-wrap - :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` + :ref:`stdwrap-cObject` prepended the content. - :typoscript:`splitChar` defines an alternative splitting character (default is "\|" - - the vertical line) -.. _stdwrap-noTrimWrap: + .. _stdwrap-postCObject: -noTrimWrap -~~~~~~~~~~ + .. confval:: postCObject + :name: stdwrap-postCObject + :type: :ref:`data-type-cobject` -.. confval:: noTrimWrap - :name: stdwrap-noTrimWrap - :type: "special" wrap /+.splitChar / :ref:`stdWrap` + :ref:`stdwrap-cObject` appended the content. - This wraps the content *without* trimming the values. That means that - surrounding whitespaces stay included! Note that this kind of wrap - does not only need a special character in the middle, but that it also - needs the same special character to begin and end the wrap (default - for all three is "\|"). - **Additional property:** + .. _data-type-align: + .. _stdwrap-wrapAlign: - :typoscript:`splitChar` + .. confval:: wrapAlign + :name: stdwrap-wrapAlign + :type: string / :ref:`stdWrap` + :Allowed values: :typoscript:`left`, :typoscript:`center`, :typoscript:`right` - Can be set to define an alternative special character. :typoscript:`stdWrap` is - available. Default is "\|" - the vertical line. This sub-property is - useful in cases when the default special character would be recognized - by :ref:`optionsplit` (which takes precedence over :typoscript:`noTrimWrap`). + Wraps content with :typoscript:`<div style=text-align:[*value*];"> | </div>` + *if* align is set. - .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10.noTrimWrap = | val1 | val2 | + .. _stdwrap-typolink: - In this example the content with the values val1 and val2 will be - wrapped; including the whitespaces. + .. confval:: typolink + :name: stdwrap-typolink + :type: :ref:`typolink` / :ref:`stdWrap` - .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Wraps the content with a link tag. - page.10 { - noTrimWrap = ^ val1 ^ val2 ^ || ^ val3 ^ val4 ^ - noTrimWrap.splitChar = ^ - } - :ref:`optionsplit` will use the "\|\|" to have two subparts in - the first part. In each subpart :typoscript:`noTrimWrap` will then use the "^" as - special character. + .. _stdwrap-wrap: + .. confval:: wrap + :name: stdwrap-wrap + :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` -.. _stdwrap-wrap2: + :typoscript:`splitChar` defines an alternative splitting character (default is "\|" + - the vertical line) -wrap2 -~~~~~ + .. _stdwrap-noTrimWrap: -.. confval:: wrap2 - :name: stdwrap-wrap2 - :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` + .. confval:: noTrimWrap + :name: stdwrap-noTrimWrap + :type: "special" wrap /+.splitChar / :ref:`stdWrap` - same as :ref:`stdwrap-wrap` (but watch the order in which they are executed) + This wraps the content *without* trimming the values. That means that + surrounding whitespaces stay included! Note that this kind of wrap + does not only need a special character in the middle, but that it also + needs the same special character to begin and end the wrap (default + for all three is "\|"). + **Additional property:** -.. _stdwrap-dataWrap: + :typoscript:`splitChar` -dataWrap -~~~~~~~~ + Can be set to define an alternative special character. :typoscript:`stdWrap` is + available. Default is "\|" - the vertical line. This sub-property is + useful in cases when the default special character would be recognized + by :ref:`optionsplit` (which takes precedence over :typoscript:`noTrimWrap`). -.. confval:: dataWrap - :name: stdwrap-dataWrap - :type: mixed / :ref:`stdWrap` + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - The content is parsed for pairs of curly braces. The content of the - curly braces is of the type :ref:`data-type-gettext` and is substituted with the result - of :ref:`data-type-gettext`. + page.10.noTrimWrap = | val1 | val2 | - .. rubric:: Examples + In this example the content with the values val1 and val2 will be + wrapped; including the whitespaces. - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - page.10.dataWrap = <div id="{tsfe : id}"> | </div> + page.10 { + noTrimWrap = ^ val1 ^ val2 ^ || ^ val3 ^ val4 ^ + noTrimWrap.splitChar = ^ + } - This will produce a :html:`<div>` tag around the content with an id attribute - that contains the number of the current page. + :ref:`optionsplit` will use the "\|\|" to have two subparts in + the first part. In each subpart :typoscript:`noTrimWrap` will then use the "^" as + special character. -.. _stdwrap-prepend: + .. _stdwrap-wrap2: -prepend -~~~~~~~ + .. confval:: wrap2 + :name: stdwrap-wrap2 + :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` -.. confval:: prepend - :name: stdwrap-prepend - :type: :ref:`data-type-cobject` + same as :ref:`stdwrap-wrap` (but watch the order in which they are executed) - :ref:`stdwrap-cObject` prepended to content (before) + .. _stdwrap-dataWrap: -.. _stdwrap-append: + .. confval:: dataWrap + :name: stdwrap-dataWrap + :type: mixed / :ref:`stdWrap` -append -~~~~~~ + The content is parsed for pairs of curly braces. The content of the + curly braces is of the type :ref:`data-type-gettext` and is substituted with the result + of :ref:`data-type-gettext`. -.. confval:: append - :name: stdwrap-append - :type: :ref:`data-type-cobject` + .. rubric:: Examples - :ref:`stdwrap-cObject` appended to content (after) + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + page.10.dataWrap = <div id="{tsfe : id}"> | </div> -.. _stdwrap-wrap3: + This will produce a :html:`<div>` tag around the content with an id attribute + that contains the number of the current page. -wrap3 -~~~~~ -.. confval:: wrap3 - :name: stdwrap-wrap3 - :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` + .. _stdwrap-prepend: - same as :typoscript:`wrap` (but watch the order in which they are executed) + .. confval:: prepend + :name: stdwrap-prepend + :type: :ref:`data-type-cobject` + :ref:`stdwrap-cObject` prepended to content (before) -.. _stdwrap-orderedStdWrap: -orderedStdWrap -~~~~~~~~~~~~~~ + .. _stdwrap-append: -.. confval:: orderedStdWrap - :name: stdwrap-orderedStdWrap - :type: Array of numeric keys with / :ref:`stdWrap` each + .. confval:: append + :name: stdwrap-append + :type: :ref:`data-type-cobject` - Execute multiple :typoscript:`stdWrap` statements in a freely selectable order. The order - is determined by the numeric order of the keys. This allows to use multiple - stdWrap statements without having to remember the rather complex sorting - order in which the :typoscript:`stdWrap` functions are executed. + :ref:`stdwrap-cObject` appended to content (after) - .. rubric:: Examples - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. _stdwrap-wrap3: - 10 = TEXT - 10.value = a - 10.stdWrap.orderedStdWrap { - 30.wrap = |. + .. confval:: wrap3 + :name: stdwrap-wrap3 + :type: :ref:`wrap <data-type-wrap>` /+.splitChar / :ref:`stdWrap` - 10.wrap = is | working - 10.innerWrap =  |  + same as :typoscript:`wrap` (but watch the order in which they are executed) - 20.wrap = This|solution - 20.stdWrap.wrap =  |  - } - In this example orderedStdWrap is executed on the value "a". - :typoscript:`10.innerWrap` is executed first, followed by :typoscript:`10.wrap`. - Then the next key is processed which is 20. Afterwards :typoscript:`30.wrap` - is executed on what already was created. + .. _stdwrap-orderedStdWrap: - This results in "This is a working solution." + .. confval:: orderedStdWrap + :name: stdwrap-orderedStdWrap + :type: Array of numeric keys with / :ref:`stdWrap` each + Execute multiple :typoscript:`stdWrap` statements in a freely selectable order. The order + is determined by the numeric order of the keys. This allows to use multiple + stdWrap statements without having to remember the rather complex sorting + order in which the :typoscript:`stdWrap` functions are executed. -.. _stdwrap-outerWrap: + .. rubric:: Examples -outerWrap -~~~~~~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: outerWrap - :name: stdwrap-outerWrap - :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` + 10 = TEXT + 10.value = a + 10.stdWrap.orderedStdWrap { + 30.wrap = |. - Wraps the complete content + 10.wrap = is | working + 10.innerWrap =  |  + 20.wrap = This|solution + 20.stdWrap.wrap =  |  + } -.. _stdwrap-insertData: + In this example orderedStdWrap is executed on the value "a". + :typoscript:`10.innerWrap` is executed first, followed by :typoscript:`10.wrap`. + Then the next key is processed which is 20. Afterwards :typoscript:`30.wrap` + is executed on what already was created. -insertData -~~~~~~~~~~ + This results in "This is a working solution." -.. confval:: insertData - :name: stdwrap-insertData - :type: :ref:`data-type-boolean` / :ref:`stdWrap` - If set, then the content string is parsed like :typoscript:`dataWrap` above. + .. _stdwrap-outerWrap: - .. rubric:: Examples + .. confval:: outerWrap + :name: stdwrap-outerWrap + :type: :ref:`wrap <data-type-wrap>` / :ref:`stdWrap` - Displays the page title: + Wraps the complete content - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - 10 = TEXT - 10.value = This is the page title: {page:title} - 10.stdWrap.insertData = 1 + .. _stdwrap-insertData: - # TEXT is already stdWrapable, so we can also use insertData right away - 20 = TEXT - 20.value = <link rel="preload" href="{path : EXT:site/Resources/Public/Fonts/Roboto.woff2}" as="font" type="font/woff2" crossorigin="anonymous"> - 20.insertData = 1 + .. confval:: insertData + :name: stdwrap-insertData + :type: :ref:`data-type-boolean` / :ref:`stdWrap` -.. warning:: - Never use this on content that can be edited in the backend. This allows editors to disclose - normally hidden information. Never use this to insert data into wraps. - Use :ref:`stdwrap-dataWrap` instead. + If set, then the content string is parsed like :typoscript:`dataWrap` above. + .. rubric:: Examples -.. _stdwrap-postUserFunc: + Displays the page title: -postUserFunc -~~~~~~~~~~~~ + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. confval:: postUserFunc - :name: stdwrap-postUserFunc - :type: :ref:`data-type-function-name` + 10 = TEXT + 10.value = This is the page title: {page:title} + 10.stdWrap.insertData = 1 - Calls the provided PHP function. If you specify the name with a '->' - in it, then it is interpreted as a call to a method in a class. + # TEXT is already stdWrapable, so we can also use insertData right away + 20 = TEXT + 20.value = <link rel="preload" href="{path : EXT:site/Resources/Public/Fonts/Roboto.woff2}" as="font" type="font/woff2" crossorigin="anonymous"> + 20.insertData = 1 - Two parameters are sent to the PHP function: As first parameter a - content variable, which contains the current content. This is the - value to be processed. As second parameter any sub-properties of - :typoscript:`postUserFunc` are provided to the function. + .. warning:: + Never use this on content that can be edited in the backend. This allows editors to disclose + normally hidden information. Never use this to insert data into wraps. + Use :ref:`stdwrap-dataWrap` instead. - The description of the :typoscript:`cObject` :ref:`USER <cobj-user>` contains some - more in-depth information. - .. rubric:: Examples + .. _stdwrap-postUserFunc: - You can paste this example directly into a new template record: + .. confval:: postUserFunc + :name: stdwrap-postUserFunc + :type: :ref:`data-type-function-name` - .. literalinclude:: _StdWrap/_UserFunction.typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Calls the provided PHP function. If you specify the name with a '->' + in it, then it is interpreted as a call to a method in a class. - Your methods will get the parameters :php:`$content` and :php:`$conf` - (in that order) and need to return a string. + Two parameters are sent to the PHP function: As first parameter a + content variable, which contains the current content. This is the + value to be processed. As second parameter any sub-properties of + :typoscript:`postUserFunc` are provided to the function. - .. literalinclude:: _StdWrap/_UserFunction.php - :caption: EXT:site_package/Classes/UserFunctions/YourClass.php + The description of the :typoscript:`cObject` :ref:`USER <cobj-user>` contains some + more in-depth information. - For :typoscript:`page.10` the content, which is present when - :typoscript:`postUserFunc` is executed, will be given to the PHP function - :php:`reverseString()`. The result will be `!DLROW OLLEH`. + .. rubric:: Examples - The content of :typoscript:`page.20` will be processed by the function - :php:`reverseString()` from the class :php:`YourClass`. This also returns - the text `!DLROW OLLEH`, but wrapped into a link to the page with the ID 11. - The result will be :html:`<a href="/path/to/page/id/11">!DLROW OLLEH</a>`. + You can paste this example directly into a new template record: - Note how in the second example :php:`$this->cObj`, the reference to the - calling :typoscript:`cObject`, is utilised to use functions from - :php:`ContentObjectRenderer` class! + .. literalinclude:: _StdWrap/_UserFunction.typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Your methods will get the parameters :php:`$content` and :php:`$conf` + (in that order) and need to return a string. -.. _stdwrap-postUserFuncInt: + .. literalinclude:: _StdWrap/_UserFunction.php + :caption: EXT:site_package/Classes/UserFunctions/YourClass.php -postUserFuncInt -~~~~~~~~~~~~~~~ + For :typoscript:`page.10` the content, which is present when + :typoscript:`postUserFunc` is executed, will be given to the PHP function + :php:`reverseString()`. The result will be `!DLROW OLLEH`. -.. confval:: postUserFuncInt - :name: stdwrap-postUserFuncInt - :type: :ref:`data-type-function-name` + The content of :typoscript:`page.20` will be processed by the function + :php:`reverseString()` from the class :php:`YourClass`. This also returns + the text `!DLROW OLLEH`, but wrapped into a link to the page with the ID 11. + The result will be :html:`<a href="/path/to/page/id/11">!DLROW OLLEH</a>`. - Calls the provided PHP function. If you specify the name with a '->' - in it, then it is interpreted as a call to a method in a class. + Note how in the second example :php:`$this->cObj`, the reference to the + calling :typoscript:`cObject`, is utilised to use functions from + :php:`ContentObjectRenderer` class! - Two parameters are sent to the PHP function: As first parameter a - content variable, which contains the current content. This is the - value to be processed. As second parameter any sub-properties of - postUserFuncInt are provided to the function. - The result will be rendered non-cached, outside the main - page-rendering. Please see the description of the :typoscript:`cObject` - :ref:`USER_INT <cobj-user-int>`. + .. _stdwrap-postUserFuncInt: - Supplied by Jens Ellerbrock + .. confval:: postUserFuncInt + :name: stdwrap-postUserFuncInt + :type: :ref:`data-type-function-name` + Calls the provided PHP function. If you specify the name with a '->' + in it, then it is interpreted as a call to a method in a class. -.. _stdwrap-prefixComment: + Two parameters are sent to the PHP function: As first parameter a + content variable, which contains the current content. This is the + value to be processed. As second parameter any sub-properties of + postUserFuncInt are provided to the function. -prefixComment -~~~~~~~~~~~~~ + The result will be rendered non-cached, outside the main + page-rendering. Please see the description of the :typoscript:`cObject` + :ref:`USER_INT <cobj-user-int>`. -.. confval:: prefixComment - :name: stdwrap-prefixComment - :type: :ref:`data-type-string` / :ref:`stdWrap` + Supplied by Jens Ellerbrock - Prefixes content with an HTML comment with the second part of input - string (divided by "\|") where first part is an integer telling how - many trailing tabs to put before the comment on a new line. - The content is parsed through :ref:`stdwrap-insertData`. + .. _stdwrap-prefixComment: - .. rubric:: Examples + .. confval:: prefixComment + :name: stdwrap-prefixComment + :type: :ref:`data-type-string` / :ref:`stdWrap` - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + Prefixes content with an HTML comment with the second part of input + string (divided by "\|") where first part is an integer telling how + many trailing tabs to put before the comment on a new line. - prefixComment = 2 | CONTENT ELEMENT, uid:{field:uid}/{field:CType} + The content is parsed through :ref:`stdwrap-insertData`. - Will indent the comment with 1 tab (and the next line with 2+1 tabs) + .. rubric:: Examples + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript -.. _stdwrap-htmlSanitize: + prefixComment = 2 | CONTENT ELEMENT, uid:{field:uid}/{field:CType} -htmlSanitize -~~~~~~~~~~~~ + Will indent the comment with 1 tab (and the next line with 2+1 tabs) -.. confval:: htmlSanitize - :name: stdwrap-htmlSanitize - :type: :ref:`data-type-boolean` / array with key "build" - The property controls the sanitization and removal of XSS from markup. It - strips tags, attributes and values that are not explicitly allowed. +.. _stdwrap-properties-cache: - * :typoscript:`htmlSanitize = [boolean]`: whether to invoke sanitization - (enabled per default when invoked via :typoscript:`stdWrap.parseFunc`). - * :typoscript:`htmlSanitize.build = [string]`: defines which specific builder - (must be an instance of :php:`\TYPO3\HtmlSanitizer\Builder\BuilderInterface`) - to be used for building a :php:`\TYPO3\HtmlSanitizer\Sanitizer` instance - using a particular :php:`\TYPO3\HtmlSanitizer\Behavior`. This can either be - a fully qualified class name or the name of a preset as defined in - :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['htmlSanitizer']` - per default, - :php:`\TYPO3\CMS\Core\Html\DefaultSanitizerBuilder` is used. +Properties for sanitizing and caching data +------------------------------------------ - .. rubric:: Examples +.. confval-menu:: + :name: stdwrap-cache + :display: table + :type: - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + .. _stdwrap-htmlSanitize: - 10 = TEXT - 10 { - value = <div><img src="invalid.file" onerror="alert(1)"></div> - htmlSanitize = 1 - } + .. confval:: htmlSanitize + :name: stdwrap-htmlSanitize + :type: :ref:`data-type-boolean` / array with key "build" - will result in the following output: + The property controls the sanitization and removal of XSS from markup. It + strips tags, attributes and values that are not explicitly allowed. - .. code-block:: html + * :typoscript:`htmlSanitize = [boolean]`: whether to invoke sanitization + (enabled per default when invoked via :typoscript:`stdWrap.parseFunc`). + * :typoscript:`htmlSanitize.build = [string]`: defines which specific builder + (must be an instance of :php:`\TYPO3\HtmlSanitizer\Builder\BuilderInterface`) + to be used for building a :php:`\TYPO3\HtmlSanitizer\Sanitizer` instance + using a particular :php:`\TYPO3\HtmlSanitizer\Behavior`. This can either be + a fully qualified class name or the name of a preset as defined in + :php:`$GLOBALS['TYPO3_CONF_VARS']['SYS']['htmlSanitizer']` - per default, + :php:`\TYPO3\CMS\Core\Html\DefaultSanitizerBuilder` is used. - <div><img src="invalid.file"></div> + .. rubric:: Examples - The following code is equivalent to above, but with a builder specified: + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + 10 = TEXT + 10 { + value = <div><img src="invalid.file" onerror="alert(1)"></div> + htmlSanitize = 1 + } - 10 = TEXT - 10 { - value = <div><img src="invalid.file" onerror="alert(1)"></div> - htmlSanitize = 1 - // Use either "default" for the default builder - htmlSanitize.build = default - // or use the full class name of the default builder - // htmlSanitize.build = TYPO3\CMS\Core\Html\DefaultSanitizerBuilder - } + will result in the following output: + .. code-block:: html -.. _stdwrap-cache: + <div><img src="invalid.file"></div> -cache -~~~~~ + The following code is equivalent to above, but with a builder specified: + + .. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + 10 = TEXT + 10 { + value = <div><img src="invalid.file" onerror="alert(1)"></div> + htmlSanitize = 1 + // Use either "default" for the default builder + htmlSanitize.build = default + // or use the full class name of the default builder + // htmlSanitize.build = TYPO3\CMS\Core\Html\DefaultSanitizerBuilder + } -.. confval:: cache - :name: stdwrap-cache - :type: :ref:`cache` - Caches rendered content in the caching framework. + .. _stdwrap-cache: + .. confval:: cache + :name: stdwrap-cache + :type: :ref:`cache` -.. _stdwrap-debug: + Caches rendered content in the caching framework. -debug -~~~~~ +.. _stdwrap-properties-debug: -.. confval:: debug +Properties for debugging data +----------------------------- + +.. confval-menu:: :name: stdwrap-debug - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + :display: table + :type: - Prints content with :php:`HTMLSpecialChars()` and :html:`<pre></pre>`: - Useful for debugging which value :typoscript:`stdWrap` actually ends up with, - if you are constructing a website with TypoScript. + .. _stdwrap-debug: -.. attention:: + .. confval:: debug + :name: stdwrap-debug + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Only for debugging during development, otherwise output can break. + Prints content with :php:`HTMLSpecialChars()` and :html:`<pre></pre>`: + Useful for debugging which value :typoscript:`stdWrap` actually ends up with, + if you are constructing a website with TypoScript. + .. attention:: -.. _stdwrap-debugFunc: + Only for debugging during development, otherwise output can break. -debugFunc -~~~~~~~~~ -.. confval:: debugFunc - :name: stdwrap-debugFunc - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + .. _stdwrap-debugFunc: - Prints the content directly to browser with the :php:`debug()` function. + .. confval:: debugFunc + :name: stdwrap-debugFunc + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Set to value "2" the content will be printed in a table which looks nicer. + Prints the content directly to browser with the :php:`debug()` function. -.. attention:: + Set to value "2" the content will be printed in a table which looks nicer. - Only for debugging during development, otherwise output can break. + .. attention:: + Only for debugging during development, otherwise output can break. -.. _stdwrap-debugData: -debugData -~~~~~~~~~ + .. _stdwrap-debugData: -.. confval:: debugData - :name: stdwrap-debugData - :type: :ref:`data-type-boolean` / :ref:`stdWrap` + .. confval:: debugData + :name: stdwrap-debugData + :type: :ref:`data-type-boolean` / :ref:`stdWrap` - Prints the current data-array, :php:`$cObj->data`, directly to browser. This - is where :typoscript:`field` gets data from. + Prints the current data-array, :php:`$cObj->data`, directly to browser. This + is where :typoscript:`field` gets data from. -.. attention:: + .. attention:: - Only for debugging during development, otherwise output can break. + Only for debugging during development, otherwise output can break. .. _stdwrap-examples: From 81714df9cb5d5f87c52873f0e989901c702beaf1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 05:38:36 +0100 Subject: [PATCH 074/125] [TASK] Remove examples and properties of pure TypoScript language and userfunction menus. (#1494) Refer to old documetnation instead Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../DataProcessing/MenuProcessor/Index.rst | 11 ++- .../DataProcessing/MenuProcessor/Language.rst | 85 ++----------------- .../MenuProcessor/Userfunction.rst | 26 ++---- .../_LanguageMenuLib.typoscript | 35 -------- 4 files changed, 22 insertions(+), 135 deletions(-) delete mode 100644 Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript diff --git a/Documentation/DataProcessing/MenuProcessor/Index.rst b/Documentation/DataProcessing/MenuProcessor/Index.rst index fde8220c9..9391951f0 100644 --- a/Documentation/DataProcessing/MenuProcessor/Index.rst +++ b/Documentation/DataProcessing/MenuProcessor/Index.rst @@ -173,11 +173,16 @@ Options .. confval:: special :name: MenuProcessor-special :type: *"directory" / "list" / "updated" / "rootline" / "browse" / "keywords" - / "categories" / "language" / "userfunction"* + / "categories" Lets you define special types of menus. - See the section about the :ref:`.special property <hmenu-special-property>`! + For backward compatibility reason the special type `language` can be + used with an HMENU. We recommend to use the + `language-menu data processor <https://docs.typo3.org/permalink/t3tsref:languagemenuprocessor>`_ + to create language menus. + + See the section about the :ref:`.special property <MenuProcessor-special>`. .. confval:: value :name: MenuProcessor-special-value @@ -185,7 +190,7 @@ Options List of page uid's to use for the special menu. What they are used for depends on the menu type as defined by ".special"; see the - section about the :ref:`.special property <hmenu-special-property>`! + section about the :ref:`.special property <MenuProcessor-special>`. .. _MenuProcessor-titleField: diff --git a/Documentation/DataProcessing/MenuProcessor/Language.rst b/Documentation/DataProcessing/MenuProcessor/Language.rst index d50d4e87c..0e7de4a78 100644 --- a/Documentation/DataProcessing/MenuProcessor/Language.rst +++ b/Documentation/DataProcessing/MenuProcessor/Language.rst @@ -3,83 +3,16 @@ .. index:: HMENU; special = categories .. _hmenu-special-language: -============= -Language menu -============= +========================================================== +Pure TypoScript language menu (For backward compatibility) +========================================================== + +.. attention:: + It is still possible to create a menu with :typoscript:`special = userfunction` + for backward compatibility reasons to be used with HMENU. -.. seealso:: The :ref:`LanguageMenuProcessor <LanguageMenuProcessor>` can be used to create a language menu styled by Fluid. -Creates a language selector menu. - -The :typoscript:`special = language` type will create menu items based on -the current page record but with the language record for each language -overlaid if available. - -.. contents:: - :local: - -.. _hmenu-special-language-properties: - -Properties -========== - -.. confval-menu:: - :display: table - :type: - -.. _hmenu-special-language-value: - -.. confval:: special.value - :name: hmenu-language-special-value - :type: comma separated list of language UIDs /:ref:`stdWrap <stdwrap>` or `auto` - - The number of elements in this list determines the number of menu - items. Setting to `auto` will include all available languages from - the current site. - -.. _hmenu-special-language-normalwhennolanguage: - -.. confval:: special.normalWhenNoLanguage - :name: hmenu-language-special-normalWhenNoLanguage - :type: boolean - - If set, the button for a language will be rendered as a non- - disabled button even if no translation is found for the language. - -.. _hmenu-addquerystring: - -.. confval:: addQueryString - :name: hmenu-addquerystring - :type: :ref:`->addQueryString <typolink-addQueryString>` - - **Note:** This works only for *special=language*. - - -.. _hmenu-special-language-examples: - -Example: Create a language menu with pure TypoScript -==================================================== - -.. literalinclude:: _code-snippets/_LanguageMenuLib.typoscript - :caption: EXT:site_package/Configuration/TypoScript/Menus/Setup/LanguageMenuLib.typoscript - -.. seealso:: - For a language menu styled by Fluid see - :ref:`LanguageMenuProcessor <LanguageMenuProcessor>`. - -Note on item states -==================== - -When the language of the menu element matches the current language of the page -displayed, the state is set to `ACT`, otherwise `NO`. However, if a page -is not available due to the pages "Localization settings" (which can -disable translations) or if no Alternative Page Language record was -found (can be disabled with `.normalWhenNoLanguage`, see below) the -state is set to `USERDEF1` for non-active items and `USERDEF2` for -active items. So in total there are four states to create designs for. -It is recommended to disable the link on menu items rendered with -`USERDEF1` and `USERDEF2` in this case since they are disabled exactly -because a page in that language does not exist and might even issue an -error if tried accessed (depending on site configuration). +See :ref:`TYPO3 11.5 - Language menu <t3tsref/11.5:hmenu-special-language>` for examples +how to use the language menu with the HMENU. diff --git a/Documentation/DataProcessing/MenuProcessor/Userfunction.rst b/Documentation/DataProcessing/MenuProcessor/Userfunction.rst index 83befa48f..b61d87542 100644 --- a/Documentation/DataProcessing/MenuProcessor/Userfunction.rst +++ b/Documentation/DataProcessing/MenuProcessor/Userfunction.rst @@ -4,9 +4,9 @@ .. _hmenu-special-userfunction: .. _hmenu-special-userfunction-examples: -================= -Userfunction menu -================= +============================================ +Userfunction menu (For backward compability) +============================================ .. attention:: It is still possible to create a menu with :typoscript:`special = userfunction` @@ -15,21 +15,5 @@ Userfunction menu However we would advise you to write a :ref:`customized MenuProcessor <CustomDataProcessors>` and style the output with Fluid instead. -Calls a user function/method in class which should return an array with -page records for the menu. - -.. contents:: - :local: - -.. _hmenu-special-userfunction-properties: - -Properties -========== - -.. _hmenu-special-userfunction-userfunc: - -.. confval:: special.userFunc - :name: hmenu-userfunction-special-userfunc - :type: string - - Name of the user function +See :ref:`TYPO3 11.5 -Userfunction menu <t3tsref/11.5:hmenu-special-userfunction>` +for examples how to use the language menu with the HMENU. diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript deleted file mode 100644 index 36cbef931..000000000 --- a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_LanguageMenuLib.typoscript +++ /dev/null @@ -1,35 +0,0 @@ -lib.langMenu = HMENU -lib.langMenu { - special = language - special.value = 0,1,2 - wrap = <ul class="langugageMenu">|</ul> - 1 = TMENU - 1 { - NO = 1 - NO { - linkWrap = <li>|</li> - doNotLinkIt = 1 - stdWrap.override = en || de || fr - stdWrap.typolink { - parameter.data = page:uid - additionalParams = &L=0 || &L=1 || &L=2 - addQueryString = 1 - addQueryString.exclude = L,id - - } - } - - // We are in the current language - ACT < .NO - ACT { - linkWrap = <li class="active">|</li> - } - - // No translation available - USERDEF1 < .NO - USERDEF1 { - linkWrap = <li class="disabled">|</li> - stdWrap.typolink > - } - } -} From d4690afc01f939f0904ad36ad4c5674040f1f59a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 05:45:21 +0100 Subject: [PATCH 075/125] [BUGFIX] Don't create multiple whitespace Prs (#1496) Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .github/workflows/apply-precommit.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/apply-precommit.yml b/.github/workflows/apply-precommit.yml index 44019f6f0..831486e79 100644 --- a/.github/workflows/apply-precommit.yml +++ b/.github/workflows/apply-precommit.yml @@ -32,8 +32,19 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create and push changes if needed + - name: Check for existing PR if: env.FIX_NEEDED == 'true' + id: check_pr + run: | + EXISTING_PR=$(gh pr list --state open --search "Fix whitespace issues" --json number -q '.[].number') + if [[ -n "$EXISTING_PR" ]]; then + echo "EXISTING_PR=true" >> $GITHUB_ENV + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create and push changes if needed + if: env.FIX_NEEDED == 'true' && env.EXISTING_PR != 'true' id: create_branch run: | git config user.name "github-actions[bot]" @@ -49,7 +60,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Open Pull Request - if: env.FIX_NEEDED == 'true' + if: env.FIX_NEEDED == 'true' && env.EXISTING_PR != 'true' uses: repo-sync/pull-request@v2 with: source_branch: ${{ env.branch_name }} From ac07ee27897bc6a439c216ac9b3e31b2e8226ccd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 05:57:03 +0100 Subject: [PATCH 076/125] [Backport 13.4] [TASK] Use Browse menus with Data processors (#1498) * [TASK] Use Browse menus with Data processors Remove HMENU usage and refer to older versions for that. Releases: main, 13.4 * [TASK] Use Browse menus with Data processors Remove HMENU usage and refer to older versions for that. Releases: main, 13.4 --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../DataProcessing/MenuProcessor/Browse.rst | 301 ++++++------------ .../_code-snippets/_BrowseNavigation.html | 9 + .../_RelPrevNextMenu.typoscript | 26 -- .../ContentObjectsHmenuSpecialBrowse.png | Bin 2236 -> 0 bytes 4 files changed, 111 insertions(+), 225 deletions(-) create mode 100644 Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.html delete mode 100644 Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript delete mode 100644 Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/ContentObjectsHmenuSpecialBrowse.png diff --git a/Documentation/DataProcessing/MenuProcessor/Browse.rst b/Documentation/DataProcessing/MenuProcessor/Browse.rst index a4cd6fb51..74b54a405 100644 --- a/Documentation/DataProcessing/MenuProcessor/Browse.rst +++ b/Documentation/DataProcessing/MenuProcessor/Browse.rst @@ -1,23 +1,31 @@ :navigation-title: Browse .. include:: /Includes.rst.txt .. _hmenu-special-browse: +.. _MenuProcessor-special-browse: -================================ -Browse - previous and next links -================================ +=========================================== +Browse navigation - previous and next links +=========================================== -This menu contains pages which give your user the possibility to +This data processor provides pages which give your reader the possibility to browse to the previous page, to the next page, to a page with the -table of contents and so on. The menu is built of items given by a -list from the property ".items". +table of contents and so on. + +.. tip:: + In older TypoScript browser menus were created using the `HMENU` object. + This still works for backward compatibility reasons. We recommend to only use + data processors for newly created menus. + + See :ref:`TYPO3 11, Browse navigation <t3tsref/:hmenu-special-browse>` for + examples how this was done. .. attention:: - Mount pages are *not* supported! + Mount pages are *not* supported! .. contents:: - :local: + :local: -.. _hmenu-special-browse-properties: +.. _MenuProcessor-special-browse-properties: Properties ========== @@ -27,193 +35,88 @@ Properties :type: :Default: -.. _hmenu-special-browse-value: - -.. confval:: special.value - :name: hmenu-browse-special-value - :type: integer /:ref:`stdWrap <stdwrap>` - :Default: current page ID - - The default value can be overridden with a different page ID as starting - point for the menu in some rare use cases. - - -.. _hmenu-special-browse-items: - -.. confval:: special.items - :name: hmenu-browse-special-items - :type: list of item names separated by `|` - :Default: Current page ID - - Each element in the list (separated by `|`) is either a reserved item - name (see list) with a predefined function, or a user-defined name - which you can assign a link to any page. Note that the current page - cannot be the root-page of a site. - - .. rubric:: Reserved item names: - - `next` / `prev` - Links to the next page / the previous page. - Next and previous pages are from the same "pid" as the current page id - (or "value") - that is the next item in a menu with the current page. - Also referred to as current level. - - If :confval:`hmenu-browse-special-items-prevnextToSection` is set then - `next` / `prev` will link to the first - page of the next section / to the last page of the previous section, - too. - - `nextsection` / `prevsection` - Links to the next section / the - previous section. A section is defined as the subpages of a page on - the same level as the parent (pid) page of the current page. Will not - work if the parent page of the current page is the root page of the - site. - - .. figure:: /Images/ManualScreenshots/FrontendOutput/Hmenu/ContentObjectsHmenuSpecialBrowse.png - :alt: Example for the usage of the property "items". - - `nextsection_last` / `prevsection_last` - Where `nextsection` / `prevsection` links to the first page in a section, these - link to the last page. If there is only one page in the section that - will be both first and last. Will not work if the parent page of the - current page is the root page of the site. - - `first` / `last` - First / last page on the current level. If - there is only one page on the current level that page will be both - first and last. - - `up` - Links to the parent (pid) page of the current page (up 1 - level). Will always be available. - - `index` - Links to the parent of the parent page of the current - page(up 2 levels). May not be available, if that page is out of the - root line. - - -.. _hmenu-special-browse-items-example: - -Example: Display different types of browse links -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If id = 20 is the current page then: - -21 = prev and first, 19 = next, 18 = last, 17 = up, 1 = index, 10 = -nextsection, 11 = nextsection\_last - -prevsection and prevsection\_last are not present because id = 3 has -no subpages! - -**TypoScript (only "browse"-part, needs also TMENU):** - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - xxx = HMENU - xxx.special = browse - xxx.special { - items = index|up|next|prev - items.prevnextToSection = 1 - index.target = _blank - index.fields.title = INDEX - index.uid = 8 - } - -.. _hmenu-special-browse-prevnexttosection: - -special.items.prevnextToSection --------------------------------- - -.. confval:: special.items.prevnextToSection - :name: hmenu-browse-special-items-prevnextToSection - :type: boolean - :Default: false - - If set, the `prev` and `next` navigation will jump to the next section - when it reaches the end of pages in the current section. That way - `prev` and `next` will also link to the first page of the next section - / to the last page of the previous section. - - -.. _hmenu-special-browse-target: - -special.[itemname].target --------------------------- - -.. confval:: special.[itemname].target - :name: hmenu-browse-special-itemname-target - :type: string - - Optional or alternative target of the item. - -.. _hmenu-special-browse-uid: - -special.[itemname].uid ------------------------ - -.. confval:: special.[itemname].uid - :name: hmenu-browse-special-itemname-uid - :type: integer (UID of page) - - Optional or alternative page UID to link to. - -.. _hmenu-special-browse-fields: - -special.[itemname].fields.[field name] ---------------------------------------- - -.. confval:: special.[itemname].fields.[field name] - :name: hmenu-browse-special-itemname-fields - :type: string - - Use the provided string as linked text instead of the pages title. - - -.. _hmenu-special-browse-fields-example: - -Example: Use "back" as text on the `prev` link -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This gives the link to the previous page the linked text "« back": - -.. code-block:: typoscript - :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - - prev.fields.title = « back - - -.. _hmenu-special-browser-excludenosearchpages: - -special.excludeNoSearchPages ------------------------------ - - -.. confval:: special.excludeNoSearchPages - :name: hmenu-browse-special-excludeNoSearchPages - :type: boolean - :Default: false - - If set, pages marked with the `no search` checkbox will be excluded from the menu. - -.. _hmenu-special-browser-example: - -Example: Pagination with rel="next" and rel="prev" -================================================== - -The following snippet uses a :ref:`HMENU <cobj-hmenu>` with -:typoscript:`special = browse` to display links like the following: - -.. code-block:: html - :caption: Example HTML output - - <link rel="prev" href="http://www.example.org/page1" /> - <link rel="next" href="http://www.example.org/page2" /> - -The menu excludes pages with the flag :guilabel:`Include in Search` removed -and jumps to the next section when the last of subpages is reached. - -.. literalinclude:: _code-snippets/_RelPrevNextMenu.typoscript - :caption: EXT:site_package/Configuration/TypoScript/Seo/Setup/RelPrevNextMenu.typoscript + .. confval:: special.value + :name: hmenu-browse-special-value + :type: integer /:ref:`stdWrap <stdwrap>` + :Default: current page ID + + The default value can be overridden with a different page ID as starting + point for the menu in some rare use cases. + + .. confval:: special.items + :name: hmenu-browse-special-items + :type: list of item names separated by `|` + :Required: + + A list, separated by pipes `|`, containing the following item types: + + `next` / `prev` + Links to the next page / the previous page. + Next and previous pages are from the same "pid" as the current page id + (or "value") - that is the next item in a menu with the current page. + Also referred to as current level. + + If :confval:`hmenu-browse-special-items-prevnextToSection` is set then + `next` / `prev` will link to the first + page of the next section / to the last page of the previous section, + too. + + `nextsection` / `prevsection` + Links to the next section / the + previous section. A section is defined as the subpages of a page on + the same level as the parent (pid) page of the current page. Will not + work if the parent page of the current page is the root page of the + site. + + `nextsection_last` / `prevsection_last` + Where `nextsection` / `prevsection` links to the first page in a section, these + link to the last page. If there is only one page in the section that + will be both first and last. Will not work if the parent page of the + current page is the root page of the site. + + `first` / `last` + First / last page on the current level. If + there is only one page on the current level that page will be both + first and last. + + `up` + Links to the parent (pid) page of the current page (up 1 + level). Will always be available. + + `index` + Links to the parent of the parent page of the current + page(up 2 levels). May not be available, if that page is out of the + root line. + + .. confval:: special.items.prevnextToSection + :name: hmenu-browse-special-items-prevnextToSection + :type: boolean + :Default: false + + If set, the `prev` and `next` navigation will jump to the next section + when it reaches the end of pages in the current section. That way + `prev` and `next` will also link to the first page of the next section + / to the last page of the previous section. + + .. confval:: special.excludeNoSearchPages + :name: hmenu-browse-special-excludeNoSearchPages + :type: boolean + :Default: false + + If set, pages marked with the `no search` checkbox will be excluded from the menu. + +.. _MenuProcessor-special-browse-example: + +Example: Display a browse navigation +==================================== + +The menu data processor with `special = browse` returns the found items as an +array. The items in this array contain no information about what kind of item +(previous, next, up, etc) they are. We therefore recommend to only use one +item kind per data processor: + +.. literalinclude:: _code-snippets/_BrowseNavigation.typoscript + :caption: config/sites/mySite/setup.typoscript + +The result of each data processor can then be used, assuming that the result is +the first item of the array saved into the database. diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.html b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.html new file mode 100644 index 000000000..21371b181 --- /dev/null +++ b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.html @@ -0,0 +1,9 @@ +<f:if condition="{prevNavigation.0}"> + <a href="{prevNavigation.0.link}"><- {prevNavigation.0.title}</a> +</f:if> +<f:if condition="{nextNavigation.0}"> + <a href="{nextNavigation.0.link}">{nextNavigation.0.title} -></a> +</f:if> +<f:if condition="{upNavigation.0}"> + <a href="{upNavigation.0.link}">{upNavigation.0.title}</a> +</f:if> diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript deleted file mode 100644 index 33f328765..000000000 --- a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_RelPrevNextMenu.typoscript +++ /dev/null @@ -1,26 +0,0 @@ -page { - headerData { - // https://developers.google.com/search/blog/2011/09/pagination-with-relnext-and-relprev - 10 = HMENU - 10 { - special = browse - special { - items = prev|next - items.prevnextToSection = 1 - excludeNoSearchPages = 1 - } - - 1 = TMENU - 1.NO { - allWrap = <link rel="prev" href="|"> |*| <link rel="next" href="|"> - doNotLinkIt = 1 - stdWrap { - typolink { - parameter.data = field:uid - returnLast = url - } - } - } - } - } -} diff --git a/Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/ContentObjectsHmenuSpecialBrowse.png b/Documentation/Images/ManualScreenshots/FrontendOutput/Hmenu/ContentObjectsHmenuSpecialBrowse.png deleted file mode 100644 index 43f1572e2615819cec07b0c4b83f25d125fb8f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2236 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 KMNUMnLSTaL>ZPFo From f23a915e4ca647ec849e2148ea478b4d2f15da15 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Jan 2025 23:29:48 +0100 Subject: [PATCH 077/125] Fix indentation of example (#1501) Releases main, 13.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/PageTsconfig/TceMain.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Documentation/PageTsconfig/TceMain.rst b/Documentation/PageTsconfig/TceMain.rst index 422123f9f..45cdd0742 100644 --- a/Documentation/PageTsconfig/TceMain.rst +++ b/Documentation/PageTsconfig/TceMain.rst @@ -337,22 +337,22 @@ everybody Example: Set permissions defaults so that everybody can see the page ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. code-block:: typoscript - :caption: EXT:site_package/Configuration/page.tsconfig +.. code-block:: typoscript + :caption: EXT:site_package/Configuration/page.tsconfig - TCEMAIN.permissions { - # Everybody can at least see the page, normally everybody can do nothing - everybody = show - } + TCEMAIN.permissions { + # Everybody can at least see the page, normally everybody can do nothing + everybody = show + } - The page "Community" was created with the settings from the example - above. Compared to the two other pages created with default - permissions you can see the effect: "Everybody" has read access: +The page "Community" was created with the settings from the example +above. Compared to the two other pages created with default +permissions you can see the effect: "Everybody" has read access: - .. figure:: /Images/ManualScreenshots/Access/AccessDefaultActions.png - :alt: Page with altered permissions for backend users, groups and everybody +.. figure:: /Images/ManualScreenshots/Access/AccessDefaultActions.png + :alt: Page with altered permissions for backend users, groups and everybody - Page with altered permissions for backend users, groups and everybody + Page with altered permissions for backend users, groups and everybody .. index:: Page permissions; Group From 688210a26cefc662d240ff997d52e947f913a439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6mken?= <froemken@gmail.com> Date: Sun, 5 Jan 2025 00:44:23 +0100 Subject: [PATCH 078/125] [BUGFIX] Fix `siteLanguage("locale")` TypoScript condition example (#1449) (#1502) Co-authored-by: Daniel Corn <d@cundd.net> --- Documentation/Conditions/Index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index bb5a262e1..927c7d913 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -1268,7 +1268,7 @@ siteLanguage() Returns the language ID as an integer. :typoscript:`siteLanguage("locale")` - Returns the current locale as a string, for example `en_GB` or `de_DE`. + Returns the current locale as a string, for example `en-GB` or `de-DE`. :typoscript:`siteLanguage("base")` Returns the configured base URL as a string. @@ -1307,8 +1307,8 @@ siteLanguage() .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - [siteLanguage("locale") == "de_CH"] - page.10.value = This site has the locale "de_CH" + [siteLanguage("locale") == "de-CH"] + page.10.value = This site has the locale "de_CH" or "de_CH.utf8" [END] [siteLanguage("title") == "Italy"] From 35bcba689e080ea587710c0719c9f4784561df56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 22:33:43 +0100 Subject: [PATCH 079/125] Update Index.rst (#1504) Co-authored-by: Gitsko <s.koschel@hotmail.de> --- Documentation/UsingSetting/Index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/UsingSetting/Index.rst b/Documentation/UsingSetting/Index.rst index 429d8e83d..bd102accb 100644 --- a/Documentation/UsingSetting/Index.rst +++ b/Documentation/UsingSetting/Index.rst @@ -14,7 +14,7 @@ Each template can include other (static) templates, which can again define values in their own :guilabel:`Constants` and :guilabel:`Setup` fields. The TypoScript template configuration can be viewed and edited in the -:guilabel:`WEB > Template` module. +:guilabel:`Site Management > TypoScript` module. .. toctree:: :maxdepth: 5 From 6606880e14becfb227fcd3bcfff7b53d0939f984 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 17:06:55 +0100 Subject: [PATCH 080/125] fix: correct typo on site data processor page (#1508) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4, 12.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/DataProcessing/SiteProcessor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DataProcessing/SiteProcessor.rst b/Documentation/DataProcessing/SiteProcessor.rst index 653465d50..1728a082a 100644 --- a/Documentation/DataProcessing/SiteProcessor.rst +++ b/Documentation/DataProcessing/SiteProcessor.rst @@ -45,7 +45,7 @@ Using the :php:`SiteProcessor` the following scenario is possible: .. include:: /CodeSnippets/DataProcessing/TypoScript/SiteProcessor.rst.txt -.. rubric:: The Fluid templat +.. rubric:: The Fluid template In the Fluid template the properties of the site configuration can be accessed: From 2484c97fa66bb5965c2054a264a3f501da17f2dc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:50:51 +0100 Subject: [PATCH 081/125] fix: correct display of itemsLimitPerTable (#1511) --- Documentation/PageTsconfig/Mod/WebList.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/PageTsconfig/Mod/WebList.rst index a85f6b5e0..32958d4b5 100644 --- a/Documentation/PageTsconfig/Mod/WebList.rst +++ b/Documentation/PageTsconfig/Mod/WebList.rst @@ -378,7 +378,7 @@ itemsLimitPerTable :name: mod-web-list-itemsLimitPerTable :type: positive integer :Default: 20 -` + Set the default maximum number of items to show per table. The number must be between `0` and `10000`. If below or above this range, the nearest valid number will be used. From 3bb9ae6a7200e1bc9fb611e8ce7b414572f2fa37 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:15:24 +0100 Subject: [PATCH 082/125] [Backport 13.4] [BUGFIX] Do not pretend to be a cObject (#1515) * [BUGFIX] Do not pretend to be a cObject `templateName` is of type string/stdWrap. However, the snippet gives the impression that it is a cObject due to `templateName = TEXT`. Working: ``` templateName = Default ``` Working ``` templateName.stdWrap.cObject = TEXT templateName.stdWrap.cObject.value = Default ``` *Not* working ``` templateName= TEXT templateName.value = Default ``` * [TASK] Remove unnecessary stdWrap No extra `stdWrap` is necessary. `templateName` has direct stdWrap behaviour. Related: #1513 --------- Co-authored-by: Julian Hofmann <julianhofmann@users.noreply.github.com> Co-authored-by: Julian Hofmann <info@julian-hofmann.net> --- .../Fluidtemplate/_includes/_templateNameAutomatic.typoscript | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Documentation/ContentObjects/Fluidtemplate/_includes/_templateNameAutomatic.typoscript b/Documentation/ContentObjects/Fluidtemplate/_includes/_templateNameAutomatic.typoscript index dd16f960e..b3d78cb40 100644 --- a/Documentation/ContentObjects/Fluidtemplate/_includes/_templateNameAutomatic.typoscript +++ b/Documentation/ContentObjects/Fluidtemplate/_includes/_templateNameAutomatic.typoscript @@ -1,7 +1,6 @@ lib.stdContent = FLUIDTEMPLATE lib.stdContent { - templateName = TEXT - templateName.stdWrap { + templateName { cObject = TEXT cObject { data = levelfield:-2,backend_layout_next_level,slide From 030359c6953ff564191cac152a49e767b59aa5fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:00:15 +0100 Subject: [PATCH 083/125] Remove non-working video (#1518) Releases main, 13.4, 12.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/PageTsconfig/TceMain.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/PageTsconfig/TceMain.rst b/Documentation/PageTsconfig/TceMain.rst index 45cdd0742..849597169 100644 --- a/Documentation/PageTsconfig/TceMain.rst +++ b/Documentation/PageTsconfig/TceMain.rst @@ -10,8 +10,6 @@ TCEMAIN Configuration for the TYPO3 Core Engine (DataHandler). For general information, see the :ref:`according section of TYPO3 Explained <t3coreapi:tce>`. -.. youtube:: HnAdDHkes5A - Properties ========== From 03e3c122d84018ce30cd347e356cb978b195108a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 16:06:28 +0100 Subject: [PATCH 084/125] Update apply-precommit.yml (#1519) This should (hopefully) only trigger automatted commits for our own repository scope. Please only merge after https://github.com/TYPO3-Documentation/TYPO3CMS-Reference-CoreApi/pull/5271 has proven to work properly. Co-authored-by: Garvin Hicking <blog@garv.in> --- .github/workflows/apply-precommit.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/apply-precommit.yml b/.github/workflows/apply-precommit.yml index 831486e79..a416a2d2b 100644 --- a/.github/workflows/apply-precommit.yml +++ b/.github/workflows/apply-precommit.yml @@ -7,6 +7,7 @@ on: jobs: lint: + if: github.repository_owner == 'TYPO3-documentation' runs-on: ubuntu-latest steps: - name: Checkout code From 9525c458efc4ca1d25a9d753f1051d99d3c02b6e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:40:53 +0100 Subject: [PATCH 085/125] [BUGFIX] Align headline and description in example (#1522) Headline says that the following example does not allow deletion, desxription says that this code snippet will allow deletion (which is true). Co-authored-by: Dan Kleine (geb. Dan Untenzu) <mail@pixelbrackets.de> --- Documentation/PageTsconfig/TceMain.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/PageTsconfig/TceMain.rst b/Documentation/PageTsconfig/TceMain.rst index 849597169..12672a321 100644 --- a/Documentation/PageTsconfig/TceMain.rst +++ b/Documentation/PageTsconfig/TceMain.rst @@ -378,7 +378,7 @@ group .. _pagetcemain-permissions-group-example: -Example: Set permission defaults so that the group can do anything but delete a page +Example: Set permission defaults so that the group can do anything with the new page ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: typoscript From 7de99e642e046d55ed3657ae32066c3948cc6fe3 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Mon, 17 Feb 2025 06:13:00 +0100 Subject: [PATCH 086/125] [BUGFIX] Regenerate codesnippets (#1524) Releases: main, 13.4 (cherry picked from commit b12c190195280621e2f90017326b52b7e4f14148) --- Documentation/CodeSnippets/Config/Menus.php | 4 +-- .../TypoScript/DatabaseQueryProcessor.rst.txt | 2 +- .../Template/BreadcrumbDataProcessor.rst.txt | 4 +-- .../PageTSconfig/Mod/CsvExport.rst.txt | 17 +++++----- .../Mod/noExportRecordsLinks.rst.txt | 15 ++++---- .../_BrowseNavigation.typoscript | 34 +++++++++++++++++++ 6 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.typoscript diff --git a/Documentation/CodeSnippets/Config/Menus.php b/Documentation/CodeSnippets/Config/Menus.php index 929d48fcb..79622a8ba 100644 --- a/Documentation/CodeSnippets/Config/Menus.php +++ b/Documentation/CodeSnippets/Config/Menus.php @@ -71,8 +71,8 @@ // special = rootline [ 'action' => 'createCodeSnippet', - 'caption' => 'EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html', - 'sourceFile' => 'EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html', + 'caption' => 'EXT:site_package/Resources/Private/PageView/Partials/Navigation/Breadcrumb.html', + 'sourceFile' => 'EXT:site_package/Resources/Private/PageView/Partials/Navigation/Breadcrumb.html', 'targetFileName' => 'CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt', ], ]; diff --git a/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt b/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt index d04fc21ba..dda16084a 100644 --- a/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt +++ b/Documentation/CodeSnippets/DataProcessing/TypoScript/DatabaseQueryProcessor.rst.txt @@ -17,7 +17,7 @@ as = myHaikus // recursively process the images in the records with the FilesProcessor dataProcessing { - 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 = files 10 { references.fieldName = image } diff --git a/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt b/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt index 363342b8d..8c46b6df8 100644 --- a/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt +++ b/Documentation/CodeSnippets/Menu/Template/BreadcrumbDataProcessor.rst.txt @@ -1,8 +1,8 @@ .. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html +.. Extracted from EXT:site_package/Resources/Private/PageView/Partials/Navigation/Breadcrumb.html .. code-block:: html - :caption: EXT:site_package/Resources/Private/Templates/Partials/Navigation/Breadcrumb.html + :caption: EXT:site_package/Resources/Private/PageView/Partials/Navigation/Breadcrumb.html <f:if condition="{breadcrumb}"> <div class="container"> diff --git a/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt b/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt index 7d3efd57e..dfb08484a 100644 --- a/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt +++ b/Documentation/CodeSnippets/PageTSconfig/Mod/CsvExport.rst.txt @@ -1,11 +1,10 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig +.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets +.. Extracted from EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig -.. code-block:: typoscript - :caption: EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig +.. code-block:: typoscript + :caption: EXT:examples/Configuration/TsConfig/Page/Mod/csvExport.tsconfig - mod.web_list { - csvDelimiter = ; - csvQuote = ' - } - \ No newline at end of file + mod.web_list { + csvDelimiter = ; + csvQuote = ' + } diff --git a/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt b/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt index 29bfe83d9..1c947d381 100644 --- a/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt +++ b/Documentation/CodeSnippets/PageTSconfig/Mod/noExportRecordsLinks.rst.txt @@ -1,10 +1,9 @@ -.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets -.. Extracted from EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig +.. Generated by https://github.com/TYPO3-Documentation/t3docs-codesnippets +.. Extracted from EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig -.. code-block:: typoscript - :caption: EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig +.. code-block:: typoscript + :caption: EXT:examples/Configuration/TsConfig/Page/Mod/noExportRecordsLinks.tsconfig - mod.web_list { - noExportRecordsLinks = 1 - } - \ No newline at end of file + mod.web_list { + noExportRecordsLinks = 1 + } diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.typoscript new file mode 100644 index 000000000..1311fd100 --- /dev/null +++ b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BrowseNavigation.typoscript @@ -0,0 +1,34 @@ +page = PAGE +page { + 10 = PAGEVIEW + 10 { + dataProcessing { + 50 = menu + 50 { + special = browse + as = prevNavigation + special { + items = prev + items.prevnextToSection = 1 + } + } + 60 = menu + 60 { + special = browse + as = nextNavigation + special { + items = next + items.prevnextToSection = 1 + } + } + 70 = menu + 70 { + special = browse + as = upNavigation + special { + items = up + } + } + } + } +} From 871d276ecc82d1dce609fbc9decf446f21dfcfff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 23 Feb 2025 08:10:07 +0100 Subject: [PATCH 087/125] [Backport 13.4] [BUGFIX] Fix getText flexform syntax (#1532) * [BUGFIX] Fix getText flexform syntax * Remove incorrect info about flexform separator character --------- Co-authored-by: Georg Tiefenbrunn <georg.tiefenbrunn@gmail.com> --- Documentation/Functions/Data.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index 27ad97ac2..9ef02526c 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -373,10 +373,9 @@ flexform .. confval:: flexform :name: data-flexform - :Syntax: flexform : [field containing flexform data].[property of this flexform] + :Syntax: flexform : [field containing flexform data] : [property of this flexform] - Access values from :ref:`FlexForms <t3coreapi:flexforms>`, for example inside of :sql:`tt_content` record. In contrast - to most parts, deeper levels are accessed through dots, not pipes. + Access values from :ref:`FlexForms <t3coreapi:flexforms>`, for example inside of :sql:`tt_content` record. .. _data-type-gettext-flexform-example: From 8b943ab04b95c4eddf27f29887cefe0fedbb1236 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 07:59:22 +0100 Subject: [PATCH 088/125] [TASK] Move TSconfig Syntax into general syntax chapter (#1533) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Syntax/Index.rst | 9 ++++++--- .../Syntax.rst => Syntax/TSconfig/Index.rst} | 15 +++++++-------- Documentation/UsingSettingTSconfig/Index.rst | 14 -------------- 3 files changed, 13 insertions(+), 25 deletions(-) rename Documentation/{UsingSettingTSconfig/Syntax.rst => Syntax/TSconfig/Index.rst} (59%) diff --git a/Documentation/Syntax/Index.rst b/Documentation/Syntax/Index.rst index dac51bc16..7d408571c 100644 --- a/Documentation/Syntax/Index.rst +++ b/Documentation/Syntax/Index.rst @@ -1,7 +1,9 @@ :navigation-title: Syntax -.. include:: /Includes.rst.txt -.. index:: TypoScript; Syntax -.. _typoscript-syntax: + +.. include:: /Includes.rst.txt +.. index:: TypoScript; Syntax +.. _typoscript-syntax: +.. _syntax: ================= TypoScript syntax @@ -21,3 +23,4 @@ store configuration in this structure. Conditions/Index FileImports/Index StringFormats/Index + TSconfig/Index diff --git a/Documentation/UsingSettingTSconfig/Syntax.rst b/Documentation/Syntax/TSconfig/Index.rst similarity index 59% rename from Documentation/UsingSettingTSconfig/Syntax.rst rename to Documentation/Syntax/TSconfig/Index.rst index f63fd9c89..5ce467aa7 100644 --- a/Documentation/UsingSettingTSconfig/Syntax.rst +++ b/Documentation/Syntax/TSconfig/Index.rst @@ -1,10 +1,11 @@ -.. include:: /Includes.rst.txt -.. index:: Syntax -.. _syntax: +:navigation-title: TSconfig differences -====== -Syntax -====== +.. include:: /Includes.rst.txt +.. _tsconfig-syntax: + +================================================================== +Differences in the syntax between TSconfig and frontend TypoScript +================================================================== While the objects, properties and conditions are different, the *syntax* of TSconfig is basically the same as it is for @@ -13,8 +14,6 @@ TypoScript in frontend TypoScript templates. Please note the following differences: * There are differences in the :ref:`conditions <conditions>` that can be used. -* The general TypoScript syntax is described in - :ref:`TypoScript syntax <t3tsref:typoscript-syntax>`. .. note:: :ref:`Site settings <t3coreapi:sitehandling-settings>` can be used with the diff --git a/Documentation/UsingSettingTSconfig/Index.rst b/Documentation/UsingSettingTSconfig/Index.rst index 9b60339f8..4c5f4591b 100644 --- a/Documentation/UsingSettingTSconfig/Index.rst +++ b/Documentation/UsingSettingTSconfig/Index.rst @@ -42,19 +42,6 @@ in which case it is known as "User TSconfig". Lists different options of how to include User TSconfig options. - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 - - .. container:: card px-0 h-100 - - .. rst-class:: card-header h3 - - .. rubric:: :ref:`Syntax <syntax>` - - .. container:: card-body - - A short introduction in the syntax of TSconfig and how it differs - from TypoScript setup. - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 .. container:: card px-0 h-100 @@ -87,6 +74,5 @@ in which case it is known as "User TSconfig". PageTSconfig UserTSconfig - Syntax Conditions PhpApi From 140ab2bb4429b11e85668bc855a2b1a817801c1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:59:12 +0100 Subject: [PATCH 089/125] [TASK] Use new Cards directive (#1536) Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/UsingSettingTSconfig/Index.rst | 57 ++++++-------------- 1 file changed, 16 insertions(+), 41 deletions(-) diff --git a/Documentation/UsingSettingTSconfig/Index.rst b/Documentation/UsingSettingTSconfig/Index.rst index 4c5f4591b..6fe881733 100644 --- a/Documentation/UsingSettingTSconfig/Index.rst +++ b/Documentation/UsingSettingTSconfig/Index.rst @@ -16,57 +16,32 @@ TSconfig can be used in page, it is then referred to as in which case it is known as "User TSconfig". -.. container:: row m-0 p-0 +.. card-grid:: + :columns: 1 + :columns-md: 2 + :gap: 4 + :class: pb-4 + :card-height: 100 - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 + .. card:: :ref:`Setting Page TSconfig <setting-page-tsconfig>` - .. container:: card px-0 h-100 + Lists different options of how to include Page TSconfig options. - .. rst-class:: card-header h3 - .. rubric:: :ref:`Setting Page TSconfig <setting-page-tsconfig>` + .. card:: :ref:`Setting User TSconfig <setting-user-tsconfig>` - .. container:: card-body + Lists different options of how to include User TSconfig options. - Lists different options of how to include Page TSconfig options. - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 + .. card:: :ref:`Conditions <conditions>` - .. container:: card px-0 h-100 + Explains how Conditions can be used in TSconfig of both user and + page. - .. rst-class:: card-header h3 + .. card:: :ref:`PHP API <phpapi>` - .. rubric:: :ref:`Setting User TSconfig <setting-user-tsconfig>` - - .. container:: card-body - - Lists different options of how to include User TSconfig options. - - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 - - .. container:: card px-0 h-100 - - .. rst-class:: card-header h3 - - .. rubric:: :ref:`Conditions <conditions>` - - .. container:: card-body - - Explains how Conditions can be used in TSconfig of both user and - page. - - .. container:: col-md-6 pl-0 pr-3 py-3 m-0 - - .. container:: card px-0 h-100 - - .. rst-class:: card-header h3 - - .. rubric:: :ref:`PHP API <phpapi>` - - .. container:: card-body - - Explains how TSconfig can be retrieved from and used - within the PHP code of backend modules. + Explains how TSconfig can be retrieved from and used + within the PHP code of backend modules. .. toctree:: :titlesonly: From 4c86144120a70e733fc247d86e76f2bbe8849cbd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:25:33 +0100 Subject: [PATCH 090/125] fix: avoid new line in the middle of a sentence (#1539) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4, 12.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/TopLevelObjects/Page/Index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index f04492cbb..d2e6fc00c 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -226,7 +226,8 @@ Properties This is the default body tag. It is overridden by :ref:`setup-page-bodyTag`, if that is set. - .. note:: Additionally to the body tag properties noted here, + .. note:: + Additionally to the body tag properties noted here, there also is the property :confval:`config.disableBodyTag <config-disableBodyTag>`, which, if set, disables body tag generation independently from what might be set here. From 5457aac5084dd09160d4e549109acf0b7db82228 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 09:54:13 +0100 Subject: [PATCH 091/125] [Backport 13.4] [TASK] Display page and config on top level of Frontend TypoScript (#1541) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [BUGFIX] Display page and config on top level of Frontend TypoScript The page is the starting point for whatever rendering is configured via TypoScript. It is hard to find within the "Top level object." The TypoScript config also has a central and special handling. Leave hints of how they can be found in the previous place in the Top Level objects Releases: main, 13.4 * Apply suggestions from code review * Update Documentation/TopLevelObjects/PageAndConfig.rst Co-authored-by: Stefan Frömken <froemken@gmail.com> --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Stefan Frömken <froemken@gmail.com> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/Index.rst | 2 + Documentation/TopLevelObjects/Config.rst | 39 +++++--------- Documentation/TopLevelObjects/Index.rst | 4 +- Documentation/TopLevelObjects/Page/Index.rst | 13 +++-- .../TopLevelObjects/PageAndConfig.rst | 52 +++++++++++++++++++ 5 files changed, 76 insertions(+), 34 deletions(-) create mode 100644 Documentation/TopLevelObjects/PageAndConfig.rst diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 356931afc..f398e78ca 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -52,8 +52,10 @@ chapter. :maxdepth: 1 :titlesonly: + TopLevelObjects/Page/Index ContentObjects/Index DataProcessing/Index + TopLevelObjects/Config TopLevelObjects/Index Functions/Index Conditions/Index diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index 1ae2e2f72..e107fa54d 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -1,3 +1,5 @@ +:navigation-title: Config + .. include:: /Includes.rst.txt .. index:: config @@ -7,38 +9,23 @@ .. _config-datatype: .. _top-level-objects-config: -=============== -CONFIG & config -=============== - -.. contents:: Table of content - :depth: 1 - -.. _top-level-objects-config-about: - -The 'config' top-level-object -============================= +================================== +`config`: TypoScript configuration +================================== -Internally TYPO3 always creates an array `config` with various configuration -values which are evaluated during the rendering process and treated in some -special, predefined and predictive way. This is what we mean when we say the -property `config`, actually the array `'config'` is of type CONFIG. It is a -"top-level-object" because it is not subordinate to any other configuration -setting. - -In PHP you can refer to the array within :file:`typo3/sysext/frontend/Classes/` -files by writing :php:`$GLOBALS['TSFE']->config['config']`. - -This typoscript "top level object" `config` provides access to the internal -array. This means, that configuration settings can be made easily. For example: +The `config` top-level object does not have to be initialized, configuration +settings can be made like this: .. code-block:: + :caption: config/sites/my_site/setup.typoscript # TypoScript - config.debug = 1 + config { + headerComment = Made with ❤ by your TYPO3 Documentation Team + } - # will produce, in php - $GLOBALS['TSFE']->config['config']['debug'] // with value 1 +.. contents:: Table of content + :depth: 1 .. _setup-config-xmlprologue: .. _setup-config-typolinklinkaccessrestrictedpages-ATagParams: diff --git a/Documentation/TopLevelObjects/Index.rst b/Documentation/TopLevelObjects/Index.rst index 74f299ebe..803ecfe38 100644 --- a/Documentation/TopLevelObjects/Index.rst +++ b/Documentation/TopLevelObjects/Index.rst @@ -34,12 +34,10 @@ config :ref:`CONFIG <config-datatype>` :ref:`sitetitle <tlo-sitetitle>` readonly ===================================== ========================= - .. toctree:: :hidden: - Config + PageAndConfig Module - Page/Index Plugin Other diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index d2e6fc00c..528ed8860 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -1,14 +1,17 @@ +:navigation-title: Page + .. include:: /Includes.rst.txt .. index:: - PAGE - Top-level objects; page + PAGE + Top-level objects; page .. _page: .. _page-datatype: .. _object-type-page: -==== -PAGE -==== + +================================ +`PAGE` object type in TypoScript +================================ This defines what is rendered in the frontend. diff --git a/Documentation/TopLevelObjects/PageAndConfig.rst b/Documentation/TopLevelObjects/PageAndConfig.rst new file mode 100644 index 000000000..79362415d --- /dev/null +++ b/Documentation/TopLevelObjects/PageAndConfig.rst @@ -0,0 +1,52 @@ +:navigation-title: page & config + +.. include:: /Includes.rst.txt +.. _page-config: + +=============================================== +`page` and `config` on the TypoScript top level +=============================================== + +By convention the main rendering of a page (page type 0) is configured in a top +level object called `page`. It is of type +`PAGE <https://docs.typo3.org/permalink/t3tsref:object-type-page>`_. + +The main TypoScript configuration is always done in a top level object called +`config`. It is of type +`CONFIG <https://docs.typo3.org/permalink/t3tsref:top-level-objects-config>`_. + +.. contents:: Table of Contents + +.. _top-level-objects-page: + +The 'page' top-level-object +============================= + +The `page` object should be of type `PAGE <https://docs.typo3.org/permalink/t3tsref:object-type-page>`_ +with property :ref:`typeNum <t3tsref:confval-page-typenum>` (also called page type) +set to `0`, which is the default. + +Some site package authors decide to give the main `PAGE <https://docs.typo3.org/permalink/t3tsref:object-type-page>`_ +object a different top level name like `mypage`, however this can be confusing +to subsequent integrators and not compatible with extensions that also make +settings to the `page` top level object. + +TYPO3 does not initialize :typoscript:`page` by default. You must initialize this +explicitly, for example: + +.. code-block:: typoscript + :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript + + page = PAGE + +.. _top-level-objects-config-about: + +The 'config' top-level-object +============================= + +Internally TYPO3 always creates an array `config` with various configuration +values which are evaluated during the rendering process and treated in some +special, predefined and predictive way. This is what we mean when we say the +property `config`, actually the array `'config'` is of type CONFIG. It is a +"top-level-object" because it is not subordinate to any other configuration +setting. From 938873aa6a2b54f6c2e2ce03e6dc65d140b2ff92 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 17:05:39 +0100 Subject: [PATCH 092/125] [Backport 13.4] [BUGFIX] Handle record export and download options individually (#1542) * [BUGFIX] Handle record export and download options individually Resolves: https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/850 Releases: main, 13.4, 12.4 * Update Documentation/PageTsconfig/Mod/WebList.rst * Update Documentation/PageTsconfig/Mod/WebList.rst * [TASK] Minor language corrections Releases:main, Backport 12.4) --------- Co-authored-by: lina.wolf <lwolf@w-commerce.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Sarah McCarthy <sarahmccarthy123@yahoo.com> --- Documentation/PageTsconfig/Mod/WebList.rst | 51 ++++++++++++++++++---- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/Documentation/PageTsconfig/Mod/WebList.rst b/Documentation/PageTsconfig/Mod/WebList.rst index 32958d4b5..670722fbc 100644 --- a/Documentation/PageTsconfig/Mod/WebList.rst +++ b/Documentation/PageTsconfig/Mod/WebList.rst @@ -203,6 +203,42 @@ displayColumnSelector the :guilabel:`List` module. It can be used to compare different fields of the listed records. +.. _pageTsConfigWebList-displayRecordDownload: + +displayRecordDownload +===================== + +.. confval:: displayRecordDownload + :name: mod-web-list-displayRecordDownload + :type: boolean + :Default: `1` + + The "Download" functionality is available in the :guilabel:`Web > List` + module via the "Download" button in the relevant + table header row. It is available in both the list and the single table + view and can be managed using this option. + + As well as the general option, it is also possible to set this option on + a table basis using the + :typoscript:`mod.web_list.table.<tablename>.displayRecordDownload` option. + If this option is set, it takes precedence over the general option. + + .. code-block:: typoscript + :caption: packages/my_sitepackage/Configuration/Sets/MySet/page.tsconfig + + # Page TSconfig + mod.web_list { + # Disable "Export" button in List module header + noExportRecordsLinks = 1 + + # Generally disable "Download" button + displayRecordDownload = 0 + + # Enable "Download" button for table "tt_content" + table.tt_content.displayRecordDownload = 1 + } + + .. _pageTsConfigWebList-displayColumnSelector-example: Example: Hide the column selector @@ -517,7 +553,6 @@ Example: Hide the "Create new record" link. .. index:: noExportRecordsLinks Buttons; Export - Buttons; Download .. _pageTsConfigWebList-noExportRecordsLinks: noExportRecordsLinks @@ -528,15 +563,15 @@ noExportRecordsLinks :type: boolean :Default: 0 - If set, the :guilabel:`Download` and :guilabel:`Export` buttons are hidden - in the list module. This applies to - the :guilabel:`Export` button located at the top left for t3d exports, the - :guilabel:`Download` button directly on the table - listing for csv download and the :guilabel:`Download` button in the tables - single view. + .. versionchanged:: 13.1.0, 12.4.11 + Up until these versions this option also hid the + :guilabel:`Download` button used for CSV export. + + If set, the :guilabel:`Download` button is hidden + in the :guilabel:`Web > List` module. This option is for example important to disable batch - download of sensitive data via CSV or t3d exports. + download of sensitive data via t3d exports. .. include:: /Images/AutomaticScreenshots/WebList/WithExportButtons.rst.txt From 1bb57234dd0159d34c359dbb3f1c3b2100f1f26d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 09:15:29 +0100 Subject: [PATCH 093/125] [BUGFIX] Provide default configuration for browse menu (#1544) References: https://review.typo3.org/c/Packages/TYPO3.CMS/+/88332 Releases: main, 13.4, 12.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/DataProcessing/MenuProcessor/Browse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DataProcessing/MenuProcessor/Browse.rst b/Documentation/DataProcessing/MenuProcessor/Browse.rst index 74b54a405..ab3d67fb3 100644 --- a/Documentation/DataProcessing/MenuProcessor/Browse.rst +++ b/Documentation/DataProcessing/MenuProcessor/Browse.rst @@ -46,7 +46,7 @@ Properties .. confval:: special.items :name: hmenu-browse-special-items :type: list of item names separated by `|` - :Required: + :Default: `index|up|next|prev` A list, separated by pipes `|`, containing the following item types: From 75d4e108fb0c86c96a36ee2ccdf7466d47efc16f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:53:40 +0100 Subject: [PATCH 094/125] Corrected <f:cObject> in _Default.html (#1547) The old code did not work and caused errors. Co-authored-by: Christian Ludwig <cl@viazenetti.de> --- .../PageTsconfig/Mod/WebLayout/_Default.html | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Documentation/PageTsconfig/Mod/WebLayout/_Default.html b/Documentation/PageTsconfig/Mod/WebLayout/_Default.html index b4d7dca43..e01923a7b 100644 --- a/Documentation/PageTsconfig/Mod/WebLayout/_Default.html +++ b/Documentation/PageTsconfig/Mod/WebLayout/_Default.html @@ -1,11 +1,12 @@ <f:render partial="Jumbotron" arguments="{jumbotronContent: myContent.jumbotron}"/> <main> - <f:for each="{myContent.left.records}" as="contentElement"> - <f:cObject typoscriptObjectPath="tt_content.{contentElement.data.CType}" - data="{contentElement.data}" - table="tt_content" - /> - </f:for> + <f:for each="{myContent.left.records}" as="contentElement"> + <f:cObject + typoscriptObjectPath="{contentElement.mainType}" + data="{contentElement.rawRecord}" + table="{contentElement.mainType}" + /> + </f:for> </main> <aside> <f:render partial="Aside" arguments="{content: myContent.right}"/> From 1df4cba817e0cbb47925fe8c53b0cdb9248d505e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 15:33:20 +0100 Subject: [PATCH 095/125] [Backport 13.4] Add section about Template naming and locations to PAGEVIEW (#1548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Index.rst I just try to get PAGEVIEW running and get errors like: Tried resolving a template file for controller action "Default->Pages/Default" in format ".html", but none of the paths contained the expected template file (Default/Pages/Default.html). That's why I would prefer to provide a running example in first section, before we start explaining the containing variables for Fluid templating. * Apply suggestions from code review Co-authored-by: Garvin Hicking <38074677+fe-hicking@users.noreply.github.com> * Improve content * Update Documentation/ContentObjects/Pageview/Index.rst * Update Documentation/ContentObjects/Pageview/Index.rst --------- Co-authored-by: Stefan Frömken <froemken@gmail.com> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> Co-authored-by: Garvin Hicking <38074677+fe-hicking@users.noreply.github.com> --- .../ContentObjects/Pageview/Index.rst | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Documentation/ContentObjects/Pageview/Index.rst b/Documentation/ContentObjects/Pageview/Index.rst index be9653953..8d5edb078 100644 --- a/Documentation/ContentObjects/Pageview/Index.rst +++ b/Documentation/ContentObjects/Pageview/Index.rst @@ -40,6 +40,42 @@ Example: Display a page with Fluid templates :language: typoscript :caption: EXT:my_sitepackage/Configuration/TypoScript/setup.typoscript +.. _cobj-pageview-template-naming: + +Template naming and locations +============================= + +To ensure proper rendering, the following requirements and +fallback mechanisms apply: + +.. _cobj-pageview-template-naming-path: + +Target path structure +--------------------- + +* The target directory **must contain a folder named :directory:`Pages/`**. +* This folder must contain Fluid templates in :file`*.html` format. + +.. _cobj-pageview-template-naming-conventions: + +Template naming convention +-------------------------- + +* The Fluid template file **must** match the name of the selected backend layout + of your current page. +* The first letter of the Fluid template file must be **uppercase**. + +.. _cobj-pageview-template-naming-fallback: + +Fallback behavior when no backend layout is defined +---------------------------------------------------- + +* If the page record does not specify a backend layout, TYPO3 tries to detect + next-level backend layouts by traversing up the page rootline. +* If still no backend layout could be found, TYPO3 falls back to `Default.html`. +* If you explicitly set the backend layout to `none`, a Fluid template + with name :file:`None.html` will be used. + .. _cobj-pageview-data: Default variables in Fluid templates From 37ea6ff70ca5637afb5c51e67f4082e8a2fc902e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 22:40:20 +0100 Subject: [PATCH 096/125] Fix wrong assignment (#1550) Assign "PAGE" instead of "10" here. Co-authored-by: Ralf Merz <mail@merzilla.de> --- Documentation/Guide/Page/_fluid-template.typoscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/Guide/Page/_fluid-template.typoscript b/Documentation/Guide/Page/_fluid-template.typoscript index bba907095..1ceb8f032 100644 --- a/Documentation/Guide/Page/_fluid-template.typoscript +++ b/Documentation/Guide/Page/_fluid-template.typoscript @@ -1,4 +1,4 @@ -page = 10 +page = PAGE page { 10 = PAGEVIEW 10 { From 9612a99862c5163382975d94988fa316c9370ef3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:27:31 +0100 Subject: [PATCH 097/125] Add ServerRequestInterface to user function (#1556) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4, 12.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/ContentObjects/UserAndUserInt/_Hostname.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Documentation/ContentObjects/UserAndUserInt/_Hostname.php b/Documentation/ContentObjects/UserAndUserInt/_Hostname.php index e20bece27..28225f064 100644 --- a/Documentation/ContentObjects/UserAndUserInt/_Hostname.php +++ b/Documentation/ContentObjects/UserAndUserInt/_Hostname.php @@ -4,6 +4,8 @@ namespace Vendor\SitePackage\UserFunctions; +use Psr\Http\Message\ServerRequestInterface; + final class Hostname { /** @@ -11,9 +13,10 @@ final class Hostname * * @param string Empty string (no content to process) * @param array TypoScript configuration + * @param ServerRequestInterface The current PSR-7 request object * @return string HTML result */ - public function getHostname(string $content, array $conf): string + public function getHostname(string $content, array $conf, ServerRequestInterface $request): string { return gethostname() ?: ''; } From bf56ae935e7698a4381fbe1435e67dfdedfa536d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:27:49 +0100 Subject: [PATCH 098/125] [Backport 13.4] Improve hint regarding unavailable variables (#1557) * Improve hint regarding unavailable variables * Apply suggestions from code review --------- Co-authored-by: Daniel Siepmann <daniel.siepmann@codappix.com> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/Conditions/Index.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 927c7d913..6b7df471e 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -792,6 +792,9 @@ traverse() # Traverse query parameters of current request along tx_news_pi1[news] [request && traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0] + # Traverse page properties for current page + [traverse(page ?? [], "pid") == 65] + .. tip:: Checking for the :ref:`request object <t3coreapi:typo3-request>` to be available before using :typoscript:`traverse()` may be necessary, for @@ -801,6 +804,9 @@ traverse() available). This avoids the error `Unable to call method "getQueryParams" of non-object "request"`. + Same is true for the `page` variable, which might not be available + in all contexts, for example backend modules without a page. + One can use the `?? []` workaround. .. index:: Conditions; compatVersion .. _condition-function-compatVersion: From 7b51644359d8c421d896166aea8287ec628f3682 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:07:59 +0100 Subject: [PATCH 099/125] typo in TypoScript (#1558) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the example above, it should be uids not uid https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Pageview/Index.html#cobj-pageview-data-settings-example Co-authored-by: Sven Jürgens <SvenJuergens@users.noreply.github.com> --- .../ContentObjects/Pageview/_includes/_PageWithConstant.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/ContentObjects/Pageview/_includes/_PageWithConstant.html b/Documentation/ContentObjects/Pageview/_includes/_PageWithConstant.html index d5483e4e9..93acd8b79 100644 --- a/Documentation/ContentObjects/Pageview/_includes/_PageWithConstant.html +++ b/Documentation/ContentObjects/Pageview/_includes/_PageWithConstant.html @@ -4,6 +4,6 @@ <p>...</p> </main> <footer> - See also our <f:page pageUid="{settings.page.uid.dataPrivacy}">data privacy policy</f:page> + See also our <f:page pageUid="{settings.page.uids.dataPrivacy}">data privacy policy</f:page> </footer> </f:section> \ No newline at end of file From 063349c3eacd39e87e4b86874d7f22db5dcd4fa9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 17:35:29 +0200 Subject: [PATCH 100/125] Use alias for data processor instead of FQCN (#1563) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- .../_code-snippets/_BreadcrumbDataProcessor.typoscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript index 396877f8b..2ddab6649 100644 --- a/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript +++ b/Documentation/DataProcessing/MenuProcessor/_code-snippets/_BreadcrumbDataProcessor.typoscript @@ -2,7 +2,7 @@ page { 10 = FLUIDTEMPLATE 10 { dataProcessing { - 1657927210 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 1657927210 = menu 1657927210 { special = rootline special.range = 0|-1 From 9d275b5a69948d1c6d79a6d4cd14cc358734c012 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 17:35:39 +0200 Subject: [PATCH 101/125] adjust header level of examples on PAGEVIEW page (#1564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Examples are currently located under properties, which is not correct. The examples should be on the same level as properties. Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/ContentObjects/Pageview/Index.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/ContentObjects/Pageview/Index.rst b/Documentation/ContentObjects/Pageview/Index.rst index 8d5edb078..f98ba5e53 100644 --- a/Documentation/ContentObjects/Pageview/Index.rst +++ b/Documentation/ContentObjects/Pageview/Index.rst @@ -233,12 +233,12 @@ Properties .. _cobj-pageview-examples: Examples --------- +======== .. _cobj-pageview-dataProcessing-example: Example: Display a main menu and a breadcrumb on the page -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------------------------------- .. literalinclude:: _includes/_pageWithBreadcrumb.typoscript :language: typoscript @@ -266,7 +266,7 @@ And .. _cobj-pageview-paths-example: Example: Define a path that contains all templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------------------- This is a basic definition of a :fluid:`PAGEVIEW` object with only one path to the templates: @@ -326,7 +326,7 @@ are expected in folder .. _cobj-pageview-paths-example-extended: Example: Define fallbacks for a template paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------------- You can use the directories defined in :confval:`pageview-paths` to define fallback directories for the templates: @@ -351,7 +351,7 @@ in :path:`EXT:my_basic_sitepackage/Resources/Private/PageView/Pages/`. .. _cobj-pageview-variables-example: Example: Make additional variables available in the Fluid template -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------------------------ .. literalinclude:: _includes/_pageWithVariables.typoscript :langugage: typoscript From 57fc97af1fa73cba87619bd9c879f948e448a884 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 22:07:23 +0200 Subject: [PATCH 102/125] [Backport 13.4] setup-page-bodyTag should not point to Properties (#1569) * setup-page-bodyTag should not point to Properties If you click on the link setup-page-bodyTag`, then you come to bodyTagCObject back again. This is misleading. You need to come to bodyTag. bodyTagCObject :name: page-bodyTagCObject :type: cObject This is the default body tag. It is overridden by :ref:`setup-page-bodyTag` * change local link The TYPO3 documentation REST cheat sheet seems to be missing the local references link description. * Update Documentation/TopLevelObjects/Page/Index.rst --------- Co-authored-by: Franz Holzinger <franz.holzinger@festwein.de> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/TopLevelObjects/Page/Index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index 528ed8860..483d39d72 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -148,6 +148,8 @@ These are just recommendations. However, especially the name page for the conten is very common and most documentation will imply that your main page object is called page. .. index:: PAGE; Properties +.. _setup-page-bodytag: +.. _setup-page-bodytagadd: .. _setup-page-bodytagcobject: .. _setup-page-config: .. _setup-page-cssinline: @@ -170,8 +172,6 @@ is very common and most documentation will imply that your main page object is c .. _setup-page-stdwrap: .. _setup-page-typenum: .. _setup-page-wrap: -.. _setup-page-bodytagadd: -.. _setup-page-bodytag: .. _setup-page-array: .. _page_properties: @@ -226,7 +226,7 @@ Properties :name: page-bodyTagCObject :type: cObject - This is the default body tag. It is overridden by :ref:`setup-page-bodyTag`, + This is the default body tag. It is overridden by :ref:`confval-page-bodytag`, if that is set. .. note:: From 1d0a6e555996a877cd06ec15ede01e93aa22edba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 22:08:04 +0200 Subject: [PATCH 103/125] Link examples to cache configuration from text (#1568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Although the link is given directly in the confval it is easier for users to just click on the link instead scrolling up and click (if you know already that there is a link above). Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/TopLevelObjects/Config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index e107fa54d..3170f973e 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -165,7 +165,7 @@ Properties of 'config' config.cache.<page-id> = <table name>:<storage-pid> Multiple record sources can be added as comma-separated list, see the - examples. + :ref:`examples <setup-config-cache>`. You can use the keyword "all" instead of a <page-id> to consider records for the cache lifetime of all pages. From 886b979606a9e41901735fbaf34173994209fcb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 28 May 2025 11:54:44 +0200 Subject: [PATCH 104/125] [Backport 13.4] clear the wording (#1571) * clear the wording This is not understandable: "Although you cannot override values TypoScript-style (using the operators and all) the properties of the object which has the reference will be merged with the configuration of the reference." * [TASK] Minor language corrections Releases:main, Backport 12.4) --------- Co-authored-by: Franz Holzinger <franz.holzinger@festwein.de> Co-authored-by: Sarah McCarthy <sarahmccarthy123@yahoo.com> --- .../GeneralInformation/Index.rst | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Documentation/ContentObjects/GeneralInformation/Index.rst b/Documentation/ContentObjects/GeneralInformation/Index.rst index f416f8c15..442ef3701 100644 --- a/Documentation/ContentObjects/GeneralInformation/Index.rst +++ b/Documentation/ContentObjects/GeneralInformation/Index.rst @@ -92,30 +92,29 @@ But this is not the case with :typoscript:`tt_content.bullets.10`. Here :typoscript:`lib.stdheader` is referenced and :typoscript:`lib.stdheader` will be used as the cObject at *runtime*. -The reason why lib.stdheader was copied in the first case is the fact -that it's needed to unset ".stdWrap.space" inside the cObject -(:typoscript:`10.stdWrap.space >`). This could **not** be done in the second case -where only a pointer is created. +The reason why lib.stdheader is copied (and not referenced) in the first case is the fact +that ".stdWrap.space" can be unset inside the cObject +(:typoscript:`10.stdWrap.space >`). This **cannot** be done in the second case +because it is only a reference pointer. .. _reusing-cobjects-temp-objects: -Note: ------ +Reusing Temporary TypoScript Objects: +------------------------------------- -If :typoscript:`lib.stdheader` was :typoscript:`temp.stdheader` instead, the pointer would +If :typoscript:`temp.stdheader` had been used instead of :typoscript:`lib.stdheader`, the reference pointer would not work! This is due to the fact that the runtime-reference would find nothing in `temp.` as this is unset before the template is stored -in cache! +in the cache! This goes for :typoscript:`temp.` and :typoscript:`styles.` (see the top-level object definition elsewhere). Overriding values anyway: -Although you cannot override values TypoScript-style (using the -operators and all) the properties of the object which has the -reference will be merged with the configuration of the reference. +Although you cannot override values in :typoscript:`styles.`, the properties of the object which gets a +copy of the reference will be merged with the configuration of the reference. .. _reusing-cobjects-examples: @@ -139,8 +138,8 @@ The result is this configuration: .. include:: /Images/ManualScreenshots/FrontendOutput/StdWrap/ContentObjectsExampleMerge1.rst.txt -Notice that :typoscript:`.value` was *not* cleared, because it's simply two arrays -which are joined: +Notice that :typoscript:`.value` was *not* cleared, because these two arrays +are simply merged: .. include:: /Images/ManualScreenshots/FrontendOutput/StdWrap/ContentObjectsExampleMerge2.rst.txt From 369daf1f0066761f402c55851f16afe185efa19d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 28 May 2025 12:16:52 +0200 Subject: [PATCH 105/125] [FEATURE] Restructure conditions docs (#1573) Improve headlines and structure, move examples to typoscript files or inline Releases: main, 13.4, 12.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .../TypoScriptSyntax/Conditions1.rst.txt | 10 - .../TypoScriptSyntax/Conditions2.rst.txt | 13 - .../TypoScriptSyntax/Conditions3.rst.txt | 16 -- .../TypoScriptSyntax/Conditions4.rst.txt | 19 -- .../TypoScriptSyntax/Conditions5.rst.txt | 12 - Documentation/Conditions/Index.rst | 9 +- Documentation/Syntax/Conditions/Index.rst | 244 ++++++++++-------- .../_codesnippets/_andor.typoscript | 7 + .../_codesnippets/_basic.typoscript | 10 + .../_codesnippets/_condition.typoscript | 5 + .../Conditions/_codesnippets/_not.typoscript | 14 + .../UsingSettingTSconfig/Conditions.rst | 8 +- 12 files changed, 182 insertions(+), 185 deletions(-) delete mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt delete mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt delete mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt delete mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt delete mode 100644 Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt create mode 100644 Documentation/Syntax/Conditions/_codesnippets/_andor.typoscript create mode 100644 Documentation/Syntax/Conditions/_codesnippets/_basic.typoscript create mode 100644 Documentation/Syntax/Conditions/_codesnippets/_condition.typoscript create mode 100644 Documentation/Syntax/Conditions/_codesnippets/_not.typoscript diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt deleted file mode 100644 index 8a21ddf72..000000000 --- a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt +++ /dev/null @@ -1,10 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. code-block:: typoscript - :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions1/setup.typoscript - - [date("j") == 9] - page.10.value = It is the 9th day of the month! - [ELSE] - page.10.value = It is NOT the 9th day of the month! - [END] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt deleted file mode 100644 index 6eb5061c4..000000000 --- a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt +++ /dev/null @@ -1,13 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. code-block:: typoscript - :caption: Extension examples, file Configuration/TypoScript/Conditions2/setup.typoscript - - # Some TypoScript, always parsed - [condition criteria] - # Some TypoScript, only parsed if the condition criteria is met - [ELSE] - # Some TypoScript, only parsed if the condition criteria is *not* met - # [ELSE] is optional - [GLOBAL] - # ... some TypoScript, always parsed diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt deleted file mode 100644 index 0c292d99b..000000000 --- a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt +++ /dev/null @@ -1,16 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. code-block:: typoscript - :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions3/setup.typoscript - - page = PAGE - page.10 = TEXT - page.10.value = HELLO WORLD! - - [frontend.user.isLoggedIn || ip('127.0.0.1')] - page.20 = TEXT - page.20 { - value = A frontend user is logged in, or the browser IP is 127.0.0.1 - stdWrap.case = upper - } - [GLOBAL] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt deleted file mode 100644 index da295179f..000000000 --- a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. code-block:: typoscript - :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions4/setup.typoscript - - page = PAGE - page.10 = TEXT - page.10.value = You are logged in - - # This is hard to read - [frontend.user.isLoggedIn] - [ELSE] - page.10.value = You are *not* logged in - [END] - - # This is faster to read - [!frontend.user.isLoggedIn] - page.10.value = You are *not* logged in - [END] diff --git a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt b/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt deleted file mode 100644 index 469b5ed2d..000000000 --- a/Documentation/CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -.. Automatic screenshot: Remove this line if you want to manually change this file - -.. code-block:: typoscript - :caption: Extension examples, file Configuration/TypoScript/Syntax/Conditions5/setup.typoscript - - # Invalid: Conditions must not be used within code blocks - someIdentifier { - someProperty = foo - [frontend.user.isloggedIn] - someProperty = bar - [GLOBAL] - } diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 6b7df471e..5bb197bf8 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -1,3 +1,5 @@ +:navigation-title: Conditions + .. include:: /Includes.rst.txt .. index:: Conditions @@ -12,10 +14,9 @@ .. _condition-functions-in-all-contexts: .. _condition-functions-in-frontend-context: - -========== -Conditions -========== +======================================= +Frontend TypoScript conditions criteria +======================================= Frontend TypoScript conditions offer a way to conditionally change TypoScript based on current context. Do not confuse conditions with the diff --git a/Documentation/Syntax/Conditions/Index.rst b/Documentation/Syntax/Conditions/Index.rst index b2fc943bb..97298c568 100644 --- a/Documentation/Syntax/Conditions/Index.rst +++ b/Documentation/Syntax/Conditions/Index.rst @@ -1,33 +1,26 @@ -.. include:: /Includes.rst.txt -.. index:: - TypoScript; Operator "[" - TypoScript; Conditions - TypoScript; [GLOBAL] condition - TypoScript; Symfony expression language -.. _typoscript-syntax-conditions: -.. _typoscript-syntax-syntax-square-brackets: -.. _typoscript-syntax-syntax-conditions: -.. _typoscript-syntax-syntax-value: -.. _typoscript-syntax-else-condition: -.. _typoscript-syntax-end-condition: -.. _typoscript-syntax-global-condition: -.. _typoscript-syntax-conditions-expression-language: -.. _typoscript-syntax-implementing-custom-conditions: - - -========== -Conditions -========== +:navigation-title: Conditions + +.. include:: /Includes.rst.txt +.. index:: + TypoScript; Operator "[" + TypoScript; Conditions + TypoScript; [GLOBAL] condition + TypoScript; Symfony expression language +.. _typoscript-syntax-conditions: +.. _typoscript-syntax-implementing-custom-conditions: +.. _typoscript-syntax-conditions-examples: + +=================================== +Conditions in the TypoScript syntax +=================================== TypoScript can contain :code:`if` and :code:`if / else` control structures. They are called `conditions`, their "body" is only considered if a condition criteria evaluates to true. Examples of condition criteria are: -- Is a user logged in? - -- Is it Monday? - -- Is the page called in a certain language? +- Is a user logged in? +- Is it Monday? +- Is the page called in a certain language? Conditions are a TypoScript syntax construct. They are thus available in both frontend TypoScript and backend TSconfig. However, condition criteria are based @@ -36,129 +29,164 @@ TypoScript and backend TSconfig. For example, the :typoscript:`frontend` variabl not exist in TSconfig, it is (obviously) impossible to have a backend TSconfig condition that checks for a logged in frontend user. -For a reference of allowed condition criteria, please refer to the according -chapter in the :ref:`frontend TypoScript Reference <conditions>` and -the :ref:`backend TSconfig Reference <tsconfig-conditions>`. These references -come with examples for single condition criteria as well. +.. contents:: Table of contents -The TSconfig and TypoScript backend modules show lists of existing conditions -and allow simulating criteria verdicts to analyze their impact on the -resulting TypoScript tree. +.. _typoscript-syntax-conditions-usage: -Condition criteria are based on -the `Symfony expression language <https://symfony.com/doc/current/components/expression_language/syntax.html>`__. -The Core allows extending the Symfony expression language with own variables and -functions, see :ref:`symfony expression language API <t3coreapi:sel-within-typoscript-conditions>` -for more details. +Basic usage of TypoScript conditions +==================================== +.. literalinclude:: _codesnippets/_basic.typoscript + :captions: packages/my_site_package/Configuration/TypoScript/setup.typoscript -Basic example -============= +.. _typoscript-syntax-conditions-syntax: + +Syntax and rules +================ -.. include:: /CodeSnippets/TypoScriptSyntax/Conditions1.rst.txt +These general rules apply: +.. _typoscript-syntax-conditions-confinements: +.. _typoscript-syntax-conditions-braces: +.. _typoscript-syntax-syntax-square-brackets: +.. _typoscript-syntax-syntax-conditions: -.. _typoscript-syntax-conditions-syntax: +General condition syntax +------------------------ -Syntax and rules -================ +Conditions are encapsulated in :typoscript:`[` and :typoscript:`]` -The general syntax is like this: +.. _typoscript-syntax-the-global-condition: +.. _typoscript-syntax-global-condition: +.. _typoscript-syntax-else-condition: +.. _typoscript-syntax-end-condition: -.. include:: /CodeSnippets/TypoScriptSyntax/Conditions2.rst.txt +`[GLOBAL]`, `[ELSE]` and `[END]` +-------------------------------- -These general rules apply: +:typoscript:`[ELSE]` negates a previous condition criteria and can contain +a new body until :typoscript:`[END]` or :typoscript:`[GLOBAL]`. :typoscript:`[ELSE]` +is considered if the condition criteria did *not* evaluate to true. -* Conditions are encapsulated in :typoscript:`[` and :typoscript:`]` +:typoscript:`[END]` and :typoscript:`[GLOBAL]` stop a given condition scope. +This is similar to a closing curly brace :code:`}` in programming languages like PHP. -* :typoscript:`[ELSE]` negates a previous condition criteria and can contain - a new body until :typoscript:`[END]` or :typoscript:`[GLOBAL]`. :typoscript:`[ELSE]` - is considered if the condition criteria did *not* evaluate to true. +.. literalinclude:: _codesnippets/_condition.typoscript + :captions: packages/my_site_package/Configuration/TypoScript/setup.typoscript -* :typoscript:`[END]` and :typoscript:`[GLOBAL]` stop a given condition scope. - This is similar to a closing curly brace :code:`}` in programming languages like PHP. +Conditions automatically stop at the end of a text snippet (file or record), even +without :typoscript:`[END]` or :typoscript:`[GLOBAL]`. Another snippet on the same +level is in "global" scope automatically. The backend TypoScript and +TSconfig modules may mumble about a not properly closed condition, though. -* Multiple condition criteria can be combined using :typoscript:`or` or :typoscript:`||`, - as well as :typoscript:`and` or :typoscript:`&&` +.. versionchanged:: 12.0 -* Single criteria can be negated using :typoscript:`!` + :typoscript:`[END]` and :typoscript:`[GLOBAL]` behave exactly the same. Both + are kept for historical reasons (for now). - .. versionchanged:: 12.0 + Conditions automatically stop at the end of a text snippet (file or record). - :typoscript:`[END]` and :typoscript:`[GLOBAL]` behave exactly the same. Both - are kept for historical reasons (for now). +.. _typoscript-syntax-end-condition-and: +.. _typoscript-syntax-end-condition-or: -* Conditions can use constants. They are available in frontend TypoScript "setup" and - in TSconfig from "site settings". A simple example if this constant - :typoscript:`myPageUid = 42` is set: +Combining multiple TypoScript conditions with `and` or `or` +----------------------------------------------------------- - .. code-block:: typoscript +Multiple condition criteria can be combined using :typoscript:`or` or :typoscript:`||`, +as well as :typoscript:`and` or :typoscript:`&&` - [traverse(page, "uid") == {$myPageUid}] - page.10.value = Page uid is 42 - [end] +.. literalinclude:: _codesnippets/_andor.typoscript + :captions: packages/my_site_package/Configuration/TypoScript/setup.typoscript -* Conditions can *not* be nested within code blocks. +Single criteria can be negated using :typoscript:`!` - .. versionchanged:: 12.0 +.. _typoscript-syntax-end-condition-constants: - Conditions *can* be nested into each other, if they are located in - different snippets (files or records), see example below. They can *not* be nested - within the same code snippet. +TypoScript constant usage in Conditions +--------------------------------------- -* A second condition that is *not* :typoscript:`[ELSE]`, :typoscript:`[END]` - or :typoscript:`[GLOBAL]` *stops* a previous condition and starts a new one. - This is the main reason conditions can *not* be nested within one text snippet. +Conditions can use constants. They are available in frontend TypoScript "setup" and +in TSconfig from "site settings". A simple example if this constant +:typoscript:`myPageUid = 42` is set: -* .. versionchanged:: 12.0 +.. code-block:: typoscript - :typoscript:`@import` *can* be nested - inside conditions. This allows conditional includes and is a new feature of the - TYPO3 v12 parser. + [traverse(page, "uid") == {$myPageUid}] + page.10.value = Page uid is 42 + [end] -* .. versionchanged:: 12.0 +.. _typoscript-syntax-end-condition-nesting: - Conditions automatically stop at the end of a text snippet (file or record), even - without :typoscript:`[END]` or :typoscript:`[GLOBAL]`. Another snippet on the same - level is in "global" scope automatically. The backend TypoScript and - TSconfig modules may mumble about a not properly closed condition, though. +Nesting conditions via TypoScript imports +----------------------------------------- -* .. versionadded:: 12.1 +Conditions can *not* be nested within code blocks. - Using the null-safe operator is possible when accessing properties on objects - which might not be available in some context, for example `TSFE` in the - backend: +.. code-block:: typoscript - .. code-block:: typoscript + # Invalid: Conditions must not be used within code blocks + # someIdentifier { + # someProperty = foo + # [frontend.user.isloggedIn] + # someProperty = bar + # [GLOBAL] + # } - # Previously - [getTSFE() && getTSFE().id == 123] +.. versionchanged:: 12.0 - # Now - [getTSFE()?.id == 123] +Conditions *can* be nested into each other, if they are located in +different snippets (files or records), see example below. They can *not* be nested +within the same code snippet. +A second condition that is *not* :typoscript:`[ELSE]`, :typoscript:`[END]` +or :typoscript:`[GLOBAL]` *stops* a previous condition and starts a new one. +This is the main reason conditions can *not* be nested within one text snippet. -.. _typoscript-syntax-conditions-usage: -.. _typoscript-syntax-conditions-combine: -.. _typoscript-syntax-conditions-confinements: -.. _typoscript-syntax-conditions-braces: -.. _typoscript-syntax-the-global-condition: -.. _typoscript-syntax-conditions-examples: +:typoscript:`@import` *can* be nested +inside conditions. This allows conditional includes and is a new feature of the +TYPO3 v12 parser. -Examples -======== +.. _typoscript-syntax-end-condition-null-save: -* If a user is logged in, or if the client is local, text will be - output in upper case: +Using the null-safe operator in conditions +------------------------------------------ - .. include:: /CodeSnippets/TypoScriptSyntax/Conditions3.rst.txt +.. versionadded:: 12.1 -* In case :code:`if` is empty and only a :code:`else` body is needed for a - single condition criteria, these two are identical: +Using the null-safe operator is possible when accessing properties on objects +which might not be available in some context, for example `TSFE` in the +backend: - .. include:: /CodeSnippets/TypoScriptSyntax/Conditions4.rst.txt +.. code-block:: typoscript -* Conditions can *not* be nested within curly braces. The example below - is invalid syntax and the backend modules mumble with "missing braces": + # Previously + # [getTSFE() && getTSFE().id == 123] - .. include:: /CodeSnippets/TypoScriptSyntax/Conditions5.rst.txt + # Now + [getTSFE()?.id == 123] + + +.. _typoscript-syntax-syntax-value: + +Allowed criteria in TypoScript conditions +========================================= + +For a reference of allowed condition criteria, please refer to the according +chapter in the :ref:`frontend TypoScript Reference <conditions>` and +the :ref:`backend TSconfig Reference <tsconfig-conditions>`. These references +come with examples for single condition criteria as well. + +The TSconfig and TypoScript backend modules show lists of existing conditions +and allow simulating criteria verdicts to analyze their impact on the +resulting TypoScript tree. + +.. _typoscript-syntax-conditions-expression-language: + +TypoScript conditions and the Symfony expression language +========================================================= + +Condition criteria are based on +the `Symfony expression language <https://symfony.com/doc/current/components/expression_language/syntax.html>`__. +The Core allows extending the Symfony expression language with own variables and +functions, see :ref:`symfony expression language API <t3coreapi:sel-within-typoscript-conditions>` +for more details. diff --git a/Documentation/Syntax/Conditions/_codesnippets/_andor.typoscript b/Documentation/Syntax/Conditions/_codesnippets/_andor.typoscript new file mode 100644 index 000000000..b1152e02a --- /dev/null +++ b/Documentation/Syntax/Conditions/_codesnippets/_andor.typoscript @@ -0,0 +1,7 @@ +[frontend.user.isLoggedIn || ip('127.0.0.1')] + page.20 = TEXT + page.20 { + value = A frontend user is logged in, or the browser IP is 127.0.0.1 + stdWrap.case = upper + } +[GLOBAL] diff --git a/Documentation/Syntax/Conditions/_codesnippets/_basic.typoscript b/Documentation/Syntax/Conditions/_codesnippets/_basic.typoscript new file mode 100644 index 000000000..656dee48c --- /dev/null +++ b/Documentation/Syntax/Conditions/_codesnippets/_basic.typoscript @@ -0,0 +1,10 @@ +page = PAGE +page.10 = TEXT +page.10.value = HELLO WORLD! + +[frontend.user.isLoggedIn] + page.20 = TEXT + page.20 { + value = A frontend user is logged in. + } +[GLOBAL] diff --git a/Documentation/Syntax/Conditions/_codesnippets/_condition.typoscript b/Documentation/Syntax/Conditions/_codesnippets/_condition.typoscript new file mode 100644 index 000000000..6ad4082d8 --- /dev/null +++ b/Documentation/Syntax/Conditions/_codesnippets/_condition.typoscript @@ -0,0 +1,5 @@ +[date("j") == 9] + page.10.value = It is the 9th day of the month! +[ELSE] + page.10.value = It is NOT the 9th day of the month! +[END] diff --git a/Documentation/Syntax/Conditions/_codesnippets/_not.typoscript b/Documentation/Syntax/Conditions/_codesnippets/_not.typoscript new file mode 100644 index 000000000..e8ab4525e --- /dev/null +++ b/Documentation/Syntax/Conditions/_codesnippets/_not.typoscript @@ -0,0 +1,14 @@ +page = PAGE +page.10 = TEXT +page.10.value = You are logged in + +# This is hard to read +[frontend.user.isLoggedIn] +[ELSE] + page.10.value = You are *not* logged in +[END] + +# This is faster to read +[!frontend.user.isLoggedIn] + page.10.value = You are *not* logged in +[END] diff --git a/Documentation/UsingSettingTSconfig/Conditions.rst b/Documentation/UsingSettingTSconfig/Conditions.rst index cc3f24d6c..4f6df05c3 100644 --- a/Documentation/UsingSettingTSconfig/Conditions.rst +++ b/Documentation/UsingSettingTSconfig/Conditions.rst @@ -1,3 +1,5 @@ +:navigation-title: Conditions + .. include:: /Includes.rst.txt .. index:: Conditions @@ -8,9 +10,9 @@ .. _conditions-example: .. _tsconfig-condition-differences: -========== -Conditions -========== +=========================================== +Conditions in Backend TypoScript / TSconfig +=========================================== TSconfig TypoScript conditions offer a way to conditionally change TypoScript based on current context. See the :ref:`TypoScript syntax condition chapter <t3tsref:typoscript-syntax-conditions>` From 9358a4413827a9274c4b94d798f5b06a5a6365b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:20:39 +0200 Subject: [PATCH 106/125] [TASK] Clarify limits of null coalescing operator `??` (#1575) Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- Documentation/Syntax/Conditions/Index.rst | 6 +++++- Documentation/Syntax/Operators/Index.rst | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Documentation/Syntax/Conditions/Index.rst b/Documentation/Syntax/Conditions/Index.rst index 97298c568..6f6fa9d96 100644 --- a/Documentation/Syntax/Conditions/Index.rst +++ b/Documentation/Syntax/Conditions/Index.rst @@ -115,6 +115,11 @@ in TSconfig from "site settings". A simple example if this constant page.10.value = Page uid is 42 [end] +.. note:: + + Using the `Null coalescing operator ?? <https://docs.typo3.org/permalink/t3tsref:typoscript-syntax-syntax-null-coalescing>`_ + with constants used within conditions is not possible. + .. _typoscript-syntax-end-condition-nesting: Nesting conditions via TypoScript imports @@ -165,7 +170,6 @@ backend: # Now [getTSFE()?.id == 123] - .. _typoscript-syntax-syntax-value: Allowed criteria in TypoScript conditions diff --git a/Documentation/Syntax/Operators/Index.rst b/Documentation/Syntax/Operators/Index.rst index 11ccfc102..4989788db 100644 --- a/Documentation/Syntax/Operators/Index.rst +++ b/Documentation/Syntax/Operators/Index.rst @@ -316,6 +316,9 @@ parenthesis. These predefined functions are available: The section :ref:`EvaluateModifierFunctionEvent <t3coreapi:EvaluateModifierFunctionEvent>` provides an example and the API. + +.. _typoscript-syntax-syntax-null-coalescing: + Null coalescing operator `??` for TypoScript constants ======================================================= @@ -333,3 +336,17 @@ Example that evaluates to `$config.oldThing` if set, otherwise the newer setting :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript plugin.tx_myext.settings.example = {$config.oldThing ?? $myext.thing} + +The null coalescing operator cannot be used in conditions. Use +`or <https://docs.typo3.org/permalink/t3tsref:typoscript-syntax-end-condition-or>`_ +instead: + +.. code-block:: typoscript + :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript + + # Wrong + # [{$config.oldThing ?? $myext.thing} == 5] + + # Right + [{$config.oldThing} == 5 or {$myext.thing} == 5] + From 8d0f763a541bde0605d7c673ef44027156de3d4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 08:22:19 +0200 Subject: [PATCH 107/125] Update titles and add toc (#1578) Releases: main, 13.4, 12.4 Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/Syntax/Operators/Index.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Documentation/Syntax/Operators/Index.rst b/Documentation/Syntax/Operators/Index.rst index 4989788db..27533e877 100644 --- a/Documentation/Syntax/Operators/Index.rst +++ b/Documentation/Syntax/Operators/Index.rst @@ -1,15 +1,19 @@ +:navigation-title: Operators + .. include:: /Includes.rst.txt .. index:: TypoScript; Operator .. _typoscript-syntax-syntax-operator: -========= -Operators -========= +================================== +Operators in the TypoScript syntax +================================== TypoScript syntax comes with a couple of operators to assign values, copy from other identifier paths, and to manipulate values. Let's have a closer look at them. +.. contents:: Operators in TypoScript + .. index:: TypoScript; Operator "=" TypoScript; Value assignment @@ -319,8 +323,8 @@ parenthesis. These predefined functions are available: .. _typoscript-syntax-syntax-null-coalescing: -Null coalescing operator `??` for TypoScript constants -======================================================= +Null coalescing operator `??` for TypoScript constants +====================================================== .. versionadded:: 13.1 From cb3d2b38ae17c7559095ad482d3400ab5cbd2e80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:01:18 +0200 Subject: [PATCH 108/125] Fix typo in PAGEVIEW page (#1580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4 Co-authored-by: Chris Müller <2566282+brotkrueml@users.noreply.github.com> --- Documentation/ContentObjects/Pageview/Index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/ContentObjects/Pageview/Index.rst b/Documentation/ContentObjects/Pageview/Index.rst index f98ba5e53..3498f6107 100644 --- a/Documentation/ContentObjects/Pageview/Index.rst +++ b/Documentation/ContentObjects/Pageview/Index.rst @@ -7,7 +7,7 @@ PAGEVIEW ======== .. versionadded:: 13.1 - The content object PAGEVIEW can be used in stead of + The content object PAGEVIEW can be used instead of `FLUIDTEMPLATE <https://docs.typo3.org/permalink/t3tsref:cobj-template>`_ to configure the HTML body of a page using Fluid templates. From 9f1d105805489838d8c1a23f7453ee8c1b787fb5 Mon Sep 17 00:00:00 2001 From: Johannes Nielsen <flykasual@gmail.com> Date: Fri, 13 Jun 2025 08:01:53 +0200 Subject: [PATCH 109/125] [DOCS] Remove outdated paragraph (#1581) There is no necessity anymore for user functions to be prepended with `user_` anymore, so that confusing and vague sentence can be removed. --- Documentation/Functions/Parsefunc.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/Documentation/Functions/Parsefunc.rst b/Documentation/Functions/Parsefunc.rst index 955e654b7..10dd3e007 100644 --- a/Documentation/Functions/Parsefunc.rst +++ b/Documentation/Functions/Parsefunc.rst @@ -167,9 +167,6 @@ userFunc Similar to, for example, :ref:`stdwrap-postUserFunc` in :ref:`stdWrap`, or :ref:`typolink.userFunc <typolink-userFunc>`. - Remember the function name must possibly be prepended :php:`user_`. - - .. _parsefunc-nonTypoTagStdWrap: nonTypoTagStdWrap From 11456106fd69c67c76f3cb96ff358637db4cce97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 16:46:27 +0200 Subject: [PATCH 110/125] [TASK] Describe "removeTags" configuration possibilities (#1587) Resolves: TYPO3-Documentation/Changelog-To-Doc#1067 Releases: main, 13.4, 12.4 Co-authored-by: Garvin Hicking <blog@garv.in> --- Documentation/Functions/Htmlparser.rst | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Documentation/Functions/Htmlparser.rst b/Documentation/Functions/Htmlparser.rst index bba9d6d2a..266607e3a 100644 --- a/Documentation/Functions/Htmlparser.rst +++ b/Documentation/Functions/Htmlparser.rst @@ -128,11 +128,28 @@ removeTags .. confval:: removeTags :name: htmlparser-removeTags - :type: (ibid) + :type: string-list / array List of tags (among the already set tags), which will be configured so they are surely removed. + .. code-block:: yaml + :caption: EXT:rte_ckeditor/Configuration/RTE/Processing.yaml + + processing: + HTMLparser_db: + removeTags: [link, meta, o:p, sdfield, style, title] + # "string" definition is also possible: + # removeTags: link, meta, o:p, sdfield, style, title + + .. code-block:: typoscript + :caption: EXT:my_extension/Configuration/TypoScript/page.tsconfig + + RTE.default.proc { + HTMLparser_db { + removeTags: link, meta, o:p, sdfield, style, title + } + } .. _htmlparser-keepNonMatchedTags: From 1fde50c799c05798038653085fbff3110fe112b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 17:18:10 +0200 Subject: [PATCH 111/125] [Backport 13.4] [TASK] Descripe argument mapping exception-handling of ActionController (#1589) * [TASK] Descripe argument mapping exception-handling of ActionController Closes https://github.com/TYPO3-Documentation/Changelog-To-Doc/issues/1038 Releases: main, 13.4 * [TASK] Add extension specific config --------- Co-authored-by: Garvin Hicking <blog@garv.in> --- Documentation/TopLevelObjects/Plugin.rst | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Documentation/TopLevelObjects/Plugin.rst b/Documentation/TopLevelObjects/Plugin.rst index 1707e7029..252a98b34 100644 --- a/Documentation/TopLevelObjects/Plugin.rst +++ b/Documentation/TopLevelObjects/Plugin.rst @@ -225,6 +225,45 @@ plugins. Same as :ref:`setup-plugin-mvc-callDefaultActionIfActionCantBeResolved` but this will raise a "page not found" error. + .. confval:: mvc.showPageNotFoundIfTargetNotFoundException + :name: plugin-mvc-showPageNotFoundIfTargetNotFoundException + :type: :ref:`data-type-boolean` + :Default: `false` + + **Only for Extbase plugins**. By default, when calling an extbase controller action + that is not registered for an Extbase plugin, a fatal exception + :php:`TargetNotFoundException` is thrown + (usually an internal error message is shown). + + When this configuration option is set to `1` (true), instead the default + "Page not Found" page will be shown instead (with a 404 HTTP header by default). + + The configuration option can be either set on the global `config.tx_extbase` + scope, or also plugin-specific via + `plugin.tx_yourextension.mvc.showPageNotFoundIfTargetNotFoundException` / + `plugin.tx_yourextension_pluginName.mvc.showPageNotFoundIfTargetNotFoundException`. + + .. confval:: mvc.showPageNotFoundIfRequiredArgumentIsMissingException + :name: plugin-mvc-showPageNotFoundIfRequiredArgumentIsMissingException + :type: :ref:`data-type-boolean` + :Default: `false` + + **Only for Extbase plugins**. By default, when calling an extbase controller action + with missing/invalid required arguments a fatal exception :php:`RequiredArgumentMissingException` + is thrown (usually an internal error message is shown). + + When this configuration option is set to `1` (true), instead the default + "Page not Found" page will be shown instead (with a 404 HTTP header by default). + + The configuration option can be either set on the global `config.tx_extbase` + scope, or also plugin-specific via + `plugin.tx_yourextension.mvc.showPageNotFoundIfRequiredArgumentIsMissingException` / + `plugin.tx_yourextension_pluginName.mvc.showPageNotFoundIfRequiredArgumentIsMissingException`. + + Note that extension authors can also implement the Controller method + :php:`ActionController->handleArgumentMappingExceptions()` to individually operate + on invalid arguments. + .. confval:: format :name: plugin-format :type: :ref:`data-type-string` From 40f4298658b8aa180933fa20c463ffc762184b34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 17:24:55 +0200 Subject: [PATCH 112/125] =?UTF-8?q?[TASK]=20Use=20of=20siteLanguage(?= =?UTF-8?q?=E2=80=9Clocale=E2=80=9D)=20corrected=20(#1592)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases: main, 13.4, 12.4 Co-authored-by: brosua <j.vogel97@web.de> --- Documentation/Conditions/Index.rst | 10 ++++++++-- Documentation/PageTsconfig/Rte.rst | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Documentation/Conditions/Index.rst b/Documentation/Conditions/Index.rst index 5bb197bf8..e20f2929a 100644 --- a/Documentation/Conditions/Index.rst +++ b/Documentation/Conditions/Index.rst @@ -1275,7 +1275,13 @@ siteLanguage() Returns the language ID as an integer. :typoscript:`siteLanguage("locale")` - Returns the current locale as a string, for example `en-GB` or `de-DE`. + Returns the current locale as :php:`\TYPO3\CMS\Core\Localization\Locale`. + You can call all public methods of the object, for example + :typoscript:`siteLanguage("locale").getName()` returns `en-GB` or `de-DE`. + + **Note**: In TYPO3 v12 there was an unintentional breaking change, + whereby an object and not a string is returned. + A future TYPO3 release may address implementing a shortcut for this. :typoscript:`siteLanguage("base")` Returns the configured base URL as a string. @@ -1314,7 +1320,7 @@ siteLanguage() .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript - [siteLanguage("locale") == "de-CH"] + [siteLanguage("locale").getName() == "de-CH"] page.10.value = This site has the locale "de_CH" or "de_CH.utf8" [END] diff --git a/Documentation/PageTsconfig/Rte.rst b/Documentation/PageTsconfig/Rte.rst index 9950219ca..ee6d19f2c 100644 --- a/Documentation/PageTsconfig/Rte.rst +++ b/Documentation/PageTsconfig/Rte.rst @@ -289,7 +289,7 @@ config.contentsLanguageDirection RTE.config.contentsLanguageDirection = rtl # except for the following language: - [siteLanguage("locale") == "en_US"] + [siteLanguage("locale").getName() == "en-US"] RTE.config.contentsLanguageDirection = ltr [END] From c33b3c15201dba0c58286e6972fd5bfe2f5baf60 Mon Sep 17 00:00:00 2001 From: Daniel Corn <daniel@iresults.li> Date: Mon, 18 Aug 2025 13:53:29 +0200 Subject: [PATCH 113/125] Fix "Demonstrates" link (#1595) The example code uses `jsInline`. Adapt the "Demonstrates" section to jump to `jsInline` too. --- Documentation/TopLevelObjects/Page/Index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TopLevelObjects/Page/Index.rst b/Documentation/TopLevelObjects/Page/Index.rst index 483d39d72..186ef9075 100644 --- a/Documentation/TopLevelObjects/Page/Index.rst +++ b/Documentation/TopLevelObjects/Page/Index.rst @@ -937,7 +937,7 @@ Example: Make a cObject available in JavaScript ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Demonstrates: - * :confval:`page.jsFooterInline <page-jsFooterInline>` + * :confval:`page.jsInline <page-jsInline>` .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript From 297461a83365aaa683d65c0f2b04b15bc10aa2d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:23:59 +0200 Subject: [PATCH 114/125] [BUGFIX] ci: disable composer-normalize step due to dependency conflict (#1604) The ergebnis/composer-normalize plugin still requires localheinz/diff, which conflicts with sebastian/diff and causes fatal errors in CI. Temporarily disable the composerNormalize step in runTests until upstream resolves the dependency issue. Releases: main, 13.4 Co-authored-by: lina.wolf <lwolf@w-commerce.de> --- .github/workflows/tests.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e31d41dc1..eb95547fe 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,8 +35,12 @@ jobs: - name: Composer validate run: Build/Scripts/runTests.sh -p ${{ env.php }} -s composerValidate - - name: Composer normalize - run: Build/Scripts/runTests.sh -p ${{ env.php }} -s composerNormalize -n + # Disabled composer-normalize for now because ergebnis/composer-normalize + # still hard-depends on localheinz/diff, which conflicts with sebastian/diff + # and causes fatal errors in our CI. Re-enable once the upstream dependency + # situation is resolved in a newer release. + # - name: Composer normalize + # run: Build/Scripts/runTests.sh -p ${{ env.php }} -s composerNormalize -n - name: CGL run: Build/Scripts/runTests.sh -n -p ${{ env.php }} -s cgl -n From 339c36c6fee8bdbbdc9d970b2681ee43edd78311 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:24:10 +0200 Subject: [PATCH 115/125] Adjust spelling of second in cache_period section (#1600) Co-authored-by: Julian Schuierer <60898948+Julian-Schuierer@users.noreply.github.com> --- Documentation/TopLevelObjects/Config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index 3170f973e..549cc1786 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -187,7 +187,7 @@ Properties of 'config' :type: :ref:`data-type-integer` :Default: `86400` *(= 24 hours)* - The number of second a page may remain in cache. + The number of seconds a page may remain in cache. This value is overridden by the value set in the page-record `field="cache_timeout"` if this value is greater than zero. From c83bf21fe1eb10594b442040a7507bff26b2a7a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:44:46 +0200 Subject: [PATCH 116/125] [TASK] Add usermapping for linux (#1607) Co-authored-by: Ines Willenbrock <44277221+ineswillenbrock@users.noreply.github.com> --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 00741b28f..ef3c97114 100644 --- a/Makefile +++ b/Makefile @@ -7,13 +7,13 @@ help: ## Displays this list of targets with descriptions docs: ## Generate projects docs (from "Documentation" directory) mkdir -p Documentation-GENERATED-temp - docker run --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation + docker run --user $(shell id -u):$(shell id -g) --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation .PHONY: test-docs test-docs: ## Test the documentation rendering mkdir -p Documentation-GENERATED-temp - docker run --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --minimal-test + docker run --user $(shell id -u):$(shell id -g) --rm --pull always -v "$(shell pwd)":/project -t ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --minimal-test .PHONY: generate generate: codesnippets command-json ## Regenerate automatic code documentation From d386ebeddd9618cd0c1c569d2740a1f471b5ae60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:28:36 +0200 Subject: [PATCH 117/125] [Backport 13.4] Correct option filenname in FlexFormProcessor.rst (#1612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Correct option filenname in FlexFormProcessor.rst The option is called fieldName with a capital "N". * Update FlexFormProcessor.rst --------- Co-authored-by: Timon Grützmacher <449505+dertimon@users.noreply.github.com> Co-authored-by: Lina Wolf <48202465+linawolf@users.noreply.github.com> --- Documentation/DataProcessing/FlexFormProcessor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DataProcessing/FlexFormProcessor.rst b/Documentation/DataProcessing/FlexFormProcessor.rst index 705ef324d..1c912128d 100644 --- a/Documentation/DataProcessing/FlexFormProcessor.rst +++ b/Documentation/DataProcessing/FlexFormProcessor.rst @@ -27,7 +27,7 @@ Options .. _FlexFormProcessor-fieldname: - .. confval:: fieldname + .. confval:: fieldName :name: FlexFormProcessor-fieldname :Required: false :type: :ref:`data-type-string` From 74f10a3e417aafa408b869e10758bb80c8096971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=B6ffler?= <loeffler@spooner-web.de> Date: Thu, 11 Sep 2025 16:30:32 +0200 Subject: [PATCH 118/125] Fixed wrong TSconfig syntax (#1610) --- Documentation/Functions/Htmlparser.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/Functions/Htmlparser.rst b/Documentation/Functions/Htmlparser.rst index 266607e3a..0566fbe6a 100644 --- a/Documentation/Functions/Htmlparser.rst +++ b/Documentation/Functions/Htmlparser.rst @@ -147,7 +147,7 @@ removeTags RTE.default.proc { HTMLparser_db { - removeTags: link, meta, o:p, sdfield, style, title + removeTags = link, meta, o:p, sdfield, style, title } } From b22f4ca3921d8f3beb388679085ffcbc87f23fa3 Mon Sep 17 00:00:00 2001 From: "lina.wolf" <lwolf@w-commerce.de> Date: Thu, 11 Sep 2025 16:36:57 +0200 Subject: [PATCH 119/125] [BUGFIX] make installable Releases: 13.4 --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index a6a69f459..60c6997d9 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,8 @@ "friendsofphp/php-cs-fixer": "^3.46", "symfony/yaml": "^7.0", "t3docs/codesnippet": "dev-main", + "t3docs/examples": "^13.2", + "t3docs/site-package": "dev-main", "typo3/cms-adminpanel": "^13.4", "typo3/cms-backend": "^13.4", "typo3/cms-belog": "^13.4", @@ -61,9 +63,7 @@ "typo3/cms-t3editor": "^13.4", "typo3/cms-tstemplate": "^13.4", "typo3/cms-viewpage": "^13.4", - "typo3/cms-workspaces": "^13.4", - "t3docs/examples": "dev-main", - "t3docs/site-package": "dev-main" + "typo3/cms-workspaces": "^13.4" }, "scripts": { "generate:codesnippets": [ From f1f34d1c5f95b68d5eaadb8bc5969d7890d89ae9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 21:00:07 +0200 Subject: [PATCH 120/125] Add "if" to CONTENT (#1620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stefan Frömken <123929835+sfroemkenjw@users.noreply.github.com> --- Documentation/ContentObjects/Content/Index.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Documentation/ContentObjects/Content/Index.rst b/Documentation/ContentObjects/Content/Index.rst index 274b444ac..0f4571460 100644 --- a/Documentation/ContentObjects/Content/Index.rst +++ b/Documentation/ContentObjects/Content/Index.rst @@ -33,6 +33,15 @@ Properties :display: table :type: +.. _cobj-content-if: + +.. confval:: if + :name: content-if + :type: :ref:`->if <if>` + + If "if" returns false, the content is not generated. + + .. _cobj-content-select: .. confval:: select From 7c11945cea47c8ea39f105d25e3c4d21ef22cd45 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 21:01:03 +0200 Subject: [PATCH 121/125] [TASK] Fix typo in levelfield description (#1618) Co-authored-by: Peter Kraume <peter.kraume@gmx.de> --- Documentation/Functions/Data.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index 9ef02526c..d58b1058e 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -584,7 +584,7 @@ levelfield :name: data-levelfield :Syntax: levelfield : [pointer, integer], [field name], ["slide"] - Like :ref:`data-type-gettext-leveltitle` but the field do be fetched from the + Like :ref:`data-type-gettext-leveltitle` but the field to be fetched from the record is configurable. .. _data-type-gettext-levelfield-example: From 2c3300c298c0f95dd5cc1674edb184a8d34e531b Mon Sep 17 00:00:00 2001 From: Sarah McCarthy <sarahmccarthy123@yahoo.com> Date: Mon, 13 Oct 2025 14:45:56 +0200 Subject: [PATCH 122/125] [TASK] Overhaul docs (#1624) Releases:main (cherry picked from commit c7c3ad5ada3dc8f8ab400632c4f5dad947f1a1c6) --- Documentation/TopLevelObjects/Config.rst | 468 +++++++++++------------ 1 file changed, 232 insertions(+), 236 deletions(-) diff --git a/Documentation/TopLevelObjects/Config.rst b/Documentation/TopLevelObjects/Config.rst index 549cc1786..4a7d81722 100644 --- a/Documentation/TopLevelObjects/Config.rst +++ b/Documentation/TopLevelObjects/Config.rst @@ -13,8 +13,8 @@ `config`: TypoScript configuration ================================== -The `config` top-level object does not have to be initialized, configuration -settings can be made like this: +The `config` top-level object does not have to be initialized. Configuration +can be set like this: .. code-block:: :caption: config/sites/my_site/setup.typoscript @@ -84,63 +84,61 @@ Properties of 'config' :type: :ref:`data-type-string` :Special value: "auto" - If set, the string is prepended to all relative links that TYPO3 generates. + If set, this string is prepended to all relative links that TYPO3 generates. - :typoscript:`config.absRefPrefix = auto` lets TYPO3 autodetect - the site root based on path prefixes and not based on host name variables - from the server, making this value safe for multi-domain environments. + :typoscript:`config.absRefPrefix = auto` means TYPO3 auto-detects + the site root from path prefixes rather than host name variables + on the server, making this value safe for multi-domain environments. - If the option :ref:`config.forceAbsoluteUrls <setup-config-forceAbsoluteUrls>` - is enabled, :typoscript:`absRefPrefix` is overridden. + If :ref:`config.forceAbsoluteUrls <setup-config-forceAbsoluteUrls>` + is enabled :typoscript:`absRefPrefix` is overridden. Using an URI in :typoscript:`absRefPrefix` will require additional conditions if you use different domains for your deployment stages in CI environments. If you are working on a server where you have different domain names or different path segments leading to the same page (e.g. for internal and - external access), you may do yourself a favor and set :typoscript:`absRefPrefix` to + external access), set :typoscript:`absRefPrefix` to the URL and path of your site, e.g. :samp:`https://example.org/`. If you do not, - you risk to render pages to cache from the internal network and thereby - prefix image references and links with a wrong path or a path not accessible - from outside. + you risk rendering pages to cache from the internal network and thereby + prefixing image references and links with incorrect or inaccessible paths. .. confval:: additionalHeaders :name: config-additionalheaders :type: numerically indexed array of "HTTP header entries". :Example: :ref:`setup-config-additionalheaders` - By means of :typoscript:`config.additionalHeaders` as series of additional HTTP headers - can be configured. An entry has the following structure: + :typoscript:`config.additionalHeaders` allows additional HTTP headers + to be configured. An entry has the following structure: :typoscript:`10.header = the header string` This value is required. :typoscript:`10.replace = 0 | 1` - Optional, boolean, default is `1`. - If `1`, the header will replace an existing one that has the same name. + Optional, boolean. Default value is `1`. + If `1` the header will replace an existing header with the same name. :typoscript:`10.httpResponseCode = 201` - Optional, integer, a http status code that the page should return. + Optional, integer. The http status code that the page should return. - By default TYPO3 sends a "Content-Type" header with the defined - encoding. It then sends cache headers, if configured via - :ref:`setup-config-sendcacheheaders`. - Then additional headers are send, plus finally a "Content-Length" - header, if enabled via :ref:`setup-config-enablecontentlengthheader`. + By default, TYPO3 sends a "Content-Type" header with the defined + encoding. It then sends cache headers if configured via + :ref:`setup-config-sendcacheheaders` and then any additional headers. + Finally, a "Content-Length" header is sent, if enabled via + :ref:`setup-config-enablecontentlengthheader`. .. confval:: admPanel :name: config-admPanel :type: boolean - :typoscript:`config.admPanel = 1` can - be used to enable the admin panel. See :ref:`Configuration in - the Admin Panel manual <ext_adminpanel:typoscript-config-admpanel>`. + :typoscript:`config.admPanel = 1` enables the admin panel. See + :ref:`Configuration in the Admin Panel manual <ext_adminpanel:typoscript-config-admpanel>`. .. confval:: ATagParams :name: config-ATagParams :type: *<A>-params* - Additional parameters to all links in TYPO3 (excluding menu-links). + Additional parameters for all links in TYPO3 (excluding menu-links). .. confval:: cache :name: config-cache @@ -149,14 +147,14 @@ Properties of 'config' Determine the maximum cache lifetime of a page. - The maximum cache lifetime of a page can not only be determined by the - start and stop times of content elements on the page itself, but also - by arbitrary records on any other page. However, the page has to be - configured so that TYPO3 knows the start and stop times of which - records to include. Otherwise, the cache entry will be used although a - start/stop date already passed by. + The maximum cache lifetime of a page can be determined by + start and stop times of content elements on that page, as well as + arbitrary records on any other page. The page needs to be + configured so that TYPO3 knows which records' start and stop times to + take into account. Otherwise, the cache entry might be used although a + start/stop date has already passed by. - To include records of type <table name> on page <pid> into the cache + To include records of type <table name> on page <pid> in the cache lifetime calculation of page <page-id>, add the following TypoScript: .. code-block:: typoscript @@ -164,21 +162,21 @@ Properties of 'config' config.cache.<page-id> = <table name>:<storage-pid> - Multiple record sources can be added as comma-separated list, see the + Multiple record sources can be added as a comma-separated list. See :ref:`examples <setup-config-cache>`. - You can use the keyword "all" instead of a <page-id> to consider - records for the cache lifetime of all pages. + Use the keyword "all" instead of a <page-id> to take all records + from all pages into account for the cache lifetime calculation. - You can use the keyword "current" instead of a <storage-pid> to consider - records on the current page for the cache life of itself. + Use the keyword "current" instead of a <storage-pid> to take only records + on the current page into account for the cache lifetime calculation. .. confval:: cache_clearAtMidnight :name: config-cache-clearAtMidnight :type: :ref:`data-type-boolean` :Default: `0` - With this setting the cache always expires at midnight of the day, the + This setting ensures that the cache expires at midnight on the day that the page is scheduled to expire. @@ -187,10 +185,10 @@ Properties of 'config' :type: :ref:`data-type-integer` :Default: `86400` *(= 24 hours)* - The number of seconds a page may remain in cache. + The number of seconds a page can remain in the cache. - This value is overridden by the value set in the page-record - `field="cache_timeout"` if this value is greater than zero. + This value is overridden by the value in the page record + `field="cache_timeout"` if that value is greater than zero. .. confval:: compressCss :name: config-compressCss @@ -198,21 +196,21 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-compresscss` - If set, CSS files referenced in :typoscript:`page.includeCSS` and the like will be - minified and compressed. Does not work on files, which are referenced + If set, CSS files referenced in :typoscript:`page.includeCSS`, etc, will be + minified and compressed. It has no effect on files which are referenced in :typoscript:`page.headerData`. - Minification will remove all excess space. The more significant - compression step (using gzip compression) requires + Minification will remove excess space. A higher level of compression + (using gzip) requires :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel']` to be enabled in the - Install Tool. For this to work you also need to activate the gzip- - related compressionLevel options in :file:`.htaccess`, as otherwise the + Install Tool. For it to work you also need to activate gzip- + related compressionLevel options in :file:`.htaccess`, otherwise the compressed files will not be readable by the user agent. .. include:: _includes/_concat-compress.rst.txt TYPO3 comes with a built-in compression handler, but you can - also register your own one using + also register your own using :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['cssCompressHandler']`. .. code-block:: php @@ -229,11 +227,11 @@ Properties of 'config' Enabling this option together with :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel']` in the Install Tool - delivers Frontend JavaScript files referenced in :typoscript:`page.includeJS` and - the like using GZIP compression. Does not work on files, which are + wil compress frontend JavaScript files referenced in :typoscript:`page.includeJS`, etc, + using GZIP compression. It has no effect on files which are referenced in :typoscript:`page.headerData`. - Please note that this requires :file:`.htaccess` to be adjusted, as otherwise + Please note that this requires :file:`.htaccess` to be modified, otherwise the files will not be readable by the user agent. Please see the description of :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel']` in the Install Tool. @@ -241,7 +239,7 @@ Properties of 'config' .. include:: _includes/_concat-compress.rst.txt TYPO3 comes with a built-in compression handler, but you can - also register your own one using + also register your own using :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['jsCompressHandler']`. .. code-block:: php @@ -256,16 +254,16 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-concatenatecss` - Setting :typoscript:`config.concatenateCss` merges Stylesheet files referenced in - the Frontend in page.includeCSS and the like together. Files are merged - only, if their media attribute has the same value, e.g. if it is "all" - for several files. Does not work on files, which are referenced in + Setting :typoscript:`config.concatenateCss` merges frontend stylesheet + files referenced in page.includeCSS, etc. Files are merged + only if their media attribute has the same value, e.g. if it is "all" + for several files. It has no effect on files which are referenced in :typoscript:`page.headerData`. .. include:: _includes/_concat-compress.rst.txt TYPO3 comes with a built-in concatenation handler, but you - can also register your own one using + can also register your own using :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['cssConcatenateHandler']`. .. code-block:: php @@ -280,16 +278,17 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-concatenateJs` - Setting :typoscript:`config.concatenateJs` merges JavaScript files referenced in - the Frontend in :typoscript:`page.includeJS` and the like together. Does not work - on files, which are referenced in :typoscript:`page.headerData`. + Setting :typoscript:`config.concatenateJs` merges frontend JavaScript + files referenced in :typoscript:`page.includeJS`, etc. It has no effect + on files which are referenced in :typoscript:`page.headerData`. - If all files to be concatenated are marked with the async flag, the async attribute is assigned to the script tag. + If all the files are marked with an async flag, an async attribute is + assigned to the script tag. .. include:: _includes/_concat-compress.rst.txt TYPO3 comes with a built-in concatenation handler, but you - can also register your own one using + can also register your own using :php:`$GLOBALS['TYPO3_CONF_VARS']['FE']['jsConcatenateHandler']`. .. code-block:: php @@ -304,32 +303,32 @@ Properties of 'config' :Default: `0` :Example: :ref: `setup-config-contentObjectExceptionHandler` - Exceptions which occur during rendering of content objects (typically plugins) - will be caught by default in production context and an error message - is shown along with the rendered output. + Exceptions which occur during the rendering of content objects (typically plugins) + are caught by default in a production context. An error message + is displayed with the rendered output. - If this is done, the page will remain available while the section of the page - that produces an error (i.e. throws an exception) will show a configurable error message. - By default this error message contains a random code which references - the exception and is also logged by the :ref:`logging framework <t3coreapi:logging>` + If there is an exception, the page will remain available while the section of the page + that produces the error (i.e. throws an exception) will show a configurable error message. + By default the error message contains a random code referencing + the exception and the error is logged by the :ref:`logging framework <t3coreapi:logging>` for developer reference. .. important:: - Instead of breaking the whole page when an exception occurs, an error message - is shown for the part of the page that is broken. - Be aware, it is possible that a page with an error message gets cached. + Instead of a whole page breaking when an exception occurs, an error message + is displayed just in the part of the page that is broken. + Be aware that a page displaying an error message can get cached. - To get rid of the error message not only the actual error needs to be fixed, - but the cache must be cleared for this page. + To get rid of the error message, the error needs to be fixed + and the cache must be cleared for the page. .. confval:: debug :name: config-debug :type: :ref:`data-type-boolean` - If set, then debug information in the TypoScript code is sent. - This applies e.g. to menu objects and the parsetime output. - The parsetime will be sent as HTTP response header `X-TYPO3-Parsetime`. + If set, debug information for the TypoScript code is sent. + This applies to menu objects and parse-time output. + The parse-time will be sent in HTTP response header `X-TYPO3-Parsetime`. .. confval:: disableAllHeaderCode :name: config-disableAllHeaderCode @@ -337,19 +336,19 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-disableallheadercode` - If this is not set or set to `0`, the :ref:`page` object automatically + If this is not set or set to `0`, the :ref:`page` outputs a HTML skeleton, see :ref:`page_output`. - To disable this default behaviour set :typoscript:`disableAllHeaderCode = 1`. - The page outputs only the result of the cObject array - (1,2,3,4...) of the :ref:`page` object. + To disable the default behaviour set :typoscript:`disableAllHeaderCode = 1`. + The page then consists of only the cObject array + (1,2,3,4...) output of the :ref:`page`. - Use this feature in templates supplying other content-types than HTML. - That could be an image, a RSS-feed, an ajax request in a format like - XML or JSON. + Use this feature for templates for content types other than HTML, + for example images, RSS-feeds or ajax requests in an + XML or JSON format. - This property can also be used to generate the complete HTML page, - including the :html:`<html>` and :html:`<body>` tags manually. + This property can also be used to generate complete HTML pages, + including the :html:`<html>` and :html:`<body>` tags. .. confval:: disableBodyTag :name: config-disableBodyTag @@ -358,36 +357,37 @@ Properties of 'config' If this option is set, the TYPO3 core will not generate the opening :html:`<body ...>` part of the body tag. The closing :html:`</body>` - is not affected and will still be issued. + is not affected and will still be generated. - :typoscript:`disableBodyTag` takes precedence over the :ref:`page` properties + :typoscript:`disableBodyTag` takes precedence over :typoscript:`bodyTagCObject`, :typoscript:`bodyTag` and - :typoscript:`bodyTagAdd`. With :typoscript:`config.disableBodyTag = 1` the others are - ignored and don't have any effect. + :typoscript:`bodyTagAdd` in the :ref:`page` properties. If + :typoscript:`config.disableBodyTag = 1` then the other settings are ignored + and won't have any effect. .. confval:: disableCanonical :name: config-disableCanonical :type: :ref:`data-type-boolean` - When the system extension SEO is installed, canonical tags are generated - automatically to prevent duplicate content. A good canonical is added + If the SEO system extension is installed, canonical tags are generated + to prevent duplicate content. A good canonical is added in many cases by default. For edge cases, you might want to disable the - rendering of this tag. You can do this by setting this property to `1`. + rendering of this tag by setting it to `1`. .. confval:: disableHrefLang :name: config-disableHrefLang :type: :ref:`data-type-boolean` - When the system extension SEO is installed, hreflang tags are generated - automatically in multi-language setups. By settings this option to `1` - the rendering of those tags will be skipped. + If the SEO system extension is installed, hreflang tags are generated + in multi-language setups. By settings this option to `1` + the rendering of the tags will be skipped. .. confval:: disablePrefixComment :name: config-disablePrefixComment :type: :ref:`data-type-boolean` - If set, the stdWrap property :ref:`stdwrap-prefixComment` will be disabled, thus - preventing any revealing and space-consuming comments in the HTML + If set, stdWrap :ref:`stdwrap-prefixComment` will be disabled, thus + preventing any potentially revealing and space-consuming comments in the HTML source code. .. confval:: disablePreviewNotification @@ -395,7 +395,7 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: `0` - Disables the "preview" notification box completely. + Disables the "preview" notification box. .. confval:: disableLanguageHeader :name: config-disableLanguageHeader @@ -403,7 +403,7 @@ Properties of 'config' :Default: `0` TYPO3 by default sends a `Content-language: XX` HTTP header, - where "XX" is the ISO code of the according language. The + where "XX" is the ISO code of the relevant language. The value is based on the language defined in the :ref:`Site Configuration <t3coreapi:sitehandling>`. @@ -430,12 +430,12 @@ Properties of 'config' `html5` for the HTML5 doctype. `none` - for *no* doctype at all. + for *no* doctype. See :ref:`config.htmlTag_setParams <setup-config-htmltag-setparams>` for more details on the effect on the HTML tag. - Default is the HTML 5 doctype: + It defaults to the HTML 5 doctype: .. code-block:: html @@ -446,11 +446,11 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: `1` - If set, a header "content-length: [bytes of content]" is sent. + If set, the header "content-length: [bytes of content]" is sent. - If a backend user is logged in, this is disabled. The reason is + This is disabled if a backend user is logged in. The reason is that the content length header cannot include the length of these - objects and the content-length will cut off the length of the + objects and the content-length will truncate the length of the document in some browsers. .. confval:: extTarget @@ -471,16 +471,16 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: `0` - If this option is set, all links, reference to images or assets + If this option is set, all links, image references or assets previously built with a relative or absolute path (for example, :file:`/fileadmin/my-pdf.pdf`) will be rendered as absolute URLs with the site prefix / current domain. - Examples for such use cases are the generation of a complete static + An example of a possible use case is generating a static version of a TYPO3 site for sending a page via email. .. note:: - Setting this option will override any setting in :ref:`config.absRefPrefix + Setting this option will override :ref:`config.absRefPrefix <setup-config-absrefprefix>` and any typolink :ref:`typolink-forceAbsoluteUrl` options. @@ -488,20 +488,20 @@ Properties of 'config' :name: config-forceTypeValue :type: :ref:`data-type-boolean` - Force the `&type` value of all TYPO3 generated links to a specific value + Force the `&type` value of TYPO3 generated links to a specific value (except if overruled by local :typoscript:`forceTypeValue` values). - Useful if you run a template with special content at - say `&type=95` - - but still wants to keep your targets neutral. Then you set your - targets to blank and this value to the type value you wish. + This is useful if you have a template with special content, for example + `&type=95`, but still want to keep your targets neutral. Then you can + set your targets to blank and this value to your required type value. .. confval:: headerComment :name: config-headerComment :type: :ref:`data-type-string` - The content is added before the "TYPO3 Content Management Framework" - comment in the <head> section of the page. Use this to insert a note - like that "Programmed by My-Agency". + This content is added above the "TYPO3 Content Management Framework" + comment in the <head> page section. Use this to insert text + like "Programmed by My-Agency". .. confval:: htmlTag.attributes :name: config-htmlTag-attributes @@ -520,15 +520,15 @@ Properties of 'config' :type: :ref:`data-type-string` :Example: :ref:`setup-config-htmltag-setparams` - Sets the attributes for the :html:`<html>` tag on the page. If you set - :ref:`setup-config-doctype` to a keyword enabling XHTML then some attributes are - already set. This property allows you to override any preset - attributes with your own content if needed. + Sets the :html:`<html>` tag attributes on the page. If you set + :ref:`setup-config-doctype` to a keyword that enables XHTML then some + attributes will already be set. This property allows you to override preset + attributes with your own content. - **Special:** If you set it to "none" then no attributes will be set at - any event. + **Special:** If you set it to "none" then setting attributes is no longer + possible. - If you are using `htmlTag.attributes` this property (`htmlTag_setParams`) + If you have set `htmlTag.attributes` this property (`htmlTag_setParams`) will not have any effect. @@ -536,16 +536,16 @@ Properties of 'config' :name: config-htmlTag-stdWrap :type: :ref:`stdwrap` - Modify the whole :html:`<html>` tag with stdWrap functionality. This can be - used to extend or override this tag. + Modify the :html:`<html>` tag with stdWrap functionality. Use + this property to extend or override this tag. .. confval:: index_descrLgd :name: config-index-descrLgd :type: :ref:`data-type-integer` :Default: `200` - This indicates how many chars to preserve as description for an - indexed page. This may be used in the search result display. + This indicates how many chars to preserve in the description of an + indexed page. This can be used in search result output. .. confval:: index_enable :name: config-index-enable @@ -559,7 +559,7 @@ Properties of 'config' :name: config-index-externals :type: :ref:`data-type-boolean` - If set, external media linked to on the pages is indexed as well. + If set, external media linked to on pages is indexed. Automatically enabled when :t3-ext:`indexed_search` is enabled. @@ -568,8 +568,8 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Default: `1` - This allows to turn on or off the indexing of metatags. It is turned - on by default. + This allows the indexing of metatags to be switched on or off. It is + switched on by default. .. confval:: inlineStyle2TempFile :name: config-inlineStyle2TempFile @@ -577,11 +577,11 @@ Properties of 'config' :Default: `1` :Example: :ref:`setup-config-inlinestyle2tempfile` - If set, the inline styles TYPO3 controls in the core are written to a - file, :file:`typo3temp/assets/css/stylesheet\_[hashstring].css`, and the header - will only contain the link to the stylesheet. + If set, the inline styles TYPO3 controls in the core are written to + the :file:`typo3temp/assets/css/stylesheet\_[hashstring].css` file and + the header then contains just a link to the stylesheet. - The file hash is based solely on the content of the styles. + The file hash is based on the content of the styles. .. confval:: intTarget :name: config-intTarget @@ -594,33 +594,32 @@ Properties of 'config' :type: list :Example: :ref:`setup-config-linkvars` - :php:`HTTP_GET_VARS`, which should be passed on with links in TYPO3. This + :php:`HTTP_GET_VARS`, which is passed on in links in TYPO3. It is compiled into a string stored in :php:`$GLOBALS['TSFE']->linkVars` The values are rawurlencoded in PHP. You can specify a range of valid values by appending a () after each - value. If this range does not match, the variable won't be appended to - links. This is very important to prevent that the cache system gets - flooded with forged values. + value. If the range doesn't match, the variable won't be appended to + links. This prevents the cache system getting flooded with forged values. - The range may contain one of these values: + The range can contain one of the following values: `[a]-[b]` A range of allowed integer values `int` Only integer values are allowed `[a]\|[b]\|[c]` - A list of allowed strings (whitespaces will be removed) + A list of allowed strings (whitespace will be removed) `/[regex]/` - Match against a regular expression (PCRE style) + Match a regular expression (PCRE style) You can use the pipe character (|) to access nested properties. .. note:: - Do **not** include the `type` and `L` parameter in the linkVars - list, as this will result in unexpected behavior. + Do **not** include the `type` and `L` parameters in the linkVars + list as this will result in unexpected behavior. .. confval:: message_preview :name: config-message_preview @@ -661,7 +660,7 @@ Properties of 'config' Imagine you have a TYPO3 site with several mount points, and you need certain pages to always include a specific mount point parameter for correct content rendering. By configuring :typoscript`MP_defaults`, you - ensure consistency and reduce the risk of broken links or incorrect + can ensure consistency and reduce the risk of broken links or incorrect content being displayed due to missing parameters. @@ -680,18 +679,18 @@ Properties of 'config' calculated for the branch. The result is used just like :ref:`MP\_defaults <setup-config-mp-defaults>` are used to - find MP-vars if none has been specified prior to the call to + find MP-vars if none have been specified prior to the call to `\TYPO3\CMS\Frontend\Typolink\PageLinkBuilder`. You can specify `root` as a special keyword in the list of IDs and that will create a map-tree for the whole site (but this may be VERY processing intensive if there are many pages!). - The order of IDs specified may have a significance; Any ID in a branch - which is processed already (by a previous ID root point) will not be + The order of IDs can be significant - any ID in a branch + which has already been processed (by a previous ID root point) will not be processed again. - The configured IDs have to be the uids of Mount Point pages itself, not the targets. + Configured IDs have to be the uids of actual mount point pages, not the targets. .. confval:: namespaces.[identifier] :name: config-namespaces @@ -710,16 +709,16 @@ Properties of 'config' If this is set to `1`, it disables the `pages` cache, meaning that the rendered result/response will not be saved to cache. - If set to `0`, it's ignored. Rendered result (e.g. full html of a page) + If set to `0`, it is ignored. The rendered result (e.g. full html of a page) is stored in the `pages` cache. Other parameters may have set it to true for other reasons. Note that setting this to `1` doesn't disable other TYPO3 caches. - Instead of setting `config.no_cache` you might consider changing dynamic + Instead of setting `config.no_cache` you can change dynamic (non-cacheable) content from :ref:`USER <cobj-user>` to :ref:`USER_INT <cobj-user>` (:ref:`COA <cobj-coa>` to :ref:`COA_INT<cobj-coa>`). - For more information about cache types see + For more information about cache types see the :ref:`cache types chapter <t3coreapi:caching-architecture-core>`. .. confval:: noPageTitle @@ -728,13 +727,13 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-pagerenderertemplatefile` - If you only want to have the site name (from the template record) in - your :html:`<title>` tag, set this to 1. If the value is 2 then the :html:`<title>` - tag is not printed at all. + If you only want to have the site name (from the template record) in + your :html:`<title>` tag, set this to 1. If the value is 2 then the :html:`<title>` + tag is not output. - Please take note that this tag is required for (X)HTML compliant - output, so you should only disable this tag if you generate it - manually already. + Please note that this tag is required for (X)HTML compliant + output, so you should only disable this tag if you have already + generated it manually. .. confval:: pageRendererTemplateFile :name: config-pageRendererTemplateFile @@ -757,23 +756,22 @@ Properties of 'config' :Default: `0` :Example: :ref:`setup-config-pagetitleproviders` - TYPO3 by default prints a title tag in the format "website: page + TYPO3 by default prints title tags in the format "website: page title". If :typoscript:`pageTitleFirst` is set (and if the page title is printed), then the - page title will be printed IN FRONT OF the template title. So it will - look like "page title: website". + page title will be printed before the template title, i.e. "page title: website". .. confval:: pageTitleProviders :name: config-pageTitleProviders :type: array - In order to keep setting the titles in control, an API to set the page title is available. The API uses - :typoscript:`PageTitleProviders` to define the page title based on page record and the content on the page. + In order to set page titles, an API is available. The API uses + :typoscript:`PageTitleProviders` to set the page title based on the page record and the content on that page. - Based on the priority of the providers, the :php:`PageTitleProviderManager` will check the providers if a title - is given by the provider. It will start with the highest priority :typoscript:`PageTitleProviders` and will end with - the lowest in priority. + Based on the priority of providers, :php:`PageTitleProviderManager` will + check the providers to see if they have titles. It will start with the + highest priority :typoscript:`PageTitleProviders`. .. confval:: pageTitleSeparator :name: config-pageTitleSeparator @@ -781,11 +779,11 @@ Properties of 'config' :Default: `:` *(colon with following space)* :Example: :ref:`setup-config-pagetitleseparator` - The signs which should be printed in the title tag between the website + The symbols ouput in the title tag between the website name and the page title. If :typoscript:`pageTitleSeparator` is set, but *no* sub-properties are defined, then a space will be added to the end of the - separator. stdWrap is useful to adjust whitespaces at the beginning and - the end of the separator. + separator. stdWrap can be used to adjust whitespace at the beginning and + end of the separator. .. confval:: recordLinks :name: config-recordLinks @@ -795,7 +793,7 @@ Properties of 'config' :caption: Frontend TypoScript definition for identifier `my_content` config.recordLinks.my_content { - // Do not force link generation when the record is hidden + // If the record is hidden do not force link generation forceLink = 0 typolink { @@ -812,22 +810,22 @@ Properties of 'config' :type: :ref:`data-type-boolean` :Example: :ref:`setup-config-removedefaultjs` - Remove CSS generated by :ref:`\_CSS\_DEFAULT\_STYLE - <setup-plugin-css-default-style>` configuration of extensions. - (:typoscript:`_CSS_DEFAULT_STYLE` outputs a set of default styles, just because - an extension is installed.) + Remove CSS generated by the :ref:`\_CSS\_DEFAULT\_STYLE + <setup-plugin-css-default-style>` extension property. + (:typoscript:`_CSS_DEFAULT_STYLE` outputs a set of default styles for + extensions with frontend plugins) .. confval:: removeDefaultJS :name: config-removeDefaultJS :type: :ref:`data-type-boolean` / :ref:`data-type-string` :Example: :ref:`setup-config-removedefaultjs` - If set, the default JavaScript in the header will be removed. + If set, default JavaScript in the header will be removed. - The default JavaScript is the decryption function for email addresses. + The default JavaScript decrypts email addresses. - **Special case:** If the value is the string `external`, then the default - JavaScript is written to a temporary file and included from that file. + **Special case:** If the value is set to the string `external`, then the default + JavaScript is written to a temporary file and included in that file. See :ref:`setup-config-inlineStyle2TempFile`. .. confval:: sendCacheHeaders @@ -835,16 +833,16 @@ Properties of 'config' :type: :ref:`data-type-boolean` If set, TYPO3 will output cache-control headers to the client based - mainly on whether the page was cached internally. This feature allows + on whether the page was internally cached. This feature allows client browsers and/or reverse proxies to take load off TYPO3 websites. The conditions for allowing client caching are: * page was cached - * No `*_INT` or `*_EXT` objects were on the page (e.g. :ref:`cobj-user`) - * No frontend user is logged in - * No backend user is logged in + * No `*_INT` or `*_EXT` objects are on the page (e.g. :ref:`cobj-user`) + * No frontend users are logged in + * No backend users are logged in If these conditions are met, the headers sent are: @@ -854,21 +852,21 @@ Properties of 'config' * Cache-Control: max-age: [seconds til expiretime] * Pragma: public - In case caching is not allowed, these headers are sent to avoid client + If caching is not allowed, the following headers are sent to avoid client caching: * Cache-Control: private, no-store - Notice that enabling the browser caches means you have to consider how - log files are written. Because when a page is cached on the client it + Notice that enabling browser caches means you will have to consider how + log files are written because when a page is cached on the client it will not invoke a request to the webserver, thus not writing the - request to the log. There should be ways to circumvent these problems - but they are outside the domain of TYPO3 in any case. + request to a log. There should be ways to circumvent these problems + but they are outside the domain of TYPO3. **Tip:** Enabling cache-control headers might confuse editors seeing old content served from the browser cache. "Shift-Reload" will bypass - both browser- and reverse-proxy caches and even make TYPO3 regenerate - the page. Teach them that trick! + both browser- and reverse-proxy caches and make TYPO3 regenerate + the page. A good tip worth knowing about! .. confval:: sendCacheHeadersForSharedCaches :name: config-sendCacheHeadersForSharedCaches @@ -876,17 +874,17 @@ Properties of 'config' .. versionadded:: 13.3 - When working with proxies, it is much helpful to take load - off of TYPO3 / the webserver by keeping a cached version for a period of - time and answering requests from the client, while still telling the - client to not cache the response inside the browser cache. + When working with proxies, keeping a cached version for a period of + time and answering requests from the client will take load + off TYPO3 / the webserver, while at the same time notifying the + client not to cache the response in the browser cache. This is achieved by setting :typoscript:`config.sendCacheHeadersForSharedCaches = auto`. - With this option enabled, TYPO3 evaluates if the current TYPO3 Frontend - request is executed behind a reverse proxy, and if so, TYPO3 sends the following - HTTP Response Headers at a cached response: + When this option is enabled, TYPO3 evaluates the current TYPO3 frontend + request to see if it is being executed behind a reverse proxy. If so, TYPO3 + sends the following HTTP Response Headers as a cached response: .. code-block:: plaintext @@ -895,45 +893,43 @@ Properties of 'config' Cache-Control: max-age=0, s-maxage=86400 Pragma: public - With :typoscript:`config.sendCacheHeadersForSharedCaches = force` the reverse - proxy evaluation can be omitted, which can be used for local webserver internal + When :typoscript:`config.sendCacheHeadersForSharedCaches = force` the reverse + proxy evaluation can be omitted. Use for local webserver internal caches. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control - for details and if your reverse proxy supports this directive. + for details and whether your reverse proxy supports this directive. .. confval:: showWebsiteTitle :name: config-showWebsiteTitle :type: :ref:`data-type-boolean` :Default: 1 - The option can be used to specify whether the website title defined in + This option can be used to specify whether the website title defined in the :ref:`site configuration <t3coreapi:sitehandling>` should be added to the page title (used for the :html:`<title>` tag, for example). - By default, the website title is added. To omit the website title, the - option has to be set to `0`. + By default, the website title is added. To omit the website title, set the + option to `0`. .. confval:: spamProtectEmailAddresses :name: config-spamProtectEmailAddresses :type: `-10` to `10` :Example: :ref:`setup-config-spamprotectemailaddresses-lastdotsubst` - If set, then all email addresses in typolinks will be encrypted so + If set, all email addresses in typolinks will be encrypted so that it is harder for spam bots to detect them. - If you set this value to a number, then the encryption is an - offset of character values. If you set this value to "-2" then all - characters will have their ASCII value offset by "-2". To make this - possible, a little JavaScript code is added to every generated web - page! + If you set this value to a number then the encryption method is an + offset of character values. If you set this value to "-2" all + characters will have their ASCII value offset by "-2". It works by adding + a small piece of JavaScript code to every web page. - (It is recommended to set the value in the range from -5 to 1 since + (It is recommended to set the option to a value between -5 to 1 since setting it to >= 2 means a "z" is converted to "\|" which is a special - character in TYPO3 tables syntax – and that might confuse columns in - tables.) + character in TYPO3 table syntax – which might lead to confusion.) - It is required to enable the default JavaScript and not disable it. + Default JavaScript needs to be enabled. (see :ref:`removeDefaultJS <setup-config-removedefaultjs>`) .. confval:: spamProtectEmailAddresses_atSubst @@ -957,10 +953,10 @@ Properties of 'config' :type: array :Example: :ref:`setup-config-tx-extension-key-with-no-underscores` - Configuration space for extensions. This can be used – for example – - by plugins that need some TypoScript configuration, but that don't - actually display anything in the frontend (i.e. don't receive their - configuration as an argument from the frontend rendering process). + Configuration space for extensions. This can be used for plugins that + have TypoScript configuration, but that don't display anything in the frontend + (i.e. don't receive their configuration as an argument from the frontend + rendering process). .. confval:: typolinkLinkAccessRestrictedPages :name: config-typolinkLinkAccessRestrictedPages @@ -972,9 +968,9 @@ Properties of 'config' this setting is an integer it will be interpreted as a page id to which the link will be directed. - If the value is :typoscript:`NONE` the original link to the page will be kept - although it will generate a page-not-found situation (which can of - course be picked up properly by the page-not-found handler and present + If the value is :typoscript:`NONE`, the original link to the page will be kept + although it will generate a page-not-found situation (which could, of + course, be properly handled by the page-not-found handler and present a nice login form). See :confval:`menu-common-properties-showaccessrestrictedpages` @@ -1042,7 +1038,7 @@ Demonstrates: config.absRefPrefix = / -#. Prefixing all links with the path to a subdirectory: +#. Prefixing all links with a path to a subdirectory: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -1126,15 +1122,15 @@ calculation for page 10: config.cache.10 = fe_users:2 -This includes records from multiple sources, namely the :sql:`fe_users` -records on page 2 and the :sql:`tt_new` records on page 11: +This includes records from multiple sources; :sql:`fe_users` +records on page 2 and :sql:`tt_new` records on page 11: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript config.cache.10 = fe_users:2,tt_news:11 -Consider the :sql:`fe_users` records on the storage page 2 for the cache lifetime of all +Take :sql:`fe_users` records on storage page 2 into account for the cache lifetime of all pages: .. code-block:: typoscript @@ -1142,7 +1138,7 @@ pages: config.cache.all = fe_users:2 -Each pages cache lifetime is influenced if fe_users stored on the page itself get +Each page's cache lifetime is affected if fe_users stored on the same page are changed: .. code-block:: typoscript @@ -1356,9 +1352,8 @@ This will add `&print=[print-value]` to all links in TYPO3. config.linkVars = tracking|green(0-5) -With the above configuration the following example GET parameters will -be kept: `&tracking[green]=3`. But a get parameter like -`tracking[blue]` will not be kept. +In the above configuration, GET parameter `&tracking[green]=3` would +be kept, but `tracking[blue]` would not be kept. .. _setup-config-message-preview-workspace: @@ -1450,15 +1445,16 @@ By default, TYPO3 ships with two providers: } } -The ordering of the providers is based on the :typoscript:`before` and +The order of providers is based on the :typoscript:`before` and :typoscript:`after` parameters. If you want a provider to be handled before a specific other provider, set that provider in -the :typoscript:`before`, do the same with :typoscript:`after`. +:typoscript:`before` and :typoscript:`after`. .. note:: - The :typoscript:`seo` PageTitleProvider is only available with installed SEO system extension. + The :typoscript:`seo` PageTitleProvider is only available if the SEO system + extension is installed. -You can find information about creating own PageTitleProviders in the section +You can find information about creating your own PageTitleProviders in the section :ref:`PageTitle API <t3coreapi:pagetitle>`. @@ -1470,14 +1466,14 @@ Use custom separators between page title parts Demonstrates: * :confval:`config.pageTitleSeparator <config-pageTitleSeparator>` -This produces a title tag with the content "website . page title": +This produces a title tag with the format "website . page title": .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript config.pageTitleSeparator = . -This produces a title tag with the content "website - page title": +This produces a title tag with the format "website - page title": .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -1485,7 +1481,7 @@ This produces a title tag with the content "website - page title": config.pageTitleSeparator = - config.pageTitleSeparator.noTrimWrap = | | | -This produces a title tag with the content "website*page title": +This produces a title tag with the format "website*page title": .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -1493,7 +1489,7 @@ This produces a title tag with the content "website*page title": config.pageTitleSeparator = * config.pageTitleSeparator.noTrimWrap = ||| -If you want to remove the web page title from the displayed title, choose a separator that is not included in the web page title. +If you want to remove the web page title from the title, choose a separator that is not included in the web page title. Then split the title from that character and return the second part only: .. code-block:: typoscript @@ -1578,6 +1574,6 @@ Demonstrates: typolinkLinkAccessRestrictedPages_addParams = &return_url=###RETURN_URL###&pageId=###PAGE_ID### } -Will create a link to page with id 29 and add GET parameters where the -return URL and original page id is a part of it. Additionally, a CSS +Will create a link to the page with id 29 and add GET parameters with +the return URL and original page id. Additionally, CSS class "restricted" is added to the anchor tag. From 50faaa747f86e2afc0ff9fe5989097e008782992 Mon Sep 17 00:00:00 2001 From: Sarah McCarthy <sarahmccarthy123@yahoo.com> Date: Mon, 13 Oct 2025 14:47:02 +0200 Subject: [PATCH 123/125] [TASK] Overhaul docs (#1623) Releases:main (cherry picked from commit 9eec000b6c7649de223bdd4ae3bb6099027b3f34) --- .../Mod/WebLayout/BackendLayout.rst | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst b/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst index 21d48a317..e2785f759 100644 --- a/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst +++ b/Documentation/PageTsconfig/Mod/WebLayout/BackendLayout.rst @@ -6,37 +6,39 @@ Backend layouts =============== -Backend layouts were initially introduced in order to customize the view of -the :guilabel:`Page` module in TYPO3 Backend for a page, but has then since grown also in -Frontend rendering to select for example Fluid template files via TypoScript for a page, -commonly used via :confval:`data:pagelayout <t3tsref:data-pagelayout>`. +Backend layouts were initially introduced to display editable versions of the +webpages in the backend (in the :guilabel:`Page` module). However, they have now +increased their functionality and can be used for frontend rendering as well. Using +TypoScript, the Fluid template for a webpage is chosen depending on which backend +layout a page has. (The TypoScript :confval:`data:pagelayout <t3tsref:data-pagelayout>` +function retrieves the backend layout). .. figure:: /Images/ManualScreenshots/BackendLayouts/PageModule.png A page module with a backend layout that has 3 content areas. -Backend layouts are organized in rows and columns. Content areas can span -multiple rows and or columns. They cannot be nested. For nested layouts in the -backend use an extension like :composer:`b13/container`. +Backend layouts contain content areas that are organized in rows and columns. Content +areas can span multiple rows and columns, but they cannot be nested. For nested layouts in the +backend, use an extension like :composer:`b13/container`. The page TSconfig for the backend layout above can be found in the site package -tutorial: :ref:`Create the backend page layouts <t3sitepackage:backend-page-layouts>`. +tutorial: :ref:`Create backend page layouts <t3sitepackage:backend-page-layouts>`. -For extended examples have a look at the predefined `backend layouts of the bootstrap +For further examples, see `backend layouts in the bootstrap package (GitHub) <https://github.com/benjaminkott/bootstrap_package/tree/master/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts>`__. .. confval-menu:: .. confval:: BackendLayouts.[backendLayout] :name: mod-web-layout-BackendLayouts - :type: array + :type: array:guilabel:`Page` module :Path: mod.web_layout.BackendLayouts .. confval:: title :name: mod-web-layout-BackendLayouts-backendLayout-title :type: string or language identifier - The title of the backend layout. It will be displayed in the page + The title of a backend layout. It will be displayed in the page properties in the backend. .. figure:: /Images/ManualScreenshots/BackendLayouts/PageProperties.png @@ -46,7 +48,7 @@ package (GitHub) <https://github.com/benjaminkott/bootstrap_package/tree/master/ :name: mod-web-layout-BackendLayouts-backendLayout-icon :type: string, extension path to an image file - The icon to be displayed in the page properties. + The icon in the page properties. .. code-block:: tsconfig :caption: EXT:bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right_2_columns.tsconfig @@ -61,13 +63,13 @@ package (GitHub) <https://github.com/benjaminkott/bootstrap_package/tree/master/ :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout.colCount :type: integer - Total number of columns in the backend layout. + The total number of columns in the backend layout. .. confval:: rowCount :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout.rowCount :type: integer - Total number of rows in the backend layout. + The total number of rows in the backend layout. .. confval:: rows.[row].columns.[col] @@ -75,73 +77,72 @@ package (GitHub) <https://github.com/benjaminkott/bootstrap_package/tree/master/ :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-name :type: string or language identifier - Name of the input area where content elements can be added. Will be + The name of the input area where content elements can be added. Will be displayed in the :guilabel:`Page` module. .. confval:: colPos :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-colPos :type: integer, 0 - maxInt - When content elements are added to this area, the value of `colPos` + If content elements have been added to this area, the value of `colPos` .. confval:: identifier :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-identifier :type: string An identifier that can be used by the page content - DataProcessor to identify the content elements within this + DataProcessor to identify the content elements in this area. - It is a speaking representation for the :confval:`colPos <mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-colPos>`, - such as "main", "sidebar" or "footerArea". + It is a more meaningful representation than just :confval:`colPos <mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-colPos>`, + such as "main", "sidebar" and "footerArea". .. confval:: slideMode :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-slideMode :type: string, "" (empty string), "slide", "collect", "collectReverse" An identifier that can be used by the page content - DataProcessor to identify the content elements within this + DataProcessor to identify content elements in this area. `slide` If no content is found, check the parent pages for more content `collect` - Use all content from this page, and the parent pages as one collection + Use all content from this page and the parent pages as one collection `collectReverse` - Same as "collect" but in the opposite order + The same as "collect", but in the opposite order .. confval:: colspan :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-colspan :type: integer, 1 - :confval:`mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout.colCount` Can be used if the content element area should span multiple - columns as for the "Jumbotron" example in the example above. + columns as in the "Jumbotron" example above. .. confval:: rowspan :name: mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout-rows-row-columns-col-rowspan :type: integer, 1 - :confval:`mod-web-layout-BackendLayouts-backendLayout-title-config-backend_layout.rowCount` - Can be used if the content element area should span multiple + Can be used if the content element area spans multiple rows. Example: Use a backend layout in the page content data processor ================================================================ -Define the backend layout via page TSconfig, for example in the site: +Define the backend layout via page TSconfig, like in the site below: .. literalinclude:: _BackendLayout.tsconfig :caption: config/sites/my-site/page.tsconfig -Configure the output via TypoScript, using the content object -:ref:`PAGEVIEW <t3tsref:cobj-pageview>` and the DataProcessor -`page-content`. +Configure the output with TypoScript, using the :ref:`PAGEVIEW <t3tsref:cobj-pageview>` +content object and the `page-content` DataProcessor. .. todo: Link Dataprocessor .. literalinclude:: _BackendLayout.typoscript :caption: config/sites/my-site/setup.typoscript -Use the identifiers of the columns in the Fluid template: +Use the column identifiers in a Fluid template: .. literalinclude:: _Default.html :caption: EXT:my_sitepackage/Resources/Private/Templates/Pages/Default.html From ec9c3aa8c7b268d111783d73ec307df3a4c0d8de Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:49:13 +0200 Subject: [PATCH 124/125] [TASK] Overhaul docs (#1626) Releases:main Co-authored-by: Sarah McCarthy <sarahmccarthy123@yahoo.com> From 1cc2f45684326a4a145f23695cc2fdca06a85460 Mon Sep 17 00:00:00 2001 From: Sarah McCarthy <sarahmccarthy123@yahoo.com> Date: Thu, 16 Oct 2025 15:43:27 +0200 Subject: [PATCH 125/125] [TASK] Overhaul docs (#1628) * [TASK] Overhaul docs Releases:main, Backport 13.4 * [TASK] Overhaul docs Releases:main, Backport 13.4 (cherry picked from commit 2360e64249e5eeb24eeedac8dc2e5a433d4339fd) --- Documentation/Functions/Data.rst | 222 +++++++++++++++---------------- 1 file changed, 108 insertions(+), 114 deletions(-) diff --git a/Documentation/Functions/Data.rst b/Documentation/Functions/Data.rst index d58b1058e..4c95cdaa0 100644 --- a/Documentation/Functions/Data.rst +++ b/Documentation/Functions/Data.rst @@ -7,10 +7,10 @@ Data / getText ============== -The `getText` data type is some kind of tool box allowing to retrieve -values from a variety of sources, for example from `GET`/`POST` variables, from -registers, values from the page tree, items in the page menus, records -from any database table, etc. +The `getText` data type is a kind of tool box for retrieving +values from different sources, for example, `GET`/`POST` variables, +registers, values from the page tree, items in the page menus and records +from database tables. The general syntax is as follows: @@ -19,31 +19,28 @@ The general syntax is as follows: lib.foo.data = <key> : <code> -where :typoscript:`<key>` indicates the source and :typoscript:`<code>` is some form of path or -pointer to the value, which depends on the key used. The various keys and -their possible codes are described below. +where :typoscript:`<key>` indicates the source and :typoscript:`<code>` contains paths or +pointers to values. Possible keys and codes are described below. -The :typoscript:`code` can contain pipe characters :typoscript:`|` to separate keys -in a multidimensional array. This, for example, works with :typoscript:`TSFE`: +The :typoscript:`code` can contain pipe characters :typoscript:`|` which will +result in a multidimensional array. This, for example, works with :typoscript:`TSFE`: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript lib.foo.data = TSFE : fe_user | user | username -Some codes work with a different separator, which is documented right at the +Some codes use a different separator, but this is documented in the code. Spaces around the colon (:typoscript:`:`) are irrelevant. The :typoscript:`key` is case-insensitive. .. _data-type-gettext-double-slash: -By separating the value of getText with :typoscript:`//` (double slash) a number of -codes can be supplied and getText will return the first one, which is not -empty ("" or zero). - -To get the content of the field "header". If "header is empty, "title" is -retrieved. If "title" is empty as well, it finally gets the field "uid": +Using multiple codes separated by a :typoscript:`//` (double slash) will return +the first one that is not empty ("" or zero). The TypoScript below gets the +content of the "header" field. If "header" is empty, "title" is +retrieved. If "title" is also empty, the "uid" field is retrieved: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -69,7 +66,7 @@ applicationcontext :name: data-applicationcontext Returns the current :ref:`application context <t3coreapi:application-context>` - as string. + as a string. .. _data-type-gettext-applicationcontext-example: @@ -96,16 +93,16 @@ asset :name: data-asset .. versionadded:: 13.2 - Local resources can be cache-busted. It is not necessary anymore - to rename the asset when it is exchanged, forcing browsers to relod the file. + Local resources can be cache-busted. It is no longer necessary + to rename the asset when it is exchanged, forcing browsers to reload the file. The getText `asset` function includes assets like images, CSS or - JavaScript in a cache-busted way. + JavaScript that are cache-busted. Depending on :confval:`$GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename'] <t3coreapi:typo3-conf-vars-fe-versionnumberinfilename>` - the cache buster is applied as query string or embedded in the filename. + the cache buster is applied as a query string or embedded in the filename. - The result is the same like using argument :fluid:`useCacheBusting="true"` + The result is the same as using the argument :fluid:`useCacheBusting="true"` in :ref:`t3viewhelper:typo3-fluid-uri-resource`. Example: Display extension icon with cache buster @@ -182,7 +179,7 @@ current .. confval:: current :name: data-current - current (gets the "current" value) + Current (gets the "current" value) .. TODO: What is the "current" value? We should explain that. @@ -224,11 +221,11 @@ DB :name: data-db :Syntax: DB : [table name] : [uid] : [field] - Value from database. Any record from a table in TCA can be selected here. - Records marked as deleted will not return any value. + Value from the database. Any record from any table that is in the TCA can be + selected here. Records marked as deleted will not return a value. - In contrast to other keys, colons are used here to get deeper into the - structure, instead of pipes. + In contrast to the other keys, colons are used here instead of pipes to drill down into the + structure. .. _data-type-gettext-db-example: @@ -243,8 +240,8 @@ Get the value of the header field of record with uid 234 from table lib.foo.data = DB : tt_content:234:header -Get the value of the header field of a record, whose uid is stored in a GET -parameter `myContentId`: +Get the value of the header field of a record, where the uid is in the +`myContentId` GET parameter : .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -252,10 +249,10 @@ parameter `myContentId`: lib.foo.data.dataWrap = DB : tt_content:{GP : myContentId}:header .. note:: - It is safe to directly use a client-/user-provided input for the id of a DB + It is safe to use client-/user-provided input for the id of a DB record here. The function :php:`ContentObjectRenderer->getData()` internally calls the function :php:`PageRepository->getRawRecord()`, which converts the - parameter to int via :php:`QueryBuilder->createNamedParameter()` + parameter to an int via :php:`QueryBuilder->createNamedParameter()` .. _data-type-gettext-debug: @@ -266,8 +263,8 @@ debug .. confval:: debug :name: data-debug - Returns HTML-formatted content of the PHP variable defined by the keyword. - Available keywords are :typoscript:`rootLine`, :typoscript:`fullRootLine`, :typoscript:`data`, + Returns HTML-formatted content of a PHP variable. + Available variables are :typoscript:`rootLine`, :typoscript:`fullRootLine`, :typoscript:`data`, :typoscript:`register` and :typoscript:`page`. .. _data-type-gettext-debug-example: @@ -289,19 +286,18 @@ field .. confval:: field :name: data-field - :Syntax: field : [field name from the current :php:`$cObj->data` array in the cObject, multi-dimensional.] + :Syntax: field : [a field name in the current :php:`$cObj->data` array in the cObject, multidimensional] - This gives read access to the current value of an internal global variable determined by the given key. + This gives read access to the value of an internal global variable depending on the key. - - As default the :php:`$cObj->data` array is :php:`$GLOBALS['TSFE']->page` - (record of the current page) + - By default, the :php:`$cObj->data` array is the record of the current page. - - In :ref:`TMENU <tmenu>` :php:`$cObj->data` is set in a loop to the page-record for - each menu item during its rendering process. + - In :ref:`TMENU <tmenu>` :php:`$cObj->data` is set to the page-record of + each menu item in loop iterations during the rendering process. - In :ref:`cobj-content` / :ref:`cobj-records` :php:`$cObj->data` is set to - the actual record + the current record - In :ref:`GIFBUILDER <gifbuilder>` :php:`$cObj->data` is set to the data :ref:`GIFBUILDER <gifbuilder>` is supplied with. @@ -318,7 +314,7 @@ Get content from :php:`$cObj->data['header']`: lib.foo.data = field : header -Example: Get data of a field +Example: Get data in a field ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Get content from :php:`$cObj->data['fieldname']['level1']['level2']`: @@ -339,27 +335,27 @@ file Retrieves a property from a file object (:ref:`FAL <t3coreapi:fal>`) by identifying it through its :sql:`sys_file` UID. Note that during execution of the :ref:`cobj-files` cObject, - it is also possible to reference the current file with :confval:`data-current` as UID like - :typoscript:`file : current : size`. + it is possible to reference the current file using :confval:`data-current` as the UID, + for example, :typoscript:`file : current : size`. The following properties are available: name, uid, originalUid, size, sha1, - extension, mimetype, contents, publicUrl, modification_date, creation_date + extension, mimetype, contents, publicUrl, modification_date and creation_date. - Furthermore when manipulating references (such as images in content elements - or media in pages), additional properties are available (not all are + Furthermore, when manipulating references (such as images in content elements + and media on pages), these additional properties are available (not all are available all the time, it depends on the setup of *references* of the - :ref:`cobj-files` cObject): title, description, link, alternative. + :ref:`cobj-files` cObject): title, description, link and alternative. - Additionally, any data in the :sql:`sys_file_metadata` table can be accessed too. + Any data in the :sql:`sys_file_metadata` table can also be accessed. - See the :ref:`FILES <cobj-files-examples>` cObject for usage examples. + See the :ref:`FILES <cobj-files-examples>` cObject for examples of usage. .. _data-type-gettext-file-example: Example: Get the size of a file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Get the file size of the file with the sys\_file UID 17: +Get the size of the file with sys\_file UID 17: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -375,7 +371,7 @@ flexform :name: data-flexform :Syntax: flexform : [field containing flexform data] : [property of this flexform] - Access values from :ref:`FlexForms <t3coreapi:flexforms>`, for example inside of :sql:`tt_content` record. + Access values in :ref:`FlexForms <t3coreapi:flexforms>`, for example, inside a :sql:`tt_content` record. .. _data-type-gettext-flexform-example: @@ -398,12 +394,12 @@ fullRootLine :name: data-fullRootLine :Syntax: fullRootLine : [pointer, integer], [field name], ["slide"] -This property can be used to retrieve values from "above" the current page's -root. Take the below page tree and assume that we are on the page "Here you -are!". Using the :ref:`data-type-gettext-levelfield` property, it is possible -to go up only to the page "Site root", because it is the root of a new -(sub-)site. With :typoscript:`fullRootLine` it is possible to go all the way up to page -tree root. The numbers between square brackets indicate to which page each +Used to retrieve values from "above" the current page's +root. Assume that you are on the page "You are here!" in the page tree below. +Using the :ref:`data-type-gettext-levelfield` property, you +can only go up to the page "Site root", because it is the root of a new +(sub-)site. :typoscript:`fullRootLine` allows you to go all the way up to the page +tree root. The numbers in square brackets indicate which page each value of *pointer* would point to: .. code-block:: text @@ -411,17 +407,17 @@ value of *pointer* would point to: - Page tree root [-2] |- 1. page before [-1] |- Site root (root template here!) [0] - |- Here you are! [1] + |- You are here! [1] -A "slide" parameter can be added just as for the -:ref:`data-type-gettext-levelfield` property. +A "slide" parameter can be added (like in :ref:`data-type-gettext-levelfield` +property). .. _data-type-gettext-fullrootline-example: Example: Get the title of the previous page ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Get the title of the page right before the start of the current website: +Get the title of the page before the start of the current website: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -438,14 +434,14 @@ getenv Value from PHP environment variables. - For a cached variation of this feature, please refer to :ref:`getEnv <getenv>`. + For a cached version of this feature, see :ref:`getEnv <getenv>`. .. _data-type-gettext-getenv-example: Example: Get the HTTP referer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Get the environment variable `HTTP_REFERER`: +Get the environment variable `HTTP_REFERER`. .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -462,10 +458,9 @@ getIndpEnv :Syntax: getIndpEnv : <name> Returns the value of a *System Environment Variable* denoted by - *name* regardless of server OS, CGI/MODULE version etc. The result is - identical to the :php:`$_SERVER` variable in most cases. This method should - be used instead of *getEnv* to get reliable values for all situations. The - internal processing is handled by + *name* regardless of server OS, CGI/MODULE version, etc. The result is + usually identical to the :php:`$_SERVER` variable. This method is more reliable + then *getEnv*. Internal processing is handled by :php:`TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv()` Available names: @@ -521,7 +516,7 @@ global :name: data-global :Syntax: global : [variable] - Deprecated, use :ref:`data-type-gettext-gp`, :ref:`data-type-gettext-tsfe` or + Deprecated. Use :ref:`data-type-gettext-gp`, :ref:`data-type-gettext-tsfe` or :ref:`data-type-gettext-getenv`. .. _data-type-gettext-gp: @@ -533,7 +528,7 @@ GP :name: data-gp :Syntax: GP : [Value from GET or POST method] - Get a variable from :php:`$_GET` or :php:`$_POST` where a variable, which + Get a variable from :php:`$_GET` or :php:`$_POST` when a variable, which exists in both arrays, is returned from :php:`$_POST`. .. _data-type-gettext-gp-example: @@ -584,15 +579,15 @@ levelfield :name: data-levelfield :Syntax: levelfield : [pointer, integer], [field name], ["slide"] - Like :ref:`data-type-gettext-leveltitle` but the field to be fetched from the - record is configurable. + Like :ref:`data-type-gettext-leveltitle` but you can choose which field should + be fetched from the record. .. _data-type-gettext-levelfield-example: -Example: Get a field from a page up in the root-line -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Example: Get a field from a page up the root-line +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Get the value of the user-defined field :sql:`tx_myextension_myfield` in the root line. +Get the value of user-defined field :sql:`tx_myextension_myfield` in the root line. .. code-block:: typoscript :caption: EXT:my_extension/Configuration/TypoScript/setup.typoscript @@ -606,7 +601,7 @@ Get the value of the user-defined field :sql:`tx_myextension_myfield` in the roo use custom fields. To stay compatible with both TYPO3 v12 and v13, add the following to your - extensions :file:`ext_localconf.php`: + extension's :file:`ext_localconf.php`: .. literalinclude:: _Data/_addRootlineFields_ext_localconf.php :caption: EXT:my_extension/ext_localconf.php @@ -623,9 +618,9 @@ levelmedia Get the media field of a page in the root-line. - * Use an absolute level with 0 or a positive integer. - * With a negative integer got x levels up - * The slide parameter slides until there is a non-empty value found. + * Use an absolute level: 0 or a positive integer. + * Negative integers determine x levels up. + * The slide parameter slides until there is a non-empty value. .. _data-type-gettext-leveltitle: @@ -638,12 +633,12 @@ leveltitle Get the title of a page in the root-line. - * Use an absolute level with 0 or a positive integer. - * With a negative integer got x levels up - * The slide parameter slides until there is a non-empty value found. + * Use an absolute level: 0 or a positive integer. + * Negative integers determine x levels up + * The slide parameter slides until there is a non-empty value. -Example: Get the title of a page up in the root line -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Example: Get the title of a page up the root line +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Get the title of the page on the first level of the root line: @@ -652,8 +647,8 @@ Get the title of the page on the first level of the root line: lib.foo.data = leveltitle : 1 -Get the title of the page on the level right below the current page AND if -that is not present, walk to the bottom of the root line until there's a +Get the title of the page on the level immediately below the current. If +it is empty, walk to the bottom of the root line until there is a title: .. code-block:: typoscript @@ -672,8 +667,8 @@ leveluid Get the UID of a page in the root line. - * Use an absolute level with 0 or a positive integer. - * With a negative integer got x levels up + * Use an absolute level: 0 or a positive integer. + * Negative integers determine x levels up. .. _data-type-gettext-leveluid-example: @@ -739,7 +734,7 @@ pagelayout .. confval:: pagelayout :name: data-pagelayout - Get the current backend layout + Get the current backend layout. .. _data-type-gettext-pagelayout-example: @@ -760,7 +755,7 @@ parameters :name: data-parameters :Syntax: parameters: [field name from the current :php:`$cObj->parameters` array in the cObject.] - Get the content of a key in :php:`parameters` array of the current cObject. + Get the content of a key in the :php:`parameters` array of the current cObject. .. _data-type-gettext-parameters-examples: @@ -782,7 +777,7 @@ path .. confval:: path :name: data-path - Path to a file, possibly placed in an extension, returns empty if the file + Path to a file, for example, that is in an extension. Returns an empty value if the file does not exist. .. _data-type-gettext-path-example: @@ -825,7 +820,7 @@ register Example: Get the content of a register ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Get content from the :ref:`register <using-setting-register>`: +Get content from a :ref:`register <using-setting-register>`: .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -847,9 +842,9 @@ request Retrieve the property of a :ref:`PSR-7 request attribute <t3coreapi:request-attributes>`. - Note that only scalar properties can be retrieved: int, float, string or - bool as value. If the property is an object or an array, a subproperty can - be given which then calls the getter method of the object or retrieves the + Only scalar properties can be retrieved: int, float, string or + bool values. If the property is an object or an array, a subproperty can + be used to call the getter method of the object or retrieve the key of the array. .. _data-type-gettext-request-example-page-type: @@ -896,7 +891,7 @@ session :name: data-session :Syntax: session : [key] - The `key` refers to the session key used to store the value. + The `key` is the session key used to store a value. .. _data-type-gettext-session-example: @@ -920,7 +915,7 @@ site :name: data-site :Syntax: site : [key] - Accessing the current + Accesses the current :ref:`site configuration <t3coreapi:sitehandling-basics>`. .. rubric:: Possible keys: @@ -932,7 +927,7 @@ site The base URL for this site. :typoscript:`baseVariants` - The base variants for this site. + The base variants of this site. :typoscript:`rootPageId` The root page ID of this site. @@ -955,8 +950,8 @@ Example: Get values from the current site page.10.data = site:base page.10.wrap = This is your base URL: | -Where :typoscript:`site` is the keyword for accessing an aspect, and the -following parts are the configuration key(s) to access. +:typoscript:`site` is the keyword, and the parts after the colon are the +configuration key(s) to access. .. code-block:: typoscript :caption: EXT:site_package/Configuration/TypoScript/setup.typoscript @@ -974,7 +969,7 @@ siteLanguage :name: data-siteLanguage :Syntax: siteLanguage : [key] - Accessing the current + Accesses the current :ref:`site language configuration <t3coreapi:sitehandling-addingLanguages>`. @@ -987,14 +982,13 @@ siteLanguage The base URL for this language. :typoscript:`flagIdentifier` - The flag key (like `gb` or `fr`) used in the TYPO3 backend. + The flag key (for example, `gb` or `fr`) used in the TYPO3 backend. - .. versionadded:: 12.4 - You can also use :typoscript:`flag` to match the corresponding site - configuration setting. + :typoscript:`flag` can be used to match the site + configuration setting. :typoscript:`hreflang` - The language tag for this language defined by RFC 1766 / 3066 for + The language tag for this language defined by RFC 1766 / 3066 :html:`hreflang` attributes. This option is not relevant for regular websites without @@ -1006,7 +1000,7 @@ siteLanguage :typoscript:`locale` .. versionchanged:: 12.3 The :typoscript:`locale` property in typoscript can be subdivided - into more specific details using subkeys separated by a colon `:`. + using subkeys separated by a colon `:`. The subkeys `languageCode`, `countryCode`, and `full` allow access to the individual components of the :typoscript:`locale` value. For instance, a :typoscript:`locale` value of "en_US.UTF-8" can be @@ -1017,7 +1011,7 @@ siteLanguage :typoscript:`siteLanguage:twoLetterIsoCode`) * :typoscript:`countryCode`: contains the uppercase country code part of the locale - * :typoscript:`full`: contains the entire locale (also the default + * :typoscript:`full`: contains the entire locale (this is also the default if no subkey is specified) The :typoscript:`locale` property represents the language, country, and @@ -1026,10 +1020,10 @@ siteLanguage subkeys for more precise language and location specifications. :typoscript:`navigationTitle` - The label to be used within language menus. + The label used in language menus. :typoscript:`title` - The label to be used within TYPO3 to identify the language. + The label used in TYPO3 to identify the language. :typoscript:`typo3Language` The prefix for TYPO3's language files (`default` for English), otherwise @@ -1037,8 +1031,8 @@ siteLanguage TypoScript :typoscript:`config.language = fr`. :typoscript:`websiteTitle` - The website title for this language. No automatic fallback to the - :typoscript:`site:websiteTitle`! + The website title for this language. Note: there is no automatic fallback to the + :typoscript:`site:websiteTitle`. .. _data-type-siteLanguage-example: @@ -1068,7 +1062,7 @@ siteSettings .. confval:: siteSettings :name: data-siteSettings - Access the :ref:`site settings <t3coreapi:sitehandling-settings>` for the + Access the :ref:`site settings <t3coreapi:sitehandling-settings>` of the current site. .. _data-type-siteSettings-example: @@ -1097,7 +1091,7 @@ TSFE .. versionchanged:: 13.0 - The following properties within TypoScriptFrontendController (TSFE) have + The following TypoScriptFrontendController (TSFE) properties have been removed: * :php:`spamProtectEmailAddresses` @@ -1106,7 +1100,7 @@ TSFE * :php:`fileTarget` * :php:`baseUrl` - Migrate these properties to use the config property. You can access the + Migrate these properties to the config property. You can access the TypoScript properties directly, for example, via :typoscript:`lib.something.data = TSFE : config | config | fileTarget`