Tronquer un texte dans un tableau

Eléphant du PHP | 179 Messages

28 sept. 2005, 16:16

Bonjour à tous,

J'ai un tableau dynamique avec alternance de couleurs. Je voudrais que ce tableau n'affiche pas plus d'une cinquantaine de caractères dans chaque cellule.

Mon script actuel ressemble à ça:
<?php
$couleur1 = '#ffcc00';
$couleur2 = '#ffffe0';
?>

<!--Tableau-->
<table class="tableau">
<table rules="cols" border=1 max-width=1000 cellspacing=0 cellpadding=5>

<!--Titres du tableau-->
<tr bgcolor="<?php echo $couleur1; ?>">
<td><b>Id</b></td>
<td><b>Nom du groupe </b></td>
<td><b>Autre nom</b></td>
<td><b>Présentation </b></td>
<td><b>Informations complémentaires</b></td>
<td><b>MAJ</b></td>
</tr>

<?php
//Compteur et modulo//
$cptCouleur = 1;
while ($val=mysql_fetch_array($result))
{
$couleur = ($cptCouleur % 2 == 0)?$couleur1:$couleur2;
?>

<!--Affichage des lignes-->
<tr bgcolor="<?php echo $couleur; ?>">
<td> <?php print ($val["IdGroupe"]);?> </td>
<td> <a href="b_groupes_list2.php?IdGroupe=<?php print ($val["IdGroupe"]);?>"><?php print ($val["NomGroupe"]);?></a></td>
<td> <?php print ($val["AutreNomGroupe"]);?> </td>
<td> <?php print ($val["Presentation"]);?> </td>
<td> <?php print ($val["InfCompl"]);?> </td>
<td> <?php print ($val["MAJ"]);?> </td>
</tr>

<?php
$cptCouleur++;
}
mysql_close($lien);
?>

</table>
Le code que je veux intégrer doit ressembler à ça:
<?php 
$max_caracteres=50;
$texte= ???; // C'est ici qu'est mon problème !!
// Test si la longueur du texte dépasse la limite
if (strlen($texte)>$max_caracteres)
	{
// Sélection du maximum de caractères
$texte = substr($texte, 0, $max_caracteres);
// Récupération de la position du dernier espace (afin déviter de tronquer un mot)
$position_espace = strrpos($texte, " ");
$texte = substr($texte, 0, $position_espace);
// Ajout des "..."
$texte = $texte."...";
	}
?>
En fait, je voudrais que $texte corresponde à $val pour chaque champ appelé en print. Est-ce que je dois le faire en disant à chaque fois $texte correspond à tel champ ou bien y a-t-il une autre possibilité?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 sept. 2005, 16:32

tu peux mettre ton code dans une fonction, que tu vas utiliser sur chaque valeur de ton tableau

Eléphant du PHP | 179 Messages

28 sept. 2005, 16:34

Un petit tutorial ou un cours sur les fonctions ? Du type: comment apprendre à une handicapée du PHP ce qu'est une fonction? :P

P.S.: Ca y est j'ai soutenu... Ca s'est très bien passé.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 sept. 2005, 16:38

une fonction serrt à ne pas réécrire du code que tu utilises souvent

ex :
// définition de la fonction
fonction auCarre($nombre) { // $nombre => paramètre de la fonction
   $carre = $nombre * $nombre;
   return $carre; // renvoie une valeur
}

// utilisation
$valeur = auCarre(5);
echo $valeur;
affichera 25

l'appel à la fonction permet de ne pas réécrire le code à chaque fois, là c'ets court mais ça peut être bcp plus long, et si tu dois le modifier, tu ne le fais qu'une fois

la doc qui correspond :
http://fr.php.net/manual/fr/language.functions.php

Bravo pour ta soutenance =D>

Mammouth du PHP | 19672 Messages

28 sept. 2005, 16:44

Une fonction : Il s'agit d'une série d'instruction qui seront exécutées chaque fois qu'on fera appel à la fonction. La structure d'une fonction en PHP est la suivante:
<?php
/* On initialise avec le mot clé "function" et son nom suivi de parenthèses */
function mafonction()
{
    /* Ici viendront les instructions à exécuter */
}
?>
On utilisera une fonction afin de pouvoir utiliser souvent les mêmes instructions dans plusieurs endroits du code sans devoir ré-écrire à chaque fois toutes les instructions.

