Page 1 sur 2

Tronquer un texte dans un tableau

Posté : 28 sept. 2005, 16:16
par Elisa
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é?

Posté : 28 sept. 2005, 16:32
par ouckileou
tu peux mettre ton code dans une fonction, que tu vas utiliser sur chaque valeur de ton tableau

Posté : 28 sept. 2005, 16:34
par Elisa
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é.

Posté : 28 sept. 2005, 16:38
par ouckileou
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>

Posté : 28 sept. 2005, 16:44
par Cyrano
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.

Posté : 28 sept. 2005, 16:44
par Elisa
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...

Posté : 28 sept. 2005, 16:51
par ouckileou
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 ?

Posté : 28 sept. 2005, 17:06
par Tho
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);

Posté : 28 sept. 2005, 17:26
par ouckileou
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 ;)

Posté : 29 sept. 2005, 10:12
par Invité
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:

Posté : 29 sept. 2005, 10:39
par Cyrano
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.

Posté : 29 sept. 2005, 11:06
par Elisa
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?

Posté : 29 sept. 2005, 11:16
par Cyrano
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

Posté : 29 sept. 2005, 11:54
par Elisa
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.

Posté : 29 sept. 2005, 11:59
par Cyrano
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.