tronquer un texte

Eléphant du PHP | 440 Messages

10 janv. 2010, 16:45

Bonjour,

le code ci-dessous m'affiche 1 article et des flêches de navigation. Voir pour être clair la page http://www.sud-network.com/index2.php#articles

Je souhaiterais afficher les 3 premières lignes par exemple de l'article suivi d'un lien vers l'article complet. Ca je ne sais pas faire !
J'ai essayé d'intégrer une fonction string récupérée sur une autre page mais je n'ai pas su la faire fonctionner :oops:

Merci de m'aider.
                        <?php
//=========================================
// includes du fichier fonctions
//=========================================
require 'fonctions.php';

$nombre = 4;  // on va afficher 4 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois 
               // on met limite à 0.
    
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];

// requête SQL qui compte le nombre total d'enregistrements dans la table et qui
//récupère tous les enregistrements
$select = 'SELECT count(id) FROM articles';
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0]; 
//=========================================
// vérifier la validité de notre variable 
// $limite;
//=========================================
$verifLimite= verifLimite($limite,$total,$nombre);
// si la limite passée n'est pas valide on la remet à zéro
if(!$verifLimite)  {
    $limite = 0;
}
//=========================================
// requête SQL qui ne prend que le nombre 
// d'enregistrement necessaire à l'affichage.
//=========================================
$select = 'select * FROM articles ORDER BY id DESC limit '.$limite.','.$nombre;
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$nbCols = 2; // nombre de colonnes du tableau  
$cpt = 0;
$rs = mysql_query($select); 
$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
// si on a récupéré un résultat on l'affiche.
    // début du tableau
    echo '<table>';
		echo '<tr>';
		echo '</tr>';
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
	while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats  

    // début d'une ligne  
    if ($cpt%$nbCols==0)
        echo '<tr>';
// Je prépare ma cellule 
$cellule = '<td valign="top" align="left" width="600">'; 
$cellule .= '<strong>'.$row['nom'].'</strong><br/>'; 
$cellule .= $row['texte']; 

// et je l'affiche 
echo $cellule;
		if ($cpt%$nbCols==($nbCols-1))
        echo '</tr>';
		$cpt++; // on incrémente le compteur pour savoir où on en est 
}  

// Au cas où ... 
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ... 
    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille... 
    echo '</tr>'; // ... et on ferme la ligne 
} 
    echo '</table>';
    // fin du tableau.

// on libère le résultat
mysql_free_result($result);
//récupération de $limite
    if(isset($_GET['limite'])) 
        $limite=$_GET['limite'];    else   $limite=0;

function verifLimite($limite,$total,$nombre) {
    // je verifie si limite est un nombre.
    if(is_numeric($limite)) {
        
// si $limite est entre 0 et $total, $limite est ok
        // sinon $limite n'est pas valide.
        if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) {
            // j'assigne 1 à $valide si $limite est entre 0 et $max
            $valide = 1;
        }    
        else {
            // sinon j'assigne 0 à $valide
            $valide = 0;
        }
    }
    else {
            // si $limite n'est pas numérique j'assigne 0 à $valide
            $valide = 0;
    }
// je renvois $valide
return $valide;
}

if($limite != 0) {
    echo '<a href="'.$page.'?limite='.$limiteprecedente.'#articles"><span class="actif"><img src="images/fleche_gauche.gif" border="0"></span></a>';
}
if($limitesuivante < $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'#articles"><span class="actif"><img src="images/fleche_droite.gif" border="0"></span></a>';
}

?>

Débutant complet en php/mysql. Merci pour votre aide.

ViPHP
ViPHP | 1996 Messages

10 janv. 2010, 20:10

Tronquer avec substr() (je pense que tu connais) mais pour l'histoire des 3 lignes, il faudrait ton mode de sortie.
Est ce que tu saute des lignes avec <br ou avec des <p ou est ce que c'est juste le browzer internet qui les saute pour toi ?

Le plus simple à mon avis serait de couper ton texte en plusieurs morceau fixe et d'y ajouter un <br à la fin.
Tu peux aussi tricher avec les CSS pour n'afficher que 3 lignes à l'écran quelques soit la largeur du texte et mettre ton lien en bout de texte avec un type float:right par exemple.

Note j'ai pas mis les balises fermantes ">" car elle sont interprétées.
Modifié en dernier par Aureusms le 10 janv. 2010, 20:13, modifié 2 fois.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 janv. 2010, 20:11

Tu ne pourras pas afficher les 3 premières lignes de ton article (ou alors au prix d'un effort qui n'en vaut certainement pas le résultat), dans la mesure ou la taille des lignes va dépendre de l'affichage de l'utilisateur, de la longueur des mots, de la police utilisé, de la taille des caractères... bref, tu vas t'arracher les cheveux ;)

