[Résolu] Tronquer titres article

dieddied Member
avril 2014 modifié dans Entraide et S.A.T
Bonjour à toutes et tous,
je souhaiterais tronquer mes titres sur mon blog en définissant un maximum de caractères et y mettre"..." a la fin pour exprimé que le titre a une suite.
Merci de votre aide.

Réponses

  • Cette fonction marche super bien et elle garde le formatage html
    [== PHP ==]
    /**
    * texte_resume
    * Coupe une chaine en gardant le formatage HTML
    *
    * @param string $texte Texte à couper
    * @param integer $nbreCar Longueur à garder en nbre de caractères
    * @return string
    */
    function texte_resume($texte, $nbreCar)
    {
            $LongueurTexteBrutSansHtml = strlen(strip_tags($texte));
    
            if($LongueurTexteBrutSansHtml < $nbreCar) return $texte;
    
            $MasqueHtmlSplit = '#</?([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?>#';
            $MasqueHtmlMatch = '#<(?:/([a-zA-Z1-6]+)|([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?)>#';
    
            $texte .= ' ';
    
            $BoutsTexte = preg_split($MasqueHtmlSplit, $texte, -1,  PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY);
    
            $NombreBouts = count($BoutsTexte);
    
            if( $NombreBouts == 1 )
            {
                    $longueur = strlen($texte);
    
                    return substr($texte, 0, strpos($texte, ' ', $longueur > $nbreCar ? $nbreCar : $longueur));
            }
    
            $longueur = 0;
    
            $indexDernierBout = $NombreBouts - 1;
    
            $position = $BoutsTexte[$indexDernierBout][1] + strlen($BoutsTexte[$indexDernierBout][0]) - 1;
    
            $indexBout = $indexDernierBout;
            $rechercheEspace = true;
    
            foreach( $BoutsTexte as $index => $bout )
            {
                    $longueur += strlen($bout[0]);
    
                    if( $longueur >= $nbreCar )
                    {
                            $position_fin_bout = $bout[1] + strlen($bout[0]) - 1;
    
                            $position = $position_fin_bout - ($longueur - $nbreCar);
    
                            if( ($positionEspace = strpos($bout[0], ' ', $position - $bout[1])) !== false  )
                            {
                                    $position = $bout[1] + $positionEspace;
                                    $rechercheEspace = false;
                            }
    
                            if( $index != $indexDernierBout )
                                    $indexBout = $index + 1;
                            break;
                    }
            }
    
            if( $rechercheEspace === true )
            {
                    for( $i=$indexBout; $i<=$indexDernierBout; $i++ )
                    {
                            $position = $BoutsTexte[$i][1];
                            if( ($positionEspace = strpos($BoutsTexte[$i][0], ' ')) !== false )
                            {
                                    $position += $positionEspace;
                                    break;
                            }
                    }
            }
    
            $texte = substr($texte, 0, $position);
    
            preg_match_all($MasqueHtmlMatch, $texte, $retour, PREG_OFFSET_CAPTURE);
    
            $BoutsTag = array();
    
            foreach( $retour[0] as $index => $tag )
            {
                    if( isset($retour[3][$index][0]) )
                    {
                            continue;
                    }
    
                    if( $retour[0][$index][0][1] != '/' )
                    {
                            array_unshift($BoutsTag, $retour[2][$index][0]);
                    }
    
                    else
                    {
                            array_shift($BoutsTag);
                    }
            }
    
            if( !empty($BoutsTag) )
            {
                    foreach( $BoutsTag as $tag )
                    {
                            $texte .= '</' . $tag . '>';
                    }
            }
    
            if ($LongueurTexteBrutSansHtml > $nbreCar)
            {
                    $texte .= ' [......]';
    
                    $texte =  str_replace('</p> [......]', '... </p>', $texte);
                    $texte =  str_replace('</ul> [......]', '... </ul>', $texte);
                    $texte =  str_replace('</div> [......]', '... </div>', $texte);
            }
    
            return $texte;
    }
    
    $txt = texte_resume($txt, 100);
    
    
    
    
  • dieddied Member
    mars 2014 modifié
    Salut merci à toi, mais dit moi ou dois-je positionner cette fonction et dans quel fichiers? faut-il que je paramètre quelque chose la dedans lol!
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    mars 2014 modifié
    @je-evrard,

    On peut gérer les débordements de texte en utilisant la propriété overflow dans les feuilles CSS sans toucher au code.
    Lire le tuto chez Alsa-Créations
    Ou sur Google chercher : "css text-overflow".

    Cela se fait en une ou deux lignes, une fois trouvée la bonne règle CSS.
  • Effectivement mais ça dépend de l'usage (surchage de la page...)
  • StéphaneStéphane Member, Former PluXml Project Manager
    PluXml possède 2 fonctions dans la lib plxUtils pour couper des chaines

    plxUtils::strCut

    et

    plxUtils::truncate

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • dieddied Member
    Bonjour et merci à tous pour vos réponses,
    mais j'ai beau essayer plusieurs moyen css, php et html apparemment je n'y arrive pas ou je pencherais plus vers une mauvaise manipulation du code de ma part.
    Si vous pouviez m'aider un peut plus a réalisé ceci ce serais bien aimable, cela fait tellement de temps que j'ai toucher a des codes avec les travaux de la maison j'en ai perdu la main arf encore merci a tous.
  • StéphaneStéphane Member, Former PluXml Project Manager
    @died: Bonjour

    Edite le fichier header.php de ton thème

    En dessous de la ligne
    <?php if (!defined('PLX_ROOT')) exit; ?>
    

    Ajoute
    <?php
    function artTitle($type='', $length=25, $type='', $end='...') {
    	$plxMotor = plxMotor::getInstance();
    	$title = plxUtils::strCut($plxMotor->plxRecord_arts->f('title'), $length, $type, $end);
    	$title = plxUtils::strCheck($title);
    	if($type == 'link') { # Type lien
    		$id = intval($plxMotor->plxRecord_arts->f('numero'));
    		$url = $plxMotor->plxRecord_arts->f('url');
    		echo '<a href="'.$plxMotor->urlRewrite('?article'.$id.'/'.$url).'" title="'.$title.'">'.$title.'</a>';
    	} else { # Type normal
    		echo plxUtils::strCheck($title);
    	}
    }
    ?>
    

    Dans le fichier home.php, remplace
    <?php $plxShow->artTitle('link'); ?>
    

    par
    <?php artTitle('link'); ?>
    

    La nouvelle fonction artTitle ajoutée dans le fichier header.php, accepte 4 paramètres:
    - paramètre 1: type d'affichage lien ou texte (si la valeur du paramètre = 'link' le titre est sous forme de lien)
    - paramètre 2: longueur du titre à couper en nombre de caractères ou nombre de mots (par défaut 25)
    - paramètre 3: texte ajouté apres la césure (par défaut le texte ajouté est ...)
    - paramètre 4: spécifie si la césure se fait en nombre de mots (par défaut la césure est en nombre de caractère. spécifier la valeur 'word' dans le paramètre pour compter en nombre de mots).

    La modification dans le fichier home.php est à reporter dans les autres fichiers du thèmes qui affichent le titre de l'article (ex fichiers article.php, tags.php, archives.php)

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • dieddied Member
    Bonjour,
    un grand merci Stéphane cela fonctionne a merveille, bonne journée à tous.
Connectez-vous ou Inscrivez-vous pour répondre.