Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

news : afficher le titre de la news comme titre de la page et + encore
#1

Origine : http://forum.cmsmadesimple.org/index.php...75.15.html

Vous désirez que, lorsqu'une news a été cliquée, la page de détail reçoive comme titre celui de la news. Et que cela se répercute sur le breadcrumbs et la balise <h1> (ou h2).

Allons-y :

1° Contenu => Articles => Gabarit du détail article

Placez ce qui suit au tout début du gabarit (par défaut 'Sample'):
Code :
{assign var='pagetitle'  value=$entry->title}
Cela insère le titre de la news dans la variable $pagetitle que nous utiliserons dans le gabarit de la page.

2° Disposition => Gabarits

Ouvrez votre gabarit principal, déplacez {process_pagedata}, ajoutez {capture assign='captured_content'}{content}{/capture} et modifiez la ligne contenant <title> comme suit :
Code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{process_pagedata}
{capture assign='captured_content'}{content}{/capture}
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr_FR">
<head>
<title>{if isset($pagetitle)}{$pagetitle} - {sitename}{else}{title} - {sitename}{/if}</title>
{* sitename est modifié dans Site Admin/Global settings. {title} est le nom de chaque page *}
{* {$page_name!='news'} 'news' est l'alias, le nom ou l'ID de la page assignée à recevoir le détail des news, modifiez selon vos besoins *}
{if isset($canonical) AND $page_name!='news'}<link rel="canonical" href="{$canonical}" />{elseif isset($content_obj) AND $page_name!='news'}<link rel="canonical" href="{$content_obj->GetURL()}" />{/if}
{/if}
{metadata}
{cms_stylesheet}
    </head>
Ici, nous créons une condition : si la variable $pagetitle existe, affiche les variables sitename et pagetitle, sinon affiche sitename et title.
Pour que nous puissions agir sur le content (qui va être remplacé par le détail de la news), nous devons tout d'abord assigner la variable captured_content à content. C'est réalisé avec {capture assign='captured_content'}{content}{/capture}.

3° Le breadcrumds :

