/core/controllers/admin/ETAppearanceAdminController.class.php
https://github.com/iugo/esoTalk · PHP · 222 lines · 67 code · 36 blank · 119 comment · 21 complexity · e9d45306014b4e81ea7a2f8ef758ff6e MD5 · raw file
- <?php
- // Copyright 2011 Toby Zerner, Simon Zerner
- // This file is part of esoTalk. Please see the included license file for usage information.
- if (!defined("IN_ESOTALK")) exit;
- /**
- * This controller handles changing of the forum appearance, including the management of skins and skin
- * settings.
- *
- * @package esoTalk
- */
- class ETAppearanceAdminController extends ETAdminController {
- /**
- * Show the appearearance page, including a list of skins.
- *
- * @return void
- */
- public function action_index()
- {
- $skins = $this->getSkins();
- $this->title = T("Appearance");
- $this->data("skins", $skins);
- $this->data("skin", C("esoTalk.skin") ? $skins[C("esoTalk.skin")] : array());
- $this->render("admin/appearance");
- }
- /**
- * Return a list of skins and their information.
- *
- * @return array
- */
- protected function getSkins()
- {
- $skins = array();
- // Get the installed skins and their details by reading the skins/ directory.
- if ($handle = opendir(PATH_SKINS)) {
- while (false !== ($file = readdir($handle))) {
- // Make sure the skin is valid, and include its skin.php file.
- if ($file[0] != "." and file_exists($skinFile = PATH_SKINS."/$file/skin.php") and (include_once $skinFile)) {
- // Add the skin's information and status to the array.
- $skins[$file] = array(
- "info" => ET::$skinInfo[$file],
- "selected" => $file == C("esoTalk.skin"),
- "selectedMobile" => $file == C("esoTalk.mobileSkin"),
- "settingsView" => false
- );
- // If this skin's settings function returns a view path, then store it.
- if ($skins[$file]["selected"]) $skins[$file]["settingsView"] = ET::$skin->settings($this);
- }
- }
- closedir($handle);
- }
- ksort($skins);
- return $skins;
- }
- /**
- * Activate a skin so it is used as the default skin.
- *
- * @param string $skin The name of the skin.
- * @return void
- */
- public function action_activate($skin = "")
- {
- if (!$this->validateToken()) return;
- // Get the skins and make sure this one exists.
- $skins = $this->getSkins();
- if (!$skin or !array_key_exists($skin, $skins)) return false;
- // Write the new setting to the config file.
- ET::writeConfig(array("esoTalk.skin" => $skin));
- // Clear skin cache.
- $files = glob(PATH_CACHE.'/css/*.*');
- foreach ($files as $file) unlink(realpath($file));
- $this->redirect(URL("admin/appearance"));
- }
- /**
- * Activate a skin so it is used as the mobile skin.
- *
- * @param string $skin The name of the skin.
- * @return void
- */
- public function action_activateMobile($skin = "")
- {
- if (!$this->validateToken()) return;
- // Get the skins and make sure this one exists.
- $skins = $this->getSkins();
- if (!$skin or !array_key_exists($skin, $skins)) return false;
- // Write the new setting to the config file.
- ET::writeConfig(array("esoTalk.mobileSkin" => $skin));
- // Clear skin cache.
- $files = glob(PATH_CACHE.'/css/*.*');
- foreach ($files as $file) unlink(realpath($file));
- $this->redirect(URL("admin/appearance"));
- }
- /**
- * Uninstall a skin by removing its directory.
- *
- * @param string $skin The name of the skin.
- * @return void
- */
- public function action_uninstall($skin = "")
- {
- if (!$this->validateToken()) return;
- // Get the skins and make sure this one exists.
- $skins = $this->getSkins();
- if (!$skin or !array_key_exists($skin, $skins)) return false;
- unset($skins[$skin]);
- // Attempt to remove the directory. If we couldn't, show a "not writable" message.
- if (!is_writable($file = PATH_SKINS) or !is_writable($file = PATH_SKINS."/$skin") or !rrmdir($file))
- $this->message(sprintf(T("message.notWritable"), $file), "warning");
- // Otherwise, show a success message.
- else $this->message(T("message.skinUninstalled"), "success");
- // If one of the skin config options is set to this skin, change it.
- $config = array();
- if (C("esoTalk.skin") == $skin) $config["esoTalk.skin"] = reset(array_keys($skins));
- if (C("esoTalk.mobileSkin") == $skin) $config["esoTalk.mobileSkin"] = reset(array_keys($skins));
- if (count($config)) ET::writeConfig($config);
- $this->redirect(URL("admin/appearance"));
- }
- // Install an uploaded skin.
- /*
- function installSkin()
- {
- // If the uploaded file has any errors, don't proceed.
- if ($_FILES["installSkin"]["error"]) {
- $this->esoTalk->message("invalidSkin");
- return false;
- }
- // Temorarily move the uploaded skin into the skins directory so that we can read it.
- if (!move_uploaded_file($_FILES["installSkin"]["tmp_name"], "skins/{$_FILES["installSkin"]["name"]}")) {
- $this->esoTalk->message("notWritable", false, "skins/");
- return false;
- }
- // Unzip the skin. If we can't, show an error.
- if (!($files = unzip("skins/{$_FILES["installSkin"]["name"]}", "skins/"))) $this->esoTalk->message("invalidSkin");
- else {
- // Loop through the files in the zip and make sure it's a valid skin.
- $directories = 0; $skinFound = false;
- foreach ($files as $k => $file) {
- // Strip out annoying Mac OS X files!
- if (substr($file["name"], 0, 9) == "__MACOSX/" or substr($file["name"], -9) == ".DS_Store") {
- unset($files[$k]);
- continue;
- }
- // If the zip has more than one base directory, it's not a valid skin.
- if ($file["directory"] and substr_count($file["name"], "/") < 2) $directories++;
- // Make sure there's an actual skin file in there.
- if (substr($file["name"], -8) == "skin.php") $skinFound = true;
- }
- // OK, this skin in valid!
- if ($skinFound and $directories == 1) {
- // Loop through skin files and write them to the skins directory.
- $error = false;
- foreach ($files as $k => $file) {
- // Make a directory if it doesn't exist!
- if ($file["directory"] and !is_dir("skins/{$file["name"]}")) mkdir("skins/{$file["name"]}");
- // Write a file.
- elseif (!$file["directory"]) {
- if (!writeFile("skins/{$file["name"]}", $file["content"])) {
- $this->esoTalk->message("notWritable", false, "skins/{$file["name"]}");
- $error = true;
- break;
- }
- }
- }
- // Everything copied over correctly - success!
- if (!$error) $this->esoTalk->message("skinAdded");
- }
- // Hmm, something went wrong. Show an error.
- else $this->esoTalk->message("invalidSkin");
- }
- // Delete the temporarily uploaded skin file.
- unlink("skins/{$_FILES["installSkin"]["name"]}");
- }
- */
- }