diff --git a/docker/studip/config_local.php b/docker/studip/config_local.php index 4e77ed8e20187ff68b4e19c8fb0f01576adb3681..010ff664318ca0653ec4cc7c370e880feb96d94e 100644 --- a/docker/studip/config_local.php +++ b/docker/studip/config_local.php @@ -44,4 +44,6 @@ namespace { $ASSETS_URL = $ABSOLUTE_URI_STUDIP.'/assets/'; } $MAIL_TRANSPORT = getenv('STUDIP_MAIL_TRANSPORT'); -} \ No newline at end of file + + $CONTENT_LANGUAGES['en_GB'] = ['picture' => 'lang_en.gif', 'name' => 'English']; +} diff --git a/lib/models/SimpleORMap.class.php b/lib/models/SimpleORMap.class.php index 0488b0fd60f3febf6b893270f5e91d1886c60e59..f36f65d3ffddeff40132dfe39c00ca67fa80d239 100644 --- a/lib/models/SimpleORMap.class.php +++ b/lib/models/SimpleORMap.class.php @@ -355,8 +355,19 @@ class SimpleORMap implements ArrayAccess, Countable, IteratorAggregate } } - if (!I18N::isEnabled()) { + if (!I18N::isEnabled() || empty($config['i18n_fields'])) { $config['i18n_fields'] = []; + } elseif (is_string($config['i18n_fields'])) { + $i18n_fields = words($config['i18n_fields']); + $config['i18n_fields'] = array_combine( + $i18n_fields, + array_fill(0, count($i18n_fields), true) + ); + } elseif (array_is_list($config['i18n_fields'])) { + $config['i18n_fields'] = array_combine( + $config['i18n_fields'], + array_fill(0, count($config['i18n_fields']), true) + ); } array_unshift($config['registered_callbacks']['after_initialize'], 'cbAfterInitialize'); diff --git a/tests/_data/simpleormap/auth_user_md5.php b/tests/_data/simpleormap/auth_user_md5.php index 3f712d57a562c65dd6e7f9a19eb751ab492c6429..b3d4c6603cd9fa31a6c146d68127cfe0e19b5411 100644 --- a/tests/_data/simpleormap/auth_user_md5.php +++ b/tests/_data/simpleormap/auth_user_md5.php @@ -135,4 +135,13 @@ $result = [ 'default' => '[1,2]', 'extra' => '', ], + 15 => + [ + 'name' => 'i18n_field', + 'type' => 'varchar(255)', + 'null' => 'NO', + 'key' => '', + 'default' => '', + 'extra' => '', + ], ]; diff --git a/tests/unit/lib/classes/SimpleOrMapNodbTest.php b/tests/unit/lib/classes/SimpleOrMapNodbTest.php index b36451042e153317fb6874b7631a9c10cef18b8d..4c35d27feac099c2b96c5fac36c859782506c217 100644 --- a/tests/unit/lib/classes/SimpleOrMapNodbTest.php +++ b/tests/unit/lib/classes/SimpleOrMapNodbTest.php @@ -25,6 +25,8 @@ 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); } @@ -46,25 +48,39 @@ class auth_user_md5 extends SimpleORMap class SimpleOrMapNodbTest extends \Codeception\Test\Unit { - function setUp(): void + protected static function setupFixture(): void { StudipTestHelper::set_up_tables(['auth_user_md5']); } - function tearDown(): void + protected static function teardownFixture(): void { StudipTestHelper::tear_down_tables(); } + public function setUp(): void + { + self::setupFixture(); + } + + public function tearDown(): void + { + self::teardownFixture(); + } + + /** + * @covers SimpleORMap::__construct + */ public function testConstruct(): auth_user_md5 { $a = new auth_user_md5(); - $this->assertInstanceOf('SimpleOrMap', $a); + $this->assertInstanceOf(SimpleORMap::class, $a); return $a; } /** * @depends testConstruct + * @covers SimpleORMap::getTableMetadata */ public function testMetaData($a) { @@ -76,19 +92,22 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::getDefaultValue */ public function testDefaults($a) { $this->assertEquals(null, $a->email); $this->assertEquals('unknown', $a->visible); $this->assertEquals('', $a->validation_key); - $this->assertInstanceOf('CSVArrayObject', $a->csvdata); + $this->assertInstanceOf(CSVArrayObject::class, $a->csvdata); $this->assertEquals('1,3', (string)$a->csvdata); - $this->assertInstanceOf('JSONArrayObject', $a->jsondata); + $this->assertInstanceOf(JSONArrayObject::class, $a->jsondata); } /** * @depends testConstruct + * @covers SimpleORMap::getValue + * @covers SimpleORMap::setValue */ public function testGetterAndSetter($a) { @@ -102,14 +121,14 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit $a->perms = 'ADMIN'; $this->assertEquals('ok:admin', $a['perms']); $a->csvdata = '1,2,3,4,5'; - $this->assertInstanceOf('CSVArrayObject', $a->csvdata); + $this->assertInstanceOf(CSVArrayObject::class, $a->csvdata); $this->assertEquals('1,2,3,4,5', (string)$a->csvdata); $this->assertEquals(range(1,5), $a['csvdata']->getArrayCopy()); $a->jsondata = [0 => 'test1', 1 => 'test2']; - $this->assertInstanceOf('JSONArrayObject', $a->jsondata); + $this->assertInstanceOf(JSONArrayObject::class, $a->jsondata); $this->assertEquals('["test1","test2"]', (string)$a->jsondata); $a->jsondata[] = [1,2,3]; - $this->assertInstanceOf('JSONArrayObject', $a->jsondata[2]); + $this->assertInstanceOf(JSONArrayObject::class, $a->jsondata[2]); $this->assertEquals('["test1","test2",[1,2,3]]', (string)$a->jsondata); $a->jsondata[2][] = ['test3' => 'test3']; $this->assertEquals('["test1","test2",[1,2,3,{"test3":"test3"}]]', (string)$a->jsondata); @@ -117,6 +136,8 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::isDirty + * @covers SimpleORMap::isFieldDirty */ public function testDirty($a) { @@ -134,6 +155,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::revertValue */ public function testRevert($a) { @@ -147,6 +169,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::setData */ public function testsetData($a) { @@ -178,6 +201,8 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::getId() + * @covers SimpleORMap::setId() */ public function testPrimaryKey($a) { @@ -196,9 +221,13 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::isAdditionalField + * @covers SimpleORMap::_setAdditionalValue + * @covers SimpleORMap::_getAdditionalValue */ public function testAdditional($a) { + $this->assertTrue($a->isAdditionalField('additional')); $this->assertNull($a->additional); $a->additional = 'test'; $this->assertEquals($a->additional_dummy_data, $a->additional); @@ -206,6 +235,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::toArray */ public function testToArray($a) { @@ -216,7 +246,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit $this->assertEquals('ok:user', $to_array['perms']); $this->assertEquals(range(1,4), $to_array['csvdata']); $this->assertArrayHasKey('visible', $to_array); - $this->assertCount(17, $to_array); + $this->assertCount(18, $to_array); $to_array = $a->toArray('id user_id additional perms'); $this->assertEquals(2, $to_array['id']); @@ -229,6 +259,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::setValue */ public function testInvalidColumnException($a) { @@ -239,6 +270,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::registerCallback */ public function testCallback($a) { @@ -258,6 +290,7 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit /** * @depends testConstruct + * @covers SimpleORMap::applyCallbacks */ public function testNotification($a) { @@ -309,4 +342,44 @@ class SimpleOrMapNodbTest extends \Codeception\Test\Unit $b->additional_dummy_data->count() ); } + + /** + * @dataProvider i18nProvider + * @covers SimpleORMap::isI18nField + * @covers SimpleORMap::i18n_fields + */ + public function testI18nFields(SimpleORMap $a): void + { + $this->assertTrue($a->isI18nField('i18n_field')); + $this->assertInstanceOf(I18NString::class, $a->i18n_field); + } + + public static function i18nProvider(): array + { + self::setupFixture(); + + $result = [ + 'definition as list' => [new auth_user_md5()], + 'definition as associative array' => [new class extends SimpleORMap { + protected static function configure($config = []) + { + $config['db_table'] = 'auth_user_md5'; + $config['i18n_fields'] = ['i18n_field' => true]; + parent::configure($config); + } + }], + 'definition as string' => [new class extends SimpleORMap { + protected static function configure($config = []) + { + $config['db_table'] = 'auth_user_md5'; + $config['i18n_fields'] = 'i18n_field'; + parent::configure($config); + } + }] + ]; + + self::teardownFixture(); + + return $result; + } }