Une fonction PHP pour afficher des listes déroulantes Par JarodxXx
le jeudi 3 juillet 2008, 10:40
Cette fonction n'a rien d'exceptionnel, elle va simplement vous aider à afficher des listes déroulantes de chiffres, je m'en sers surtout pour les champs date de naissance sur mes formulaires. J'ai ajouté quelques petites options pour certains cas de figure, comme ajouter un style css à la liste etc. ...
Liste déroulante pour afficher une liste de chiffres
[PHP]
<?php
function liste_deroul( $nom, $debut, $fin, $id, $class = 'dateP'){
echo'<select name="'.$nom.'" size="1" id="'.$id.'" class="dateP" >';
echo'<option value="">--</option>';
if ( isset ( $_POST['submit'] ) ) {
echo'<option value="'.$_POST[$nom].'">'.$_POST[$nom].'</option>';
}
for ($i=$debut; $i<=$fin; $i++){
echo'<option value="'.$i.'">'.$i.'</option>';
}
echo'</select>';
}
?>
pour afficher la liste des 31 jours du mois faites par exemple :
[PHP] <?php liste_deroul( 'jours', 1, 31, 'jours', 'date'); ?>
facile non ? répétez-le pour la liste des mois de 1 à 12
et pour les années utilisez des variables !! Par exemple pour afficher la listes de années de naissance des 12 à 90 ans :
[PHP] <?php $debut = $an-12; $fin = $an-90; ?> <?php liste_deroul( 'aa' , $fin, $debut, 'aa', 'dateP'); ?>
Autre dérivée, la même fonction qui récupère des valeurs passées en paramètres
[PHP]
<?php
function liste_deroul_edit( $nom, $debut, $fin, $id, $val, $class = 'dateP'){
echo'<select name="'.$nom.'" size="1" id="'.$id.'" class="'.$class.'" >';
echo'<option value="'.$val.'">'.$val.'</option>';
for ($i=$debut; $i<=$fin; $i++){
echo'<option value="'.$i.'">'.$i.'</option>';
}
echo'</select>';
}
?>
Cas concret : après l'inscription je veux récupérer le jour de naissance d'un membre qui édite son profil !
[PHP]
<?php
$val = 25; //résultats issus d'une requête !!
liste_deroul_edit('jours', 1, 31, 'jours', $val, 'date');
?>

















