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


Vallyan
Réponse acceptée

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'>";
MrGuillou
Réponse acceptée

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">');

Tu parles d'un switch ?

switch(get_field('pays')
{
    case 'France':
    echo "...";
    case 'Allemagne':
    echo "...";
    default:
    break;
}
Estillia
Auteur

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
Auteur

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

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
Auteur

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

@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
Auteur

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 ?

Estillia
Auteur

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

Estillia
Auteur

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 ^^ )

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
Auteur

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