Pour qu'ils soient utilisables dans votre thème, ces codes sont à placer dans le fichier prepend.php de votre thème. S'il ne s'en trouve pas, copiez le fichier prepend.php du thème par défaut et placez-le dans le répertoire de votre thème actif.
Puis copiez-y le ou les code(s) que vous souhaitez simplement dans le fichier, juste avant la dernière ligne (?>
).
L'utilisation standard dans le thème est d'insérer dans le fichier ***.php du thème du blog l'appel à cette fonction sous la forme :
<?php NomDeLaFonction(); ?>
(Le nom de la fonction est celui qui figure à la première ligne du code proprement dit, juste après les commentaires.)
Notez au début de chaque code le bloc le commentaire qui définit les paramètres de la nouvelle fonction. Par exemple, pour le « Fil d'Ariane », il s'agit de ceci :
* @param string $block Code HTML engloblant la barre de navigation * @param string $item Format d affichage d un niveau * @param string $nav_str Valeur initiale de la ligne de navigation
Notez maintenant le nom de la fonction. Il est donné dans la première ligne de code proprement dit. Dans notre exemple il s'agit de dcQuickNavbar
.
dcQuickNavbar accepte donc trois paramètres, affichés par défaut selon les indications portées dans la parenthèse qui suit la définition de la fonction :
$block = '<div id="quicknav" class="little"><p>%s</p></div>', $item = ' > %s', $nav_str = '<a href="/" title="retour à la page de garde">Accueil</a>')
Si vous utilisez le code dans sa version standard (<?php dcQuickNavbar(); ?>
), l'affichage sera conforme aux réglages par défaut, qui indiquent :
$block
) sera dans un paragraphe, lui-même placé dans une div dont l'identifiant est quicknav
et la class little
;$item
) du chemin d'Ariane sera précédée du signe > (>
) ;$nav_str
) par un lien nommé Accueil ramenant à la racine du site.A l'exception des %s que nous devrons conserver précieusement pour que la fonction… fonctionne, on peut mettre à notre sauce tout le reste. Il faudra alors appeler la fonction sous la forme :
<?php dcQuickNavbar('monblock','monitem','monnav_string'); ?>
Si par exemple je décide de ne pas mettre ce fil sous la forme par défaut mais sous la forme d'une liste d'identifiant ariane
et dont le premier lien renvoie vers ma page d'Accueil (restons crédibles tout de même), mon appel à la fonction deviendra :
<?php dcQuickNavbar('<ul id="ariane">%s</ul>','<li>%s</li>','<li><a href="/" title="retour à la page de garde">Accueil</a></li>'); ?>
Pour « vider » un paramètre on ne place rien entre les deux apostrophes. Pour laisser la valeur par défaut on ne remplit pas le paramètre du tout. Si par exemple je veux juste renommer le bloc qui contient le fil d'Ariane, j'inscrirai :
<?php dcQuickNavbar('<ul id="plop">%s</ul>'); ?>
Pep : ça se passe comment si je veux ne modifier que le troisième paramètre par exemple ? — Anne Cavalier 2007/04/21 17:13
Affichage d'une ligne de navigation dans le style "Vous êtes ici !". Tous les modes ne sont pas pris en compte (ex : search, home) mais il ne s'agit que d'un exemple. A vous de le personnaliser.
Attention :
Si vous avez installé le plugin Pagination, utilisez le code dcQuickNavbar avec pagination à la place de celui-là./** * @param string $block Code HTML engloblant la barre de navigation * @param string $item Format d'affichage d'un niveau * @param string $nav_str Valeur initiale de la ligne de navigation * */ function dcQuickNavbar( $block = '<div id="quicknav" class="little"><p>%s</p></div>', $item = ' > %s', $nav_str = '<a href="/" title="retour à la page de garde">Accueil</a>') { global $blog, $mode, $news; $comp_cat_url = 'rubrique/'; if ($mode == 'cat') { $nav_str .= sprintf($item,$news->f('cat_libelle')); } elseif ($mode == 'related') { $nav_str .= sprintf($item,$GLOBALS['related_title']); } elseif ($mode == 'month') { if ($GLOBALS['cat_id'] != '') { $cat_link = '<a href="'. sprintf($blog->front_url['cat'],$comp_cat_url.$news->f('cat_libelle_url')). '">'.$news->f('cat_libelle').'</a>'; $nav_str .= sprintf($item, $cat_link); } $ts = strtotime($GLOBALS['year'].'-'.$GLOBALS['month'].'-01 00:00'); $nav_str .= sprintf($item,dt::str('%B %Y',$ts)); } elseif ($mode == 'post') { $cat_link = '<a href="'. sprintf($news->blog->front_url['cat'],$comp_cat_url.$news->f('cat_libelle_url')). '">'.$news->f('cat_libelle').'</a>'; $nav_str .= sprintf($item, $cat_link). sprintf($item, $news->f('post_titre')); } printf($block,$nav_str); }
<?php dcQuickNavbar(); ?>
Si vous avez installé le plugin Pagination, c'est ce code-ci qu'il faut copier dans prepend.php. Cette fonction prend en compte la présence du plugin "Pagination" et de son mode particulier.
/** * @param string $block Code HTML engloblant la barre de navigation * @param string $item Format d'affichage d'un niveau * @param string $nav_str Valeur initiale de la ligne de navigation * */ function dcQuickNavbar( $block = '<div id="quicknav" class="little"><p>%s</p></div>', $item = ' > %s', $nav_str = '<a href="%s" title="retour à la page de garde">Accueil</a>') { global $blog, $news; $mode = ($GLOBALS['mode'] == 'pagination')?$GLOBALS['dc_orig_mode']:$GLOBALS['mode']; $comp_cat_url = ''; $nav_str = sprintf($nav_str, dc_blog_url); if ($mode == 'cat') { $nav_str .= sprintf($item,$news->f('cat_libelle')); } elseif ($mode == 'related') { $nav_str .= sprintf($item,$GLOBALS['related_title']); } elseif ($mode == 'month') { if ($GLOBALS['cat_id'] != '') { $cat_link = '<a href="'. sprintf($blog->front_url['cat'],$comp_cat_url.$news->f('cat_libelle_url')). '" '. sprintf('title="%s"',$news->f('cat_libelle')). '>'.$news->f('cat_libelle').'</a>'; $nav_str .= sprintf($item, $cat_link); } $ts = strtotime($GLOBALS['year'].'-'.$GLOBALS['month'].'-01 00:00'); $nav_str .= sprintf($item,dt::str('%B %Y',$ts)); } elseif ($mode == 'post') { $cat_link = '<a href="'. sprintf($news->blog->front_url['cat'],$comp_cat_url.$news->f('cat_libelle_url')). '" '. sprintf('title="%s"',$news->f('cat_libelle')). '>'.$news->f('cat_libelle').'</a>'; $nav_str .= sprintf($item, $cat_link). sprintf($item, $news->f('post_titre')); } printf($block,$nav_str); }
<?php dcQuickNavbar(); ?>
Affichage court de la liste des derniers billets pour une page 'home'.
/** * * @param string $block Chaine de format contenant le code HTML englobant la liste * @param string $item Chaine de format représentant une entrée de la liste * */ function dcRecentHeadlines($block='<ul>%s</ul>',$item='<li>Le %1$s, <a href="%3$s">%2$s</a></li>') { global $news; $res = ''; $news->moveStart(); while ($news->fetch()) { $res .= sprintf($item,dt::str('%d/%m',$news->getTS()),$news->f('post_titre'),$news->getPermURL()); } printf($block,$res); }
<?php dcRecentHeadlines(); ?>
Il s'agit d'une version modifiée de la fonction dcPostAbstract, généralement utilisée pour les affichages de listes de billets.
Cette déclinaison permet d'afficher soit le chapô s'il existe, soit les n premiers caractères d'un billet.
/** * @param integer length Entier précisant le nombre de caractères à afficher si pas de chapô * @param string s Chaîne de substitution de l'extrait ('%s') * @param string l Chaîne affichée après le chapô ('<p><a href="%s">lire la suite</a></p>') */ function dcAltPostAbstract($length = 300, $s='%s',$l='<p><a href="%s">lire la suite</a></p>') { global $news; if ($news->f('post_chapo') != '') { printf($s,$news->getChapo()); printf($l,$news->getPermURL()); } else { printf($s,util::cutString(strip_tags($news->getContent()),$length).' (…)'); printf($l,$news->getPermURL()); } }
<?php dcAltPostAbstract(); ?>
Récupère un fichier contenant du texte formaté en Wiki dans le répertoire du thème et affiche le contenu transformé de ce fichier.
/** * @param string $filename un nom de fichier relatif au chemin du * thème si le premier caractère est différent de / * ou relatif au chemin du blog sinon. * @param string $s une chaine de formatage pouvant contenir du HTML englobant. * */ function dcWikiStickyBloc($filename = 'extra.txt', $s = '%s') { $filename = trim($filename); if (strpos($filename, '/') === 0) { $filename = $_SERVER['DOCUMENT_ROOT'].dc_app_url.$filename; } else { $filename = dirname(FILE).'/'.$filename; } if (is_readable($filename)) { if ($fh = fopen($filename, "rb")) { $bloc = fread($fh, filesize($filename)); fclose($fh); $wiki = new wiki2xhtml(); printf($s, $wiki->transform($bloc)); } } }
<?php dcWikiStickyBloc(); ?>
Pour afficher les billets jour par jour à l'accueil.
<?php // On ne travaille que dans le cadre d'un mode home if ($mode == 'home') { // On récupère la date du jour et on en fait un timestamp $now = getdate(); $today = mktime(0,0,0,$now['mon'],$now['mday'],$now['year']); // On récupère ensuite toutes les dates de publication du mois courant $month_dates = $blog->getAllDates('d', $now['year'], $now['mon']); // On parcourt ce tableau jusqu'à trouver une date correspondant à // notre journée ou une journée directement antérieure $my_date = ''; foreach(array_keys($month_dates) as $ts) { if ($today >= $ts) { $my_date = $ts; break; } } // Si on n'a rien trouvé de convenable, on retombe dans le fonctionnement // par défaut du mode day, c'est à dire, la récupération du dernier jour // de publication global if (empty($my_date)) { $my_date = strtotime($blog->getEarlierDate()); } // On bascule finalement notre mode en day, et on laisse la main à DotClear $day = date('d', $my_date); $month = date('m', $my_date); $year = date('Y', $my_date); $mode = 'day'; } ?>
Une fois cette fonction copiée dans prepend.php vous n'avez plus rien à faire de spécial. Le mode « jour après jour » est opérationnel.
: C'est bien ça Pep ?
Affiche les liens de syndication liés à la catégorie courante. Fonctionnera dans les modes 'cat' et 'month' (si $cat_id est définie)
/** @function dcCatSyndication @param string block Chaine de formatage pour l'affichage du r�sultat @param string link_item Chaine de formatage pour chaque lien @param string sep Chaine de s�paration des liens @param boolean rss1 Affichage du lien RSS 1.0 oui/non @param boolean atom Affichage du lien Atom oui/non @param boolean bloglines Affichage du lien de souscription Bloglines oui/non */ function dcCatSyndication( $block = '<p style="float:left">%s</p>', $link_item = '<a href="%1$s" title="%3$s">%2$s</a>', $sep = ' | ', $rss1 = true, $atom = true, $bloglines = true ) { global $cat_id; global $blog; if (!empty($cat_id)) { $feed_links = array(); $cat_info = $blog->getCat($cat_id); if ($rss1) { $feed_links[] = sprintf( $link_item, dc_blog_rss.'?cat='.$cat_id, 'RSS', "S'abonner au fil RSS de la rubrique ".$cat_info->f('cat_libelle') ); } if ($atom) { $feed_links[] = sprintf( $link_item, dc_blog_atom.'?cat='.$cat_id, 'Atom', "S'abonner au fil Atom de la rubrique ".$cat_info->f('cat_libelle') ); } if ($bloglines) { $feed_links[] = sprintf( $link_item, 'http://www.bloglines.com/sub/http://'.$_SERVER['HTTP_HOST'].dc_blog_rss.'?cat='.$cat_id, 'Bloglines Sub', "Inscrire le fil de la rubrique ".$cat_info->f('cat_libelle')." sur Bloglines" ); } $res = implode($sep, $feed_links); if (!empty($res)) { printf($block, $res); } } }
<?php dcCatSyndication(); ?>
Ajoute des balises <link rel= …> dans l'entête des pages produites par DotClear afin de permettre la découverte automatique des fils de syndication :
/** @function dcContextualFeeds @param boolean rss1 Signaler le fil RSS 1.0 oui/non @param boolean atom Signaler le fil Atom oui/non */ function dcContextualFeeds($rss1 = true, $atom = true) { global $post_id, $cat_id, $blog; $link_str = '<link rel="alternate" type="%s" title="%s" href="%s" />'."\n"; $rss1_type = 'application/rss+xml'; $atom_type = 'application/xml'; if (!empty($post_id)) { if ($rss1) { printf( $link_str, $rss1_type, 'Fil RSS des commentaires du billet', dc_blog_rss.'?type=co&post='.$post_id ); } if ($atom) { printf( $link_str, $atom_type, 'Fil Atom des commentaires du billet', dc_blog_atom.'?type=co&post='.$post_id ); } } elseif (!empty($cat_id)) { if ($rss1) { printf( $link_str, $atom_type, 'Fil RSS des billets de cette rubrique', dc_blog_rss.'?cat='.$cat_id ); } if ($atom) { printf( $link_str, $atom_type, 'Fil Atom des billets de cette rubrique', dc_blog_atom.'?cat='.$cat_id ); } } }
<?php dcContextualFeeds(); ?>
Autres codes utiles :
Ce script permet d'automatiser une sauvegarde de votre base.
<?php # ***** BEGIN LICENSE BLOCK ***** # This file is a simple tool for DotClear. # Copyright (c) 2005 Pep and contributors. All rights # GNU/GPL # # DotClear is a simple and powerful opensource blogware. # Copyright (c) 2004-2005 Olivier Meunier and contributors. All rights # reserved. # # DotClear is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # DotClear is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with DotClear; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ***** END LICENSE BLOCK ***** require_once(dirname(__FILE__).'/../inc/prepend.php'); require_once(dirname(__FILE__).'/../'.DC_ECRIRE.'/tools/mysql/lib.mysqldump.php'); // Ajuster les paramètres suivants à ses propres besoins. $mail_to = "Moi <moi@moi.com>"; $mail_from = "Mon joli blog <no-reply@monjoliblog.com>"; $mail_subject = "[DB DUMP] ". date('d/m/Y'); $mail_body = "Servi tout chaud, votre dump de base de données ! \\o/"; /** PAS BESOIN DE TOUCHER A CE QUI SUIT. **/ /** @function mail_attached Un pompage éhonté de la fonction de J. Coggeshall. Pourquoi ré-inventer la roue ? Par flemme, je ne détaille pas les arguments. Leurs noms sont suffisamment parlant à mon goût... Comme rien ne vaut l'original : * Homepage de John : http://www.coggeshall.org/ * Url de l'article : http://www.theukwebdesigncompany.com/articles/php-file-attachments.php */ function mail_attached($to, $from, $subject, $message, $filename, $headers = '') { $unique_sep = md5(uniqid(time())); $headers .= "From: $from\n". "MIME-Version: 1.0\nContent-Type: multipart/mixed;boundary=\"$unique_sep\";\n". "charset=\"iso-8859-1\"\nContent-Transfer-Encoding:7bit\n\n". "--$unique_sep\n". "Content-Type: text/plain; charset=\"iso-8859-1\"\n". "Content-Transfer-Encoding: 7bit\n\n". $message."\n\n"; if (is_array($filename)) { foreach ($filename as $val) { if(file_exists($val['file'])) { $headers .= "--$unique_sep\n". "Content-Type: {$val['mimetype']}; ". "name=\"{$val['filename']}\"\n". "Content-Transfer-Encoding: base64\n". "Content-Disposition: attachment\n\n"; $filedata = file_get_contents($val['file']); $headers .= chunk_split(base64_encode($filedata)); } else { print("probleme fichier : ".$val['file']." inexistant"); return(false); } } } else { print("probleme : pas de fichiers transmis ou variable erronee"); return(false); } $headers .= "--$unique_sep--\n"; return(mail($to, $subject, $message, $headers)); } /** C'est ici que ça se passe... */ // Connexion MySQL $con = new Connection(DB_USER,DB_PASS,DB_HOST,DB_DBASE); $files[0]['file'] = DC_SHARE_DIR.'/mysql/'.dbdump::saveDump(false, '', '', true); $files[0]['mimetype'] = 'application/x-gzip'; $files[0]['filename'] = 'dbdump_'.date('Y-m-d').".sql.gz"; if (mail_attached($mail_to, $mail_from, $mail_subject, $mail_body, $files)) { print("Fichier de dump envoyé"); unlink($files[0]['file']); } else { print("Erreur avec le fichier de dump"); } $con->close(); ?>
Cette fonction est un simple wrapper pour les appels aux méthodes additionnelles mises en oeuvre par les plugins.
Elle permet d'envisager l'appel aux fonctions d'un plugin sans que cela ne pose problème en cas d'absence du dit plugin.
<?php /** @function dcCall liste d'arguments variable. @param string plugin_method @param mixed method_arguments */ if (!function_exists('dcCall')) { function dcCall() { if (!func_num_args() == 0) { $args = func_get_args(); $call = array_shift($args); $method_call = explode('::', $call); switch (count($method_call)) { case 1 : $call = $method_call[0]; $callable = function_exists($call); break; case 2 : $call = $method_call; $callable = is_callable($call, false); break; default : $callable = false; break; } if ($callable) { return(call_user_func_array($call, $args)); } } return false; } } ?>