Page 1 sur 1

Instructions conditionnelles

Posté : 05 mars 2011, 09:46
par serval92
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.

Re: Instructions conditionnelles

Posté : 05 mars 2011, 10:48
par Berzemus
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:

Re: Instructions conditionnelles

Posté : 05 mars 2011, 10:52
par xTG
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. ;)

Re: Instructions conditionnelles

Posté : 05 mars 2011, 11:20
par serval92
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.

Re: Instructions conditionnelles

Posté : 05 mars 2011, 11:48
par xTG
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.

Re: Instructions conditionnelles

Posté : 05 mars 2011, 12:32
par serval92
OK merci XTG, je vais essayer.

Re: Instructions conditionnelles

Posté : 06 mars 2011, 01:20
par serval92
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.

Re: Instructions conditionnelles

Posté : 06 mars 2011, 10:39
par xTG
<?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. :)

Re: Instructions conditionnelles

Posté : 06 mars 2011, 10:54
par serval92
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.

Re: Instructions conditionnelles

Posté : 11 mars 2011, 13:56
par serval92
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.

Re: Instructions conditionnelles

Posté : 11 mars 2011, 14:34
par xTG
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";

Re: Instructions conditionnelles

Posté : 11 mars 2011, 17:18
par serval92
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.

Re: Instructions conditionnelles

Posté : 11 mars 2011, 19:32
par xTG
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.