Trouvez la balise breadcrumbs et modifiez-la ainsi :
Code :
{* Start Breadcrumbs *}
   <div class="breadcrumbs">
  {if isset($pagetitle)}{breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'} -> {$pagetitle}
{else}
   {breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'}
{/if}
4° Le titre du contenu et le contenu:
Code :
{* Start Content Area *}
      <div id="main">
         <h2>{if isset($pagetitle)}{$pagetitle}{else}{title}{/if}</h2>
        {$capturedcontent}<br />
5° Utilisez le paramètre detailpage=news dans l'appel au module dans le gabarit . Ex, si la news est dans la sidebar :
Code :
{* Start Sidebar *}
      <div id="sidebar" class="hascontent">
        {news lang="fr_FR" detailpage="news"} {content block='Sidebar'}
      </div>
      {* End Sidebar *}
6° Créer une page "news" (modifier le nom comme vous le souhaitez mais n'oubliez pas de modifier en conséquence les points 2, 4 et 5)

Placez dans le contenu de la page :
Code :
{news category="General" detailpage="news"}
Adaptez les paramètres selon vos besoins.

EDIT : ajout de canonical au point 2 (pas de canonical dans la page de détail des news)
EDIT 09-08-2010 : modification pour la version cmsms 1.8+ (merci à nicolas-web2)

Have fun Smile
Répondre
#2

Ohé Jean le Chauve.


Je viens de regarder ton site de démo à propos de ce post sur les le module "News"
Pour le titre c'est quelque chose que j'avais déjà tenté sans succès .
Je vais étudier cela dés que possible.

Encore merci pour tes nombreuses interventions.

A plus

-.
Répondre
#3

Pour compléter ce brillant tuto.

Trouvé sur http://wiki.cmsmadesimple.org/index.php/...y_Per_Page
Facile à mettre en place et tellement utile.

Un bloc de news pour chaque page
Dans votre template, ou ailleurs changer le détailpage comme suit.
Code :
<!-- Start News -->
    <div id="news">
      <h2>News</h2>
      {news limit=3 detailpage='news' category = $page_alias}
    </div>
  <!-- End News -->
-----------------------------------------------------------------------------------------
Pour chaque page de votre template auquelle vous aurez préalablement donnée un nom d'alias dans (option de la page) vous pouvez maintenant créer une catégorie dont le nom est l'alias de la page en question.
EX: page: Home alias de la page _Home catégorie:_Home.
Tous les articles que vous attriburez à cette catégorie seront affichés dans la page Home.
-------------------------------------
Atention vous devez le faire pour toutes les pages du template sinon le bloc n'aparaîtra pas sur les autres pages.
Vous pouvez aussi regarder sur la même page de doc
Hide Empty News Block
----------------------------------------------------------------------------
Démo ici http://isa46.byethost16.com/
sur les trois pages template, page and navigation,content dans la rubrique How cmsms works du menu.
--------------------------------------
Bons test.

-.
Répondre
#4

c'est sympas Smile

Quelqu'un à déja poussé ce type de pratique SEO jusqu'à coller le résumé d'un article en meta description ?
Répondre
#5

Ajouter dans le gabarit de détail de la news :
Code :
{assign var='description' value=$entry->extra}
Dans l'article lui-même : entrer la description dans le champs "extra". Veiller à ne pas dépasser 300 caractères (edit:le champs n'autorise que 250 caractères) et échapper les doubles-quotes (" => \"). N'utilisez pas, bien entendu, de balise html dans cette description Wink.
Dans le gabarit de la page ajouter juste avant {metadata}:
Code :
{if !empty($description)}<meta name="Description" content="{$description|strip_tags:false}" />{/if}
Répondre
#6

hummm voila donc une bonne explication de l'utilisation du champ extra Smile.

c'est extra Smile

humm dans mes réflexions bouillonnante j'étais plus dans la conception d'un Tag SEO, pour les meta keywords et description, basé sur le résumé de l'article et sur une analyse de densité et poid des occurrences mots clés dans le dit résumé avec exclusion des occurrences sans valeur.

Mais ça peut déjà dépanner en attendant de bosser dessus : thx
Répondre
#7

Bonjour!

J'ai essayé cela mais au moment que je modifie la balise meta j'ai comme réponse:

string(114) "Smarty error: [in template:21 line 12]: syntax error: mismatched tag {/if}. (Smarty_Compiler.class.php, line 2300)"
Parse error: syntax error, unexpected T_ENDIF in /home/cesargel/public_html/cmsmds/tmp/templates_c/%%09^098^09882797%%template%3A21.php on line 22

En amont j'ai modifié le ficher config, et j'ai mis en true:

$config['process_whole_template'] = true;

$config['use_smarty_php_tags'] = true;

$config['auto_alias_content'] = true;

quel est le probleme?

Merci!
Répondre
#8

@Cesariongelvez

ce que te dit smarty c'est que tu as une borne {/if}, mais pas de borne {if} correspondante. recherche donc dans les gabarit que tu as pu modifier si tu
-> aurais pas oublié un {if}
-> mis deux fois un {/if}
-> oublié une accolade, une apostrophe, ... qui fout le gabarit en l'air.
Répondre
#9

bess a écrit :@Cesariongelvez

ce que te dit smarty c'est que tu as une borne {/if}, mais pas de borne {if} correspondante. recherche donc dans les gabarit que tu as pu modifier si tu
-> aurais pas oublié un {if}
-> mis deux fois un {/if}
-> oublié une accolade, une apostrophe, ... qui fout le gabarit en l'air.
Effectivement, dans le code il y a deux {/if}

Merci!
Répondre
#10

Merci à Jean le Chauve pour ce tutoriel très sympa et ô combien utile Wink

Afficher le titre de la news dans le <title>, le fil d'Ariane, et en titre principal de contenu, c'est limite indispensable Smile

Au niveau du fil d'Ariane, cette méthode est (selon moi) un plus pour l'utilisateur final, qui saura exactement où il est lorsqu'il consulte les news (qui ne sont pas affichées dans le menu principal, chez moi. C'est un contenu "annexe") ! Par exemple :
Citation :Accueil › Toutes les news – Ma super news
(j'ai préféré mettre un tiret moyen à la place d'une flèche)

Bref, je l'ai appliqué sur un de mes sites en devéloppement (un site à vocation éditorial, j'y reviendrai plus tard dans le topic relatif à nos réalisations sous CMSMS)… Et franchement, "ça tue tout" !
Répondre
#11

Content que cela te soit utile Smile
Répondre
#12

De rien Wink
J'ai même poussé ce concept un peu plus loin.

On va dire que je suis un peu un "maniaque" de la hiérarchie des pages et du souci de la facilité d'utilisation, j'ai donc 2 pages différentes (affichées dans la liste, dans la section "Pages" de l'administration) pour les actus :
- une page de listing ("Toute l'actualité"), alias "news-list"
- une page spécifique dédiée à l'affichage du détail des news, alias "news-detail"

Seule la page de listing a l'option "afficher dans le menu", ma navigation est de toute manière configurée pour exclure les pages préfixées de "news" (comme ça, on se retrouve pas avec les pages "conteneur" d'articles, ni dans le menu principal, ni dans le plan du site).

L'objectif à atteindre était d'avoir quelque chose comme ça dans le fil d'Ariane :
› [url=]Toute l'actualité › Titre d'article

Donc sans le nom de la page servant à afficher le détail d'un article.

L'extension du principe exposé par Jean repose sur 1 idée simple : ajouter un peu de balisage dans le breadcrumb modifié, et ajouter 1 règle CSS.

1. Modification du breadcrumb : (dans votre/vos gabarit(s))
Code :
<div class="breadcrumbs{if isset($pagetitle)} newsDetail{/if}">
{breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'}{if isset($pagetitle)}<span class="newsPointer"> -> </span>{$pagetitle}{/if}
</div>
On ajoute donc une condition sur la classe du breadcrumb (normalement j'utilise id="Breadcrumbs", j'ai ici transposé à l'exposé de Jean) : si "$pagetitle" est défini, on rajoute newsDetail (ou ce que vous voulez, indiquant qu'on est en détail de news) à la classe du breadcrumb.
On ajoute aussi du balisage autour de la "flèche" pointant le titre d'article. Ici, un <span> avec une classe "newsPointer"

2. Règles CSS additionnelles :
Code :
.breadcrumbs.newsDetail .lastitem, .breadcrumbs.newsDetail .newsPointer {
    position:absolute;
    top:-9999em;
    left:-9999em;
    visibility:hidden;
    display:none;
}
C'est le cœur de l'astuce ! Le breadcrumbs généré ajoute, sur le dernier titre de page affiché, le balisage <span class="lastitem"> ; autant s'en servir pour arriver à nos fins.
Dans le cas présent, on veut masquer le vrai nom de la page dédiée au détail des news ("article détaillé", "détail de news", en fonction de votre nommage des pages), ainsi que le "pointeur" de news (la flèche, tiret, etc…). On positionne donc ces éléments hors de l'écran, et pour être sûr (lecteurs vocaux, etc…), on les masque avec les 2 méthodes possibles.

On se retrouve donc bien, au final, avec (par exemple) :
› [url=]Toute l'actualité › Titre d'article

Voilà Wink C'est pas plus compliqué que ça. Par contre, faites gaffe avec les classes multiples (.classA.classB), car Internet Explorer 6 a un "bug" faisant qu'il ne prend en compte que la dernière classe de la chaîne.

En espérant que ça serve à d'autres Smile
Répondre
#13

Ça me semble très intéressant, je testerai dès que j'ai un peu de temps.
Tu pourrais peut-être aussi "masquer" les liens "page précédente et page suivante".
Merci pour cette contribution Smile
Répondre
#14

Jean le Chauve a écrit :Ça me semble très intéressant, je testerai dès que j'ai un peu de temps.
Tu pourrais peut-être aussi "masquer" les liens "page précédente et page suivante".
Par défaut, je n'utilise jamais ces 2 liens dans les pages éditoriales.

J'ai juste un lien "haut de page" présent partout, ainsi qu'un lien "retour" permettant un retour à la liste des articles dans le cas où on consulte le détail d'un article. Vivent les blocs de contenus globaux Wink
Répondre
#15

Bonjour, je relance quelques instants le sujet j'ai un petit problème.

La variable pagetitle n'existe plus dès que je passe le cap de la balise "body", est ce normal ?

Car j'ai suivi le tuto et je veux afficher le fil d'ariane adapté à la page, mais la variable n'existe plus à cette étape.

Voici mon fichier gabarit

Code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{process_pagedata}
{if $page_name=='news'}
    {content assign="capturedcontent"}
{/if}
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
    <title>{if isset($pagetitle)}{$pagetitle} - {sitename}{else}{title} - {sitename}{/if}</title>
    {if isset($canonical) AND $page_name !='news'}}<link rel="canonical" href="{$canonical}" />{elseif isset($content_obj) AND $page_name !='news'}<link rel="canonical" href="{$content_obj->GetURL()}" />{/if}
{metadata}
{stylesheet}
<script type="text/javascript" src="flash/autoflip/js/swfobject.js"></script>

{* note: anything inside these are smarty comments, they will not show up in the page source *}

</head>
<body>
<!-- start header -->
<div id="header">
  <div class="sub">
    <!-- start banner -->
    <div id="banner">
      <a href="/" id="logo"></a>
      <div id="slogan">Prenez la Pop  Position !</div>
    </div>
    <!-- end banner -->
    
    <!-- start menu -->
    <div class="page-menu util-clearfix">
      {menu template='test_poptract_menu'}
    </div>
    <!-- end menu -->
  </div>
</div>
<!-- end header -->

<!-- start about -->
<div id="about_small">
  <div class="sub">
  </div>
</div>
<!-- end about -->

<!-- start main -->
<div id="main">
  <div id="main_float">
    <div id="main_content">
<p id="fil_ariane">
  {if isset($pagetitle) }
        {breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'} -> {$pagetitle}
{else}
   {breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'}
{/if}
</p>
      {if $page_name=='news'}{$capturedcontent}{else}{content}{/if}
    </div>
    <div id="footer">
      {global_content name='footer'}
    </div>
  </div>
</div>
<!-- end main -->
{google_analytic}
</body>
</html>
Merci d'avance.
Répondre
#16

Hello,

En suivant à la lettre les tutos de ce topic, ça fonctionne sans souci Wink
As-tu bien mis ce code en toute première ligne de ton template de news ?
Code :
{assign var='pagetitle'  value=$entry->title}
Répondre
#17

Oui et pour conforter cette idée, la variable marche pour le title, et dès que ca passe la balise body, elle existe plus comme je disai.
Une raison ?
Répondre
#18

ta page des news s'appel bien "news" et non un nom que tu aurais spécifié différemment ?
Répondre
#19

Si tu parles de ce qui s'affiche dans l'url j'ai bien un /news/
Répondre
#20

header + .htaccess + lien vers le site (surtout après avoir constaté tes déboires sur le post http://www.cmsmadesimple.fr/forum/viewto...p?id=2127)
Répondre
#21

Le htaccess

Code :
Options +FollowSymLinks
RewriteEngine on
RewriteBase /

# Redirection des URLs des domaines mis en alias vers le domaine principal
RewriteCond %{HTTP_HOST} !^www.popfactory.fr$ [NC]
RewriteRule ^(.*)$ http://www.popfactory.fr/$1 [R=301,L]

# Ces 2 pages sont redirigées vers les avantages du ...
RewriteRule ^notre-catalogue-interactif/$  les-avantages-du-catalogue-interactif/ [L,R=301]
RewriteRule ^notre-catalogue-numerique/$  les-avantages-du-catalogue-interactif/ [L,R=301]

# Declinaisons -> 301 -> autres déclinaisons
RewriteRule ^declinaisons/$ nos-solutions-clefs-en-main/nos-autres-declinaisons/ [L,R=301]

# Pour aller plus loin -> 301 -> prestations sur mesure
RewriteRule ^pour-aller-plus-loin/$ nos-solutions-clefs-en-main/nos-prestations-sur-mesure/ [L,R=301]

# la page sur le forum commentcamarche.com -> 301 -> les-avantages-du-catalogue-interactif/
#RewriteRule ^index\.php\?page=PoP-tract$ les-avantages-du-catalogue-interactif/ [L,R=301]
RewriteRule page=PoP-tract les-avantages-du-catalogue-interactif/ [L,R=301]

# Redirection de pages référencées 404 vers la page de description du catalogue
#RewriteCond %{HTTP_HOST} ^.*\.poptract\..*$ [NC]
#RewriteRule ^(.*)PoP-tract$ http://www.popfactory.fr/notre-catalogue-interactif/ [R=301,L]

# Redirection 301 de toutes les demandes qui ne contiennent
# pas un point ou un slash
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.
RewriteRule ^(.*) %{REQUEST_URI}/ [R=301,L]

# Régles de réécriture pour la forme /parent/enfant/
# mais réécrit seulement si l'URL demandée n'est pas un fichier ou un répertoire
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1 [QSA]
l'header j'en ai pas car les contenus globaux j'arrive pas a leur faire avaler mes "<html>" etc..
je colle donc le gabarit

Code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{process_pagedata}
{if $page_name=='news'}
    {content assign="capturedcontent"}
{/if}
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
    <title>{if isset($pagetitle)}{$pagetitle} - {sitename}{else}{title} - {sitename}{/if}</title>
    {if isset($canonical) AND $page_name !='news'}}<link rel="canonical" href="{$canonical}" />{elseif isset($content_obj) AND $page_name !='news'}<link rel="canonical" href="{$content_obj->GetURL()}" />{/if}

{if !empty($description)}<meta name="Description" content="{$description|strip_tags:false}" />{/if}

{metadata}

{stylesheet}
<script type="text/javascript" src="flash/autoflip/js/swfobject.js"></script>

{* note: anything inside these are smarty comments, they will not show up in the page source *}

</head>
<body>
<!-- start header -->
<div id="header">
  <div class="sub">
    <!-- start banner -->
    <div id="banner">
      <a href="/" id="logo"></a>
      <div id="slogan">Prenez la Pop  Position !</div>
    </div>
    <!-- end banner -->
    
    <!-- start menu -->
    <div class="page-menu util-clearfix">
      {menu template='test_poptract_menu'}
    </div>
    <!-- end menu -->
  </div>
</div>
<!-- end header -->

<!-- start about -->
<div id="about_small">
  <div class="sub">
  </div>
</div>
<!-- end about -->

<!-- start main -->
<div id="main">
  <div id="main_float">
    <div id="main_content">
<p id="fil_ariane">
  {if isset($pagetitle) }
        {breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'} -> {$pagetitle}
{else}
   {breadcrumbs starttext='Vous êtes ici' root='Home' delimiter='»'}
{/if}
</p>
      {if $page_name=='news'}{$capturedcontent}{else}{content}{/if}
    </div>
    <div id="footer">
      {global_content name='footer'}
    </div>
  </div>
</div>
<!-- end main -->
{google_analytic}
</body>
</html>
Répondre
#22

1°Essaye en enlevant {process_pagedata} et en mettant sa valeur sur false dans le config.php.
2°Essaye avec un .htaccess minimal pour le mod_rewrite (enlève toutes les règles maison).
Répondre
#23

Bonjour,

Je rencontre un petit soucis avec cette optimisation.

J'ai sur toutes mes pages (disons : page_1, page_2, News), un petit sommaire des 3 derniers articles de news, quand je clique sur le lien d'un de ces articles à partir de page_1, celui ci s'affiche bien, le titre de la page est changé.
Mais pour le breadcrumbs et le titre H2 principal de mon contenu, il me garde les infos de page_1, avec quand même mon article en dessous. Et page_1 est montré comme page active dans le menu.

Si je clique sur un lien de ce même sommaire à partir de ma page news, tout marche. (normal me direz vous Smile )

Mon problème consiste donc a trouver le moyen de rediriger vers la page news, peu importe la page d'origine ou je clique sur un lien article.

J'espère être assez clair :/ et je vous remercie d'avance.

PS : je peux donner le lien sur demande (site en phase de test)

Edit : problème résolu, cela venait du theme, j'ai essayé d'identifier le problème mais sans succès. maintenant ca marche
Répondre
#24

Bonjour,
Quel est ce "Ouvrez votre gabarit principal" est ce gabarit du detail article, du soumettre article, est ce le gabaritr par defaut des pages?

qu entendez vous par "EDIT : ajout de canonical au point 2 (pas de canonical dans la page de détail des news)"
Répondre
#25

soit j'ai pas assez de caféine dans le sang pour voir clair, soit c'est pas français
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)