Utilisation d'une fonction en passant des attributs

gsp
Invité n'ayant pas de compte PHPfrance

05 nov. 2005, 18:46

Bonjour,

J'ai besoin de conseils pour utiliser une fonction qui réalise un menu déroulant des départements français. Son auteur précise dans les commentaires du script :
<Commentaire>
"select" : retourne un menu déroulant avec les departements
// : passer l'attribut "name" du select comme deuxieme argument optionnel
// : passer un numero de departement comme troisieme argument optionnel
</commentaire>
Avec "select" à l'appel de la fonction ça fonctionne bien. Mon problème, c'est de trouvé comment passer le deuxième et troisième argument.

merci.


< début du script, j'ai réduit la liste des départements>
function departement($nom) {
// valeurs pour $nom : 
// "tous" : retourne le tableau ci-dessous 
// un tableau : traite chaque élément du tableau 
// 21 : retourne un tableau contenant la corse (haute et basse) 
// un entier: retourne le nom du département associé 
// une chaine: retourne le numéro du département associé 
// si rien n'est trouvé, retourne une chaîne vide. 
$dept = array( 
"01" => "Ain", 
"02" => "Aisne", 
"03" => "Allier", 
"04" => "Alpes de Haute Provence", 
"05" => "Hautes Alpes", 
"06" => "Alpes Maritimes", 
"07" => "Ard&egrave;che", 
"08" => "Ardennes", 
"09" => "Ari&eacute;ge", 
"10" => "Aube", 
"11" => "Aude", 
"12" => "Averyon", 
"13" => "Bouche du Rh&ocirc;ne", 
"14" => "Calvados", 
"15" => "Cantal", 
"16" => "Charente", 
"17" => "Charente Maritime", 
"18" => "Cher", 
"19" => "Corr&egrave;ze", 
"2a" => "Corse du Sud", 
"2b" => "Haute Corse", 
"21" => "C&ocirc;te d'Or", 
"95" => "Val d'Oise" 
); 

if (is_string($nom) && ($nom == "tous")){ 
return $dept; 
} elseif (is_string($nom) && ($nom == "select")){ 
if (func_num_args() >= 2){ 
$sel_nom = func_get_arg(1); 
} else { $sel_nom = "";} 
if (func_num_args() >= 3){ 
$checked = func_get_arg(2); 
} else { $checked = "";} 
$select = '<select name="'.$nom.'">'; 
while(list($nb, $nom) = each($dept)){ 
if ($nb == $checked){ 
$select .= "<option value=\"$nb\" selected>$nom</option>\n"; 
} else { 
$select .= "<option value=\"$nb\">$nom</option>\n"; 
} 
} 
return $select .= '</select>'; 
} elseif (is_array($nom)){ 
$retour = array(); 
foreach ($nom as $n){ 
$retour[] = departement($n); 
} 
return $retour; 
} elseif (is_int($nom) && ($nom == 21)){ 
$retour = array_kslice($dept, "2a", 2); 
$r = array(); 
$r["21"] = $retour; 
return $r; 
} elseif (is_int($nom) || in_array($nom, array("2a","2b"))) { 
if (isset($dept[$nom])){ 
return $dept[$nom]; 
} 
return ""; 
} else { 
$dept = array_flip($dept); 
$nom = ucwords(strtolower($nom)); 
if (isset($dept[$nom])){ 
return $dept[$nom]; 
} 
return "";

}


< fin du script >

Eléphant du PHP | 493 Messages

05 nov. 2005, 22:00

Bonjour, merci de formatter ton code à l'aide des balises
[/b] si tu veux obtenir une plus grande chance d'avoir des réponses :)

Mammouth du PHP | 19672 Messages

05 nov. 2005, 23:05

Je l'ai fait, comme invité, il ne pouvait pas éditer son message.

Ce code est quand même illisible; voilà une version remise en forme:
<?php
function departement($nom)
{
    // valeurs pour $nom :
    // "tous" : retourne le tableau ci-dessous
    // un tableau : traite chaque élément du tableau
    // 21 : retourne un tableau contenant la corse (haute et basse)
    // un entier: retourne le nom du département associé
    // une chaine: retourne le numéro du département associé
    // si rien n'est trouvé, retourne une chaîne vide.
    $dept = array(
    "01" => "Ain",
    "02" => "Aisne",
    "03" => "Allier",
    "04" => "Alpes de Haute Provence",
    "05" => "Hautes Alpes",
    "06" => "Alpes Maritimes",
    "07" => "Ardèche",
    "08" => "Ardennes",
    "09" => "Ariége",
    "10" => "Aube",
    "11" => "Aude",
    "12" => "Averyon",
    "13" => "Bouche du Rhône",
    "14" => "Calvados",
    "15" => "Cantal",
    "16" => "Charente",
    "17" => "Charente Maritime",
    "18" => "Cher",
    "19" => "Corrèze",
    "2a" => "Corse du Sud",
    "2b" => "Haute Corse",
    "21" => "Côte d'Or",
    "95" => "Val d'Oise"
    );

    if (is_string($nom) && ($nom == "tous"))
    {
        return $dept;
    }
    elseif (is_string($nom) && ($nom == "select"))
    {
        if (func_num_args() >= 2)
        {
            $sel_nom = func_get_arg(1);
        }
        else
        {
            $sel_nom = "";
        }
        if (func_num_args() >= 3)
        {
            $checked = func_get_arg(2);
        }
        else
        {
            $checked = "";
        }
        $select = '<select name="'.$nom.'">';
        while(list($nb, $nom) = each($dept))
        {
            if ($nb == $checked)
            {
                $select .= "<option value=\"". $nb ."\" selected>". $nom ."</option>\n";
            }
            else
            {
                $select .= "<option value=\"". $nb ."\">". $nom ."</option>\n";
            }
        }
        return $select .= '</select>';
    }
    elseif (is_array($nom))
    {
        $retour = array();
        foreach ($nom as $n)
        {
            $retour[] = departement($n);
        }
        return $retour;
    }
    elseif (is_int($nom) && ($nom == 21))
    {
        $retour = array_kslice($dept, "2a", 2);
        $r = array();
        $r["21"] = $retour;
        return $r;
    }
    elseif (is_int($nom) || in_array($nom, array("2a","2b")))
    {
        if (isset($dept[$nom]))
        {
            return $dept[$nom];
        }
        return "";
    }
    else
    {
        $dept = array_flip($dept);
        $nom = ucwords(strtolower($nom));
        if (isset($dept[$nom]))
        {
            return $dept[$nom];
        }
        return "";
    }
}
?>
Maintenant, reformule ta question clairement, qu'est-ce que tu veux faire qui ne foncitonne pas ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 nov. 2005, 02:07

merci a Cyrano pour ce code clair :wink:

alors d'apres ce que j'ai pu comprendre tu peut utiliser plusieurs paramètres lors de l'appel a la fonction, par exemple:
departement("select");
//ou
departement("select","ma_liste");
//ou encore
departement("select","ma_liste","02");
pour le dernier exemple la liste aura comme élément séléctionné par défaur le département "02"

Par contre pour le second argument qui devrai etre le nom du select (d'apres le commentaire) il y a une erreur:
$select = '<select name="'.$nom.'">'; 
devrai etre
$select = '<select name="'.$sel_nom.'">';

mais le passage de plusieurs aruments ne marchera que si tu met "select" en 1er.

Apres il me parait bien compliqué ce code pour faire une liste :shock:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

gsp
Invité n'ayant pas de compte PHPfrance

06 nov. 2005, 02:10

Bonsoir,

Tout d'abord merci pour le code remise en place, c'est un code que j'ai eu sur nexen et que j'utilise comme ça.

Ma demande pour être précis, c'est comment passer les attributs prévus par la fonction, le nom du select et la value du champ. La fonction est donnée par son rédacteur pour passer la variable $nom et deux attributs.

Quelle est la syntaxe pour passer les attribut ?

Merci

gsp
Invité n'ayant pas de compte PHPfrance

06 nov. 2005, 11:15

Bonjour,

Merci d'avoir pris la peine de me répondre, surtout à une heure aussi tardive.

Si j'utilise comme cela departement ("select","ma_liste") comment ma_liste va s'associer avec $sel_nom ?
La variable du name $sel_nom il faut la déclarer où.

La declaration de la nouvelle variable, doit être dans la fonction, ou seulement dans son intitulé departement ($nom, $sel_nom) ?


Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 nov. 2005, 18:31

Si j'utilise comme cela departement ("select","ma_liste") comment ma_liste va s'associer avec $sel_nom ?
La variable du name $sel_nom il faut la déclarer où.
et bien j'ai jamais utilisé ce genre de fonction [ func_num_args() et func_get_arg() ]mais apparemment ça existe, alors tu as ce bout de code qui s'occupe de la récupération des paramètres s'il existent:
if (func_num_args() >= 2)
        {
            $sel_nom = func_get_arg(1);
        }
        else
        {
            $sel_nom = "";
        }
        if (func_num_args() >= 3)
        {
            $checked = func_get_arg(2);
        }
        else
        {
            $checked = "";
        } 
les variables sont donc initialisées si le 2nd voire le 3eme arument sont passés.
La declaration de la nouvelle variable, doit être dans la fonction, ou seulement dans son intitulé departement ($nom, $sel_nom) ?
la variable que tu souhaite passer devra apparaitre lors de l'appel a la fonction, le reste du code tu le laisse comme il est.

Donc avec 3 argument ça donnerai:
departement("select","ma_liste","02");
et la fonction elle meme sera:
function departement($nom)
{ 
..
..
}
[/php]

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

gsp
Invité n'ayant pas de compte PHPfrance

08 nov. 2005, 20:13

Bonsoir,

Merci à tous ceux qui m'ont corrigé mon code sur les département, ça fonctionne bien.

Un merci spécial à Truc.

@ +