Instructions conditionnelles

Eléphanteau du PHP | 17 Messages

05 mars 2011, 09:46

Bonjour à tous.

Je travaille sur Joomla et j'utilise le composant Seblod (vous allez me dire : mais pourquoi vient-il nous ennuyer ici !?) mais je pense que, vu qu'il s'agit de PHP, des experts comme vous seront plus à même de me répondre.

J'ai créé un template personnalisé, dans lequel j'ai cette instruction :
<?php if ( @$jSeblod->select_cgct->value=="1" ) { ?> 
	<p>Vu l'article <?php for ( $i = 0, $n = count( @$jSeblod->articles_cgct_x ); $i < $n; $i++ ) {?>
	<?php echo @$jSeblod->articles_cgct_x[$i]->value; ?><?php } ?> du Code Général des Collectivités Territoriales,</p>			<?php } ?>
	
	<?php if ( @$jSeblod->select_cgct->value=="Plusieurs" ) { ?> 
	<p>Vu les articles <?php for ( $i = 0, $n = count( @$jSeblod->articles_cgct_x ); $i < $n; $i++ ) {?>
	<?php echo @$jSeblod->articles_cgct_x[$i]->value; ?>, <?php } ?> du Code Général des Collectivités Territoriales,</p>			<?php } ?>
