Page 1 sur 3

Comment simplifier ce code (question de débutant)?

Posté : 15 juin 2005, 13:57
par Lorange
Bonjour,

Je suis parvenu à ce que je voulais faire mais le code est très long et il y a certainement d'autres solutions pour le rendre un peu plus léger.

Voici mon code :

<?


// Ce script affiche une publicité pour le visiteur en fonction de trois critères que le script vérifie :

1) La langue du visiteur (fr, de, en ou po)
2) Son sexe (1 pour homme ou 2 pour femme)
3) Son sport préféré (1 pour football, 2 pour basketball, 3 pour tennis, ...)


// Le visiteur est un homme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-femmes.php');}
else



// Le visiteur est un homme et son sport préféré est le basketball (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/fr/articles-de-basket-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/de/articles-de-basket-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/en/articles-de-basket-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/po/articles-de-basket-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le basketball (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/fr/articles-de-basket-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/de/articles-de-basket-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/en/articles-de-basket-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/po/articles-de-basket-femmes.php');}
else




// Le visiteur est un homme et son sport préféré est le tennis (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/fr/articles-de-tennis-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/de/articles-de-tennis-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/en/articles-de-tennis-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/po/articles-de-tennis-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le tennis (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/fr/articles-de-tennis-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/de/articles-de-tennis-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/en/articles-de-tennis-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/po/articles-de-tennis-femmes.php');}
else


else
include_once('sponsors/multilingue/tous-les-sports.php');


?>



2) (2ème question)

La langue du site, par défaut, est le français. C'est à dire que si le visiteur veut afficher la page en français, il peut y accéder par :

page.php?l=fr
page.php?l=default
page.php?l=

Ces trois solutions vont afficher la page en français. Dans le code ci-dessus, je n'ai pas parlé des deux autres valeurs possibles de cette variable ('default' et ' ').

Mais est-il possible, dans le code ci-dessus, pour la ligne en français, d'écrire quelque chose telle que :

if ($l='fr', 'default', ' ') and ........... {include_once('sponsors/fr/articles-de-foot-hommes.php');}

plutôt que de faire une ligne, à chaque fois pour

if $l=fr

if $l=default

if $l=

?


Merci d'avance pour votre aide car je n'ai vraiment pas trouvé de solution malgré mes recherches sur le for, switch, etc. auxquels je n'ai pas compris grand' chose. :(



[/php]

Posté : 15 juin 2005, 14:05
par Guakamol
hum.... je suis pas sur qu'un autre structure soit plus efficace (peut etre avec des switch() imbriqués ...)

Pour ton probleme avec la langue par default tu peux utiliser ca if($l=="fr" || $l=="default" || $l=="")

Posté : 15 juin 2005, 14:05
par ouckileou
en vrac et à première vue

effectivement beaucoup de "if then else" donc tu pourrais continuer à chercher du coté du switch

on voit que dans ces lignes :
// Le visiteur est un homme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-hommes.php');}
else 
seul changement la langue, que tu as dans ta variable donc pourquoi ne pas faire :
if ($i['sexe']=='1') And ($i['sport_prefere']=='1')
{include_once('sponsors/'.$l.'/articles-de-foot-hommes.php');}
sinon pourquoi une page pour chaque type d'articles ?
on aurait pu voir un seul modèle de page qui sélectionne directement les articles suivant les variables, en construisant la requête dynamiquement

Posté : 15 juin 2005, 14:08
par Invité
merci à vous deux.

Pour l'insertion de la variable dans l'include, comme tu le proposes, je croyais que c'était à éviter (faille du include), non?

Posté : 15 juin 2005, 14:09
par ouckileou
une autre piste : construire ton include() dynamiquement
avec des tableaux de correspondances id=>libellé
$tabSports = Array(1 => "foot", 2=>"tennis");
$tabSexes = Array(1=>"homme", 2=>"femme");

include_once('sponsors/'.$l'./articles-de-'.$tabSports[$i['sport_prefere']].'-'.$tabSexes[$i['sexe']].'.php');

Posté : 15 juin 2005, 14:10
par ouckileou
Pour l'insertion de la variable dans l'include, comme tu le proposes, je croyais que c'était à éviter (faille du include), non?
à toi de sécuriser ça et de limiter ce qu'on peut insérer dedans,
si telle ou telle valeur on insère
sinon on insère une valeur par défaut

Posté : 15 juin 2005, 14:12
par Guakamol
En fait oui une structure avec des switch serait plus efficace(puisque tu n'est pas obliger de faire tous les test a chaque fois)

donc
switch($l)
{
case 'fr':
    switch($sport)
     {
        case 1:
                switch($sexe)
                 {
                   case 1:
                    //include
                    break;
                    case 2:
                    //include
                    break;
                  }
         break;
        case 2:
         //code switch
         break:
        case 3:
         //code switch
         break;
break;

case 'de':
//code
break;

etc.....

}
Fait bien attention a mettre des break a la fin de chaque case.

EDIT : l'idee des tableaux des ouckileou est carrement excellente :)

Posté : 15 juin 2005, 14:15
par Invité
Les tableaux de correspondance... ça me semble peu adéquat car en fait mon code devrait être encore très flexible par la suite. Donc je préférerais rester sur une strucutre similaire à celle proposée.

Par contre, la variable dans l'include me paraît très intéressant. Mais pourrais-tu détailler la façon de la protéger?

Posté : 15 juin 2005, 14:16
par ouckileou
par exemple pour le sexe

(partons du principe tu ne gères que 2 sexes :lol:)

quand tu récupères ta variable dans l'url tu testes avant de créer ton include
$sexe = ($i['sexe'] == 1 || $i['sexe'] == 2)?$i['sexe']:1;
le code ci-dessu veut dire :
Si $i['sexe'] vaut 1 ou vaut 2 alors je met $i['sexe'] dans $sexe
Sinon je met sexe par défaut 1

Posté : 15 juin 2005, 14:17
par ouckileou
justement si ton type de page à appeler reste le même les tableaux de correspondances peuvent convenir

si tu as tjrs /sponsors/langue/articles-de-sport-sexe

alors tu pourras rajouter facilement des langues, sports et sexes

enfin pour les sexes ça sert moins forcément... ;)

édition :

et tu pourras garder le type de tests que je t'ai donné sans le changer à chaque fois
$sport = ($i['sportPréféré'] > 0 && $i['sportPréféré']<= count($tabSports))?$i['sportPréféré']:1;

Posté : 15 juin 2005, 14:20
par Invité
Ok, mais mon sexe prend chez moi 4 valeurs :)

Homme, femme, trans et couple

(mon site est en fait un site de rencontres :p mais j'ai essayé de simplifier ;))

Finalement, l'idée du switch me paraît pas trop mal...

Je peux y écrire case "fr" || "default" || "" ?

Posté : 15 juin 2005, 14:24
par Guakamol
ben tu veux un code tres flexible mais les tableaux te permettrons de le mettre rtes facilement a jour (plutot que te retaper a chaque fois les lignes de codes tes tests (imagine tu rajoute une langue -> tu devrait rajouter ce test a chaque fois) , franchement je suis fan de l'idée du tableau 8)

Posté : 15 juin 2005, 14:25
par ouckileou
et bien de la vision que j'en ai le système des tableaux me parait convenir
$tabSexes = Array(1=>"homme", 2=>"femme", 3=>"trans",4=>"couple");

$sexe = ($i['sexe'] > 0 && $i['sexe'] <= count($tabSexes))?$i['sexe']:1;
avec ce test :
$i['sexe'] > 0 && $i['sexe'] <= count($tabSexes)
tu vérifies que la valeur transmise est comprise entre 1 et 4 sinon tu prends 1 par défaut

et le tableau te permettra de rajouter facilement un 5ième choix "animaux" si tu fais un site de rencontres très, très ouvert :lol:

Posté : 15 juin 2005, 14:27
par Invité
Oui j'en suis convaincu mais le problème c'est que ma publicité ne suit pas toujours une logique aussi implacable que celle présentée ici. Donc ça n'irait pas vraiment pour ce que je veux faire après.

Donc je vais quand même rester au switch...

par contree, est ce que ça va aller si j'écris, pour le français, qqch du genre :

case ' "fr" || "default" ||"" ':

Posté : 15 juin 2005, 14:29
par ouckileou
ben pas vraiment, voici un exemple de syntaxe
switch($l) {
   case 'en' : $langue = "anglais"; break;
   case 'de' : $langue = "allemand"; break;
   default : $langue = "français";
}