return $errors;
}
-
- /**
- * Get a list of available themes.
- *
- * It will return the name of any directory present in the template folder.
- *
- * @param string $tplDir Templates main directory.
- *
- * @return array List of theme names.
- */
- public static function getThemes($tplDir)
- {
- $allTheme = glob($tplDir.'/*', GLOB_ONLYDIR);
- $themes = [];
- foreach ($allTheme as $value) {
- $themes[] = str_replace($tplDir.'/', '', $value);
- }
-
- return $themes;
- }
}
--- /dev/null
+<?php
+
+namespace Shaarli;
+
+/**
+ * Class ThemeUtils
+ *
+ * Utility functions related to theme management.
+ *
+ * @package Shaarli
+ */
+class ThemeUtils
+{
+ /**
+ * Get a list of available themes.
+ *
+ * It will return the name of any directory present in the template folder.
+ *
+ * @param string $tplDir Templates main directory.
+ *
+ * @return array List of theme names.
+ */
+ public static function getThemes($tplDir)
+ {
+ $allTheme = glob($tplDir.'/*', GLOB_ONLYDIR);
+ $themes = [];
+ foreach ($allTheme as $value) {
+ $themes[] = str_replace($tplDir.'/', '', $value);
+ }
+
+ return $themes;
+ }
+}
$this->conf->write($this->isLoggedIn);
return true;
}
+
+ /**
+ * New setting: theme name. If the default theme is used, nothing to do.
+ *
+ * If the user uses a custom theme, raintpl_tpl dir is updated to the parent directory,
+ * and the current theme is set as default in the theme setting.
+ *
+ * @return bool true if the update is successful, false otherwise.
+ */
+ public function updateMethodDefaultTheme()
+ {
+ // raintpl_tpl isn't the root template directory anymore.
+ // We run the update only if this folder still contains the template files.
+ $tplDir = $this->conf->get('resource.raintpl_tpl');
+ $tplFile = $tplDir . '/linklist.html';
+ if (! file_exists($tplFile)) {
+ return true;
+ }
+
+ $parent = dirname($tplDir);
+ $this->conf->set('resource.raintpl_tpl', $parent);
+ $this->conf->set('resource.theme', trim(str_replace($parent, '', $tplDir), '/'));
+ $this->conf->write($this->isLoggedIn);
+
+ // Dependency injection gore
+ RainTPL::$tpl_dir = $tplDir;
+
+ return true;
+ }
}
/**
},
"autoload": {
"psr-4": {
+ "Shaarli\\": "application",
"Shaarli\\Api\\": "application/api/",
"Shaarli\\Api\\Controllers\\": "application/api/controllers",
"Shaarli\\Api\\Exceptions\\": "application/api/exceptions"
ApplicationUtils::checkResourcePermissions($conf)
);
}
-
- /**
- * Test getThemes() with existing theme directories.
- */
- public function testGetThemes()
- {
- $themes = ['theme1', 'default', 'Bl1p_- bL0p'];
- foreach ($themes as $theme) {
- mkdir('sandbox/tpl/'. $theme, 0777, true);
- }
-
- // include a file which should be ignored
- touch('sandbox/tpl/supertheme');
-
- $res = ApplicationUtils::getThemes('sandbox/tpl/');
- foreach ($res as $theme) {
- $this->assertTrue(in_array($theme, $themes));
- }
- $this->assertFalse(in_array('supertheme', $res));
-
- foreach ($themes as $theme) {
- rmdir('sandbox/tpl/'. $theme);
- }
- unlink('sandbox/tpl/supertheme');
- rmdir('sandbox/tpl');
- }
-
- /**
- * Test getThemes() without any theme dir.
- */
- public function testGetThemesEmpty()
- {
- mkdir('sandbox/tpl/', 0777, true);
- $this->assertEquals([], ApplicationUtils::getThemes('sandbox/tpl/'));
- rmdir('sandbox/tpl/');
- }
-
- /**
- * Test getThemes() with an invalid path.
- */
- public function testGetThemesInvalid()
- {
- $this->assertEquals([], ApplicationUtils::getThemes('nope'));
- }
}
--- /dev/null
+<?php
+
+namespace Shaarli;
+
+/**
+ * Class ThemeUtilsTest
+ *
+ * @package Shaarli
+ */
+class ThemeUtilsTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test getThemes() with existing theme directories.
+ */
+ public function testGetThemes()
+ {
+ $themes = ['theme1', 'default', 'Bl1p_- bL0p'];
+ foreach ($themes as $theme) {
+ mkdir('sandbox/tpl/'. $theme, 0755, true);
+ }
+
+ // include a file which should be ignored
+ touch('sandbox/tpl/supertheme');
+
+ $res = ThemeUtils::getThemes('sandbox/tpl/');
+ foreach ($res as $theme) {
+ $this->assertTrue(in_array($theme, $themes));
+ }
+ $this->assertFalse(in_array('supertheme', $res));
+
+ foreach ($themes as $theme) {
+ rmdir('sandbox/tpl/'. $theme);
+ }
+ unlink('sandbox/tpl/supertheme');
+ rmdir('sandbox/tpl');
+ }
+
+ /**
+ * Test getThemes() without any theme dir.
+ */
+ public function testGetThemesEmpty()
+ {
+ mkdir('sandbox/tpl/', 0755, true);
+ $this->assertEquals([], ThemeUtils::getThemes('sandbox/tpl/'));
+ rmdir('sandbox/tpl/');
+ }
+
+ /**
+ * Test getThemes() with an invalid path.
+ */
+ public function testGetThemesInvalid()
+ {
+ $this->assertEquals([], ThemeUtils::getThemes('nope'));
+ }
+}
$this->assertTrue($updater->updateMethodDatastoreIds());
$this->assertEquals($checksum, hash_file('sha1', self::$testDatastore));
}
+
+ /**
+ * Test defaultTheme update with default settings: nothing to do.
+ */
+ public function testDefaultThemeWithDefaultSettings()
+ {
+ $sandbox = 'sandbox/config';
+ copy(self::$configFile . '.json.php', $sandbox . '.json.php');
+ $this->conf = new ConfigManager($sandbox);
+ $updater = new Updater([], [], $this->conf, true);
+ $this->assertTrue($updater->updateMethodDefaultTheme());
+
+ $this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
+ $this->assertEquals('default', $this->conf->get('resource.theme'));
+ $this->conf = new ConfigManager($sandbox);
+ $this->assertEquals('tpl/', $this->conf->get('resource.raintpl_tpl'));
+ $this->assertEquals('default', $this->conf->get('resource.theme'));
+ unlink($sandbox . '.json.php');
+ }
+
+ /**
+ * Test defaultTheme update with a custom theme in a subfolder
+ */
+ public function testDefaultThemeWithCustomTheme()
+ {
+ $theme = 'iamanartist';
+ $sandbox = 'sandbox/config';
+ copy(self::$configFile . '.json.php', $sandbox . '.json.php');
+ $this->conf = new ConfigManager($sandbox);
+ mkdir('sandbox/'. $theme);
+ touch('sandbox/'. $theme .'/linklist.html');
+ $this->conf->set('resource.raintpl_tpl', 'sandbox/'. $theme .'/');
+ $updater = new Updater([], [], $this->conf, true);
+ $this->assertTrue($updater->updateMethodDefaultTheme());
+
+ $this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
+ $this->assertEquals($theme, $this->conf->get('resource.theme'));
+ $this->conf = new ConfigManager($sandbox);
+ $this->assertEquals('sandbox', $this->conf->get('resource.raintpl_tpl'));
+ $this->assertEquals($theme, $this->conf->get('resource.theme'));
+ unlink($sandbox . '.json.php');
+ unlink('sandbox/'. $theme .'/linklist.html');
+ rmdir('sandbox/'. $theme);
+ }
}
<td>
<select name="theme" id="theme">
{loop="$theme_available"}
- <option value="{$value}"
- {if="$value===$theme"}
- selected="selected"
- {/if}
- >
+ <option value="{$value}" {if="$value===$theme"}selected{/if}>
{$value|ucfirst}
</option>
{/loop}