functions.php 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220
  1. <?php
  2. # ***** BEGIN LICENSE BLOCK *****
  3. # This file is part of DotClear.
  4. # Copyright (c) 2004 Olivier Meunier and contributors. All rights
  5. # reserved.
  6. #
  7. # DotClear is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # DotClear is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with DotClear; if not, write to the Free Software
  19. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. #
  21. # ***** END LICENSE BLOCK *****
  22. /**
  23. @doc
  24. == Fonctionnement des gabarits ==
  25. === Introduction ===
  26. Le système de modèle de page de DotClear n'est pas ce qui se fait de plus
  27. simple à l'usage mais reste abordable pour peu de bien lire la
  28. documentation.
  29. Le fonctionnement est très simple, il s'agit de fonctions PHP qui se
  30. chargent d'afficher l'information qu'on leur demande.
  31. Parfois un motif est utilisé pour formater l'information affichée. Ce motif
  32. constitue une marque de substitution, généralement identifiée par %s. Pour de
  33. plus amples détails, suivre la documentation de la fonction
  34. PHP|PHP Hypertext Processor,
  35. [http://fr2.php.net/manual/fr/function.sprintf.php sprintf].
  36. Pour chaque fonction utilisant un motif, nous expliquerons comment le remplir.
  37. */
  38. /**
  39. @doc
  40. === Les fonctions informatives ===
  41. Les fonctions suivantes permettent d'afficher des renseignements divers sur
  42. le blog ou les billets.
  43. */
  44. /**
  45. @function dcInfo
  46. Fonction affichant une information sur le blog.
  47. La propriété '''name''' peut prendre les valeurs suivantes :
  48. * name : non du weblogue
  49. * theme : chemin vers le répertoire du thème
  50. * img : chemin vers les images
  51. * url : URL de la home page du blog
  52. * rss : chemin vers le fil RSS
  53. * atom : chemin vers le fil Atom
  54. * search : chemin de l'action pour le moteur de rechercher
  55. * logo : chemin vers l'image du logo
  56. * encoding : Encodage des caractères
  57. * lang : langue principale du weblogue
  58. Exemple :
  59. {{{
  60. #!php
  61. <h1><?php dcInfo(); ?></h1>
  62. <a href="<?php dcInfo('rss'); ?>">fil rss</a>
  63. }}}
  64. Note : vous pouvez faire un lien vers le fil RSS ou Atom d'une catégorie
  65. très facilement en ajoutant l'identifiant de la catégorie à l'URL, comme
  66. ceci par exemple :
  67. {{{
  68. #!php
  69. <a href="<?php dcInfo('rss'); ?>?cat=General">RSS général</a>
  70. }}}
  71. @param string name Nom de la propriété à afficher ('name')
  72. */
  73. function dcInfo($name='name')
  74. {
  75. switch ($name)
  76. {
  77. case 'theme' : echo $GLOBALS['theme_uri'].$GLOBALS['__theme']; break;
  78. case 'img' : echo $GLOBALS['img_path']; break;
  79. case 'url' : echo dc_blog_url; break;
  80. case 'rss' : echo dc_blog_rss; break;
  81. case 'atom' : echo dc_blog_atom; break;
  82. case 'search' : echo dc_blog_url; break;
  83. case 'logo' : echo $GLOBALS['img_path'].'/dotclear_pw.png'; break;
  84. case 'encoding' : echo dc_encoding; break;
  85. case 'lang' : echo dc_default_lang; break;
  86. case 'desc' : echo dc_blog_desc; break;
  87. default : echo dc_blog_name;
  88. }
  89. }
  90. /**
  91. @function dcDayDate
  92. Cette fonction affiche la date du jour. Elle est utilisée dans la boucle
  93. des billets et n'affiche la date que lors du premier billet du jour. Cela
  94. permet d'afficher la date du jour au dessus de plusieurs billets du même
  95. jour.
  96. On peut entourer la date de marqueur ou de texte grâce à la chaîne
  97. de substitution '''s''' passée en argument. Par exemple:
  98. {{{
  99. #!php
  100. <?php dcDayDate('<h2>%s</h2>'); ?>
  101. }}}
  102. @param string s Chaine de substition ('%s')
  103. */
  104. function dcDayDate($s='%s')
  105. {
  106. if ($GLOBALS['news']->firstPostOfDay())
  107. {
  108. printf($s,$GLOBALS['news']->getLDate());
  109. }
  110. }
  111. /**
  112. @function dcCalendar
  113. Cette fonction affiche un calendrier contextuel (mois, année, jour).
  114. Le calendrier est un tableau dans une balise <div> dont la classe
  115. CSS|Cascading Style Sheet est ''cal''. Les nom des jours sont indiqués avec des
  116. cellules d'en-tête (th) et le titre avec (caption).
  117. Exemple d'utilisation :
  118. {{{
  119. #!php
  120. <?php dcCalendar(); ?>
  121. }}}
  122. @param string block Chaine de substitution pour pour le tableau ('<div class="cal"><table summary="calendrier">%s</table></div>')
  123. */
  124. function dcCalendar($block='<div class="cal"><table summary="calendrier">%s</table></div>')
  125. {
  126. global $year,$month,$day,$cat_id,$lang;
  127. echo $GLOBALS['blog']->xCalendar($year,$month,$day,$cat_id,$lang,$block);
  128. }
  129. /**
  130. @function dcHeadLinks
  131. Cette fonction affiche les liens (link) dans l'en-tête du fichier HTML.
  132. Elle génère automatiquement les liens de navigation dans le blog. Il
  133. suffit de la placer dans l'en-tête du document :
  134. {{{
  135. #!php
  136. <head>
  137. <?php dcHeadLinks(); ?>
  138. </head>
  139. }}}
  140. */
  141. function dcHeadLinks()
  142. {
  143. global $blog, $cat_id, $rs_cat;
  144. echo dcPostNext(1,'<link rel="next" href="%3$s" title="%2$s" />'."\n");
  145. echo dcPostNext(-1,'<link rel="previous" href="%3$s" title="%2$s" />'."\n");
  146. if (!$rs_cat->isEmpty() && !$cat_id)
  147. {
  148. while (!$rs_cat->EOF())
  149. {
  150. if ($rs_cat->f('nb_post') > 0)
  151. {
  152. $id = $rs_cat->f('cat_libelle_url');
  153. $libelle = $rs_cat->f('cat_libelle');
  154. $lien = sprintf($blog->front_url['cat'],$id);
  155. echo '<link rel="section" href="'.$lien.'" title="'.$libelle.'" />'."\n";
  156. }
  157. $rs_cat->moveNext();
  158. }
  159. $rs_cat->moveStart();
  160. }
  161. $arry_months = $GLOBALS['arry_months'];
  162. $comp_url = '';
  163. if ($cat_id) {
  164. $comp_url = $cat_id.'/';
  165. }
  166. foreach ($arry_months as $ts => $d)
  167. {
  168. $titre = dt::str('%B %Y',$ts);
  169. $url = sprintf($blog->front_url['archive'],$comp_url.date('Y',$ts),date('m',$ts));
  170. echo '<link rel="archive" href="'.$url.'" title="'.$titre.'" />'."\n";
  171. }
  172. if ($GLOBALS['mode'] == 'home')
  173. {
  174. echo $GLOBALS['news']->getHeadLinks();
  175. }
  176. }
  177. /**
  178. @function dcSinglePostTitle
  179. Cette fonction affiche le titre d'un billet si on est sur une page présentant
  180. un billet (/blog/yyyy/mm/dd/titre par exemple).
  181. On l'utilisera dans la balise <title> du document. Par exemple:
  182. {{{
  183. #!php
  184. <title><?php dcSinglePostTitle(); ?></title>
  185. }}}
  186. @param string s Chaîne de substitution ('%s - ')
  187. */
  188. function dcSinglePostTitle($s='%s - ')
  189. {
  190. if ($GLOBALS['mode'] == 'post') {
  191. printf($s,$GLOBALS['news']->f('post_titre'));
  192. }
  193. }
  194. /**
  195. @function dcSingleCatTitle
  196. Cette fonction affiche le nom de la catégorie s'il y a lieu de l'afficher. On peut
  197. l'utiliser dans le titre, comme '''dcSinglePostTitle'''.
  198. @param string s Chaîne de substitution ('%s - ')
  199. */
  200. function dcSingleCatTitle($s='%s - ')
  201. {
  202. if ($GLOBALS['cat_id'] != '') {
  203. printf($s,$GLOBALS['news']->f('cat_libelle'));
  204. }
  205. }
  206. /**
  207. @function dcSingleMonthTitle
  208. Cette fonction affiche le mois et l'année en cours s'il y a lieu de l'afficher.
  209. S'utilise aussi dans le titre comme '''dcSinglePostTitle'''.
  210. @param string s Chaîne de substitution ('%s - ')
  211. */
  212. function dcSingleMonthTitle($s='%s - ')
  213. {
  214. if ($GLOBALS['mode'] == 'month') {
  215. $ts = strtotime($GLOBALS['year'].'-'.$GLOBALS['month'].'-01 00:00');
  216. printf($s,dt::str('%B %Y',$ts));
  217. }
  218. }
  219. /**
  220. @function dcCustomTitle
  221. Cette fonction affiche le contenu de la variable globale $dc_custom_title.
  222. Cette variable peut-être assignée par un plugin.
  223. @param string s Chaîne de substitution ('%s - ')
  224. */
  225. function dcCustomTitle($s='%s - ')
  226. {
  227. if (!empty($GLOBALS['dc_custom_title'])) {
  228. printf($s,$GLOBALS['dc_custom_title']);
  229. }
  230. }
  231. /**
  232. @doc
  233. ==== Exemples d'usage des fonctions pour la balise <title> ====
  234. Voici un exemple de commun de balise <title> à partir des fonctions précédentes :
  235. {{{
  236. #!php
  237. <title><?php dcSinglePostTitle('%s - '); dcSingleCatTitle('%s - ');
  238. dcSingleMonthTitle('%s - '); dcCustomTitle('%s - '); dcInfo(); ?></title>
  239. }}}
  240. */
  241. /**
  242. @function dcLangList
  243. Cette fonction affiche une liste des langues définies dans les billets. Les
  244. langues s'affichent uniquement si au moins deux langues différentes existent.
  245. Ceci permet d'offrir une navigation par langue dans le weblogue.
  246. @param string block Chaine de substitution pour pour la liste ('<ul>%s</ul>')
  247. @param string item Chaine de substitution pour un élément ('<li>%s</li>')
  248. */
  249. function dcLangList($block='<ul>%s</ul>',$item='<li>%s</li>')
  250. {
  251. global $rs_lang,$lang,$blog;
  252. if ($rs_lang->nbRow() > 1)
  253. {
  254. $res = '';
  255. while ($rs_lang->fetch())
  256. {
  257. $lien = '<a href="'.
  258. sprintf($blog->front_url['cat'],$rs_lang->f(0)).'">'.
  259. $rs_lang->f(0).'</a>';
  260. if ($lang == $rs_lang->f(0)) {
  261. $lien = '<strong>'.$lien.'</strong>';
  262. }
  263. $res .= sprintf($item,$lien);
  264. }
  265. printf($block,$res);
  266. }
  267. }
  268. /**
  269. @function dcCatList
  270. Cette fonction affiche une liste des catégories avec les liens pour y
  271. accéder. La liste générée est une liste non ordonnée (<ul>), il est donc
  272. très simple de la mettre en forme par la suite.
  273. @param string block Chaine de substitution pour pour la liste ('<ul>%s</ul>')
  274. @param string item Chaine de substitution pour un élément ('<li>%s</li>')
  275. */
  276. function dcCatList($block='<ul>%s</ul>',$item='<li>%s</li>')
  277. {
  278. global $rs_cat, $cat_id, $lang, $blog;
  279. $comp_url = '';
  280. if ($lang) {
  281. $comp_url = $lang.'/';
  282. }
  283. if (!$rs_cat->isEmpty())
  284. {
  285. $res = '';
  286. while (!$rs_cat->EOF())
  287. {
  288. if ($rs_cat->f('nb_post') > 0)
  289. {
  290. $id = $rs_cat->f('cat_libelle_url');
  291. $libelle = $rs_cat->f('cat_libelle');
  292. $lien = '<a href="'.
  293. sprintf($blog->front_url['cat'],$comp_url.$id).
  294. '">'.$libelle.'</a>';
  295. if ($cat_id == $id) {
  296. $lien = '<strong>'.$lien.'</strong>';
  297. }
  298. $res .= sprintf($item,$lien);
  299. }
  300. $rs_cat->moveNext();
  301. }
  302. $rs_cat->moveStart();
  303. printf($block,$res);
  304. }
  305. }
  306. /**
  307. @function dcMonthsList
  308. Cette fonction affiche la liste des mois contenant les archives.
  309. Si on se trouve dans une catégorie, seuls les mois de cette catégorie
  310. seront affichés.
  311. @param string block Chaine de substitution pour pour la liste ('<ul>%s</ul>')
  312. @param string item Chaine de substitution pour un élément ('<li>%s</li>')
  313. */
  314. function dcMonthsList($block='<ul>%s</ul>',$item='<li>%s</li>')
  315. {
  316. global $arry_months, $month, $year, $cat_id, $lang, $blog;
  317. $comp_url = '';
  318. if ($lang) {
  319. $comp_url .= $lang.'/';
  320. }
  321. if($cat_id) {
  322. $comp_url .= $cat_id.'/';
  323. }
  324. $res = '';
  325. foreach($arry_months as $ts => $d)
  326. {
  327. $titre = dt::str('%B %Y',$ts);
  328. $url = sprintf($blog->front_url['archive'],$comp_url.date('Y',$ts),date('m',$ts));
  329. $lien = '<a href="'.$url.'">%s</a>';
  330. $liClass = '';
  331. if($year == date('Y',$ts) && $month == date('m',$ts)) {
  332. $lien = '<strong>'.$lien.'</strong>';
  333. }
  334. $res .= sprintf($item,sprintf($lien,$titre));
  335. }
  336. if (count($arry_months) > 0) {
  337. printf($block,$res);
  338. }
  339. }
  340. /**
  341. @function dcSelection
  342. Cette fonction affiche une liste des billets sélectionnés, avec simplement
  343. le titre et un lien vers le billet. L'affichage par défaut produira une liste,
  344. vous pouvez l'appeler tout simplement par '''dcSelection()'''.
  345. @param string block Chaine de substitution pour pour la liste ('<ul>%s</ul>')
  346. @param string item Chaine de substitution pour un élément ('<li><a href="%2$s">%1$s</a></li>')
  347. @param integer limit Nombre de titres à afficher (ilimité)
  348. */
  349. function dcSelection($block='<ul>%s</ul>',$item='<li><a href="%2$s">%1$s</a></li>',$limit=NULL)
  350. {
  351. global $blog;
  352. $rs = $blog->getLastNews($limit,'','post_dt DESC',true);
  353. if (!$rs->isEmpty()) {
  354. $res = '';
  355. while (!$rs->EOF()) {
  356. $res .= sprintf($item,$rs->f('post_titre'),$rs->getPermURL());
  357. $rs->moveNext();
  358. }
  359. printf($block,$res);
  360. }
  361. }
  362. /**
  363. @function dcSearchString
  364. Cette fonction affiche la chaîne de recherche lorsque qu'une recherche vient d'être
  365. effectuée.
  366. @param string s Chaîne de substitution ('%s')
  367. */
  368. function dcSearchString($s='%s')
  369. {
  370. if(!empty($_GET['q'])) {
  371. printf($s,htmlspecialchars(stripslashes($_GET['q'])));
  372. }
  373. }
  374. /**
  375. @function dcAdminLink
  376. Cette fonction affiche un lien vers l'espace d'administration du blog dans le
  377. cas ou une session d'administration est ouverte (et seulement dans ce cas).
  378. @param string s Chaine de substitution ('<ul><li><a href="%s">admin</a></li></ul>')
  379. */
  380. function dcAdminLink($s='<ul><li><a href="%s">admin</a></li></ul>')
  381. {
  382. if (isset($_SESSION['sess_user_id']) && defined('DC_ECRIRE')) {
  383. $url = dc_app_url.'/'.DC_ECRIRE.'/index.php';
  384. printf($s,$url);
  385. }
  386. }
  387. # Billets #################################################
  388. /**
  389. @doc
  390. === Traitement des billets. ===
  391. Les fonctions suivantes doivent être utilisées uniquement dans un
  392. contexte de billet. Cela signifie qu'on l'utilisera si '''$mode'''
  393. vaut 'post' ou dans une boucle de billet. Exemple:
  394. {{{
  395. #!php
  396. <?php if ($mode == 'post') : ?>
  397. on peut utiliser les fonctions.
  398. <?php endif; ?>
  399. }}}
  400. L'affichage des listes de billets est géré par une boucle très simple
  401. à mettre en place. Voici un exemple qui affiche le titre des billets :
  402. {{{
  403. #!php
  404. <?php while ($news->fetch()) : ?>
  405. <h3><?php dcPostTitle(); ?></h3>
  406. <?php endwhile; ?>
  407. }}}
  408. */
  409. /**
  410. @function dcPostURL
  411. Cette fonction affiche l'URI du billet, son permalien. On l'utilisera dans
  412. l'affichage d'un billet (boucle ou pas). Par exemple:
  413. {{{
  414. #!php
  415. <a href="<?php dcPostURL(); ?>">lien permanent</a>
  416. }}}
  417. */
  418. function dcPostURL()
  419. {
  420. echo $GLOBALS['news']->getPermURL();
  421. }
  422. /**
  423. @function dcPostID
  424. Cette fonction affiche l'ID du billet (son numéro identifiant unique).
  425. */
  426. function dcPostID()
  427. {
  428. echo $GLOBALS['news']->f('post_id');
  429. }
  430. /**
  431. @function dcPostTitle
  432. Cette fonction affiche le titre d'un billet, avec chaîne de substitution
  433. possible. Exemple:
  434. {{{
  435. #!php
  436. <h2><?php dcPostTitle(); ?></h2>
  437. }}}
  438. */
  439. function dcPostTitle($s='%s')
  440. {
  441. printf($s,$GLOBALS['news']->f('post_titre'));
  442. }
  443. /**
  444. @function dcPostCatTitle
  445. Dans le contexte du billet, cette fonction affiche le nom de la catégorie
  446. du billet.
  447. */
  448. function dcPostCatTitle()
  449. {
  450. echo $GLOBALS['news']->f('cat_libelle');
  451. }
  452. /**
  453. @function dcPostCatURL
  454. Cette fonction affiche l'URL de la catégorie d'un billet. Ne s'utilise que dans
  455. le contexte d'un billet. Par exemple:
  456. {{{
  457. #!php
  458. <a href="<?php dcPostCarURL(); ?>"><?php dcPostCatTitle(); ?></a>
  459. }}}
  460. */
  461. function dcPostCatURL()
  462. {
  463. echo $GLOBALS['news']->getCatURL();
  464. }
  465. /**
  466. @function dcPostContent
  467. Cette fonction affiche le contenu d'un billet (sans son chapô). On peut
  468. limiter le nombre de mots affichés avec le paramère '''part'''.
  469. Si '''part''' vaut 0 alors on affiche tout le billet.
  470. @param integer part Nombre de mots à afficher
  471. */
  472. function dcPostContent($part=0)
  473. {
  474. global $news;
  475. if ($part > 0) {
  476. echo $news->blog->getPart($news->f('post_content'),$part);
  477. } else {
  478. echo $news->getContent();
  479. }
  480. }
  481. /**
  482. @function dcPostChapo
  483. Cette fonction affiche le chapô d'un billet s'il existe, sinon elle
  484. n'affiche rien. Le paramètre '''s''' permet d'ajouter des information lors
  485. de l'affichage du chapô. Exemple:
  486. {{{
  487. #!php
  488. <?php dcPostChapo('<h3>Chapô</h3> %s'); ?>
  489. }}}
  490. @param string s Chaine de substitution ('%s <hr />')
  491. */
  492. function dcPostChapo($s='%s <hr />')
  493. {
  494. printf($s,$GLOBALS['news']->getChapo());
  495. }
  496. /**
  497. @function dcPostAbstract
  498. Cette fonction affiche le chapô du billet s'il y en a un sinon elle affiche
  499. le contenu du billet. Si elle affiche le chapô, le paramètre '''l''' permet
  500. de définir un texte à afficher après le chapô. Dans le paramètre '''l''' la
  501. première chaîne %s indique le lien vers le billet et la seconde le titre
  502. du billet. On pourra donc par exemple faire ceci :
  503. {{{
  504. #!php
  505. <?php dcPostAbstract('%s','<p><a href="%s" title="Lire %s">Lire la suite</a></p>'); ?>
  506. }}}
  507. On notera que cette fonction trouve sa place dans un affichage de liste de
  508. billets, plutôt que dans l'affichage d'un seul billet.
  509. @param string s Chaîne de substitution du chapô ('%s')
  510. @param string l Chaîne affichée après le chapô ('<p><a href="%s" title="%s">Read next</a></p>')
  511. */
  512. function dcPostAbstract($s='%s',$l='<p><a href="%s" title="Read %s">Read next</a></p>')
  513. {
  514. global $news;
  515. if ($news->f('post_chapo') != '') {
  516. printf($s,$news->getChapo());
  517. printf($l,$news->getPermURL(),$news->f('post_titre'));
  518. } else {
  519. echo $news->getContent();
  520. }
  521. }
  522. /**
  523. @function dcPostAuthor
  524. Cette fonction affiche le nom canonique de l'auteur du billet. Le nom canonique
  525. est défini en fonction des informations données par le rédacteur. Si un pseudo
  526. est présent, il sera utilisé, sinon, le prénom et le nom seront utilisés.
  527. */
  528. function dcPostAuthor()
  529. {
  530. echo $GLOBALS['news']->getUserCN();
  531. }
  532. /**
  533. @function dcPostDate
  534. Cette fonction affiche la date d'un billet. On peut changer le formatage
  535. de la date en changeant le paramètre '''format'''. Par défaut, ce paramètre
  536. utilisera le format donné dans la configuration du blog.
  537. Voir [http://fr2.php.net/manual/fr/function.strftime.php strftime] pour les
  538. formats possible de date.
  539. @param string format Masque de formatage de la date ('')
  540. */
  541. function dcPostDate($format='')
  542. {
  543. if ($format) {
  544. echo dt::str($format,strtotime($GLOBALS['news']->f('post_dt')));
  545. } else {
  546. echo $GLOBALS['news']->getLDate();
  547. }
  548. }
  549. /**
  550. @function dcPostTime
  551. Cette fonction affiche l'heure d'un billet en utilisant le format donné dans la
  552. configuration du blog.
  553. */
  554. function dcPostTime($format='')
  555. {
  556. echo $GLOBALS['news']->getLTime();
  557. }
  558. /**
  559. @function dcPostLang
  560. Cette fonction affiche l'attribut lang="" pour un billet. Vous pouvez le
  561. positionner dans n'importe quel marqueur. Rien n'est affiché si la langue
  562. n'est pas présente.
  563. */
  564. function dcPostLang()
  565. {
  566. $lang = $GLOBALS['news']->f('post_lang');
  567. if ($lang != '') {
  568. echo 'lang="'.$lang.'"';
  569. }
  570. }
  571. /**
  572. @function dcPostNbComments
  573. Cette fonction affiche le nombre de commentaires d'un billet.
  574. Les trois arguments permettent de définir le texte affiché pour
  575. respectivement aucun, un ou plusieurs commentaires. Par exemple:
  576. {{{
  577. #!php
  578. <?php dcPostNbComments('aucun commentaire','un commentaire',
  579. '%s commentaires'); ?>
  580. }}}
  581. @param string zero Texte affiché pour 0 commentaire
  582. @param string one Texte affiché pour 1 commentaire
  583. @param string more Texte affiché plusieurs commentaires
  584. */
  585. function dcPostNbComments($zero,$one,$more)
  586. {
  587. $nb = $GLOBALS['news']->f('nb_comment');
  588. if($nb == 0) {
  589. echo $zero;
  590. } elseif($nb == 1) {
  591. echo $one;
  592. } elseif($nb > 1) {
  593. printf($more,$nb);
  594. }
  595. }
  596. /**
  597. @function dcPostNbTrackbacks
  598. Cette fonction affiche le nombre de trackbacks d'un billet.
  599. Les trois arguments permettent de définir le texte affiché pour
  600. respectivement aucun, un ou plusieurs trackbacks. Par exemple:
  601. {{{
  602. #!php
  603. <?php dcPostNbTrackbacks('aucun trackback','un trackback',
  604. '%s trackbacks'); ?>
  605. @param string zero Texte affiché pour 0 trackback
  606. @param string one Texte affiché pour 1 trackback
  607. @param string more Texte affiché plusieurs trackbacks
  608. */
  609. function dcPostNbTrackbacks($zero,$one,$more)
  610. {
  611. $nb = $GLOBALS['news']->f('nb_trackback');
  612. if($nb == 0) {
  613. echo $zero;
  614. } elseif($nb == 1) {
  615. echo $one;
  616. } elseif($nb > 1) {
  617. printf($more,$nb);
  618. }
  619. }
  620. /**
  621. @function dcPostNext
  622. Cette fonction permet d'afficher une information sur le billet suivant ou
  623. précédent. Le paramètre '''dir''' indique la direction dans laquelle chercher
  624. le billet (1 pour suivant, -1 pour précédent). Le paramètre '''s''' est une
  625. chaîne de substitution permettant de formater l'affichage des informations
  626. concernant le billet. Il y a trois paramètres à cette chaîne, donnant
  627. respectivement l'ID, le titre et l'url du billet suivant ou précédent. Cette
  628. fonction n'affiche rien si elle ne trouve pas de billet.
  629. On peut l'utiliser pour l'affichage individuel des billets, par exemple:
  630. {{{
  631. #!php
  632. <?php dcPostNext(1,'<a href="%3$s" title="%2$s">Billet suivant</a>'); ?>
  633. }}}
  634. Ceci affichera un lien vers le billet suivant s'il existe et ayant pour titre le
  635. titre du billet.
  636. @param integer dir Direction (1)
  637. @param string s Chaîne de substitution ('%1$s %2$s %3$s')
  638. */
  639. function dcPostNext($dir,$s='%1$s %2$s %3$s')
  640. {
  641. global $blog;
  642. if ($dir > 0 && (empty($GLOBALS['rs_next'])) || empty($GLOBALS['rs_prev'])) {
  643. return false;
  644. }
  645. $rs = ($dir > 0) ? $GLOBALS['rs_next'] : $GLOBALS['rs_prev'];
  646. if (!$rs->isEmpty())
  647. {
  648. $id = $rs->f('post_id');
  649. $titre = $rs->f('post_titre');
  650. $date = $rs->f('post_dt');
  651. $ts = strtotime($date);
  652. $url = sprintf($blog->front_url['post'],date('Y',$ts),
  653. date('m',$ts),date('d',$ts),$id,$blog->str2url($titre));
  654. printf($s,$id,$titre,$url);
  655. }
  656. }
  657. /**
  658. @function dcPostOpenComments
  659. Cette fonction indique si les commentaires sont autorisés pour un billet.
  660. On peut l'utiliser dans un test par exemple.
  661. @return boolean
  662. */
  663. function dcPostOpenComments()
  664. {
  665. return (boolean) $GLOBALS['news']->openComment();
  666. }
  667. /**
  668. @function dcPostOpenTrackbacks
  669. Cette fonction indique si les trackbacks sont autorisés pour un billet.
  670. On peut l'utiliser dans un test par exemple.
  671. @return boolean
  672. */
  673. function dcPostOpenTrackbacks()
  674. {
  675. return (boolean) $GLOBALS['news']->openTb();
  676. }
  677. /**
  678. @function dcPostTrackbackURI
  679. Cette fonction affiche l'URI à pinger pour faire un trackback sur un billet.
  680. */
  681. function dcPostTrackbackURI()
  682. {
  683. echo
  684. 'http://'.$_SERVER['HTTP_HOST'].
  685. dc_trackback_uri.'?id='.$GLOBALS['news']->f('post_id');
  686. }
  687. /**
  688. @function dcPostTrackbackAutoDiscovery
  689. Cette fonction affiche le commentaire HTML contenant les informations
  690. RDF permettant de réaliser la découverte automatique de l'URL de trackback.
  691. On l'utilisera dans l'en-tête du document de préférence.
  692. */
  693. function dcPostTrackbackAutoDiscovery()
  694. {
  695. if ($GLOBALS['mode'] == 'post' && $GLOBALS['news']->openTb())
  696. {
  697. $tb_url = 'http://'.$_SERVER['HTTP_HOST'].
  698. dc_trackback_uri.'?id='.$GLOBALS['news']->f('post_id');
  699. echo '<!--'."\n".
  700. '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n".
  701. ' xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n".
  702. ' xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">'."\n".
  703. '<rdf:Description'."\n".
  704. ' rdf:about="http://'.$_SERVER['HTTP_HOST'].$GLOBALS['news']->getPermURL().'"'."\n".
  705. ' dc:identifier="http://'.$_SERVER['HTTP_HOST'].$GLOBALS['news']->getPermURL().'"'."\n".
  706. ' dc:title="'.$GLOBALS['news']->f('post_titre').'"'."\n".
  707. ' trackback:ping="'.$tb_url.'" />'."\n".
  708. '</rdf:RDF>'."\n".
  709. '-->'."\n";
  710. }
  711. }
  712. # Commentaires ############################################
  713. /**
  714. @doc
  715. === Traitement des commentaires ===
  716. Le traitement des commentaires est régis par la même système de boucle
  717. que les billets. Les fonctions suivantes ne s'utilisent que dans une
  718. boucle de commentaires sauf '''dcCommentFormError''' et '''dcCommentFormValue'''
  719. qui peuvent être utilisés partout.
  720. Exemple d'une boucle de commentaires affichant son contenu
  721. {{{
  722. #!php
  723. <?php while ($comments->fetch()) : ?>
  724. <?php dcCommentContent(); ?>
  725. <?php endwhile; ?>
  726. }}}
  727. */
  728. /**
  729. @function dcCommentContent
  730. Cette fonction affiche le contenu d'un commentaire.
  731. */
  732. function dcCommentContent()
  733. {
  734. echo $GLOBALS['comments']->xGetContent();
  735. }
  736. /**
  737. @function dcCommentContentTransform
  738. Cette fonction affiche un commentaire de type trackback avec le lien vers
  739. l'article dans le corps du commentaire (autour du titre). Sinon, il affiche
  740. que le commentaire comme dcCommentContent().
  741. */
  742. function dcCommentContentTransform()
  743. {
  744. dcCommentContent();
  745. }
  746. /**
  747. @function dcCommentDate
  748. Cette fonction affiche la date d'un commentaire. On peut changer le formatage
  749. de la date en changeant le paramètre '''format'''. Par défaut, ce paramètre
  750. utilisera le format donné dans la configuration du blog.
  751. Voir [http://fr2.php.net/manual/fr/function.strftime.php strftime] pour les
  752. formats possibles de date.
  753. @param string format Masque de formatage de la date ('')
  754. */
  755. function dcCommentDate($format='')
  756. {
  757. if ($format) {
  758. echo dt::str($format,strtotime($GLOBALS['comments']->f('comment_dt')));
  759. } else {
  760. echo $GLOBALS['comments']->getLDate();
  761. }
  762. }
  763. /**
  764. @function dcCommentTime
  765. Cette fonction affiche l'heure d'un commentaire en utilisant le format donné
  766. dans la configuration du blog.
  767. */
  768. function dcCommentTime()
  769. {
  770. echo $GLOBALS['comments']->getLTime();
  771. }
  772. /**
  773. @function dcCommentAuthor
  774. Cette fonction affiche le pseudo de l'auteur d'un commentaire. Avec un lien si
  775. l'auteur a laissé une URL
  776. @param string s Chaîne de substitution, uniquement si l'auteur a laissé une URL
  777. */
  778. function dcCommentAuthor($s='<a href="%1$s">%2$s</a>')
  779. {
  780. if (($link = $GLOBALS['comments']->auteurSite()) !== false) {
  781. printf($s,$link,$GLOBALS['comments']->f('comment_auteur'));
  782. } else {
  783. echo $GLOBALS['comments']->f('comment_auteur');
  784. }
  785. }
  786. /**
  787. @function dcCommentID
  788. Cette fonction affiche l'ID d'un commentaire
  789. */
  790. function dcCommentID()
  791. {
  792. echo $GLOBALS['comments']->f('comment_id');
  793. }
  794. /**
  795. @function dcCommentAuthorLink
  796. Cette fonction affiche le nom de l'auteur avec un lien
  797. vers son adresse email s'il en a laissé une.
  798. @param string s Chaîne de substitution
  799. */
  800. function dcCommentAuthorLink($s='%s')
  801. {
  802. if (($link = $GLOBALS['comments']->auteurLink()) !== false) {
  803. printf($s,$link);
  804. }
  805. }
  806. /**
  807. @function dcCommentAuthorSite
  808. Cette fonction affiche un lien vers le site de l'auteur d'un commentaire
  809. s'il en a laissé un.
  810. @param string s Chaîne de substitution
  811. */
  812. function dcCommentAuthorSite($s='%s')
  813. {
  814. if (($link = $GLOBALS['comments']->auteurSite()) !== false) {
  815. printf($s,$link);
  816. }
  817. }
  818. /**
  819. @function dcCommentPreview
  820. Cette fonction affiche la prévisualisation d'un commentaire. Elle affiche les
  821. émoticones et le formatage tel qu'il sera affiché.
  822. */
  823. function dcCommentPreview()
  824. {
  825. if (!empty($GLOBALS['in_content'])) {
  826. if (dc_use_smilies) {
  827. echo $GLOBALS['blog']->addSmilies($GLOBALS['in_content']);
  828. } else {
  829. echo $GLOBALS['in_content'];
  830. }
  831. }
  832. }
  833. /**
  834. @function dcCommentFormError
  835. Cette fonction affiche les erreurs qui ont pu se produire lors de la soumission
  836. d'un commentaire. Il est conseillé de la laisser.
  837. @param string s Chaîne de substitution
  838. */
  839. function dcCommentFormError($s='%s')
  840. {
  841. if (!empty($GLOBALS['form_err'])) {
  842. printf($s,$GLOBALS['form_err']);
  843. }
  844. }
  845. /**
  846. @function dcCommentFormMsg
  847. Cette fonction affiche un message après la soumission d'un commentaire. Le seul
  848. message actuellement est la confirmation de la réception du commentaire quand
  849. ceux-ci sont modérés. Si vous ne modérez pas les commentaires, cette fonction
  850. peut ne pas être utilisée.
  851. @param string s Chaîne de substitution
  852. */
  853. function dcCommentFormMsg($s='%s')
  854. {
  855. if (!empty($GLOBALS['form_msg'])) {
  856. printf($s,$GLOBALS['form_msg']);
  857. }
  858. }
  859. /**
  860. @function dcCommentFormValue
  861. Cette fonction affiche la valeur d'une variable pour le formulaire de
  862. commentaire. Elle permet par exemple de rappeler les valeurs en cas d'erreur.
  863. Les valeurs possibles de '''var''' sont :
  864. * c_nom : nom
  865. * c_mail : adresse email
  866. * c_site : site web
  867. * c_content : contenu du commentaire
  868. On pourra utiliser par exemple:
  869. {{{
  870. #!php
  871. <input name="c_nom" id="c_nom" type="text" size="30" maxlength="255"
  872. value="<?php dcCommentFormValue('c_nom'); ?>" />
  873. }}}
  874. @param string var Nom de la variable à afficher
  875. */
  876. function dcCommentFormValue($var)
  877. {
  878. echo htmlspecialchars($GLOBALS[$var]);
  879. }
  880. /**
  881. @function dcCommentFormRedir
  882. Cette fonction donne l'url vers laquelle on redirige le client une fois
  883. le commentaire posté.
  884. */
  885. function dcCommentFormRedir()
  886. {
  887. echo util::getPageURL();
  888. }
  889. /**
  890. @function dcCommentIsTrackBack
  891. Cette fonction indique si un commentaire est un trackback.
  892. @return boolean
  893. */
  894. function dcCommentIsTrackBack()
  895. {
  896. return (boolean) $GLOBALS['comments']->f('comment_trackback');
  897. }
  898. /**
  899. @function dcCommentTrackBackURL
  900. Cette fonction retourne l'URL du trackback. Il s'agit en fait de l'URL
  901. du site dans le commentaire. Elle fait simplement un test supplémentaire
  902. pour vérifier que le commentaire est bien un trackback.
  903. */
  904. function dcCommentTrackBackURL($s='%s')
  905. {
  906. if ($GLOBALS['comments']->f('comment_trackback') == 1)
  907. {
  908. printf($s,$GLOBALS['comments']->f('comment_site'));
  909. }
  910. }
  911. # Trackbacks ##############################################
  912. /**
  913. @doc
  914. === Traitement des trackbacks ===
  915. Le traitement des trackbacks suit le même fonctionnement que les
  916. commentaires. Les fonctions suivantes ne s'utilisent que dans une
  917. boucle de trackbacks.
  918. Exemple d'une boucle de trackbacks affichant son contenu
  919. {{{
  920. #!php
  921. <?php while ($trackbacks->fetch()) : ?>
  922. <?php dcTBContent(); ?>
  923. <?php endwhile; ?>
  924. }}}
  925. */
  926. /**
  927. @function dcTBContent
  928. Cette fonction affiche un trackback avec le lien vers
  929. l'article dans le corps du commentaire (autour du titre).
  930. */
  931. function dcTBContent()
  932. {
  933. $content = $GLOBALS['trackbacks']->xGetContent();
  934. $link = '<a href="'.$GLOBALS['trackbacks']->auteurSite().'" rel="nofollow">$2</a>';
  935. echo preg_replace('|(<p><strong>)(.*)(</strong></p>)|msU','$1'.$link.'$3',$content);
  936. }
  937. /**
  938. @function dcTBDate
  939. Cette fonction affiche la date d'un trackback. On peut changer le formatage
  940. de la date en changeant le paramètre '''format'''. Par défaut, ce paramètre
  941. utilisera le format donné dans la configuration du blog.
  942. Voir [http://fr2.php.net/manual/fr/function.strftime.php strftime] pour les
  943. formats possibles de date.
  944. @param string format Masque de formatage de la date ('')
  945. */
  946. function dcTBDate($format='')
  947. {
  948. if ($format) {
  949. echo dt::str($format,strtotime($GLOBALS['trackbacks']->f('comment_dt')));
  950. } else {
  951. echo $GLOBALS['trackbacks']->getLDate();
  952. }
  953. }
  954. /**
  955. @function dcTBTime
  956. Cette fonction affiche l'heure d'un trackback en utilisant le format donné
  957. dans la configuration du blog.
  958. */
  959. function dcTBTime()
  960. {
  961. echo $GLOBALS['trackbacks']->getLTime();
  962. }
  963. /**
  964. @function dcTBAuthor
  965. Cette fonction affiche le nom de l'auteur d'un trackback.
  966. */
  967. function dcTBAuthor()
  968. {
  969. echo $GLOBALS['trackbacks']->f('comment_auteur');
  970. }
  971. /**
  972. @function dcTBID
  973. Cette fonction affiche l'ID d'un trackback
  974. */
  975. function dcTBID()
  976. {
  977. echo $GLOBALS['trackbacks']->f('comment_id');
  978. }
  979. ?>