Onglet Actualité en php

bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012 - 30 août 2011 à 12:08
bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012 - 7 sept. 2011 à 16:39
Salut, j'aimerai faire un onglet "ACTUALITE" dans mon site en php, et on m'a dit qu'il y'avait une fonction ou un bout de code tout prêt pour m'afficher le "lire la suite", est ce vraI? parceque j'ai cherché je n'ai rien trouvé, je cherche aussi à savoir comment écrire sous le titre la 1ere phrase du paragraphe concerné, je suppose que pour ça aussi y'a une fonction qui affiche un certain nombre de caractères. Merci!

16 réponses

Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
30 août 2011 à 13:27
Bonjour,

Il n'existe pas de bout de code tout prêt en PHP pour afficher le texte "Lire la suite". Peut-être utilise tu un CMS ou autre framework PHP ?

Pour afficher une partie de texte tu peux regarder comment fonctionne la méthode substr.

<?php
echo substr('Bonjour', 0, 4).'[...]';  // Bonj[...]
?>


_________________________________
Min iPomme
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
30 août 2011 à 14:09
Salut,
Voici un tutoriel pour implémenter un lire la suite avec jquery

Enjoy
0
bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012
30 août 2011 à 14:10
Merci beaucoup :)
0
bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012
30 août 2011 à 14:16
je viens de voir le tutoriel que tu m'as passé, enfait moi j'ai créé une table dans une base de données, et à chaque fois l'administrateur peut remplir un formulaire qui comprend le titre et le contenu de larticle, et je veux qu'à partir de ça ça s'affiche, le problème avec le tuto, c'est qu'il faut écrire le texte en entier et le reste du texte invisible entre les balises , moi je ne pourrai pas le faire dans mon cas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
30 août 2011 à 14:57
Avec du texte dynamique, c'est effectivement plus problematique.
En tout cas pour faire un effet (avec un regex qui coupe la phrase à un tel nombre de lettre (mais avec les retour à la ligne "br", c pas une bonne solution, si la personne n'arrête pas de faire des retour à la ligne, avant de cacher le texte, tu peux avoir une bonne hauteur).
En fait, pour ajouter des effets javascript je n'ai pas trouvé de solution de bonne qualité (calculer avec le line-height et la taille de la div qui contient le texte, a chaque "br", rajouter le nombre de pixel d'un line-height, fin en gros c pourri ^^).

Par contre sans effet, tu peux donner une hauteur à la balise qui contient ton texte (genre div, c très bien), et faire un "overflow:hidden" (tout ça en css, bien sur) sur cette meme balise, alors une partie de texte sera invisible. Après au moment ou tu clickes sur "lire la suite" tu appelles via "onclick" une fonction javascript contenant ce code :
document.getElementbyId('idDeLaDivContenantLeTexte').style.overflow = 'visible';

ce qui affichera tout le contenu de la balise.

Par contre un problème persiste, lors d'un texte plus court que la hauteur que tu as fixée, il faut pouvoir cacher le texte "lire la suite".

Pour ce faire, lors du chargement de la page tu récupères la hauteur de la balise, puis tu la compares avec la hauteur que tu veux lui donner (oui à ce moment, il faut que tu fixes la hauteur via du javascript et plus via le css), s'il est plus petit en taille alors tu ne l'affiches pas.
Pt précision : avec cette dernière technique, tu te retrouves lors du chargement de la page à voir, un court instant, la hauteur initiale de la div contenant le texte puisque le javascript est chargé après l'html (en gros rien de grave, mais au moins j'ai tout dit lol)

Enjoy
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
30 août 2011 à 21:10
Salut,

"Lire la suite ..." peut aussi être chargé dans une nouvelle page ^^
Simple (un lien), et souvent avantageux : lorsqu'il y a la possibilité d'ajouter des commentaires, que les articles sont longs et nombreux ça devient rapidement le bord** de tout charger sur la même page, sans compter la bande passante utilisée pour rien, les référencements complexes, etc ... etc ...

Dans ce cas tu peux utiliser directement la fonction SQL SUBSTR() pour ne retirer qu'une partie de l'article, éventuellement traiter par PHP avec wordwrap() avant envoi au navigateur. Suffit juste d'ajouter un lien "lire la suite ..." qui guide vers l'article complet.

