From 2394ba61250dc67915488c71dea42eb4e0492833 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Wed, 13 Nov 2024 15:43:59 +0000
Subject: [PATCH] load translations before comparing i18n field contents in
 SimpleORMap::isFieldDirty(), fixes #4864

Closes #4864

Merge request studip/studip!3643
---
 lib/classes/SimpleORMap.php                    |  8 ++++++++
 tests/unit/lib/classes/SimpleOrMapNodbTest.php | 11 ++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/lib/classes/SimpleORMap.php b/lib/classes/SimpleORMap.php
index d2cbcdca166..f3993c2706e 100644
--- a/lib/classes/SimpleORMap.php
+++ b/lib/classes/SimpleORMap.php
@@ -2233,6 +2233,14 @@ class SimpleORMap implements ArrayAccess, Countable, IteratorAggregate
         if ($this->content[$field] === null || $this->content_db[$field] === null) {
             return $this->content[$field] !== $this->content_db[$field];
         } else if ($this->content[$field] instanceof I18NString || $this->content_db[$field] instanceof I18NString) {
+            // Trigger loading of translations
+            if ($this->content[$field] instanceof I18NString) {
+                $this->content[$field]->toArray();
+            }
+            if ($this->content_db[$field] instanceof I18NString) {
+                $this->content_db[$field]->toArray();
+            }
+
             return $this->content[$field] != $this->content_db[$field];
         } else {
             return (string)$this->content[$field] !== (string)$this->content_db[$field];
diff --git a/tests/unit/lib/classes/SimpleOrMapNodbTest.php b/tests/unit/lib/classes/SimpleOrMapNodbTest.php
index 3ede1aa8e0a..9fa1eed3f62 100644
--- a/tests/unit/lib/classes/SimpleOrMapNodbTest.php
+++ b/tests/unit/lib/classes/SimpleOrMapNodbTest.php
@@ -25,8 +25,6 @@ class auth_user_md5 extends SimpleORMap
         $config['serialized_fields']['jsondata'] = 'JSONArrayObject';
         $config['notification_map']['after_store'] = 'auth_user_md5DidCreateOrUpdate';
 
-        $config['i18n_fields'] = ['i18n_field'];
-
         parent::configure($config);
     }
 
@@ -366,7 +364,14 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit
         self::setupFixture();
 
         $result = [
-            'definition as list' => [new auth_user_md5()],
+            'definition as list' => [new class extends SimpleORMap {
+                protected static function configure($config = [])
+                {
+                    $config['db_table'] = 'auth_user_md5';
+                    $config['i18n_fields'] = ['i18n_field'];
+                    parent::configure($config);
+                }
+            }],
             'definition as associative array' => [new class extends SimpleORMap {
                 protected static function configure($config = [])
                 {
-- 
GitLab