Forráskód Böngészése

Updater: keep custom theme preference with the new theme setting

ArthurHoaro 7 éve
szülő
commit
04a0e8ea34

+ 0 - 20
application/ApplicationUtils.php

@@ -195,24 +195,4 @@ class ApplicationUtils
 
         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;
-    }
 }

+ 33 - 0
application/ThemeUtils.php

@@ -0,0 +1,33 @@
+<?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;
+    }
+}

+ 29 - 0
application/Updater.php

@@ -279,6 +279,35 @@ class Updater
         $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;
+    }
 }
 
 /**

+ 1 - 0
composer.json

@@ -24,6 +24,7 @@
     },
     "autoload": {
         "psr-4": {
+            "Shaarli\\": "application",
             "Shaarli\\Api\\": "application/api/",
             "Shaarli\\Api\\Controllers\\": "application/api/controllers",
             "Shaarli\\Api\\Exceptions\\": "application/api/exceptions"

+ 0 - 44
tests/ApplicationUtilsTest.php

@@ -331,48 +331,4 @@ class ApplicationUtilsTest extends PHPUnit_Framework_TestCase
             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'));
-    }
 }

+ 55 - 0
tests/ThemeUtilsTest.php

@@ -0,0 +1,55 @@
+<?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'));
+    }
+}

+ 44 - 0
tests/Updater/UpdaterTest.php

@@ -422,4 +422,48 @@ $GLOBALS[\'privateLinkByDefault\'] = true;';
         $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);
+    }
 }

+ 1 - 5
tpl/default/configure.html

@@ -25,11 +25,7 @@
         <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}