(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 = '
Si vous utilisez le code dans sa version standard (''''), 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 **>** (''>'') ;
* 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 :
',
$item = ' > %s',
$nav_str = 'Accueil')
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 :
%s','%s ','Accueil '); ?>
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 :
%s'); ?>
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.
/**
* @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 = '
==== Appel de la fonction ====
',
$item = ' > %s',
$nav_str = 'Accueil')
{
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 =
''.$news->f('cat_libelle').'';
$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 =
''.$news->f('cat_libelle').'';
$nav_str .=
sprintf($item, $cat_link).
sprintf($item, $news->f('post_titre'));
}
printf($block,$nav_str);
}
===== 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 = '
==== Appel de la fonction ====
',
$item = ' > %s',
$nav_str = 'Accueil')
{
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 =
'f('cat_libelle')).
'>'.$news->f('cat_libelle').'';
$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 =
'f('cat_libelle')).
'>'.$news->f('cat_libelle').'';
$nav_str .=
sprintf($item, $cat_link).
sprintf($item, $news->f('post_titre'));
}
printf($block,$nav_str);
}
===== 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='%s
',$item='Le %1$s, %2$s ')
{
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 ====
===== 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ô ('')
*/
function dcAltPostAbstract($length = 300, $s='%s',$l='')
{
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());
}
}
==== Appel de la fonction ====
===== 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 ====
===== Mode home en journalier =====
Pour afficher les billets jour par jour à l'accueil.
==== Code à recopier dans prepend.php ====
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 = '%s
',
$link_item = '%2$s',
$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 ====
==== dcContextualFeeds ====
Ajoute des balises 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 = ''."\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
);
}
}
}
==== Appel de la fonction ====
----
Autres codes utiles :
===== Pour le dump de la base depuis webcron =====
Ce script permet d'automatiser une sauvegarde de votre base.
";
$mail_from = "Mon joli blog ";
$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();
?>
===== 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.