Revision history for MySkin


Revision [23428]

Last edited on 2016-05-20 07:38:48 by DarTar [Replaces old-style internal links with new pipe-split links.]
Additions:
This page refers to beta functionality supported until Wikka 1.1.x. As of [[Docs:WhatsNew12 | version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes | this page]] for more information or this [[http://blog.wikkawiki.org/2009/09/11/how-to-design-themes-for-wikkawiki/ | tutorial]] to learn how to design custom themes.
Deletions:
This page refers to beta functionality supported until Wikka 1.1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information or this [[http://blog.wikkawiki.org/2009/09/11/how-to-design-themes-for-wikkawiki/ tutorial]] to learn how to design custom themes.


Revision [20849]

Edited on 2009-09-12 07:37:33 by DarTar [link to blog post]
Additions:
This page refers to beta functionality supported until Wikka 1.1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information or this [[http://blog.wikkawiki.org/2009/09/11/how-to-design-themes-for-wikkawiki/ tutorial]] to learn how to design custom themes.
Deletions:
This page refers to beta functionality supported until Wikka 1.1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information.


Revision [20844]

Edited on 2009-09-12 07:34:39 by DarTar [[m] fixed version number]
Additions:
This page refers to beta functionality supported until Wikka 1.1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information.
Deletions:
This page refers to beta functionality supported until Wikka 1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information.


Revision [20817]

Edited on 2009-09-03 08:37:45 by DarTar [->1.2]
Additions:
<<===Theme support available in 1.2!===
<<::c::
Deletions:
>>===Theme support available in 1.2!===
>>::c::


Revision [20811]

Edited on 2009-09-03 05:29:29 by DarTar [->1.2]
Additions:
>>===Theme support available in 1.2!===
This page refers to beta functionality supported until Wikka 1.x. As of [[Docs:WhatsNew12 version 1.2]] Wikka introduces support for 100%-modular **themes**: check [[Docs:WikkaThemes this page]] for more information.
>>::c::
Deletions:
{{lastedit}}
<<Give it a [[TestSkin try]]! (v.1.0)<<
::c::


Revision [20665]

Edited on 2009-05-28 02:22:41 by AlexRust [->1.2]
Additions:
// begin change by AlexRust - May 28 2009
//$this->SetPersistentCookie("wikiskin", $postedskin);
$this->SetSkin($postedskin);
// end change by AlexRust - May 28 2009
Deletions:
$this->SetPersistentCookie("wikiskin", $postedskin);


Revision [20576]

Edited on 2009-05-05 08:46:26 by PezHore [Fixed the GetCookie being referenced as a wiki page.]
Additions:
**Note:** This section has moved to ./libs/Wakka.class.php, and the following can be placed after the ""GetCookie($name)"" function.
**Updated 5/5/2009 by PezHore:** Corrected the reference of cookie 'skin' to 'wikiskin', and changed the cookie retrieval from $skin = $_COOKIE['wikiskin] to use ""GetCookie"" function. Also removed the duplicate functions
Deletions:
**Note:** This section has moved to ./libs/Wakka.class.php, and the following can be placed after the GetCookie($name) function.
**Updated 5/5/2009 by PezHore:** Corrected the reference of cookie 'skin' to 'wikiskin', and changed the cookie retrieval from $skin = $_COOKIE['wikiskin] to use GetCookie function. Also removed the duplicate functions


Revision [20575]

Edited on 2009-05-05 08:45:31 by PezHore [Added steps taken to fix the MySkin action.]
Additions:
Add the following code in ##./wikka.php## immediately after the ##""//COOKIES""## section.
**Note:** This section has moved to ./libs/Wakka.class.php, and the following can be placed after the GetCookie($name) function.
**Updated 5/5/2009 by PezHore:** Corrected the reference of cookie 'skin' to 'wikiskin', and changed the cookie retrieval from $skin = $_COOKIE['wikiskin] to use GetCookie function. Also removed the duplicate functions
$skin = $_SESSION['wikiskin'];
if ($_COOKIE['wikiskin'])
$skin = $this->GetCookie('wikiskin');
$_SESSION['wikiskin'] = $skin;
$this->SetPersistentCookie('wikiskin', $skin);
Deletions:
Add the following code in ##./wikka.php## immediately after the ##""//COOKIES""## section
$skin = $_SESSION['skin'];
if ($_COOKIE['skin'])
$skin = $_COOKIE['skin'];
$_SESSION['skin'] = $skin;
$this->SetPersistentCookie("skin", $skin);
function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);

function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;


Revision [18646]

Edited on 2008-01-28 00:12:18 by DarTar [Modified links pointing to docs server]

No Differences

Revision [11403]

Edited on 2005-10-13 13:36:35 by DarTar [fixed small but annoying bug]
Additions:
~-##stylesheet## --- Defines the system stylesheet;
Deletions:
~-##default_stylesheet## --- Defines the system stylesheet;


Revision [11402]

Edited on 2005-10-13 13:36:19 by DarTar [fixed small but annoying bug]
Additions:
$skin = $this->GetConfigValue("stylesheet");
Deletions:
$skin = $this->GetConfigValue("default_stylesheet");
"default_stylesheet" => "wikka.css",


Revision [11401]

Edited on 2005-10-13 13:35:04 by DarTar [fixed small but annoying bug]
Additions:
%%(php;1)


Revision [11400]

Edited on 2005-10-13 13:34:38 by DarTar [fixed small but annoying bug]
Additions:
~-Added JW's patches
* This action allows the user to select a skin among those available in
* the Wikka css folder. A form allows to display the markup of each skin.
* Registered user can create it and modify their own custom skin. The
* first creation of a custom user skin consists in the generation of a new
* css stylesheet containing the default wikka CSS settings (as specified
* in the Wikka config file) and stored with the name of the user. Once a
* it with an existing skin, or restore the default settings. Wikka
* Cookies must be enabled for the selector to work and the css folder must
* be write-accessible to the script in order to read, edit and save skins.
* @version 2.2
* @since Wikka 1.1.X
* @output displays a form for selecting alternate skins and edit
* @todo -integrate with UserSettings.
// get skin names
$defaultskin = $this->config['stylesheet'];
$currentskin = (!$this->GetCookie('wikiskin')) ? $defaultskin : $this->GetCookie('wikiskin'); # JW 2005-07-08 FIX possibly undefined cookie
$postedskin = $_POST["skin"];
$myskin = strtolower($this->GetUserName().".css");
// build form chunks
$setskin = '<input type="submit" name="action" value="Set skin" />';
$showsource = '<input type="submit" name="action" value="Show source" />';
$hidesource = '<input type="submit" name="action" value="Hide source" />';
$editsource = '<input type="submit" name="action" value="Edit source" />';
$savesource = '<input type="submit" name="action" value="Save modified source" />';
$createskin = '<input type="submit" name="action" value="Create my skin" />';
$importskin = '<input type="submit" name="action" value="Save current skin as my skin" />';
$restoreskin = '<input type="submit" name="action" value="Restore to default settings" />';
// functions
function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);
function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
echo $this->Format("=== Select a Wikka skin: === --- ");
switch ($_POST["action"]) {
case "Save modified source":
// saves modified skin to file
WriteSkin($currentskin, $_POST["mod_css_content"]);
// no break - skin is automatically updated
case "Set skin":
// change current skin and reload page
$this->SetPersistentCookie("wikiskin", $postedskin);
$this->Redirect($this->href());
break;
case "Save current skin as my skin":
// import and save current skin as user skin
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = ReadSkin($currentskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());
break;
case "Create my skin":
// first time user skin creation
if ($this->GetUser() && !file_exists("css/".$myskin)) {
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());
break;
case "Restore to default settings":
// restore user skin to default settings
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());
break;
case "Show source":
// open a readonly textarea with skin source
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
$submit = $hidesource;
break;
case "Edit source":
// open an editable textarea with skin source
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="mod_css_content" cols="80" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource;
break;
$handle = opendir('css/');
// retrieve skin list
$skinlist = '<select name="skin">';
// put on top of the list the default and custom skin
$defaultselected = ($defaultskin == $currentskin)? " selected=\"selected\"" : "";
$myselected = ($myskin == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$defaultskin.'"'.$defaultselected.'>(Default skin: '.$defaultskin.')</option>';
if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(My skin: '.$myskin.')</option>';
// get other skins
$noskinmask = '^('.$defaultskin.'|'.$myskin.'|xml.css|print.css|\.(.*))$';
while (false !== ($file = readdir($handle))) {
if (!preg_match('/'.$noskinmask.'/', $file)) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
$skinlist .= '</select>';
// give write access to the skin owner and to admins
if (!isset($submit)) {
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
// create form
print $this->FormOpen("","","post");
print $skinlist.$setskin."<br /><br />".$showskin.$submit."<br /><br />\n";
// show user skin options
if ($this->GetUser()) {
if (!file_exists("css/".$myskin)) {
$mysubmit = $createskin;
} else {
$myskinname = "(".$myskin.")";
$mysubmit = ($currentskin == $myskin)? $restoreskin : $importskin.$restoreskin;
print $this->Format(" ---- === My skin ".$myskinname." === --- ");
print $mysubmit;
// close form
print $this->FormClose();
closedir($handle);
Deletions:
~-Fixed error in calling configuration options;
* This action allows the user to select a skin among those available in
* the Wikka css folder. A form allows to display the markup of each skin.
* Registered users can create it and modify their own custom skin. The
* first creation of a custom user skin consists in the generation of a new
* css stylesheet containing the default wikka CSS settings (as specified
* in the Wikka config file) and stored with the name of the user. Once a
* it with an existing skin, or restore the default settings. Wikka
* Cookies must be enabled for the selector to work and the css folder must
* be write-accessible to the script in order to read, edit and save skins.
* @version 2.1
* @since Wikka 1.1.6.X
* @output displays a form for selecting alternate skins and edit
* @todo - store custom skin in DB;
if ($this->GetConfigValue("allow_select_skin") == "0") {
echo $this->Format('//Sorry, skin selection is disabled on this site//');
} else {
// initialize variables
$defaultskin = $this->GetConfigValue("stylesheet");
$currentskin = $this->GetSkin();
$postedskin = '';
$myskin = '';
$submit = '';
// get skin names
$postedskin = (isset($_POST["skin"]) && (preg_match('/(.*)\.css/',$_POST["skin"])))? $_POST["skin"] : $currentskin;
if ($this->GetUser()) $myskin = 'user_'.strtolower($this->GetUserName()).'.css';
/* debug
echo "defaultskin: ".$defaultskin."<br />";
echo "currentskin: ".$currentskin."<br />";
echo "postedskin: ".$postedskin."<br />";
echo "myskin: ".$myskin."<br />";
*/
// build form chunks
$setskin = '<input type="submit" name="action" value="Set skin" title="Load this skin" />';
$showsource = '<input type="submit" name="action" value="Show source" title="Display the source of '.$currentskin.'" />';
$hidesource = '<input type="submit" name="action" value="Hide source" title="Hide the source box" />';
$editsource = '<input type="submit" name="action" value="Edit source" title="Modify the source of this skin" />';
$savesource = '<input type="submit" name="action" value="Save modified source" title="Store changes to '.$currentskin.'" />';
$createskin = '<input type="submit" name="action" value="Create custom skin" title="Generate a custom skin for '.$this->GetUserName().'" />';
$importskin = '<input type="submit" name="action" value="Save current skin as custom skin" title="Store a copy of '.$currentskin.' as '.$myskin.'" />';
$restoreskin = '<input type="submit" name="action" value="Restore to default settings" title="Reset '.$myskin.' to the default system stylesheet ('.$defaultskin.')" />';
echo $this->Format('==== Select a skin: ==== --- ');
echo $this->Format('(Current skin: **##'.$currentskin.'##**) --- --- ');
switch ($_POST["action"]) {
case "Save modified source":
// saves modified skin to file
$this->WriteSkin($currentskin, $_POST["mod_css_content"]);
// no break - skin is automatically updated

case "Set skin":
// load skin and reload page
if (file_exists("css/".$postedskin)) {
$this->SetSkin($postedskin);
$this->Redirect($this->href());
break;

case "Save current skin as custom skin":
// import and save current skin as user skin
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($currentskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
break;
case "Create custom skin":
// first-time custom user skin creation
if ($this->GetUser() && !file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($defaultskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
break;
case "Restore to default settings":
// restore user skin to default settings
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($defaultskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
break;
case "Show source":
if ($this->GetConfigValue("allow_display_skin_source") == "1") {
// open a readonly textarea with skin source
$css_contents = $this->ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
$submit = $hidesource;
break;
case "Edit source":
if ($this->GetConfigValue("allow_display_skin_source") == "1" || $this->IsAdmin || $currentskin == $myskin) {
// open an editable textarea with skin source
$css_contents = $this->ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="mod_css_content" cols="80" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource.$hidesource;
break;
default:
// give write access to the skin owner and to admins
switch ($this->GetConfigValue('allow_display_skin_source')) {
case '0': #hide source, no one except admins can edit skins
$submit = ($this->IsAdmin())? $editsource : '';
break;
case '1': #anyone can display source, skin owners can edit their skin, admins can edit any skin
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
break;
}
// retrieve skin list
$handle = opendir('css/');
$skinlist = '<select name="skin">';
// put on top of the list the default and custom skins
$defaultselected = ($defaultskin == $currentskin)? " selected=\"selected\"" : "";
$myselected = ($myskin == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$defaultskin.'"'.$defaultselected.'>(Default skin: '.$defaultskin.')</option>';
if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(Custom skin: '.$myskin.')</option>';

// get system skins
$noskinmask = '^('.$defaultskin.'|'.$myskin.'|xml.css|print.css|\.(.*)|user_(.*))$';
$skinlist .= '<option value="" disabled="disabled">--- Default skins: ---</option>';
while (false !== ($file = readdir($handle))) {
if ((!preg_match('/'.$noskinmask.'/', $file)) && (preg_match('/(.*)\.css/', $file))) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
}
// get user skins (check config and restrict list to registered users)
if ($this->GetConfigValue("display_custom_skins") == "1" && $this->GetUser()) {
$handle = opendir('css/'); #reset directory
$skinlist .= '<option value="" disabled="disabled">--- User skins: ---</option>';
while (false !== ($file = readdir($handle))) {
if ((preg_match('/user_(.*)/', $file)) && (!preg_match('/'.$myskin.'/', $file))) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
}
$skinlist .= '</select>';
// create form
print $this->FormOpen("","","post");
print $skinlist.$setskin."<br /><br />".$showskin.$submit."<br /><br />\n";
// display custom skin options
if (($this->GetConfigValue("allow_create_custom_skin") == "1") && $this->GetUser()) {
if (!file_exists("css/".$myskin)) {
$mysubmit = $createskin; #display skin creation button
} else {
$myskinname = "(".$myskin.")";
$mysubmit = ($currentskin == $myskin)? $restoreskin : $importskin.$restoreskin;
print $this->Format(" ---- (Custom skin **##".$myskinname."##**) --- --- ");
print $mysubmit;
// close form
print $this->FormClose();
closedir($handle);


Revision [11399]

Edited on 2005-10-13 13:32:35 by DarTar [fixed small but annoying bug]
Additions:
=== Current version: ##2.2## ===
==2.2==
~-Fixed error in calling configuration options;
==2.1==
$defaultskin = $this->GetConfigValue("stylesheet");
$this->SetSkin($myskin);
$this->SetSkin($myskin);
$this->SetSkin($myskin);
// give write access to the skin owner and to admins
switch ($this->GetConfigValue('allow_display_skin_source')) {
case '0': #hide source, no one except admins can edit skins
$submit = ($this->IsAdmin())? $editsource : '';
break;
case '1': #anyone can display source, skin owners can edit their skin, admins can edit any skin
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
break;
}
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);

function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
Deletions:
=== Current version: ##2.1## ===
$defaultskin = $this->GetConfigValue("default_stylesheet");
$this->SetSkin($myskin);
$this->SetSkin($myskin);
$this->SetSkin($myskin);
// give write access to the skin owner and to admins
switch ($this->GetConfigValue('allow_display_skin_source')) {
case '0': #hide source, no one except admins can edit skins
$submit = ($this->IsAdmin())? $editsource : '';
break;
case '1': #anyone can display source, skin owners can edit their skin, admins can edit any skin
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
break;
}
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);
}

function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
}


Revision [9506]

Edited on 2005-06-23 10:55:49 by DarTar [minor]
Additions:
===== MySkin: select, create and edit your favorite stylesheet =====
Deletions:
===== MySkin: choose and modify your favorite skin =====


Revision [7103]

Edited on 2005-04-04 13:12:35 by DarTar [Small update (v.2.1)]
Additions:
/* debug
echo "defaultskin: ".$defaultskin."<br />";
echo "currentskin: ".$currentskin."<br />";
echo "postedskin: ".$postedskin."<br />";
echo "myskin: ".$myskin."<br />";
*/
// get user skins (check config and restrict list to registered users)
if ($this->GetConfigValue("display_custom_skins") == "1" && $this->GetUser()) {
Deletions:
// get user skins
if ($this->GetConfigValue("display_custom_skins") == "1") {


Revision [7100]

Edited on 2005-04-04 12:32:22 by DarTar [Small update (v.2.1)]
Additions:
$postedskin = (isset($_POST["skin"]) && (preg_match('/(.*)\.css/',$_POST["skin"])))? $_POST["skin"] : $currentskin;
Deletions:
$postedskin = (isset($_POST["skin"]) && (strlen($_POST["skin"]) > 4))? $_POST["skin"] : $currentskin;


Revision [7099]

Edited on 2005-04-04 12:29:01 by DarTar [Small update (v.2.1)]
Additions:
~-added "Hide source" button, as per NilsLindenberg's suggestion;
Deletions:
~-added "Hide source" button, as per NilsLinenberg's suggestion;


Revision [7098]

Edited on 2005-04-04 12:28:29 by DarTar [Small update (v.2.1)]
Additions:
=== Current version: ##2.1## ===
~-added "Hide source" button, as per NilsLinenberg's suggestion;
~-renamed "my skin" as "custom skin", as per JavaWoman's suggestion;
* @version 2.1
$createskin = '<input type="submit" name="action" value="Create custom skin" title="Generate a custom skin for '.$this->GetUserName().'" />';
$importskin = '<input type="submit" name="action" value="Save current skin as custom skin" title="Store a copy of '.$currentskin.' as '.$myskin.'" />';
echo $this->Format('==== Select a skin: ==== --- ');
echo $this->Format('(Current skin: **##'.$currentskin.'##**) --- --- ');
// load skin and reload page
case "Save current skin as custom skin":
case "Create custom skin":
// first-time custom user skin creation
// put on top of the list the default and custom skins
if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(Custom skin: '.$myskin.')</option>';
// get system skins
if ((!preg_match('/'.$noskinmask.'/', $file)) && (preg_match('/(.*)\.css/', $file))) {
// get user skins
$handle = opendir('css/'); #reset directory
if ((preg_match('/user_(.*)/', $file)) && (!preg_match('/'.$myskin.'/', $file))) {
// display custom skin options
$mysubmit = $createskin; #display skin creation button
print $this->Format(" ---- (Custom skin **##".$myskinname."##**) --- --- ");
Deletions:
=== Current version: ##2.0## ===
* @version 1.1
$createskin = '<input type="submit" name="action" value="Create my skin" title="Generate a custom skin for '.$this->GetUserName().'" />';
$importskin = '<input type="submit" name="action" value="Save current skin as my skin" title="Store a copy of '.$currentskin.' as '.$myskin.'" />';
echo $this->Format("=== Select a skin: === --- ");
// change current skin and reload page
case "Save current skin as my skin":
case "Create my skin":
// first-time user skin creation
// put on top of the list the default and custom skin
if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(My skin: '.$myskin.')</option>';
// get default skins
if (!preg_match('/'.$noskinmask.'/', $file)) {
$handle = opendir('css/');
if (preg_match('/user_(.*)/', $file)) {
// show user skin options
$mysubmit = $createskin;
print $this->Format(" ---- === My skin ##".$myskinname."## === --- ");


Revision [7087]

Edited on 2005-04-03 08:33:01 by DarTar [Adding version number to test page]
Additions:
<<Give it a [[TestSkin try]]! (v.1.0)<<
Deletions:
<<Give it a [[TestSkin try]]!<<


Revision [7076]

Edited on 2005-04-03 00:08:23 by DarTar [Small update]
Additions:
* @version 1.1
$postedskin = (isset($_POST["skin"]) && (strlen($_POST["skin"]) > 4))? $_POST["skin"] : $currentskin;
Deletions:
* @version 2.0
if (isset($_POST["skin"])) $postedskin = $_POST["skin"];


Revision [7074]

Edited on 2005-04-02 16:40:18 by DarTar [Improved version of MySkin (v.2.0)]
Additions:
$skin = $this->GetConfigValue("default_stylesheet");
Deletions:
$skin = $this->GetConfigValue("stylesheet");


Revision [7073]

Edited on 2005-04-02 16:38:39 by DarTar [Improved version of MySkin (v.2.0)]
Additions:
===== MySkin: choose and modify your favorite skin =====
{{lastedit}}

<<Give it a [[TestSkin try]]!<<

::c::

Following the suggestions of JsnX and JavaWoman, and using code I had written for the WikkaSkinEditor action, I've created a new action that allows registered users to //create// their own custom skin and //modify// it to their taste. Feel free to test it and give your feedback.

=== Current version: ##2.0## ===
~-variables are initialized;
~-added a bunch of system-configurable options;
~-renamed user skins to ##user_username.css##;
~-skin storage: cookies for non registered users / sessions for registered users;
~-added titles to form elements;

==To do==
~-store user skins in DB;

=== How to use it ===

After installing the code (see below), just add to one of your pages ##""{{myskin}}""## and start playing

=== How to install it ===

== 1. Create the action ##(actions/myskin.php)##==

%%(php)
<?php

/**
* Allows users to select alternate skins and to edit their custom skins.
*
* This action allows the user to select a skin among those available in
* the Wikka css folder. A form allows to display the markup of each skin.
* Registered users can create it and modify their own custom skin. The
* first creation of a custom user skin consists in the generation of a new
* css stylesheet containing the default wikka CSS settings (as specified
* in the Wikka config file) and stored with the name of the user. Once a
* custom user skin exists, the owner of the skin can modify it, overwrite
* it with an existing skin, or restore the default settings. Wikka
* administrators have write access to all the skins.
*
* Cookies must be enabled for the selector to work and the css folder must
* be write-accessible to the script in order to read, edit and save skins.
*
* @package Actions
* @name MySkin
*
* @author {@link http://wikka.jsnx.com/DarTar DarTar}
* @version 2.0
* @since Wikka 1.1.6.X
*
* @output displays a form for selecting alternate skins and edit
* custom user skins.
* @todo - store custom skin in DB;
*/

if ($this->GetConfigValue("allow_select_skin") == "0") {
echo $this->Format('//Sorry, skin selection is disabled on this site//');
} else {

// initialize variables
$defaultskin = $this->GetConfigValue("default_stylesheet");
$currentskin = $this->GetSkin();
$postedskin = '';
$myskin = '';
$submit = '';

// get skin names
if (isset($_POST["skin"])) $postedskin = $_POST["skin"];
if ($this->GetUser()) $myskin = 'user_'.strtolower($this->GetUserName()).'.css';

// build form chunks
$setskin = '<input type="submit" name="action" value="Set skin" title="Load this skin" />';
$showsource = '<input type="submit" name="action" value="Show source" title="Display the source of '.$currentskin.'" />';
$hidesource = '<input type="submit" name="action" value="Hide source" title="Hide the source box" />';
$editsource = '<input type="submit" name="action" value="Edit source" title="Modify the source of this skin" />';
$savesource = '<input type="submit" name="action" value="Save modified source" title="Store changes to '.$currentskin.'" />';
$createskin = '<input type="submit" name="action" value="Create my skin" title="Generate a custom skin for '.$this->GetUserName().'" />';
$importskin = '<input type="submit" name="action" value="Save current skin as my skin" title="Store a copy of '.$currentskin.' as '.$myskin.'" />';
$restoreskin = '<input type="submit" name="action" value="Restore to default settings" title="Reset '.$myskin.' to the default system stylesheet ('.$defaultskin.')" />';

echo $this->Format("=== Select a skin: === --- ");
switch ($_POST["action"]) {

case "Save modified source":
// saves modified skin to file
$this->WriteSkin($currentskin, $_POST["mod_css_content"]);
// no break - skin is automatically updated

case "Set skin":
// change current skin and reload page
if (file_exists("css/".$postedskin)) {
$this->SetSkin($postedskin);
$this->Redirect($this->href());
}
break;

case "Save current skin as my skin":
// import and save current skin as user skin
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($currentskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
}
break;

case "Create my skin":
// first-time user skin creation
if ($this->GetUser() && !file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($defaultskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
}
break;

case "Restore to default settings":
// restore user skin to default settings
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = $this->ReadSkin($defaultskin);
$this->WriteSkin($myskin, $css_content);
$this->SetSkin($myskin);
$this->Redirect($this->href());
}
break;

case "Show source":
if ($this->GetConfigValue("allow_display_skin_source") == "1") {
// open a readonly textarea with skin source
$css_contents = $this->ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
$submit = $hidesource;
}
break;

case "Edit source":
if ($this->GetConfigValue("allow_display_skin_source") == "1" || $this->IsAdmin || $currentskin == $myskin) {
// open an editable textarea with skin source
$css_contents = $this->ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="mod_css_content" cols="80" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource.$hidesource;
}
break;

default:
// give write access to the skin owner and to admins
switch ($this->GetConfigValue('allow_display_skin_source')) {
case '0': #hide source, no one except admins can edit skins
$submit = ($this->IsAdmin())? $editsource : '';
break;
case '1': #anyone can display source, skin owners can edit their skin, admins can edit any skin
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
break;
}
}

$handle = opendir('css/');

// retrieve skin list
$skinlist = '<select name="skin">';
// put on top of the list the default and custom skin
$defaultselected = ($defaultskin == $currentskin)? " selected=\"selected\"" : "";
$myselected = ($myskin == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$defaultskin.'"'.$defaultselected.'>(Default skin: '.$defaultskin.')</option>';

if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(My skin: '.$myskin.')</option>';

// get default skins
$noskinmask = '^('.$defaultskin.'|'.$myskin.'|xml.css|print.css|\.(.*)|user_(.*))$';
$skinlist .= '<option value="" disabled="disabled">--- Default skins: ---</option>';
while (false !== ($file = readdir($handle))) {
if (!preg_match('/'.$noskinmask.'/', $file)) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
}
}
if ($this->GetConfigValue("display_custom_skins") == "1") {
$handle = opendir('css/');
$skinlist .= '<option value="" disabled="disabled">--- User skins: ---</option>';
while (false !== ($file = readdir($handle))) {
if (preg_match('/user_(.*)/', $file)) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
}
}
}
$skinlist .= '</select>';

// create form
print $this->FormOpen("","","post");
print $skinlist.$setskin."<br /><br />".$showskin.$submit."<br /><br />\n";

// show user skin options
if (($this->GetConfigValue("allow_create_custom_skin") == "1") && $this->GetUser()) {
if (!file_exists("css/".$myskin)) {
$mysubmit = $createskin;
} else {
$myskinname = "(".$myskin.")";
$mysubmit = ($currentskin == $myskin)? $restoreskin : $importskin.$restoreskin;
}
print $this->Format(" ---- === My skin ##".$myskinname."## === --- ");
print $mysubmit;
}

// close form
print $this->FormClose();
closedir($handle);
}
?>
%%

== 2. Modify the wikka core (##wikka.php##) ==

Add the following code in ##./wikka.php## immediately after the ##""//COOKIES""## section

%%(php)
// SKINS
function GetSkin()
{
if ($this->GetUser())
{
$skin = $_SESSION['skin'];
} else
{
if ($_COOKIE['skin'])
{
$skin = $_COOKIE['skin'];
} else
{
$skin = $this->GetConfigValue("stylesheet");
}
}
return $skin;
}

function SetSkin($skin)
{
if ($this->GetUser())
{
$_SESSION['skin'] = $skin;
} else
{
$this->SetPersistentCookie("skin", $skin);
}
}

function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);
}

function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
}

%%

== 3. Modify the Wikka Header (##actions/header.php##)==

To allow skin selection a small modification of the header is needed:

**original ##actions/header.php##**
%%(php)
<link rel="stylesheet" type="text/css" href="css/<?php echo $this->GetConfigValue("stylesheet") ?>" />
%%

**modified ##actions/header.php##**
%%(php)
<link rel="stylesheet" type="text/css" href="css/<?php echo $this->GetSkin() ?>" media="screen" />
%%

== 4. Add the following system options ==

**original ##wikka.config.php##**
%%(php)
"stylesheet" => "wikka.css",
%%

**modified ##wikka.config.php##**
%%(php)
"default_stylesheet" => "wikka.css",
"allow_select_skin" => "1",
"display_custom_skins" => "1",
"allow_create_custom_skin" => "1",
"allow_display_skin_source" => "1",
%%


=== Understanding the system options ===

~-##default_stylesheet## --- Defines the system stylesheet;
~-##allow_select_skin## --- Allows users to switch stilesheet;
~-##display_custom_skins## --- Displays custom skins in the list of selectable stylesheets;
~-##allow_create_custom_skin## --- Allows registered users to create custom skins;
~-##allow_display_skin_source## --- Allows users to display (and edit) the source of a skin;

----
Deletions:
===== MySkin: choose and modify your favorite skin =====
{{lastedit}}

<<Give it a [[TestSkin try]]!<<

::c::

Following the suggestions of JsnX and JavaWoman, and using code I had written for the WikkaSkinEditor action, I've created a new action that allows registered users to //create// their own custom skin and //modify// it to their taste. Feel free to test it and give your feedback.

== 1. How to use it ==

Just add in one of your pages ##""{{myskin}}""##, change the actions/header.php as shown below and start playing

== 2. The code ##(actions/myskin.php)##==

The code below is still quite redundant. It can be made much more compact by creating a couple of functions.

%%(php)
<?php

/**
* Allows users to select alternate skins and to edit their custom skins.
*
* This action allows the user to select a skin among those available in
* the Wikka css folder. A form allows to display the markup of each skin.
* Registered user can create it and modify their own custom skin. The
* first creation of a custom user skin consists in the generation of a new
* css stylesheet containing the default wikka CSS settings (as specified
* in the Wikka config file) and stored with the name of the user. Once a
* custom user skin exists, the owner of the skin can modify it, overwrite
* it with an existing skin, or restore the default settings. Wikka
* administrators have write access to all the skins.
*
* Cookies must be enabled for the selector to work and the css folder must
* be write-accessible to the script in order to read, edit and save skins.
*
* @package Actions
* @name MySkin
*
* @author {@link http://wikka.jsnx.com/DarTar DarTar}
* @version 1.0
* @since Wikka 1.1.X
*
* @output displays a form for selecting alternate skins and edit
* custom user skins.
* @todo -integrate with UserSettings?
*/


// get skin names
$currentskin = $this->GetCookie("wikiskin");
$defaultskin = $this->GetConfigValue("stylesheet");
$postedskin = $_POST["skin"];
$myskin = strtolower($this->GetUserName().".css");

// build form chunks
$setskin = '<input type="submit" name="action" value="Set skin" />';
$showsource = '<input type="submit" name="action" value="Show source" />';
$hidesource = '<input type="submit" name="action" value="Hide source" />';
$editsource = '<input type="submit" name="action" value="Edit source" />';
$savesource = '<input type="submit" name="action" value="Save modified source" />';
$createskin = '<input type="submit" name="action" value="Create my skin" />';
$importskin = '<input type="submit" name="action" value="Save current skin as my skin" />';
$restoreskin = '<input type="submit" name="action" value="Restore to default settings" />';

// internal functions

function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
fclose($css_file);
}

function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
}


echo $this->Format("=== Select a Wikka skin: === --- ");
switch ($_POST["action"]) {

case "Save modified source":
// saves modified skin to file
WriteSkin($currentskin, $_POST["mod_css_content"]);
// no break - skin is automatically updated

case "Set skin":
// change current skin and reload page
$this->SetPersistentCookie("wikiskin", $postedskin);
$this->Redirect($this->href());
break;

case "Save current skin as my skin":
// import and save current skin as user skin
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = ReadSkin($currentskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());

}
break;

case "Create my skin":
// first time user skin creation
if ($this->GetUser() && !file_exists("css/".$myskin)) {
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());
}
break;

case "Restore to default settings":
// restore user skin to default settings
if ($this->GetUser() && file_exists("css/".$myskin)) {
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$this->SetPersistentCookie("wikiskin", $myskin);
$this->Redirect($this->href());
}
break;

case "Show source":
// open a readonly textarea with skin source
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
$submit = $hidesource;
break;

case "Edit source":
// open an editable textarea with skin source
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="mod_css_content" cols="80" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource;
break;

}

$handle = opendir('css/');

// retrieve skin list
$skinlist = '<select name="skin">';
// put on top of the list the default and custom skin
$defaultselected = ($defaultskin == $currentskin)? " selected=\"selected\"" : "";
$myselected = ($myskin == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$defaultskin.'"'.$defaultselected.'>(Default skin: '.$defaultskin.')</option>';

if ($this->GetUser() && file_exists("css/".$myskin)) $skinlist .= '<option value="'.$myskin.'"'.$myselected.'>(My skin: '.$myskin.')</option>';

// get other skins
$noskinmask = '^('.$defaultskin.'|'.$myskin.'|xml.css|print.css|\.(.*))$';
while (false !== ($file = readdir($handle))) {
if (!preg_match('/'.$noskinmask.'/', $file)) {
$selected = ($file == $currentskin)? " selected=\"selected\"" : "";
$skinlist .= '<option value="'.$file.'"'.$selected.'>'.$file.'</option>';
}
}
$skinlist .= '</select>';

// give write access to the skin owner and to admins
if (!isset($submit)) {
$submit = ($this->IsAdmin() || $currentskin == $myskin)? $editsource : $showsource;
}

// create form
print $this->FormOpen("","","post");
print $skinlist.$setskin."<br /><br />".$showskin.$submit."<br /><br />\n";

// show user skin options
if ($this->GetUser()) {
if (!file_exists("css/".$myskin)) {
$mysubmit = $createskin;
} else {
$myskinname = "(".$myskin.")";
$mysubmit = ($currentskin == $myskin)? $restoreskin : $importskin.$restoreskin;
}
print $this->Format(" ---- === My skin ".$myskinname." === --- ");
print $mysubmit;
}

// close form
print $this->FormClose();
closedir($handle);
?>
%%

== 3. Modify the Wikka Header (##actions/header.php##)==

To allow skin selection a small modification of the header is needed:

**original ##actions/header.php##**
%%(php)
<link rel="stylesheet" type="text/css" href="css/<?php echo $this->GetConfigValue("stylesheet") ?>" />
%%

**modified ##actions/header.php##**
%%(php)
<link rel="stylesheet" type="text/css" href="css/<?php echo ($this->GetCookie("wikiskin"))? $this->GetCookie("wikiskin"): $this->GetConfigValue("stylesheet") ?>" />
%%

----


Revision [4913]

Edited on 2005-01-21 15:43:16 by NilsLindenberg [needed modification added]
Additions:
== 1. How to use it ==
Just add in one of your pages ##""{{myskin}}""##, change the actions/header.php as shown below and start playing
== 2. The code ##(actions/myskin.php)##==
== 3. Modify the Wikka Header (##actions/header.php##)==
To allow skin selection a small modification of the header is needed:
**original ##actions/header.php##**
<link rel="stylesheet" type="text/css" href="css/<?php echo $this->GetConfigValue("stylesheet") ?>" />
**modified ##actions/header.php##**
<link rel="stylesheet" type="text/css" href="css/<?php echo ($this->GetCookie("wikiskin"))? $this->GetCookie("wikiskin"): $this->GetConfigValue("stylesheet") ?>" />
Deletions:
== How to use it ==
Just add in one of your pages ##""{{myskin}}""## and start playing
== The code ##(actions/myskin.php)##==


Revision [4756]

Edited on 2005-01-17 14:50:38 by NilsLindenberg [cat. changed]
Additions:
CategoryUserContributions CategoryLayout
Deletions:
CategoryDevelopment CategoryLayout


Revision [3046]

Edited on 2004-12-09 20:18:35 by DarTar [Adding category link]
Additions:
CategoryDevelopment CategoryLayout
Deletions:
CategoryDevelopment


Revision [3034]

Edited on 2004-12-09 18:21:28 by NilsLindenberg [layout]
Additions:
::c::


Revision [3030]

Edited on 2004-12-09 18:07:11 by JavaWoman [minor fix]
Additions:
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
Deletions:
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br
/>';


Revision [3009]

Edited on 2004-12-09 12:05:37 by DarTar [announcing new action - internal functions added]
Additions:
* Registered user can create it and modify their own custom skin. The
* administrators have write access to all the skins.
* @todo -integrate with UserSettings?
// internal functions
function WriteSkin($file, $content){
$css_file = fopen("css/".$file, "w+");
fwrite($css_file, $content);
function ReadSkin($file){
$source = fopen("css/".$file, "r");
$css_content = fread($source, filesize("css/".$file));
fclose($source);
return $css_content;
WriteSkin($currentskin, $_POST["mod_css_content"]);
$css_content = ReadSkin($currentskin);
WriteSkin($myskin, $css_content);
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$css_content = ReadSkin($defaultskin);
WriteSkin($myskin, $css_content);
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="display_css_content" cols="80" rows="15" readonly="readonly">'.$css_contents.'</textarea><br
/>';
$css_contents = ReadSkin($currentskin);
$showskin = '<textarea id="skinedit" name="mod_css_content" cols="80" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource;
print $skinlist.$setskin."<br /><br />".$showskin.$submit."<br /><br />\n";
Deletions:
* Registered user can create and modify their own custom skin. The
* administrators have write access to all skins.
* @todo -integrate with UserSettings.
* -create functions for more compact code.
$css_file = fopen("css/".$currentskin, "w+");
fwrite($css_file, $_POST["mod_css_content"]);
$source = fopen("css/".$currentskin, "r");
$css_content = fread($source, filesize("css/".$currentskin));
fclose($source);
$myskinfile = fopen("css/".$myskin, "w+");
fwrite($myskinfile, $css_content);
fclose($myskinfile);
$source = fopen("css/".$defaultskin, "r");
$css_content = fread($source, filesize("css/".$defaultskin));
fclose($source);
$myskinfile = fopen("css/".$myskin, "w+");
fwrite($myskinfile, $css_content);
fclose($myskinfile);
$source = fopen("css/".$defaultskin, "r");
$css_content = fread($source, filesize("css/".$defaultskin));
fclose($source);
$myskinfile = fopen("css/".$myskin, "w+");
fwrite($myskinfile, $css_content);
fclose($myskinfile);
$css_file = fopen("css/".$currentskin, "r");
$css_contents = fread($css_file, filesize("css/".$currentskin));
$showskin = '<textarea name="display_css_content" cols="50" rows="15" readonly="readonly">'.$css_contents.'</textarea><br />';
$css_file = fopen("css/".$currentskin, "r");
$css_contents = fread($css_file, filesize("css/".$currentskin));
$showskin = '<textarea name="mod_css_content" cols="50" rows="15">'.$css_contents.'</textarea><br />';
$submit = $savesource;
print $skinlist.$setskin."<br /><br />".$submit."<br />\n".$showskin."<br /><br />\n";



Revision [3008]

Edited on 2004-12-09 10:24:27 by DarTar [announcing new action]
Additions:
* Registered user can create and modify their own custom skin. The
* administrators have write access to all skins.
Deletions:
* Registered user can create it and modify their own custom skin. The
* administrators have write access to all the skins.


Revision [3007]

Edited on 2004-12-09 10:23:21 by DarTar [announcing new action]
Additions:
Following the suggestions of JsnX and JavaWoman, and using code I had written for the WikkaSkinEditor action, I've created a new action that allows registered users to //create// their own custom skin and //modify// it to their taste. Feel free to test it and give your feedback.
Deletions:
Following the suggestions of JsnX and JavaWoman, and using code I had written for the WikkaSkinEditor action, I've created a new action that allows registered users to create their own custom skin and modify it as they wish. Feel free to test it and give your feedback.


Revision [3004]

Edited on 2004-12-09 10:18:55 by DarTar [Announcing new action]
Additions:
Following the suggestions of JsnX and JavaWoman, and using code I had written for the WikkaSkinEditor action, I've created a new action that allows registered users to create their own custom skin and modify it as they wish. Feel free to test it and give your feedback.
Deletions:
Following the suggestions of JsnX and JavaWoman, and using code I had written for the SkinEditor action, I've created a new action that allows registered users to create their own custom skin and modify it as they wish. Feel free to test it and give your feedback.


Revision [3003]

The oldest known version of this page was created on 2004-12-09 10:13:54 by DarTar [Announcing new action]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki