Page 1 sur 1

Amélioration d'une class combobox

Posté : 21 janv. 2008, 16:31
par Sebe
Bonjour,

J'aimerai créer un combobox permettant de sélectionner une couleur et son code ... j'ai un début de code mais il ne reprend pas la sélection par défaut:
<?php
class Item{
	var $_value = '';
	var $_text = null;
	var $_stylist = null;

	function Item( $value, $text=null ){
		$this->_value = $value;
		$this->_text = $text;
		}

	function getValue(){
		return $this->_value;
		}

	function setStylist( &$stylist ){
		$this->_stylist =& $stylist;
		}

	function render(){
        echo '<option value="' . htmlspecialchars( $this->getValue() ) . '"', $this->_stylize(), '>';
        echo htmlspecialchars( !empty( $this->_text ) ? $this->_text : $this->getValue() );
        echo '</option>';
    	}

	function _stylize(){
		if ( is_object( $this->_stylist ) ){
            $this->_stylist->render( $this );
			}
		}
	}

class Stylist{
	var $_color = '';

	function Stylist( $color ){
		$this->_color = $color;
		}

	function render( &$item ){
        echo ' style="color:' . htmlspecialchars( $this->_color ) . '; background-color:' . htmlspecialchars( $item->getValue() ) . '" '; 
		}
	}

class Select{
	var $_class = '';
	var $_name = '';
	var $_list = array();

	function Select( &$list, $name='', $class=''){
		$this->_class = $class;
		$this->_name = $name;
		$this->_list =& $list;
		}

	function render(){
		echo '<select' . ( !empty( $this->_name ) ? ' name="' . htmlspecialchars( $this->_name ) . '"' : '' ) . ( !empty( $this->_class ) ? ' class="' . htmlspecialchars( $this->_class ) . '"' : '' ) .'>';
		for ( $i=0, $n=count( $this->_list ); $i<$n; $i++ ){
			$this->_list[ $i ]->render();
			}
		echo '</select>';
		}
}
$stylist = new Stylist( 'white' );

$list = array();

$item = new Item( '#000000' );
$item->setStylist( $stylist );
$list[] = $item;
$item = new Item( '#336699' );
$item->setStylist( $stylist );
$list[] = $item;
$item = new Item( '#CC6600' );
$item->setStylist( $stylist );
$list[] = $item;

$lists['c_banniere'] = new Select( $list, 'color', 'inputbox' );
$lists['c_banniere']->render()
La selection par défaut est par exemple <?php echo $class_Config['c_banniere'];?>
Quelqu'un serait-il en meusure de modofier le code pour que la saisis par défaut soit possible ?

Merci

Posté : 21 janv. 2008, 16:44
par d0m
il faut lui passer la valeur par défaut lorsque tu crée ton SELECT, donc dans le constructeur du SELECT.
Ensuite, il faut passer cette valeur dans le render des items car c'est dans l'option qu'il faut afficher "SELECTED" si la valeur de l'option est celle de la valeur par défaut.

Posté : 22 janv. 2008, 11:07
par Sebe
Salut,

En fait, je sais qu'un combobox avec sélection par défaut c'est ceci:
<select name="name">
  <option value="1">1</option>
  <option value="2" selected>2</option>
  <option value="3">3</option>
</select>
mais le code que je propose plus haut n'est pas de moi et je n'ai pas les connaissances nécessaires pour le modifier ... c'est pour cela que je recherche qu'un qui pourrait me le faire.

Merci

Posté : 22 janv. 2008, 11:29
par Ryle
Moi chuis sur que tu as les connaissances pour le faire.... Tu sais qu'effectivement il faut ajouter l'attribut selected dans l'option. Il te suffit donc de trouver dans le code, où sont définies les options.

A partir de là, il te faut ajouter dedans l'attribut sous une condition que tu vas définir après. Cette condition peut être un paramètre passé à la fonction, ou plus simplement un test sur un des attributs de la classe, destiné à te dire quelle valeur du select doit être cochée. Si la valeur correspond, alors tu insères le "selected", sinon tu l'insère pas :)

Reste plus qu'à définir l'attribut en question au niveau de ta classe, et le setter à un moment donnée (dans le constructeur, ou via une méthode dédiée) pour que lorsque tu lance la création du select, celui-ci dispose de l'info :)

Posté : 22 janv. 2008, 13:34
par Sebe
Ryle,

Merci de croire en moi mais, même si je vois le résultat final de ce code, je n'arrive pas à le décoder ... oui, je comprends le fonctionnement d'un combobox ainsi que la manière de récupérer la sélection par défaut mais je ne comprend pas le système de class !

Enfin si, je comprends un peu le système des class mais là, il y a des fonctions et des sauts d'une class à l'autre et d'une fonction à l'autre et c'est dans la compréhension du fonctionnement de ce 1er code que je pêche alors, comprends moi, je suis un peu dépasser pour récupérer la sélection par défaut !

Merci

Posté : 22 janv. 2008, 14:53
par d0m
Alors il faut identifier le fonctionnement des classes et que fait chaque fonction :
//création d'un nouvel objet style (css)
$stylist = new Stylist( 'white' );

//initialisation de la liste des options de ton select
$list = array();
//creation d'une nouvelle option avec la couleur #000000
$item = new Item( '#000000' );
//on donne le style à l'option
$item->setStylist( $stylist );
//ajout de l'option dans la liste
$list[] = $item;
//idem avec d'autres couleurs ...
$item = new Item( '#336699' );
$item->setStylist( $stylist );
$list[] = $item;
$item = new Item( '#CC6600' );
$item->setStylist( $stylist );
$list[] = $item;

//creation d'une nouvelle liste déroulante avec comme option le contenu de $list, le nom 'color' et la classe css 'inputbox'
$lists['c_banniere'] = new Select( $list, 'color', 'inputbox' );
//affichage de la liste déroulante
$lists['c_banniere']->render()
la fonction render() doit afficher le SELECT et les différents options qui le compose.
cette fonction fait 3 choses :
- affiche la balise <SELECT ..... >
- fait appel à la fonction render() de tous les options qui le compose
- affiche la balise </SELECT>

or l'affichage d'une option dépend de la valeur de celle ci. Si la valeur est celle par défaut, il faut rajouter SELECTED.
donc cette affichage en plus doit se faire dans la fonction d'affichage render() de l'option.
Mais pour ca il faut faire un test avec la valeur par défaut, il faut donc la passer en paramètre de la fonction.
Tu peux comme le propose Ryle mettre cette valeur en attribut de la liste donc comme attribut de la classe Select.
Il faut donc rajouter la valeur par défaut dans le constructeur de Select