Codes en stock

Utilisation les codes en stock

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.)

Comment personnaliser leur affichage ?

Prenons nos marques...

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 = ' &gt; %s',
	$nav_str = '<a href="/" title="retour &agrave; 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 :

  • que la navbar (ligne $block) sera dans un paragraphe, lui-même placé dans une div dont l'identifiant est quicknav et la class little ;
  • que chaque étape ($item) du chemin d'Ariane sera précédée du signe > (&gt;) ;
  • et que ce chemin commence ($nav_str) par un lien nommé Accueil ramenant à la racine du site.

... et personnalisons l'affaire

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 &agrave; 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>'); ?>

FIXME 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

Fil d'ariane

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à.

Code à recopier dans prepend.php

/**
 * @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 = ' &gt; %s',
	$nav_str = '<a href="/" title="retour &agrave; 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);
}

Appel de la fonction

<?php dcQuickNavbar(); ?>

Fil d'ariane (avec pagination)

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.

Code à recopier dans prepend.php

/**
 * @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 = ' &gt; %s',
	$nav_str = '<a href="%s" title="retour &agrave; 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);
}

Appel de la fonction

<?php dcQuickNavbar(); ?>

Billets récents

Affichage court de la liste des derniers billets pour une page 'home'.

Code à recopier dans prepend.php

/**
 *
 * @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);
}

Appel de la fonction

<?php dcRecentHeadlines(); ?>

Extrait revu

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.

Code à recopier dans prepend.php

/**
 * @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).'&nbsp;(&hellip;)');
		printf($l,$news->getPermURL());
	}
}

Appel de la fonction

<?php dcAltPostAbstract(); ?>

WikiStickyBloc (aka KozliBlock)

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.

Code à recopier dans prepend.php

/**
 * @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));
		}
	}
}

Appel de la fonction

<?php dcWikiStickyBloc(); ?>

Mode home en journalier

Pour afficher les billets jour par jour à l'accueil.

Code à recopier dans prepend.php

<?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';
}
?>

Mise en œuvre

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.

FIXME : C'est bien ça Pep ?

Liens contextuels vers les fils de syndication

Affiche les liens de syndication liés à la catégorie courante. Fonctionnera dans les modes 'cat' et 'month' (si $cat_id est définie)

Code à recopier dans prepend.php

/**
@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);
		}
	}
}

Appel de la fonction

<?php dcCatSyndication(); ?>

dcContextualFeeds

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 :

  • des commentaires d'un billet (mode 'post')
  • des billets d'une catégorie (modes 'cat' et 'month')

Code à recopier dans prepend.php

/**
@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&amp;post='.$post_id
				);
		}
		if ($atom) {
			printf(
				$link_str,
				$atom_type,
				'Fil Atom des commentaires du billet',
				dc_blog_atom.'?type=co&amp;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
				);
		}
	}
}

Appel de la fonction

<?php dcContextualFeeds(); ?>

Autres codes utiles :

Pour le dump de la base depuis webcron

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&eacute;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&eacute;");
	unlink($files[0]['file']);
}
else
{
	print("Erreur avec le fichier de dump");
}
$con->close();
?>

Fonction générique d'appel d'une extension

dcCall

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;
	}
}
?>

Wiki powered by Dokuwiki.