From 61a63389ad396bf5328fa27c152875a0ca1f01f3 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Fri, 2 Mar 2018 16:36:44 +0100
Subject: [PATCH] [FEATURE] Add absolute option to typolink VHs

In order to generate absolute URLs through the
Typolink ViewHelpers of TYPO3 Fluid, a new
fluid parameter "absolute" is added to the following
ViewHelpers.

* <f:link.typolink>
* <f:uri.typolink>

As typolink() is allowing this option, the generation
of absolute URLs behaves the same way as typolink()
itself does it.

Use it like this:

The ViewHelper code:
- <f:link.typolink parameter="23">Link To My Page</f:link.typolink>
generates:
- <a href="index.php?id=23">Link to My Page</a>

The ViewHelper code:
- <f:link.typolink parameter="23" absolute="true">Link To My Page</f:link.typolink>
generates:
- <a href="https://www.mydomain.com/index.php?id=23">Link to My Page</a>

The ViewHelper code:
- <f:uri.typolink parameter="23" />
generates:
- "index.php?id=23"

The ViewHelper code:
- <f:uri.typolink parameter="23" absolute="true" />
generates:
- "https://www.mydomain.com/index.php?id=23"

Resolves: #84120
Releases: master
Change-Id: I6b6df0ebc8a7c257ab854959e5425debd0cadd5e
Reviewed-on: https://review.typo3.org/55990
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Riccardo De Contardi <erredeco@gmail.com>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
---
 ...120-AbsoluteURLsForTypolinkViewHelpers.rst | 33 +++++++++++++++++++
 .../ViewHelpers/Link/TypolinkViewHelper.php   |  5 ++-
 .../ViewHelpers/Uri/TypolinkViewHelper.php    |  5 ++-
 .../Link/TypolinkViewHelperTest.php           |  2 ++
 4 files changed, 43 insertions(+), 2 deletions(-)
 create mode 100644 typo3/sysext/core/Documentation/Changelog/master/Feature-84120-AbsoluteURLsForTypolinkViewHelpers.rst

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-84120-AbsoluteURLsForTypolinkViewHelpers.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-84120-AbsoluteURLsForTypolinkViewHelpers.rst
new file mode 100644
index 000000000000..33423806142b
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-84120-AbsoluteURLsForTypolinkViewHelpers.rst
@@ -0,0 +1,33 @@
+.. include:: ../../Includes.txt
+
+========================================================
+Feature: #84120 - Absolute URLs for typolink ViewHelpers
+========================================================
+
+See :issue:`84120`
+
+Description
+===========
+
+A new parameter "absolute" is added to the Fluid ViewHelpers `<f:uri.typolink>` and `<f:link.typolink>`,
+allowing to generate absolute links, like other ViewHelpers used for linking handle it already.
+
+
+Impact
+======
+
+It is now possible to add the `absolute` parameter to the ViewHelpers above.
+
+.. code-block:: html
+
+    <f:link.typolink parameter="23" absolute="true">Link To My Page</f:link.typolink>
+    <f:uri.typolink parameter="23" absolute="true" />
+    
+generates 
+
+.. code-block:: html
+
+    <a href="https://www.mydomain.com/index.php?id=23">Link to My Page</a>
+    https://www.mydomain.com/index.php?id=23
+
+.. index:: Fluid, ext:fluid
\ No newline at end of file
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Link/TypolinkViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Link/TypolinkViewHelper.php
index db306a0221be..97b4d0dfe90d 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Link/TypolinkViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Link/TypolinkViewHelper.php
@@ -77,6 +77,7 @@ class TypolinkViewHelper extends AbstractViewHelper
         $this->registerArgument('addQueryString', 'bool', '', false, false);
         $this->registerArgument('addQueryStringMethod', 'string', '', false, 'GET');
         $this->registerArgument('addQueryStringExclude', 'string', '', false, '');
+        $this->registerArgument('absolute', 'bool', 'Ensure the resulting URL is an absolute URL', false, false);
     }
 
     /**
@@ -101,6 +102,7 @@ class TypolinkViewHelper extends AbstractViewHelper
         $addQueryString = $arguments['addQueryString'];
         $addQueryStringMethod = $arguments['addQueryStringMethod'];
         $addQueryStringExclude = $arguments['addQueryStringExclude'];
+        $absolute = $arguments['absolute'];
 
         // Merge the $parameter with other arguments
         $typolinkParameter = self::createTypolinkParameterArrayFromArguments($parameter, $target, $class, $title, $additionalParams);
@@ -130,7 +132,8 @@ class TypolinkViewHelper extends AbstractViewHelper
                         'addQueryString.' => [
                             'method' => $addQueryStringMethod,
                             'exclude' => $addQueryStringExclude
-                        ]
+                        ],
+                        'forceAbsoluteUrl' => $absolute
                     ]
                 ]
             );
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Uri/TypolinkViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Uri/TypolinkViewHelper.php
index 4607091475b8..b3392884a901 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Uri/TypolinkViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Uri/TypolinkViewHelper.php
@@ -60,6 +60,7 @@ class TypolinkViewHelper extends AbstractViewHelper
         $this->registerArgument('addQueryString', 'bool', '', false, false);
         $this->registerArgument('addQueryStringMethod', 'string', '', false, 'GET');
         $this->registerArgument('addQueryStringExclude', 'string', '', false, '');
+        $this->registerArgument('absolute', 'bool', 'Ensure the resulting URL is an absolute URL', false, false);
     }
 
     /**
@@ -77,6 +78,7 @@ class TypolinkViewHelper extends AbstractViewHelper
         $addQueryString = $arguments['addQueryString'];
         $addQueryStringMethod = $arguments['addQueryStringMethod'];
         $addQueryStringExclude = $arguments['addQueryStringExclude'];
+        $absolute = $arguments['absolute'];
 
         $content = '';
         if ($parameter) {
@@ -89,7 +91,8 @@ class TypolinkViewHelper extends AbstractViewHelper
                     'addQueryString.' => [
                         'method' => $addQueryStringMethod,
                         'exclude' => $addQueryStringExclude
-                    ]
+                    ],
+                    'forceAbsoluteUrl' => $absolute
                 ]
             );
         }
diff --git a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
index dc8fdb6bb200..2b24230bdb4b 100644
--- a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
@@ -86,6 +86,7 @@ class TypolinkViewHelperTest extends ViewHelperBaseTestcase
             'addQueryString' => $addQueryString,
             'addQueryStringMethod' => $addQueryStringMethod,
             'addQueryStringExclude' => $addQueryStringExclude,
+            'absolute' => false
         ]);
         $contentObjectRendererMock = $this->createMock(ContentObjectRenderer::class);
         $contentObjectRendererMock->expects($this->once())
@@ -102,6 +103,7 @@ class TypolinkViewHelperTest extends ViewHelperBaseTestcase
                             'method' => $addQueryStringMethod,
                             'exclude' => $addQueryStringExclude,
                         ],
+                        'forceAbsoluteUrl' => false,
                     ],
                 ]
             )
-- 
GitLab