On peut envoyer des paramètres à une fonction, c'est à dire des données dont les valeurs pourront être traitées et éventuellement, la fonction retournera un résultat:
<?php
/* On initialise avec le mot clé "function" et son nom suivi de parenthèses */
function mafonction($param1)
{
    /* Ici viendront les instructions à exécuter */
    $resultat = $param1 * 2;
    /* La fonction retourne un résultat : */
    return $resultat;
}
?>
On peut donc modifier une valeur en faisant appel à la fonction :
<?php
/* On a une première valeur */
$ma_variable = 2;
/* On veut modifier cette valeur pour initialiser une autre variable: 
    on fait appel à la fonction en lui envoyant la première valeur en paramètre */
$ma_nouvelle_variable = mafonction($ma_variable);
/* Affichage du résultat obtenu */
echo("<p>Ma nouvelle valeur après traitement : ". $ma_nouvelle_variable ."</p>\n");
?>
Ceci va faire afficher :
Ma nouvelle valeur après traitement : 4
Voilà, c'est très sommaire bien entendu, je ne saurais trop te recommander d'acheter un bouquin, ce genre de sujet est toujours trité de façon beaucoup plus complète.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

28 sept. 2005, 16:44

Bon, je vais potasser ça tranquillement pour demain. En fait c'est un peu comme une inclusion (à part que ça se fait dans le même fichier alors que l'inclusion fait appel à un fichier extérieur)?

P.S.: J'aurai les résultats la semaine prochaine mais je suis confiante. On m'a essentiellement reproché une bibliographie formellement douteuse...
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 sept. 2005, 16:51

là c'est simple, tu as toutes les explications qu'il faut ;)

tu mets ton code qui sert à tronquer un texte dans une fonction, qui prend en paramètre la variable texte à traiter, et qui te renvoie une variable avec le texte tronqué (ou non s'il n'y avait pas besoin)

et tu appelles cette fonction avec chaque echo de tes cellules de tableau
et si un jour par exemple tu veux changer le nombre de caractères limite (de 50 à 40), tu n'auras à le faire qu'une seule fois, dans la fonction

c'est quoi une bibliographie douteuse ?

Tho
Eléphant du PHP | 58 Messages

28 sept. 2005, 17:06

Voilà ma version de la fonction en question. Mets-la dans un fichier contenant les fonctions utiles, par exemple util.php
function textemax($texte,$max){
	if(strlen($texte) > $max)
		return substr($texte,0,$max-3)."...";
	else 
		return $texte;
}
Pour l'utiliser :
require_once 'util.php'; // inclut le fichier
$montexte = "toto titi";
echo textemax($montexte,4);

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 sept. 2005, 17:26

ce message était-il réellement utile ?

deux personnes ont expliqué le principe, et je vois ceci :
Bon, je vais potasser ça tranquillement pour demain.
donc ça me semblait bon... elle pouvait développer ça elle-même et revenir poser des questions précises si besoin

je vais passer pour un désagréable, mais je trouve ça agaçant quand on essaye d'expliquer un principe, pour permettre aux gens de le mettre en oeuvre eux-mêmes et de le comprendre, et que quelqu'un passe après la bataille pour balancer du code tout cuit :roll:

je crois que le principe de ce forum est avant tout d'apprendre, et non pas de monter une société de service en code PHP ;)

Invité
Invité n'ayant pas de compte PHPfrance

29 sept. 2005, 10:12

Bonjour,

Grâce à vos aides et explications, j'ai défini ma fonction ainsi
<?php 
//Nbre max de caractere
$max_caracteres=50;

//Fonction à appliquer lors de l'affichage//
function tronc_texte($texte,$max_caracteres)
{
// Test si la longueur du texte dépasse la limite
	if (strlen($texte)>=$max_caracteres)
	{
		// Sélection du maximum de caractères
		$requete = substr($texte, 0, $max_caracteres);
		// Récupération de la position du dernier espace (afin déviter de tronquer un mot)
		$position_espace = strrpos($texte, " ");
		$troncature = substr($texte, 0, $position_espace)."...";
	}
	return $troncature;
}
?>
Et je l'applique à l'affichage ainsi:
<td> <?php $texte = $val["Presentation"];
			$texte = tronc_texte($texte, 0);
			echo nl2br ($texte);?> </td>
Lorsque je remplace le 0 de cette partie du code [$texte = tronc_texte($texte, 0);], rien ne change. Lorsque je le retire, en revanche, il m'affiche une erreur. Du coup je ne comprends pas bien à quoi ça sert.

Par ailleurs, la troncature se fait sur les deux-trois derniers mots du texte affiché au lieu de m'afficher une cinquantaine de caractères. Si vous avez une explication à ce nouveau mystère du PHP, je suis preneuse. :)
c'est quoi une bibliographie douteuse ?
Une bibliographie formellement douteuse est une bibligographie dont la présentation laisse fortement à désirer (lettres alphabétiques inversées, références bibliographiques incomplètes). :wink:

Mammouth du PHP | 19672 Messages

29 sept. 2005, 10:39

Tu obtiendras une erreur si tu retires le second paramètre parce que ta fonction en comporte deux obligatoires.

Mais tu peux en rendre un(ou les deux) factultatifs. Supposons que tu veuilles rendre le second facultatif : pour celà, il te suffit de définir une valeur par défaut qui sera prise en compte si rien n'est envoyé en second paramètre. Ça modifie ta fonction comme suit:
<?php
//Nbre max de caractere
$max_caracteres=50;

//Fonction à appliquer lors de l'affichage//
function tronc_texte($texte,$max_caracteres = 0)
{
// Test si la longueur du texte dépasse la limite
    if (strlen($texte)>=$max_caracteres)
    {
        // Sélection du maximum de caractères
        $requete = substr($texte, 0, $max_caracteres);
        // Récupération de la position du dernier espace (afin déviter de tronquer un mot)
        $position_espace = strrpos($texte, " ");
        $troncature = substr($texte, 0, $position_espace)."...";
    }
    return $troncature;
}
?>
Si le second paramètre n'est pas précisé dans l'appel de fonction, alors la valeur par défaut utilisée sera 0. Mais si tu envoies une autre valeur, alors cette valeur aura priorité sur la valeur par défaut.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

29 sept. 2005, 11:06

Si je comprends bien, lorsque j'écris
function tronc_texte($texte,$max_caracteres = 0) 
le 0 indique qu'il n'y a pas de caractères maximum par défaut?

Ce que j'ai du mal à comprendre, c'est que j'ai déjà prédéfini le nombre maximal de caractères (50): ce chiffre ne doit-il pas être le nombre maximal de caractères par défaut?

Par ailleurs, lorsque je modifiais le second paramètre obligatoire, ça ne changeait rien à l'affichage. Est-ce que c'est normal?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

29 sept. 2005, 11:16

Alors deux choses: j'ai mis dans l'exemple 0 par défaut, mais tu peux définir une autre valeur.

L'autre problème, si ça ne change rien quel que soit la valeur du second paramètre, c'est qu'il y a un problème dans la logique des instructions qui suivent. Reprenons ta fonction avec une modification : Si par défaut la valeur du second paramètre est à 0, il n'y aura pas de troncature, on va donc définir les instructions comme suit:
<?php
//Nbre max de caractere
$max_caracteres=50;

//Fonction à appliquer lors de l'affichage//
function tronc_texte($texte,$max_caracteres = 0)
{
    /* Définissons une valeur de longueur maxi */
    $longueur = $max_caracteres == 0 ? strlen($texte) : $max_caracteres;
    // Test si la longueur du texte dépasse la limite
    if (strlen($texte) >= $max_caracteres && $longueur != strlen($texte))
    {
        // Sélection du maximum de caractères
        $requete = substr($texte, 0, $longueur);
        // Récupération de la position du dernier espace (afin déviter de tronquer un mot)
        $position_espace = strrpos($texte, " ");
        $troncature = substr($texte, 0, $position_espace)."...";
    }
    return $troncature;
}
?>
Attention à un détail. La variable définie avant la fonction n'est pas prise en compte DANS la fonction. Pour qu'elle le soit, il faudrait qu'elle soit globale avec l'instruction global
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

29 sept. 2005, 11:54

Attention à un détail. La variable définie avant la fonction n'est pas prise en compte DANS la fonction. Pour qu'elle le soit, il faudrait qu'elle soit globale avec l'instruction global
C'est donc pour cela que [$max_caracteres=50;] n'était pas pris en compte?

Mais est-ce que je ne peux pas me contenter d'écrire:
function tronc_texte($texte,$max_caracteres = 50) 
Ainsi par défaut, j'aurai 50 caractères et seulement 50 caractères max., dans la totalité de mon tableau.

Lorsque je lis ceci:
 $longueur = $max_caracteres == 0 ? strlen($texte) : $max_caracteres; 
J'ai l'impression qu'il y a répétition: la longueur, c'est le nombre de caractères max., à savoir 0?


Nota: J'ai fait une erreur dans le script précédent: il faut remplacer $requete par $texte.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

29 sept. 2005, 11:59

Tu pourrais effectivement définir la paramètre par défaut à 50 directement dans la fonction. Mais ce que j,ai rajouté te permet de traiter encore plus rapidement en mettant un paramètre à 0 lors de l'appel de fonction pour qu'il n'y ait pas de troncature... auquel cas, il est vrai que tu n'auras pas besoin de la fonction du tout. Donc tu peux effectivement reprendre ta premiere version avec le second paramètre à 50 par défaut.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: