Raccourcir et alléger

Par Estillia, il y a 12 ans


Bonjour !
Bon, voilà ça va être tout simple, mais est-ce que vous auriez un moyen de raccourcir tout ça ?

<?php 
if (get_field('pays')=="France"){
    echo '<td class="pays" id="fr" valign="top">';
}elseif (get_field('pays')=="USA"){
    echo '<td class="pays" id="usa" valign="top">';
}elseif (get_field('pays')=="Allemagne"){
    echo '<td class="pays" id="ger" valign="top">';
}else {
    echo '<td class="pays" id="oth" valign="top">';
}
?>

Le but du code :
Si ( partie backend ) on selectionne tel ou tel pays, alors on affiche un td avec un id en fonction du pays ( ici fr pour france, ger pour l'allemagne...etc ).
Côté css, un sprite avec tout pleins de drapeaux dessus ( d'ou un id pour chaque td/pays ).
Côté frontend, le drapeau du pays sélectionné affiché.

Il y a une 15aine de pays en tout, donc ça prend de la place. Vous avez une moyen de raccourcir et alléger ce code ?

Merci d'avance :)

13 réponses

Benjamin Derepas, il y a 12 ans

Tu parles d'un switch ?

switch(get_field('pays')
{
    case 'France':
    echo "...";
    case 'Allemagne':
    echo "...";
    default:
    break;
}
Estillia, il y a 12 ans

Aucune idée, je vais tester ça, je cherche surtout à simplifier le code, le minifier.
Dans ma tête, je voyais un truc du genre :
$var = array(
'Allemagne' -> 'ger',
'France' -> 'fr',
etc...
)
<td class="pays" id="<?php $var ?>" valign="top">

Bien sur, il manque la partie get field, select... mais c'est ce que je voyais. Dans mes leçons php, j'ai jamais dépassé la 2eme partie... en clair, je suis débutant confirmé, donc j'ai su écrire ça, je me suis dit que ça faisait long, très long ^^

Estillia, il y a 12 ans

Edit : Le swich ne fonctionne pas correctement, au lieu de m'afficher un <td> par <tr>, il me les affiche tous dans un <tr>.

Vallyan, il y a 12 ans

ton idée d'un tableau associatif est valable

$pays = array( 'France' => 'fr', 'Allemagne' => 'ger', 'USA' => 'usa' );
array_key_exists(get_field('pays'), $pays) ? echo "<td class='pays' id='{$pays get_field('pays') ]}' valign='top'>"; : echo "<td class='pays' id='oth' valign='top'>";
Vallyan, il y a 12 ans

Le switch devrait fonctionner tout aussi bien que le if ... elseif ...
Si tu n'as pas le résultat attendu c'est que tu as fait une erreur quelque part dans son utilisation. Par contre il faut mettre des break; a la fin de chaque bloc

Estillia, il y a 12 ans

Ok, basé sur ton code, j'ai bien raccourci le tout, merci beaucoup :)

MrGuillou, il y a 12 ans

@Vallyan je salue ta solution. Par contre juste une petit ajout. Dans le cas de @Estillia, je ne peux savoir comment fonctionne la fonction. Mais si c'est une fonction complexe (lourde) il vaut mieux cacher son résultat une première fois, pour éviter de l'exécuter une nouvelle fois.

En plus, avec une telle solution tu peux même envisager de placer ta liste des pays dans un fichier config.

$pays = get_field('pays');
$listePays = array( 'France' => 'fr', 'Allemagne' => 'ger', 'USA' => 'usa' );

echo (array_key_exists($pays, $listePays) ? '<td class="pays" id="'.$listePays$pays].'" valign="top">' : '<td class="pays" id="oth" valign="top">');
Estillia, il y a 12 ans

Avec cette solution, j'ai cette erreur :
Warning: array_key_exists(): The first argument should be either a string or an integer
Un idée ?

MrGuillou, il y a 12 ans

l'erreur se produit quand le pays est vide, donc faut tester si il n'est pas vide avant d'appliquer array_key_existe car elle ne supporte pas une entrée vide

a tester

$pays = get_field('pays');

$listePays = array( 'France' => 'fr', 'Allemagne' => 'ger', 'USA' => 'usa' );

echo ((!empty($pays) && array_key_exists($pays, $listePays)) ? '<td class="pays" id="'.$listePays$pays].'" valign="top">' : '<td class="pays" id="oth" valign="top">');
Estillia, il y a 12 ans

Le '<td class="pays" id="oth" valign="top">' était censé remplacer une entrée vide :)
Merci pour ta réponse rapide ^^

Estillia, il y a 12 ans

Edit, 2eme solution parfaitement fonctionnelle ! Merci ! :)
( Au final il va y avoir une 40aine d'entrées et de pays, c'est mieux, beaucoup mieux et beaucoup plus court ^^ )

MrGuillou, il y a 12 ans

Justement le code équivaut à

tu test en premier si le pays n'est pas vide, si vide il va directement dans le else
sinon il continue avec array_key_exists pour cherche une clef qui correspond, sinon il va dans else

if (!empty($pays) && array_key_exists($pays, $listePays))
{
    echo '<td class="pays" id="'.$listePays$pays].'" valign="top">';
}
else
{
    echo '<td class="pays" id="oth" valign="top">';
}

Voila voila,

Estillia, il y a 12 ans

Bah en tout cas merci, ça m'aide beaucoup :)
Et en plus, j'aurais appris qq chose :p