Le plus simple, serait d'avoir une information dans ton texte qui te permet d'identifier la partie du texte que tu veux afficher. Ca peut être le premier paragraphe, une portion de texte délimitée par des balises html, ...

S'il n'y a rien dans ton texte qui permette d'identifier la partie du texte à afficher, tu peux opter pour une limite à 300 ou 400 caractères (que tu peux facilement obtenir avec un substr()). Quand tu as ces 300 premiers caractères, tu vas chercher avec strrpos() le dernier point, point d'exclamation, point d'interrogation (ou tout autre caractère qui te permettra de finir la chaine proprement). Tu peux alors retronquer la chaine proprement et afficher ton intro :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

10 janv. 2010, 23:38

Limiter à un nombre de caractères me conviendrait. Le code serait quelque chose comme ça ?
.substr("texte",0,400).
Par contre, comment l'intégrer dans mon code ?
à ce niveau, je suppose
$cellule .= $row['texte']; 
comment lier les 2 morceaux ?
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 451 Messages

11 janv. 2010, 00:27

Il te suffit de faire:
$cellule .= substr($row['texte'], 0, 400);

ViPHP
AB
ViPHP | 5818 Messages

11 janv. 2010, 05:21

Limiter à un nombre de caractères me conviendrait...
Oui mais en faisant juste comme ça tu risque de couper un mot ce qui n'est pas bien joli.
A ta place je suivrais les conseils de Ryle pour la suite.
Ou alors plus trivialement je rechercherais le dernier espace, ce qui est moins perfectionné mais plus simple à coder et quand même plus propre que de couper un mot.
$texte = substr($texte,0,400);
$texte = substr($texte, 0, strrpos($texte, ' ')).' ...';

ViPHP
ViPHP | 1996 Messages

11 janv. 2010, 13:33

Comme ton cas m'intéresse pour un de mes sites, j'ai concocté une petite classounnette normande. Dis moi si cela t'intéresse :

Pour appeller la class :
$texte_lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum laoreet scelerisque convallis. Nulla enim felis, rhoncus pharetra sollicitudin venenatis, facilisis eu erat. Donec volutpat erat vel erat pharetra sed eleifend est tincidunt. Maecenas vestibulum, elit vitae congue rhoncus, dui nunc gravida elit, sit amet porttitor dolor leo a quam. Duis augue odio, aliquam non tempor nec, semper at urna. Ut eget aliquet elit. Donec id fermentum nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra facilisis risus, vitae sagittis lectus mollis at. Nam vestibulum imperdiet nibh et sodales. Mauris urna lorem, gravida sit amet elementum sit amet, hendrerit vitae felis. Donec ipsum nunc, laoreet interdum hendrerit a, iaculis et eros. In egestas ipsum vitae nisi lobortis tincidunt. Praesent non nunc sit amet nulla lobortis ultricies id nec massa. Maecenas tincidunt massa eu magna tempus consectetur. Nunc eget turpis et odio interdum sagittis eget in augue. Vivamus a eros in est luctus viverra et non nisi. Sed posuere mi vulputate erat pellentesque ultricies.";
$texte = new affiche_ligne_tronquee;
$texte->texte = $texte_lorem;
$texte->nombre_caractere = 100;
$tab_retour = $texte->retourne_ligne_tronquee();
foreach ($tab_retour as $cle => $valeur)
{
	echo strlen($valeur).' '.$valeur.'<br />';
}
El la class :
<?php
class affiche_ligne_tronquee
{
	var $texte = "";
	var $nombre_caractere = 400;
	var $nombre_ligne = 3;
	
	function retourne_ligne_tronquee ()
	{
		if (strlen($this->texte) <= $this->nombre_caractere)
		{
			$tab_sortie[0] = $this->texte;
			return $tab_sortie;
		}
		else
		{
			if (is_numeric($this->nombre_caractere))
				$this->nombre_caractere = intval($this->nombre_caractere);
			else
				$this->nombre_caractere = 400;
			if (is_numeric($this->nombre_ligne))		
				$this->nombre_ligne = intval($this->nombre_ligne);
			else
				$this->nombre_ligne = 3;				
			$caractere_maximum = intval($this->nombre_caractere * ($this->nombre_ligne+1));
			
			if (strlen($this->texte) > $caractere_maximum)
				$this->texte = substr($this->texte,0,$caractere_maximum);
			
			$tab_texte_temp = explode (" ",$this->texte);
			$tab_sortie= array();
			foreach ($tab_texte_temp as $cle => $valeur)
			{
				if (!empty($valeur))
					$tab_texte[$cle] = trim($valeur);
			}
			$nombre_de_ligne = $this->nombre_ligne;
			$i=0;
			$tab_texte_temp = $tab_texte;
			while ($nombre_de_ligne > 0)
			{
				$tab_comptage_mot = $this->retourne_longueur_mot_dans_tableau($tab_texte_temp);
				if (array_sum($tab_comptage_mot) > $this->nombre_caractere)
				{					
					array_pop ($tab_texte_temp);				
				}
				else
				{
					$numero_clef = count($tab_comptage_mot)-1;
					$tab_temp = array_slice ($tab_texte,0,$numero_clef);
					$texte_retour = implode (" ",$tab_temp);
					array_push($tab_sortie,$texte_retour);
					$tab_texte = array_slice ($tab_texte,$numero_clef);
					$nombre_de_ligne--;
					$tab_texte_temp = $tab_texte;
				}
			}
			return $tab_sortie;
		}
		
	}
	
	function retourne_longueur_mot_dans_tableau ($tableau = 'NULL')
	{
		if (empty($tableau))
			return FALSE;
			
		foreach ($tableau as $cle => $valeur)
		{
			$tab_sortie[$cle] = strlen($valeur);
		}
		return $tab_sortie;
	}
	
	
}
?>
Note : je l'ai mis dans contributions sans savoir si quelqu'un l'avait faites avant moi.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 440 Messages

11 janv. 2010, 16:28

j'ai essayé ça :
$cellule .= substr($row['texte'], 0, 400).'...'; 
ça marche, même si effectivement ça coupe les mots !

Je voudrais mettre un lien. Ce code ne va pas :
echo '<a href="fiche-article.php?id=".$_GET['id']."'.'lire la suite'.'</a>';
Débutant complet en php/mysql. Merci pour votre aide.

ViPHP
ViPHP | 1996 Messages

11 janv. 2010, 17:25

Ferme ta balises :
echo '<a href="fiche-article.php?id='.$_GET['id'].'">lire la suite</a>';
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 440 Messages

11 janv. 2010, 19:22

echo '<div align="right"><a href="fiche-article.php?id='.$_GET['id'].'">lire la suite</a></div>';
La valeur id n'est pas récupérée. Il manque sûrement quelque chose avant. Mais quoi ?

Question subsidiaire : les colonnes sont très serrées, comment arranger cela ? J'ai essayé de placer dans <table> un cellpading mais ça n'a rien changé.
page actuelle : www.sud-network.com/index2.php
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 janv. 2010, 21:09

C'est peut-être parce que l'id à afficher dans le lien devrait être l'id respectif de chacun des articles et non pas une valeur récupérée en get sur une page qui s'ouvre sans qu'on lui passe de paramètre ? ;)

Quelque chose comme ça serait sans doute plus approprié (si le champ de ta bale s'appelle bien "id" évidemment :))
echo '<div align="right"><a href="fiche-article.php?id='.$row['id'].'">lire la suite</a></div>';
@Aureusms : elle est plus normande que -sounette ta classe non ? ;)

Personnellement je me contente d'une petite fonction :
function truncate($string, $size) {
	if (strlen($string) <= $size) // pas de modif
		return $string;

	$string = substr($string, 0, $size); // coupe la chaine à la taille max désirée

	// recherche le dernier espace (s'il y en a un)
	$lastSpace = (strrpos($string, ' ')) ? strrpos($string, ' ') : strlen($string); 

	// retourne la chaine coupée proprement (au dernier espace), suivi des points de suspension
	return substr($string, 0, $lastSpace) . '...';
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

11 janv. 2010, 22:45

echo '<div align="right"><a href="fiche-article.php?id='.$row['id'].'">lire la suite</a></div>';
Effectivement, ce code m'affiche bien l'id correspondant à l'article. Pourtant les liens renvoient tous vers le même article !
voir la page www.sud-network.com/index2.php
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 janv. 2010, 23:05

Ton code est bon et les ids des liens sont corrects. Ce qui ne l'est pas en revanche c'est ton script "fiche-article.php" qui affiche toujours le même article quel que soit l'id spécifié dans l'url (voire même si aucun id n'est spécifié dans l'url ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 440 Messages

12 janv. 2010, 09:53

Ton code est bon et les ids des liens sont corrects. Ce qui ne l'est pas en revanche c'est ton script "fiche-article.php" qui affiche toujours le même article quel que soit l'id spécifié dans l'url (voire même si aucun id n'est spécifié dans l'url ;))
l'url est correcte. Que veux-tu dire par "ton script" ?
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 janv. 2010, 16:52

Ben dans ta page "fiche-article.php" qui va normalement ouvrir l'article demandé par l'utilisateur (et dont l'identifiant devrait être passé dans l'url), il doit y avoir un problème. En effet, au lieu de récupérer l'id passé dans l'url et d'afficher l'article correspondant, il affiche encore et toujours le même article.

Donc soit cet article est écrit en dur dans ta page, et du coup, ben c'est normal qu'il apparaisse à chaque fois... soit ton script interroge la base pour afficher un article, mais ne passe dans la requête sql l'identifiant de l'article à afficher, ou passe toujours le même identifiant (ou un autre problème du genre), et du coup la base renvoi toujours le même article :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...