DotClear 2 : afficher le dernier post sur une page d'accueil
Par k-net le dimanche 10 décembre 2006, 18:32 - Mes créations - Lien permanent
Voici une petite astuce pour les bloggeurs qui voudraient, comme je le fais sur ce site, afficher leur dernier post sur une page d'accueil (ou autre).
C'est très simple : il suffit d'ajouter le code PHP plus bas dans votre page d'accueil et de créer un fichier "template" qui servira de base pour l'affichage.
Imaginons que votre page d'accueil soit home.php et que votre blog DotClear soit dans le dossier dotclear2.
Placez ce code dans votre home.php, à l'endroit où vous voulez voir le dernier post :
<?php // On démarre le blog require 'dotclear2/inc/prepend.php'; // La classe qui appelera le fichier '_tpl.html' class tplHome extends dcUrlHandlers { public static function load() { @self::serveDocument('_tpl.html','text/html',false); } } // Indication du blog à utiliser, par défaut c'est 'default' $core->setBlog('default'); // On enregistre la classe et sa fonction comme évènement par défaut $core->url->registerDefault(array('tplHome','load')); // On lit les posts du blog $_ctx = new context(); $_ctx->posts = $core->blog->getPosts(); // Création du template $core->tpl = new dcTemplate(DC_TPL_CACHE,'$core->tpl',$core); $core->tpl->setPath(dirname(__FILE__)); // C'est parti ! $core->url->getDocument(); ?>
Et créez dans le même dossier le fichier template _tpl.html contenant ce code (n'hésitez pas à le bidouiller un peu pour arriver à la présentation que vous voulez, mais attention : ce code ne doit pas être celui de votre page HTML, juste celui du post qui s'incrustera dans home.php) :
<div class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}"> <!-- # New day date --> <tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader> <h2 id="p{{tpl:EntryID}}" class="post-title"><a href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2> <p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}} {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}} <tpl:EntryIf has_category="1"> - <a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a> </tpl:EntryIf> </p> <!-- # Entry with an excerpt --> <tpl:EntryIf extended="1"> <div class="post-content">{{tpl:EntryExcerpt}}</div> <p class="read-it"><a href="{{tpl:EntryURL}}" title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue reading}}</a>...</p> </tpl:EntryIf> <!-- # Entry without excerpt --> <tpl:EntryIf extended="0"> <div class="post-content">{{tpl:EntryContent}}</div> </tpl:EntryIf> </div>
Voilà, j'espère que ça servira. Chez moi ça marche sans problème
EDIT: D'autres astuces :
Commentaires
C'est que pour Dotclear 2 ou ça marche pour le 1?
Cette manip ne marche que pour DC 2
Par contre, j'avais écrit ce code pour DotClear 1 :
Heu, ça marche pas...
Effectivement, j'avais mis une accolade fermante de trop dans le code. Reprends le Et pense à changer "dotclear" en "blog" !
C'est normal que le billet est affiché en entier?
Oui. Si tu veux juste le chapô, remplace
par
Pense aussi à intégrer le code dans une page HTML, là ça ne fait qu'afficher le dernier billet sans mise en forme
Oui je sais, j'ai fait ça :
http://nautiluska.free.fr
Merci pour ce code ;-)
excellent : ca marche ! top top !
merci !
héhé
Bonjour,
Est ce que c'est possible d'afficher le dernier billet d'une seule catégorie?
Bonsoir,
Bien sûr, pour DotClear 2, il te suffit de remplacer $core->blog->getPosts(); par $core->blog->getPosts(array('cat_id' => ID));
ID étant le chiffre représentant l'id de la catégorie.
Si tu ne connais pas l'id de ta catégorie, essaie-en plusieurs (1, 2, 3...), tu verras bien
Merci pour ta reponse.
En plus de ca, je souhaiterais afficher sur ma page d'accueil le dernier message de chaque catégorie C'est possible ca?
Tout est possible !
Il te suffit d'ajouter ce code autant de fois que tu as de catégories :
En n'oubliant pas de remplacer ID par l'id de chaque catégorie
Vraiment bien tout ca . Encore une petite question: Je souhaiterais afficher en page d'acceuil le dernier billet de certaines catégories, de chaque bolg de mon multiblog. Je pense qu'il suffit que j'ajoute le code que du ma donné precedement pour chaque catégorie, et que j'ajoute:
$core->setBlog('adefaut');
a chaque fois que je change de blog? (avec le nom du blog a la place de defaut bien sur )
Je n'ai pas trop le temps de tester en multiblog pour voir si ça marche, mais a priori c'est ça !
Dis moi si ça marche
Ca ne marche pas . J'ai ajouté le code la reponse 14, et avant, j'ai ajouté la ligne: $core->setBlog('default'); . Si je fais ca, il n'affiche que le dernier message du blog que j'appel en dernier.
Essaie ça :
Si ça ne marche pas, je ne peux plus t'aider (le multiblog c'est pas mon truc).
Désolé
J'ai fais des tests un peu rapide sur les catégories. Je croyais que ca fonctionnait, mais non. J'ai pu reperer deux choses qui ne vont pas:
1) Lorsque je lui dit de choisir une catégorie en particulier, il ne le prend pas en compte, il affiche toujours le dernier message qui a été ecrit (quelle que soit la catégorie).
2) quelque soit le mode que je choisit (une catégorie en particulier ou sur toutes les catégories), le code n'affiche pas forcement uniquement le dernier billet. Si le blog est configuré pour afficher 20 billets par page, il va afficher les 20 derniers billets sur la page d'accueil. Si le blog est configuré pour afficher 1 billet par page, il va afficher le dernier billet. C'est plutot embettant, car mes blogs sont configurés pour afficher 5 billets par pages, et je ne souhaite afficher que le dernier billet en page d'accueil. Je pense qu'il faut ajouter une ligne de code pour lui préciser le nombre de billet à afficher.
Je viens de tester ta methode pour le multiblog. Ca marche presque . J'arrive bien a afficher les derniers messages de mes 2 blogs, mais il me genere deux fois la meme page (c'est comme si j'avais la meme page deux fois de suite, seul le contenu change).
Je suis tres novice en php, c'est donc dur de t'aider. Mais si je comprend bien, il y a la variable $core qui permet de creer la page avec le dernier billet. Puis on crée la page avec $core->url->getDocument();. Je pense qu'il ne faudrait avoir cette ligne de commande qu'une fois, tout à la fin, apres avoir récuperé les informations de chaque blog. De plus, je pense qu'il faudrait avoir une varible $core1 pour le blog 1, $core2 pour le blog2, ...
Très bizarre, avec le code que j'ai écrit plus haut (excepté le multiblog) ça marche comme il faut.
Tu pourrais mettre ici le code que tu mets et un lien vers le résultat ?
EDIT: Nos commentaires se sont croisés, peux tu aussi indiquer le contenu de _tpl.html ?
Je travail tout en local, mais je viens de mettre ca vite fait sur un blog qui est deja en ligne, donc c'est pas du multiblog.
Le blog en question est (je suis sensé n'afficher que le dernier billet de la catégorie voyage): http://el.m.free.fr/raoulweb/index....
La page d'accueil: http://el.m.free.fr/index.php/
Le code de ma page d'accueil, tu peux le telecharger la: http://el.m.free.fr/electromusic/in...
Le contenu du _tpl.html: http://el.m.free.fr/electromusic/_t...
PS: ne fais pas attention au nom de mes classes, ils ne sont pas forcement adapté au contenu, c'est juste un theme que j'ai adapté vite fait
C'est bien ce que je pensais : tu as modifié _tpl.html pour en faire une page entière. Il ne faut pas : dedans il doit juste y avoir le code des posts comme j'ai donné plus haut, pas plus. Tu peux bidouiller à l'intérieur de ce code mais ne rajoute rien avant, rien après
Pour le code de ta page d'accueil, je n'y ai pas accès (ça génère une erreur php) mais peut être qu'en modifiant _tpl.html ton problème sera réglé
Ok!! Exact, j'avais tout copié dans ma page HTML . Du coup j'ai mis que le code, et ca marche tres bien, meme en multiblog. Mais du coup je ne vois pas comment je peux integrer ca à ma page web pour avoir quelque chose qui soit sympa graphiquement....
Bah si, ton code HTML tu le mets dans index.php, tout autour du php
Je viens d'essayer et ca marche . Un grand merci pour ton aide, ton code est vraiement génial, j'ai tout ce qu'il me faut pour afficher mes derniers billets en multiblog.
Je vais avoir encore une derniere question .
Lorsque j'ajoute mon code HTML autour de mon code PHP, les accents ne sont plus pris en compte. Exemple: Pour Actualités, il va afficher Actualité
Ça n'a aucun rapport avec le code php au milieu, c'est simplement que tu as enregistré ton fichier avec comme encodage l'utf-8 (ce qui est très bien) mais ton document ne déclare pas qu'il utilise l'utf-8.
Pour régler ça, cherche dans ton code <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> et remplace iso-8859-1 par utf-8
Si ça ne suffit pas, ajoute tout en haut de ton fichier <?php header('Content-Type: text/html; charset=utf-8'); ?>
Tout de suite ca va mieux . Et si je veux afficher les deux derniers, ou trois derniers billets d'une catégorie, comment je peux faire?
Il faut remplacer le 1 de $core->blog->settings->nb_post_per_page = 1; par 2, ou 3
(J'ai modifié l'organisation du code php et html que j'avais donné pour pouvoir arriver à ce que tu veux faire, tu ferais donc bien de réadapter ton code en relisant plus haut )
Je viens d'essayer ton nouveau code (j'ai bien apporté les modifications), et ca fonctionne tres bien. Mais quand j'applique la selection de catégorie, ca les prend pas en compte
Salut, j'ai bien réfléchi à ton problème (d'où la réponse tardive) et j'ai trouvé
Annule les dernières modifications sur le fichier _tpl.html (j'ai remis le code d'origine en haut) et mets ce code dans home.php :
Répète le code autant de fois que tu veux de posts sur ta page d'acceuil, en indiquant à chaque fois l'id du blog (ici default), l'id de la catégorie (ici 2) et quel post tu veux (ici 0 pour avoir le premier ; si tu veux le 2ième par exemple mets 1, le 4ième 3, etc...).
J'espère que cette fois ce sera bon
Et bien voila ca marche . Tout marche. J'ai tout bien testé, ca marche en multiblog, quelque soit la catégorie qu'on choisit et le nombre de billet à afficher. Un grand merci pour le travail que tu as fait, c'est genial
Un grand de rien, je suis content que ça marche enfin
salut et bonne année à tous,
j'utilise la version 1 de dotclear et j'aimerai n'afficher qu'1 billet sur ma page d'accueil mais d'une certaine catégorie...
Salut,
Pour ça il faut ajouter WHERE `cat_id` =ID, ce qui donne :
N'oublie pas de remplacer ID par l'ID de ta catégorie. Si tu ne connais pas cet ID, essaie en plusieurs (1, 2, 3...) jusqu'à ce que tu tombes sur le bon
merci beaucoup du coup de pouce...
a bientot...
Je rencontre un nouveau probleme avec le code. Tout fonctionnait tres bien jusqu'a ce qu'un utilisateur de IE6 (j'ai testé sous IE7 et Firefox 2 ) me dise qu'il n'y avait rien sur le site (on voyait ca: http://el.m.free.fr/electromusic/si... au lieu de ca: http://el.m.free.fr). J'ai longtemps cherché d'ou pouvait venir le probleme. J'ai fait un test de validation W3C, et j'ai découvert que c'etait parce que ma page etait en charset=utf-8 et pas en charset=iso-8859-1. J'ai donc mit ma page en charset=iso-8859-1 (je sais c'est pas logique puisque DC est en utf-8), et miracle, mon site apparait "correctement" sous IE6. Ce n'est pas si correct que ca car maintenant j'ai le probleme d'accent sous tous les naviguateurs...
Si tu pouvais m'apporter un peu d'aide, ca m'aiderait . Je vais encore chercher de mon coté pour d'ou ca peut venir, mais j'avoue que je ne sais pas trop...
oups erreur de ma part dans le message precedent. Le deuxieme site est http://clbarboux.free.fr et pas http://el.m.free.fr
J'avais en fait une erreur dans mon code, j'ai corrigé ca. C'est tout bon
Content que tu aies résolu ton problème tout seul
L'UTF-8 c'est très bien mais ça peut poser des soucis si la page a plusieurs sources...
Merci pour tous ces conseils k-net!
Je suis encore avec la version 1, et souhaiterais afficher sur une homepage les 5 derniers billets (quel que soit la catégorie...). Désolé pour ce retour en arrière, mais un coup de main serait vraiment apprécié
Salut, il te suffit de remplacer LIMIT 1 par LIMIT 5 et le tour est joué
EDIT: J'ai légèrement modifié le code tout en haut pour que ça fonctionne. Pense à apporter les modifications nécessaires !
Je ne peux dire qu'une seule chose: ça marche impec!!! merci pour ta super-réactivité (30' chrono, impressionnant!!!)
Ca marche plutôt bien! Comment afficher un article donné (identifié par son ID par exemple)?
Merci
Salut !
Pour avoir un article en particulier, c'est le même principe que sur ce commentaire mais il faut mettre array('post_id' => ID) à la place
Super bout de code ça marche pas mal !
Juste qq questions :
-comment régler le problème des accents ? j'ai remplacé par UT8 dans mon fichier php mais j'ai toujours le meme problème...
-comment réparer les liens ? Chez moi ils ne fonctionnent pas et renvoient vers http://www.monsite.fr/%7B%7Btpl:EntryURL%7D%7D
-comment modifier la police de billets ?
Merci !
Salut, pour pouvoir t'aider il faudrait que tu me donnes l'adresse de la page en question...
voici l'adresse concernée : http://www.tooble.fr/portail.php
Pour l'utf-8, c'est normal que ça ne marche pas : tu as mis charset=ut8 au lieu de charset=utf-8...
Pour les liens, encore une erreur de ta part : ton fichier _tpl.html est erroné. Je te conseille d'utiliser le code que j'ai mis en haut de cette page
Pour la police de la page, c'est du CSS, je pense que rajouter ce code juste avant le </head> de ta page devrait aider :
c'est possible que le CSS ne s'applique qu'aux derniers billets et pas au reste de la page ? Si oui on fait comment ?
Sinon je n'arrive pas non plus à afficher les trois derniers billets?
Encore une chose : merci pour votre soutien car je suis nul en PHP et vous etes vraiment dispo
Pour le CSS, je ne sais pas... désolé
Pour afficher tes trois derniers billets, est-ce que tu as suivi ces instructions ? Si oui et si ça ne marche toujours pas, peux-tu poster le code php que tu as mis dans portail.php ?
Voici mon code dans portail.php
Sinon aurait tu MSN pour qu'on puisse discuter?
<?php // On démarre le blog
require 'inc/prepend.php';
// La classe qui appelera le fichier '_tpl.html'
class tplHome extends dcUrlHandlers
{
public static function load() {
@self::serveDocument('_tpl.html','text/html',false);
}
}
// Indication du blog à utiliser, par défaut c'est 'default'
$core->setBlog('default');
// On enregistre la classe et sa fonction comme évènement par défaut
$core->url->registerDefault(array('tplHome','load'));
// On lit les posts du blog
$_ctx = new context();
$_ctx->posts = $core->blog->getPosts();
// Création du template
$core->tpl = new dcTemplate(DC_TPL_CACHE,'$core->tpl',$core);
$core->tpl->setPath(dirname(__FILE__));
// C'est parti !
$core->url->getDocument();
?>
Relis mon précédent commentaire...
Si tu veux mon adresse MSN contacte moi (en haut de la page) mais je te préviens : en ce moment je n'ai pas vraiment le temps pour discuter
Salut K-net,
Un peu comme Baj, je voudrais afficher les 2 ou 3 derniers billets d'une certaine catégorie, puis les autres billets par ordre chrono, sur la page d'accueil.
Comment faire donc? et où insérer?
Merci d'avance!
Salut,
Sur DotClear 1 ou 2 ?
salut,
moi j'ai cette erreur qd j'inclus ton code dans mon home.html :
Fatal error: Cannot redeclare __shutdown() (previously declared in \www\dotclear2\inc\prepend.php:161) in \www\dotclear2\inc\prepend.php on line 175
moi pas comprendre
thx
Salut,
Le code est à placer dans un nouveau fichier php séparé (home.php, index.php ou autre mais à mettre à la racine du site), pas dans le home.html du thème de DotClear
Exelent travail, je voulais le coder moi meme, mais des fois avec une simple recherche avec l'ami google, on tombe sur de bon produit!
Du temps de gagné=un grand merci!
simple question , si je désire faire la manip pour appellé inc/prepend.php mais mon blog se trouve dans un sous domaine donc en externe . doit je faire un appelle http://url/inc/prepend.php ou conseille tu autre chose .
je sais que plusieurs option existe pour la sécurité d'un appelle de fichier externe
WEBCodeur : C'est exactement le but
gtraxx : Si des fichiers php ne sont pas sur la même machine, tu ne peux pas les inclure comme ça...
Il y a bien un moyen, c'est de faire en sorte que leur code source ne soit pas executé (transféré directement), mais tu perds toute la sécurité de ton blog.
Reste à voir si le blog de l'autre sous-domaine est sur le même serveur... ou pas
Ca marche, allez voir ici :
http://www.xminali.com
Merci pour cette astuce.
oui k-net c'est le même serveur, comme je te l'ai dit c'est un sous domaine mais pour remonter de mon blog au site sa fais pas mal de dossier vers le haut ensuite vers le bas
une astuce ??
Je suis très pointilleux sur la sécurité donc vaux mieux que ce soit propre.
Salut,j'utilise dotclear 2 et je souhaiterai affiché sur ma page d'accueil un billet precis, c'est le billet de présentation de mon blog.
J'ai Dotclear 1 et J'autile votre code (bien tuile). Je voudrais me compliquer la vie et afficher les derniers post du même rédacteur. voici le bout de code en question :
$sql = 'SELECT * FROM `'.DB_PREFIX.'post` WHERE `cat_id` =3 AND `post_pub` =1 ORDER BY `post_id` DESC LIMIT 10;';
je voudrais donc ajouter aussi la condition 'SELECT * FROM `'.DB_PREFIX.'user` WHERE `user_id` =nom rédacteur
Je ne m'y connait pas beaucoup et alors je vous pose la question comment lier les deux conditions ?
Je vous remercie par avance.
J'ai tenté mais la page m'affiche que la commande est reconnue mais interdite. Il veut un code entre HEAD.
Indice: je suis chez Free avec une base PostgreSQL
Une idée? J'adorerai pouvoir réaliser cette astuce.
Guilou : le home.php c'est ta page d'accueil, dans ton cas ce sera un index.php placé à la racine du site.
Je ne comprends rien au message d'erreur que tu indiques, poste plutôt le vrai.
Stefano : je ne connais pas trop le SQL mais ce serait un truc du genre :
$sql = 'SELECT * FROM `'.DB_PREFIX.'post` WHERE `cat_id` =3 AND `post_pub` =1 AND `user_id` =idredacteur ORDER BY `post_id` DESC LIMIT 10;';
zeres : pareil, un truc du genre :
$sql = 'SELECT * FROM `'.DB_PREFIX.'post` WHERE `post_id` =iddubillet ;';
Merci ça marche, en fait j'avais oublié d'enlever la redirection de mon site dans l'index
Par contre pour la mise en forme j'ai vu que la question a déjà été posé et qu'il faut mettre son HTML autour du PHP et là je sèche. Y'a-t-il des balises à mettre et où? Parce que quand je collele HTML dans le PHP le code HTML s'affiche sur ma page comme un simple texte.
Excellent petit bout de code !
Mon problème à moi : je voudrais inclure des billets de dotclear sur un site qui est encodé en iso-8859-1. Si je change le code de la page pour la faire lire en utf-8, les billets du blog s'affichent correctement, mais c'est tout le reste du site (les menus sur les côtés, etc.) qui flanche. Y'a-t-il moyen de convertir le contenu renvoyé par dotclear avec une fonction php comme utf8_decode ?
Merci d'avance !
Bonjour tout le monde,
Et tout d'abord, un grand merci à k-net pour ce bout de code. Ca m'a beaucoup aidé.
Sais-tu s'il serait également possible d'afficher, dans le home.php, les liens (blogroll) que j'ai pu saisir dans le panneau d'administration de mon blog.
Il faut préciser que je ne les affiche pas dans mon blog, je les voudrait uniquement en page d'accueil (je n'ai donc pas sélectionné ce widget dans l'onglet "Configuration des widgets")
Merci d'avance si tu as une idée.
Essaie avec ce code :
Bien sûr, modifie l'id du blog et les urls pour que ça corresponde au tien
Bonjour,
J'ai trouvé une soluion pour afficher une page de votre blog par default, cela peut marcher aussi bien avec une catégorie !!
En faite, le script est à insérer sur votre page index.php du répertoire dotclear ou où se trouve le script du blog !
Inséré ceci en début du fichier index.php
if($_SERVER['QUERY_STRING'] == "")
{
header("Location: index.php?pages/VOTREPAGE");
exit;
}
Il contrôlera si il n'y a rien dans le QUERY_STRING (toutes les valeurs de GET, etc...)
Et il vous redirigera vers la page que vous spécifiez à VOTREPAGE, moi j'ai mis home parce-que j'ai fait une page d'accueil avec le blog et donc maintenant arrivant sur le blog au lieu d'afficher tous les billets ajouté, il affiche ma page d'accueil (home) !
En éspérant en aider quelques-un !
Merci,
Maxence,
http://maxence.microshyma.com/ <== Click please, my blog !
Bonjour,
C'est peut-être un peu tard pour réagir, mais j'ai un problème avec ce super code !!
J'ai installé sans problème le code avec Dot 1 mais maintenant avec DotC 2 ca ne marche pas.......
J'ai un message d'erreur :
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' on line 112
La ligne 112 c'est celle là :
public static function load() {
Je n'ai que PHP 4.49 sur ce serveur Ovh c'est une explication ????
Merci pour votre aide !!!
Bonjour, et mille mercu pour ce script, du fond du coeur !!! juste un dernier truc, c'est possible d'utilisé ce script c'est a dire il marche impec sauf que j'aimarais juste que y'auras un petit extrait et non tout le billet affiché en index, et aussi d'avoir au moin 3 ou 4 dernier billet,
Je te remercie !!!! et bon courage.
Bonjour.
Désolée de remonter ce post après autant d'années, mais je voulais déjà remercier k-net pour ses releases qui m'ont été très utile pour la création de mon site web.
Cependant j'aurais une question : est-il possible d'appeler le contenu intégral du billet et non pas seulement son extrait dans le home.php?
Si oui, serait-il possible d'avoir le code ?
Merci par avance !
Dur de répondre avec précision vu que ce billet a 8 ans ! :-)
Mais j'imagine qu'en remplaçant {{tpl:EntryExcerpt}} par {{tpl:EntryContent}} dans le fichier _tpl.html tu devrais avoir le post en entier.
En effet, cela fonctionne :-)
J'avais essayé pleins de choses, mais pas cette variable XD
Merci beaucoup !