Ziki
Dailymotion
Flickr
Technorati
Twitter
1. Le jeudi 3 juillet 2008, 10:55 par Darklg
Argh, des fonctions sans "return" !
Elles ont l'air pas mal, mais dans la plupart de mes scripts, l'exécution se fait en premier, l'affichage ensuite. Donc tant pis ^^"
2. Le jeudi 3 juillet 2008, 11:16 par Palleas
Pareil, je ne fais jamais de fonction qui affiche du contenu, je préfère les return.
Par contre ça aurait pu être cool de gérer si on a un array() plutôt que des bounds, mais après vu que c'est pas Java (<3) autant faire deux fonctions.
Ah et je préfère les fonctions avec un nom camelizé (maFonction() plutôt que ma_fonction()) mais ça c'est très personnel
3. Le jeudi 3 juillet 2008, 11:43 par kwiky
Même avis que les 2 premiers commentaires
4. Le jeudi 3 juillet 2008, 11:46 par jarodxxx
DE mon point de vue cette fonction sera systatiqement appele pour affichage et non pour des test avec un if par exemple ..
Donc si vous preferez faire un echo liste(); a chaque appel pourquoi pas ...
Moi je part de l'idée que la fonction DOIT afficher une code donc .. echo !
5. Le jeudi 3 juillet 2008, 13:53 par Luc
Dis donc, tu ne serais pas en train de nous coder un framework la ?
^^
6. Le jeudi 3 juillet 2008, 14:20 par jarodxxx
@Luc > -_- tu gache tout la !!!
La suite arrive quand meme !
7. Le jeudi 3 juillet 2008, 18:26 par Tony
Ce genre de fonction est en effet très utile. Cependant, pour la derniere, j'aurais plus utilisé un selected="selected" pour définir la valeur que remettre une ligne...
8. Le jeudi 3 juillet 2008, 22:37 par killian
Salut jarod, je vais te donner un conseil si jamais tu prépares d'autres fonctions de ce style.
Dans le modèle MVC (Modèle Vue Contrôleur), on sépare l'affichage, les traitements et les données en plusieurs couches. Dans ton exemple, la construction de la liste peut être séparée de l'affichage HTML. L'avantage ? Avoir une fonction qui puisse réutilisée et affichée de différentes façons.
Et puis tant qu'à faire, tu pourrais même encapsuler ça dans une classe, histoire de créer un composant vraiment réutilisable dans plusieurs projets.
Si jamais tu prépares un framework, renseigne toi bien à propos du MVC, crois moi ça en vaut la peine !
9. Le vendredi 4 juillet 2008, 10:25 par Luc
@killian : tient un collègue strasbourgeois!
10. Le samedi 5 juillet 2008, 11:38 par Palleas
@Killian : Moi je trouve que parler de MVC pour du web c'est un peu de la masturbation :D
11. Le samedi 5 juillet 2008, 12:26 par Joe le Mort
Voici la fonction que tu recherches Darkl :
http://www.alexandreval.info/cv/fon...
12. Le samedi 5 juillet 2008, 18:38 par Emacs
Une version plus propre, plus générique, plus MVC, plus sexy mais qui ne gère pas les <optgroup>
<?php
/**
* Génère une liste déroulante de nombres
*
* @author Hugo HAMON <webmaster@apprendre-php.com>
* @param string $name Nom de la liste déroulante
* @param int $from Valeur de départ (ex: 1970)
* @param int $to Valeur d'arrivée (ex: 2020)
* @param int $selected Value par défaut sélectionnée
* @param array $options Tableau associatif des couples attributs / valeur du tag <select>
* @param string $first Première option de la liste (ex: Année de naissance)
* @param int $pas Pas d'incrémentation (par défaut à 1)
* @return string $html Code html de la liste déroulante
*
* @example
* select_numbers('mois', 1, 12, 7, array('id'=>'mois', 'onchange'=>'this.form.submit()'), 'Votre mois de naissance');
*/
function select_numbers($name, $from, $to, $selected=0, $options=array(), $first='', $pas=1) {
$html = '<select name="'. $name .'"';
if(is_array($options) && sizeof($options)>0) {
foreach($option as $name => $value) {
$html.= ' '. $name .'="'. $value .'"';
}
}
$html.= '>'." ";
// Label vide
if(!empty($first)) {
$html.= "\t".'<option value="">'. $first .'</option>'." ";
}
for($i=$start; $i<=$end; $i=$i+$pas) {
$html.= "\t".'<option value="'. $i .'"';
$html.= ($i == $selected) ? ' selected="selected"' : '';
$html.= '>'. $i .'</option>'." ";
}
$html.= '</select>'." ";
return $html;
}
echo select_numbers(
'mois',
1,
12,
7,
array(
'id'=>'mois',
'onchange'=>'this.form.submit()'
),
'Votre mois de naissance'
);
?>
++
Hugo.
13. Le samedi 5 juillet 2008, 18:41 par Emacs
Corrigée et testé, ça donne ça au final :
<?php
/**
* Génère une liste déroulante de nombres
*
* @author Hugo HAMON <webmaster@apprendre-php.com>
* @param string $name Nom de la liste déroulante
* @param int $from Valeur de départ (ex: 1970)
* @param int $to Valeur d'arrivée (ex: 2020)
* @param int $selected Value par défaut sélectionnée
* @param array $options Tableau associatif des couples attributs / valeur du tag <select>
* @param string $first Première option de la liste (ex: Année de naissance)
* @param int $pas Pas d'incrémentation (par défaut à 1)
* @return string $html Code html de la liste déroulante
*
* @example
* select_numbers('mois', 1, 12, 7, array('id'=>'mois', 'onchange'=>'this.form.submit()'), 'Votre mois de naissance');
*/
function select_numbers($name, $from, $to, $selected=0, $options=array(), $first='', $pas=1) {
$html = '<select name="'. $name .'"';
if(is_array($options) && sizeof($options)>0) {
foreach($options as $name => $value) {
$html.= ' '. $name .'="'. $value .'"';
}
}
$html.= '>'." ";
// Label vide
if(!empty($first)) {
$html.= "\t".'<option value="">'. $first .'</option>'." ";
}
for($i=$from; $i<=$to; $i=$i+$pas) {
$html.= "\t".'<option value="'. $i .'"';
$html.= ($i == $selected) ? ' selected="selected"' : '';
$html.= '>'. $i .'</option>'." ";
}
$html.= '</select>'." ";
return $html;
}
echo select_numbers(
'mois',
1,
12,
7,
array(
'id'=>'mois',
'onchange'=>'this.form.submit()'
),
'Votre mois de naissance'
);
?>
Résultat HTML :
<select name="mois" id="mois" onchange="this.form.submit()">
<option value="">Votre mois de naissance</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7" selected="selected">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
14. Le dimanche 6 juillet 2008, 10:24 par Killian
@Palleas: Je ne suis pas d'accord avec toi, le MVC s'applique partout et surtout au web je trouve. Je me vois pas développer un site en mettant tout n'importe comment sans organisation... tous les frameworks web sont basés sur le modèle MVC (Django, Rails, Jelix...)
Mieux c'est découpé, moins on doit réécrire du code. Et réécrire du code, c'est la plaie du développeur : ça veut dire des bugs qui se répètent, alourdir le fonctionnement et ne plus rien comprendre quand on le relit un mois après...
15. Le dimanche 6 juillet 2008, 13:33 par Palleas
C'est pas le concept que je remet en cause j'en suis un fervent défenseur, c'est la dénomination, pour moi il a plus sa place pour de grosses applications (Java, AS..)
16. Le lundi 11 août 2008, 07:59 par Dator
Pour moi ce serait plutôt une fonction a mettre en helper et non pas comme function a part entière. Je suis pour la séparation des couches ! et mettre du code PHP + HTML +echo dans une fonction, c'est pas de la séparation
Bon exemple quand même
Clem
17. Le vendredi 19 septembre 2008, 18:08 par longshot
Moi j'aime la gueule de ton site
Mais c'est vrai que des return c'est parfois mieux surtout que ce genre de fonction je l'utilise plutôt avant l'envoie de header. C'est perso effectivement mais cela te limite un peu. Prends note, car les gens ce rendent compte que c'est du boulot que de prendre le temps de faire ces tuto.