From 265ced72f65cc564389f0657ff96a96a65b31daa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andre=CC=81=20Schlie=C3=9Fer?= <a.schliesser@zeroseven.de>
Date: Tue, 4 Dec 2018 17:50:24 +0100
Subject: [PATCH] [BUGFIX] Add support for language -1 to TCA field type slug

Use default language as fallback for records with sys_language_uid = -1

Resolves: #87067
Releases: master, 9.5
Change-Id: If57d5566b83f4bba79451e8595337ca6c0eb3fc9
Reviewed-on: https://review.typo3.org/59029
Tested-by: TYPO3com <noreply@typo3.com>
Reviewed-by: Susanne Moog <susanne.moog@typo3.org>
Reviewed-by: Mona Muzaffar <mona.muzaffar@gmx.de>
Tested-by: Mona Muzaffar <mona.muzaffar@gmx.de>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
---
 .../Classes/Form/Element/InputSlugElement.php |  2 +-
 .../Form/Element/InputSlugElementTest.php     | 82 +++++++++++++++++++
 2 files changed, 83 insertions(+), 1 deletion(-)
 create mode 100644 typo3/sysext/backend/Tests/Unit/Form/Element/InputSlugElementTest.php

diff --git a/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php b/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php
index cd67afdbef5e..6151dce59509 100644
--- a/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php
+++ b/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php
@@ -215,7 +215,7 @@ class InputSlugElement extends AbstractFormElement
      */
     protected function getPrefix(SiteInterface $site, int $requestLanguageId = 0): string
     {
-        $language = $site->getLanguageById($requestLanguageId);
+        $language = ($requestLanguageId < 0) ? $site->getDefaultLanguage() : $site->getLanguageById($requestLanguageId);
         $base = $language->getBase();
         $baseUrl = (string)$base;
         $baseUrl = rtrim($baseUrl, '/');
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/InputSlugElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/InputSlugElementTest.php
new file mode 100644
index 000000000000..08b7d59bec0d
--- /dev/null
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/InputSlugElementTest.php
@@ -0,0 +1,82 @@
+<?php
+declare(strict_types = 1);
+namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Backend\Form\Element\InputSlugElement;
+use TYPO3\CMS\Core\Site\Entity\Site;
+use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
+
+/**
+ * Tests for InputSlugElement Form
+ */
+class InputSlugElementTest extends UnitTestCase
+{
+    /**
+     * @test
+     */
+    public function getPrefixReturnsDefaultBaseUrlForAllDefinedLanguagesAndMinusOne(): void
+    {
+        $languages = [
+            [
+                'languageId' => 0,
+                'locale' => 'en_US.UTF-8',
+                'base' => '/en/'
+            ],
+            [
+                'languageId' => 1,
+                'locale' => 'de_DE.UTF-8',
+                'base' => '/de/'
+            ]
+        ];
+
+        $site = new Site('www.foo.de', 0, [
+            'languages' => $languages
+        ]);
+
+        $subject = $this->getAccessibleMock(
+            InputSlugElement::class,
+            ['dummy'],
+            [],
+            '',
+            false
+        );
+
+        static::assertSame('/en', $subject->_call('getPrefix', $site, -1));
+        static::assertSame('/en', $subject->_call('getPrefix', $site, 0));
+        static::assertSame('/de', $subject->_call('getPrefix', $site, 1));
+    }
+
+    /**
+     * @test
+     */
+    public function getPrefixThrowsInvalidArgumentExceptionForUndefinedLanguages(): void
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionCode(1522960188);
+
+        $site = new Site('www.foo.de', 0, []);
+
+        $subject = $this->getAccessibleMock(
+            InputSlugElement::class,
+            ['dummy'],
+            [],
+            '',
+            false
+        );
+
+        $subject->_call('getPrefix', $site, 99);
+    }
+}
-- 
GitLab