S'il faut un affichage sur la même page il est possible de procéder de la même façon, mais au lieu d'un simple lien on peut faire appelle à une fonction Ajax qui se chargera d'afficher la totalité de l'article. On ne charge alors que le nécessaire et c'est bien plus simple côté gestion JS :
la fonction se contente de remplacer le texte du conteneur et de masquer le "lire la suite"

En fait, pour ajouter des effets javascript je n'ai pas trouvé de solution de bonne qualité

Je doute effectivement qu'il y en est une, tout simplement parce que le script ne saura jamais si la portion de texte qu'il affiche à du sens, ou non. C'est bien là le principal, présenter suffisamment (mais pas trop) de texte pour que l'internaute en saisisse le contenu.
Partant de là je ne me prendrais pas trop la tête avec des calculs de line-height, taille conteneurs et autres.
Suffit "juste" de compter le nombre de ligne, éventuellement accompagné d'un nombre mini de caractères, couper à la suite d'un mot, ajouter " ..." et rien de plus.


Cordialement,



Kohntark -
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
30 août 2011 à 22:17
Salut Kohntark,
utiliser directement la fonction SQL SUBSTR() pour ne retirer qu'une partie de l'article
on peut faire appelle à une fonction Ajax qui se chargera d'afficher la totalité de l'article

Effectivement, ça me paraît très sensé si il y a bcp d'article sur une même page ^^

Suffit "juste" de compter le nombre de ligne

Dites moi, comment faites vous ça en sachant que le texte est écris (via un back-end) dans un textarea et que l'affichage (front-end) se fait en utilisant nl2br() pour respecter les sauts à la ligne fait par l'utilisateur ?
En comptant le nombre de "br" me direz vous, mais en imaginant qu'une phrase peut passer à la ligne pcq la largeur de conteneur du texte est dépassée, comment s'en rendre compte et donc compter une ligne de plus ?

éventuellement accompagné d'un nombre mini de caractères

Je vous avoue ne pas avoir bien saisi cette phrase, c'est pour les "..." ?

Merci

Cordialement
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
30 août 2011 à 23:39
C'est pas un problème facile... Surtout si tu veux que ton aperçu ait du sens.

