Bonjour, je sais pas si je suis au bon endroit alors tant pis je le fait ici
Voila, j'ai eu un besoin de pouvoir choisir des couleurs pour une preference de module, et là je me suis aperçu qu'il n'y avait pas de classe predefinie pour cela au niveau des classes FormSelect qui sont utilisées pour la gestion des formulaires de façons generales et surtout par l'administration.
J'ai donc palié a mon besoin et je le mets ici, cela peut etre utile à d'autre
.
J'ai cree une classe XoopsFormSelectColor qui peut servir a modifier la couleur du texte (style color) ou du fond (style backgroundcolor).
Dans class/xoopsform/formselectcolor.php
<?php
/*
* Created on 15 août 06
*
*/
if (!defined('XOOPS_ROOT_PATH')) {
die("XOOPS root path not defined");
}
/**
* A select field
*
* @package kernel
* @subpackage form
*
* @author Lionel FORTE aka Garrath
* @copyright
*/
class XoopsFormSelectColor extends XoopsFormSelect {
var $_back = false;
/**
* Constructor
*
* @param string $caption Caption
* @param string $name "name" attribute
* @param mixed $value Pre-selected value (or array of them).
* @param bool $back if back is true then backgroundcolor else color
*/
function XoopsFormSelectColor($caption, $name, $value=null, $back=false ){
$this->_back = $back;
$this->XoopsFormSelect($caption, $name, $value);
}
/**
* Prepare HTML for output
*
* @return string HTML
*/
function render(){
$color = $this->getValue(); //Il ne peut pas y avoir plusieurs choix ici
$style = $this->_back? 'background-color':'color';
$stylejs = $this->_back? 'backgroundColor':'color';
$ret = "<select size='".$this->getSize()."'".$this->getExtra()." style='".$style.":".$color[0]."' onchange='style.".$stylejs."=this.options[this.selectedIndex].value;'";
$ret .= " name='".$this->getName()."' id='".$this->getName()."'>n";
if (count($this->getOptions()) ){
foreach ( $this->getOptions() as $value => $name ) {
$color = htmlspecialchars($value, ENT_QUOTES);
$ret .= "<option value='".$color."' style='".$style.":".$color.";'";
if (count($this->getValue()) > 0 && in_array($value, $this->getValue())) {
$ret .= " selected='selected'";
}
$ret .= ">".$name."</option>n";
}
}
else{
$colorarray = array("00", "33", "66", "99", "CC", "FF");
$ret .= "<option value='COLOR'>"._COLOR."</option>n";
foreach ( $colorarray as $color1 ) {
foreach ( $colorarray as $color2 ) {
foreach ( $colorarray as $color3 ) {
$ret .= "<option value='#".$color1.$color2.$color3."' style='background-color:#".$color1.$color2.$color3.";color:#".$color1.$color2.$color3.";'>#".$color1.$color2.$color3."</option>n";
}
}
}
}
$ret .= "</select>";
return $ret;
}
}
?>
Voilà pour la classe.
Pour l'utiliser il faut modifier le fichier class/xoopsformloader.php pour rajouter le chemin vers la nouvelle classe
include_once XOOPS_ROOT_PATH."/class/xoopsform/formselectcolor.php";
Pour que cette classe soit utilisé pour les preferences d'un module il faut modifier le fichier modules/system/admin/preferences/main.php
rajouter ce bout de code
case 'selectcolorback':
$back = true;
case 'selectcolor':
$ele = new XoopsFormSelectColor($title, $config[$i]->getVar('conf_name'), $config[$i]->getConfValueForOutput(), isset($back));
unset($back);
$options =& $config_handler->getConfigOptions(new Criteria('conf_id', $config[$i]->getVar('conf_id')));
$opcount = count($options);
for ($j = 0; $j < $opcount; $j++) {
$optval = defined($options[$j]->getVar('confop_value')) ? constant($options[$j]->getVar('confop_value')) : $options[$j]->getVar('confop_value');
$optkey = defined($options[$j]->getVar('confop_name')) ? constant($options[$j]->getVar('confop_name')) : $options[$j]->getVar('confop_name');
$ele->addOption($optval, $optkey);
}
break;
dans les 2 boucles avec le switch a l'interieure des tests sur op est egale a show et showmod
Et maintenant au niveau du xoops_version de votre module il n'y a plus qu'a mettre cela par exemple pour definir une couleur de fond
$modversion['config'][2]['name'] = 'PM_COLOR_THISBOX';
$modversion['config'][2]['title'] = '_MI_PM_COLOR_THISBOX';
$modversion['config'][2]['description'] = '_MI_PM_COLOR_THISBOX_DESC';
$modversion['config'][2]['formtype'] = 'selectcolorback';
$modversion['config'][2]['valuetype'] = 'string';
$modversion['config'][2]['default'] = 'red';
$modversion['config'][2]['options'] = $tabcouleur;
avec ici un tableau de couleur predefinie dans $tabcouleur de ce type la :
$tabcouleur = array('aliceblue' => 'aliceblue',
'antiquewhite' => 'antiquewhite',
'aqua' => 'aqua',
'aquamarine' => 'aquamarine',
'azure' => 'azure',
'beige' => 'beige',
'bisque' => 'bisque',
'black' => 'black',
'blanchedalmond' => 'blanchedalmond',
'blue' => 'blue',
'blueviolet' => 'blueviolet',
'brown' => 'brown'... );
Si vous ne voulez pas definir un tableau de couleur, il en sera créé un automatiquement un utilisant les codes en hexa (exactement le meme que sur l'editeur).
ceci defini par exemple une couleur d'ecriture avec le tableau de couleur genere automatiquement.
$modversion['config'][3]['name'] = 'PM_COLOR_ALLBOX';
$modversion['config'][3]['title'] = '_MI_PM_COLOR_ALLBOX';
$modversion['config'][3]['description'] = '_MI_PM_COLOR_ALLBOX_DESC';
$modversion['config'][3]['formtype'] = 'selectcolor';
$modversion['config'][3]['valuetype'] = 'string';
$modversion['config'][3]['default'] = '#006699';
Vous allez me dire: quel est l'interet?
J'en avais besoins
et rajouter des classes css pour ce que je voulais faire avec me paraissait pas super top
et puis la classe peut etre utilisé par ailleurs dans n'importe quel type de formulaire (comme dans l'editeur par exemple...).