Vous pouvez constater que je crée une ligne selon un choix de case à cocher, afin d'avoir une cohérence dans l'orthographe des phrases (vu l'article/vu les articles).
Voici ma question : Existe-t-il une instruction plus académique qui me permettrait, simplement selon le nombre de données entrées pour le champ "select_cgct", de pouvoir inscrire "l'article" ou "les articles", voire aucun texte ?

Je précise que j'y arrive avec des instructions simples, mais dans le cas des boucles, je patauge...
J'ai essayé en attribuant une valeur à $i dans une condition, sans succés.

Voilà, j'espère que vous parviendrez à résoudre ma difficulté.
Je vous remercie de votre attention.

Fabien.

ViPHP
ViPHP | 4039 Messages

05 mars 2011, 10:48

Plutôt que de répondre, j'ai mis mon énergie dans une mise en forme plus intelligible, le code d'origine étant particulièrement... indigeste :wink:
<?php 
if ( @$jSeblod->select_cgct->value=="1" ) 
   {
   $html = '<p>Vu l\'article';
   for ( $i = 0, $n = count($jSeblod->articles_cgct_x ); $i < $n; $i++ )
      {
      $html .= $jSeblod->articles_cgct_x[$i]->value;
      }
   $html .= 'du Code Général des Collectivités Territoriales,</p>';
   echo $html;
   }
       
if ($jSeblod->select_cgct->value=="Plusieurs" ) 
   {
   $html = '<p>Vu les articles';
   for ( $i = 0, $n = count($jSeblod->articles_cgct_x ); $i < $n; $i++ ) 
      {
      $html .= $jSeblod->articles_cgct_x[$i]->value;
      } 
   $html .= 'du Code Général des Collectivités Territoriales,</p>';
   echo $html;
   }
?>
Au moins comme ça, on voit bien de quoi ça traite, et les éléments de réponse sautent immédiatement aux yeux. Perso, je pense pouvoir le faire en 4 ou 5 lignes (sans mettre tout bout à bout) :twisted:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
xTG
ViPHP | 7331 Messages

05 mars 2011, 10:52

Centraliser l'affichage :
echo "<p>";
if( $jSeblod->select_cgct->value=="1" )
  echo "Vu l'article : ";
elseif( $jSeblod->select_cgct->value=="Plusieurs" )
  echo "Vu les articles : ";
else
  echo ""; // ni 1 ni plusieurs ? Est-ce possible dans ton cas ?
foreach( $jSeblod->articles_cgct_x as $i => $article ) 
  echo $article->value . "du Code Général des Collectivités Territoriales,";
echo "</p>";
J'ai aussi introduit une boucle foreach, c'est plus propre et cela fait moins d'accès à ton objet. ;)

Eléphanteau du PHP | 17 Messages

05 mars 2011, 11:20

Merci pour vos réponses rapides et compréhensives.
Le code est effectivement nettement plus propre !

Néanmoins, cela résout en partie seulement mon problème (et je pense que je me suis mal exprimé) :
Le champ "articles_cgct_x" est un champ à réitération (en Ajax je pense) à l'aide d'un bouton "plus".
L'idée serait qu'en fonction du nombre d'éléments que je rentre dans ce champ, j'affiche du texte html en conséquence. Cela me permettrait de ne plus avoir l'utilité du champ de cases à cocher précédent. Ai-je été clair :?

Je vous remercie.

Fabien.

ViPHP
xTG
ViPHP | 7331 Messages

05 mars 2011, 11:48

Tu peux remplacer $jSeblod->select_cgct->value=="1" par count($jSeblod->articles_cgct_x) == 1 dans ce cas je suppose.
Et changer le elseif en simple else (et donc supprimer mon dernier else).
Cela t'afficher "article" s'il n'y a qu'un seul article, et "articles" si l'objet en renvoie plusieurs normalement.

Eléphanteau du PHP | 17 Messages

05 mars 2011, 12:32

OK merci XTG, je vais essayer.

Eléphanteau du PHP | 17 Messages

06 mars 2011, 01:20

Bonsoir.

Avec le code proposé, j'ai la partie " du Code Général des Collectivités Territoriales" qui se répéte en cas de plusieurs articles.
De plus, même s'il n'y a pas d'article, cette partie s'affiche.

Je me suis donc permis quelques modifications :
<?php 
	if( count($jSeblod->articles_cgct_x) == 1 )
  echo "<p>Vu l'article ";
elseif( count($jSeblod->articles_cgct_x) > 1 )
  echo "<p>Vu les articles ";
foreach( $jSeblod->articles_cgct_x as $i => $article ) 
  echo $article->value . ", ";
echo " du Code Général des Collectivités Territoriales,</p>";
?>
Ce code me permet de ne pas répéter la partie " du Code Général des Collectivités Territoriales".
Il me reste un dernier obstacle : la condition s'il n'y a pas d'articles.
J'ai tenté d'ajouter une condition en fin de code, mais cela ne fonctionne pas (page blanche).

Merci de votre attention.

Fabien.

ViPHP
xTG
ViPHP | 7331 Messages

06 mars 2011, 10:39

<?php 
$nbArticles = count($jSeblod->articles_cgct_x);
if( $nbArticles == 1 )
  echo "<p>Vu l'article ";
elseif( $nbArticles > 1 )
  echo "<p>Vu les articles ";
if( $nbArticles > 0 )
{
  foreach( $jSeblod->articles_cgct_x as $i => $article ) 
    echo $article->value . ", ";
  echo " du Code Général des Collectivités Territoriales,</p>";
}
Ceci devrait faire l'affaire. :)

Eléphanteau du PHP | 17 Messages

06 mars 2011, 10:54

MERCI XTG !
Tout est fonctionnel. Je vais pouvoir, grâce à ton aide, me libérer de toutes ces cases à cocher pour les conditions.
Merci encore pour ton aide précieuse et ta disponibilité.

Fabien.

Eléphanteau du PHP | 17 Messages

11 mars 2011, 13:56

Bonjour à tous.

Je suis de nouveau confronté à un problème concernant les conditions : sur les tableaux à plusieurs dimensions.
Toujour sur Joomla, j'ai créé des champs de contenu externe, qui permet donc d'extraire certains champs d'un groupe. Ils se présentent sous cette forme :
<p>code html... le(s) nommé(s) 
	 <?php for ( $i = 0, $n = sizeof( @$jSeblod->champ_x ); $i <= $n-2; $i++ ) {?>
	 <?php echo @$jSeblod->champ_x[$i]['nom_mec']->value; ?> 
	 <?php echo @$jSeblod->champ_x[$i]['prenom_mec']->value; ?>, 
	 <?php } ?> code html</p>
Voici ma question : comment écrire les conditions pour que, selon le nombre de $i, je puisse écrire le code html en conséquence ?

Voici le code fourni par XTG qui fonctionne très bien sur les tableaux simples :
$nbArticles = count($jSeblod->articles_cgct_x);
if( $nbArticles == 1 )
  echo "<p>Vu l'article ";
elseif( $nbArticles > 1 )
  echo "<p>Vu les articles ";
if( $nbArticles > 0 )
{
  foreach( $jSeblod->articles_cgct_x as $i => $article ) 
    echo $article->value . ", ";
  echo " du Code Général des Collectivités Territoriales,</p>";
}
Merci de votre attention.

Fabien.

ViPHP
xTG
ViPHP | 7331 Messages

11 mars 2011, 14:34

C'est à dire ?
Car pour ce que je comprends ça reviendrait à cela :

Code : Tout sélectionner

if( une condition du $i ) echo "un affichage spécial"; else if ( une autre condition sur $i ) echo "un autre affichage spécial"; else echo "cas standard";

Eléphanteau du PHP | 17 Messages

11 mars 2011, 17:18

Bonjour XTG.

C'est effectivement la même requête précédente, mais avec des tableaux multi-dimensionnels. J'ai essayé en remplaçant les champs sur l'exemple que tu m'as donné, mais je suis confronté à un souci au niveau de l'affichage des deux champs <?php echo @$jSeblod->champ_x[$i]['nom_mec']->value; ?> et <?php echo @$jSeblod->champ_x[$i]['prenom_mec']->value; ?>.
Pour les conditions, c'est aussi pour l'orthographe, comme précédemment, du code html : au singulier s'il n'y en a qu'un, au pluriel si plusieurs, aucun affichage sinon.

Merci pour ton aide.

ViPHP
xTG
ViPHP | 7331 Messages

11 mars 2011, 19:32

Bah cela s'applique de la même manière en fait.
Tu te fiches des différentes informations, vois $jSeblod->champ_x[$i] comme une seule entité, et donc $jSeblod->champ_x comme une collection dont on cherche le nombre.