La solution que je choisirais, c'est celle que pratique wordpress. Il suffit d'ajouter dans ton texte un marqueur (eux utilisent un commentaire html, mais ça peut être n'importe quoi).

Ton texte prendrait alors la forme suivante:
Auxerunt haec vulgi sordidioris audaciam, quod cum ingravesceret penuria commeatuum, famis et furoris inpulsu Eubuli cuiusdam inter suos clari domum ambitiosam ignibus subditis inflammavit rectoremque ut sibi iudicio imperiali addictum calcibus incessens et pugnis conculcans seminecem laniatu miserando discerpsit. post cuius lacrimosum interitum in unius exitio quisque imaginem periculi sui considerans documento recenti similia formidabat.
#MARQUEUR#
Incenderat autem audaces usque ad insaniam homines ad haec, quae nefariis egere conatibus, Luscus quidam curator urbis subito visus: eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.

Quid? qui se etiam nunc subsidiis patrimonii aut amicorum liberalitate sustentant, hos perire patiemur? An, si qui frui publico non potuit per hostem, hic tegitur ipsa lege censoria; quem is frui non sinit, qui est, etiamsi non appellatur, hostis, huic ferri auxilium non oportet? Retinete igitur in provincia diutius eum, qui de sociis cum hostibus, de civibus cum sociis faciat pactiones, qui hoc etiam se pluris esse quam collegam putet, quod ille vos tristia voltuque deceperit, ipse numquam se minus quam erat, nequam esse simularit. Piso autem alio quodam modo gloriatur se brevi tempore perfecisse, ne Gabinius unus omnium nequissimus existimaretur.


Où on utilise #MARQUEUR# comme marqueur de découpage.

Ensuite, tu peux faire un truc du genre (non testé)
function decoupeTexte($texte, $apercu=false){
    if($apercu && strpos($texte, '#MARQUEUR#')!==false){
        return substr($texte, strpos($texte, '#MARQUEUR#')).'[...]';
    }else{
        return str_replace($texte, ''. '#MARQUEUR#');
    }
}
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
31 août 2011 à 09:00
@JulSoft:
C'est clair, c'est la meilleure solution lorsqu'il s'agit de rédacteurs "avertis" (propriétaire du site par exemple), ce qui est le cas ici. Pour les commentaires d'utilisateurs lambda c'est une autre histoire.


En comptant le nombre de "br" me direz vous

Oui ^^

mais en imaginant qu'une phrase peut passer à la ligne pcq la largeur de conteneur du texte est dépassée, comment s'en rendre compte et donc compter une ligne de plus ?

Justement, pour moi le nombre de lignes n'est pas l'essentiel : qu'un début d'article soit sur 4 lignes, un autre sur 7, un autre sur 6 me parait d'ailleurs plus élégant qu'un conteneur de hauteur fixe avec des textes tronqués (coupure dans un mot par exemple)
Après, dans le cas que tu cites, je disais "accompagné d'un nombre mini de caractères" :
Dans la plupart des cas la largeur des conteneurs sera la même pour tous les articles, en comptant le nombre de caractères et le nombre de lignes on peut s'attendre à des hauteurs de conteneurs sensiblement identiques.
On peut également compter le nombre de mots et de paragraphes en appliquant des contraintes en nb de caractères, en réduisant le nombre de
successifs, etc ...

Par ailleurs, comme je le disais on peut utiliser wordwrap(). Suffit alors de compter le nombre de retourne à la ligne après l'application de cette fonction pour connaitre le nb de lignes "exactes".

c'est pour les "..." ?

Je parlais simplement des 3 petits points à la fin du texte pour indiquer qu'il y a une suite :

texte d'origine :
Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris

texte "lire la suite" :
Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor ...


Menfin, une fois de plus il y a plein de façons de faire qui sont très dépendantes du contenu, du design, ... selon le cas telle ou telle méthode donnée ici sera meilleure que les autres.

Cordialement,



Kohntark -
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 août 2011 à 10:47
Salut,

JulSoft, dans mon cas, c'est un utilisateur lambda. Mais il est vrai que j'aurai du poser la question à bmounaj
pour moi le nombre de lignes n'est pas l'essentiel : qu'un début d'article soit sur 4 lignes, un autre sur 7, un autre sur 6 me parait d'ailleurs plus élégant qu'un conteneur de hauteur fixe avec des textes tronqués (coupure dans un mot par exemple)

Comme tu le disais à la fin de ton commentaire, cela peut dépendre du design (par exemple). La structure de la page, dans mon cas, fixait la hauteur du texte. Je pense, au contraire de toi, qu'une hauteur fixe est plus "design" que des hauteurs variables. De plus, comme le texte est dynamique, il est impossible de mettre une partie de texte pour que "l'internaute en saisisse le contenu". Une partie de texte avec "..." pour terminer n'est pas génant, il lui suffit d'appuyer sur "lire la suite" pour avoir l'entièreté du texte.
Par contre, il est vrai que dans tout ça, une coupure dans un mot ne fait pas professionnel.
Alors que je pensais n'avoir aucune limite dans l'élaboration d'une idée, meme avec des contraintes complexes, j'avoue que ce problème, qui avait l'air au premier abord simple, m'a fait réflechir au limite (mes limites ? ^^) de conception.

Cordialement
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
31 août 2011 à 11:13
Perso, je pense aussi que la hauteur du texte ne compte que peu. En effet, ça sera certainement plus "pro" de n'afficher qu'une petite zone pour un commentaire de 3 mots type "c'est cool", alors qu'un commentaire plus élaboré aurait froit à plus de place.

Après une solution qui peut marcher (ou pas, j'ai pas essayé), c'est de compter les phrases en se disant qu'un point termine toujours une phrase. Du coup tu coupes par exemples après 3 '.'.
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 août 2011 à 13:05
je pense aussi que la hauteur du texte ne compte que peu

Je comprend votre point de vue, mais imaginons que mon texte est dans un encadré qui s'ajuste parfaitement avec un composant se trouvant à sa gauche (une liste de thumbnail visible de bas en haut).
Fin bon, de tout façon, j'ai considéré que ce n'était pas si grave.
En fait, c'est bien simple, j'ai dit à mon graphiste que vu le temps de conception, il était préférable de laisser l'encadré s'adapter au texte. Vu que, de tout façon, je ne pourrai pas précisement avoir la taille de l'encadré comme il le voulait (ou alors, avec le problème du "lire la suite" visible alors que le texte est pas assez long pour devoir l'afficher).
Il s'est avéré, par la suite, que cette zone de texte n'allait pas accueillir un roman mais un rapide descriptif d'une réalisation. Donc, tout est bien qui fini bien ^^

compter les phrases en se disant qu'un point termine toujours une phrase

A vue de nez, ça a l'air d'être une bonne idée ^^.

Je considère, à partir de mtn, que si je veux utiliser un "lire la suite" pour du texte dynamique, il faudra que je n'omete pas la variabilité de la hauteur de la zone de texte.

Merci a tous, je fais bien de vouloir aider, il y a tjs d'autres personnes avec de bonnes idées qui interpellent .

Cordialement
0
bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012
7 sept. 2011 à 01:14
Resalut,
Tout d'abord! un grand merci à tous les internautes qui ont participé à la conversation! Enfait, finalement j'ai procédé ainsi:
-le titre le l'actualité
-29 caracteres du contenu concaténés avec [...]
-"Lire la suite..." (qui est un lien) et quand on clique dessus, on se situe à la page qui contient tout le contenu de l'article.

Comme je l'ai déjà signalé plutôt, pour remplir la table d'actualité, j'ai utilisé un formulaire contenant les champs "titre", "corps",et "date", et c'est à l'administrateur de le remplir, une fois que c'est fait, ça s'enregistre dans la base de données.
Maintenant, le problème qu'il y'a, c'est que quand le contenu dépasse par exemple 2 petits paragraphes, ça ne s'insère pas dans la base de données, ou la mise en forme du texte ne s'enregistre pas dans la base comme elle est ( c'est à dire que y'a plus de retours à la ligne etc...).
Où est le problème si le texte est long? sachant que dans la base de données, le texte s'enregistre dans le champ "corps" qui est de type "LONGTEXT", et qu'en est -il pour les retours à la ligne? Merci
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
7 sept. 2011 à 10:45
Salut,

Pour les retour à la ligne, tu dois utiliser "nl2br($data['contenu'])" lors de l'affichage dans le site, ça mettra des
pour chaque retour à la ligne.
Pour le LONGTEXT, c pas normal... bien que je te conseillerais d'utiliser TEXT, c'est largement suffisant.
Le problème vient surement au niveau de l'insertion dans ta base.

Cordialement
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
7 sept. 2011 à 12:12
@bmounaj: Le texte ne s'insère pas dans ta bdd lorsqu'il dépasse un paragraphe... Il ne s'insert pas du tout ou c'est sa mise en page qui "disparait"? Si l'enregistrement ne se fait pas dans la bdd, mysql (je suppose) doit te générer une erreur...

En cas de problème d'insertion, tu peux débugger un peu grâce à die(mysql_error()) en fin de tes requêtes.

Perso je fais toujours comme ça (la méthode est un peu discutée, mais elle marche pas trop mal)
<?php
[...]

$results=mysql_query("INSERT INTO...", $db_connection) or die(mysql_error());

[...]
?>
0
bmounaj Messages postés 23 Date d'inscription mardi 2 août 2011 Statut Membre Dernière intervention 26 juin 2012
7 sept. 2011 à 16:39
@ JulSoft: Il ne s'insert pas du tout ou c'est sa mise en page qui "disparait"?
Enfait, si je fais l'insertion à partir du formulaire, je remplie "titre", "corps",je selectionne une "date" et je valide. si le corps ne contient pas bcp de caractères, ça s'insère dans la base de données! Si j'écris par exemple 4 mots avec des retours à la ligne à la fin de chaque mot, ça s'insère aussi dans la base de données, mais une fois qu'il s'agit d'un paragraphe, s'il est petit, genre 3 ou 4 phrases, ça s'insère dans la base mais les retours à la ligne sont supprimés, sinon si c'est un grand paragraphe rien ne s'insère!
j'utilise l'extension PDO et le serveur WAMP pour voir si la base se remplie ou pas.
et dans le fichier de connexion, je gère les exeptions, ce qui équivaut en mysql à ce que tu m'as proposé:
voici le bout de code de la connexion:
try {

$cn = new PDO($db, $dbUser, $dbPass);

}
catch (PDOException $dbex) {
die("Erreur de connexion : " . $dbex->getMessage() );
}
Merci.
0
Rejoignez-nous