Création d'une page sur le blog

Après avoir découvert comment créer un plugin, voyons comment créer une page interactive sur un blog. Nous allons créer un plugin Public example en plaçant les fichiers suivants dans un répertoire appelé /publicExample/.

Le fichier _define.php

<?php
if (!defined('DC_RC_PATH')) {return;}
 
$this->registerModule(
    'Public example',         // Name
    'A public page',          // Description
    'Dotclear Documentation', // Author
    '0.1',                    // Version
    array(                    // Properties
        'permissions' => 'usage,contentadmin',
        'type'        => 'plugin'
    )
);
?>

Note :

Outre le premier test, il est fortement recommandé de le mettre aucun autre code que la ligne d'enregistrement du module dans ce fichier, et de n'y mettre que des chaînes de caractères statiques en guise de paramètres. En effet, ce fichier peut être amené à être lu par des scripts php (console dotaddict notamment), qui pourraient refuser le plugin si d'autres expressions y étaient trouvées.

Le fichier _prepend.php

On enregistre l'URL dans le fichier _prepend.php :

<?php
if (!defined('DC_RC_PATH')) {return;}
 
global $core;
 
# enregistrer l'URL "publicexample"
$core->url->register('publicexample','publicexample',
	'^publicexample(?:/(.+))?$',array('publicExampleDocument','page'));
?>

Paramètres de la fonction register :

  1. le type d'URL, utilisé par Dotclear pour l'identifier
  2. l'URL de base de la page
  3. l'expression régulière de l'URL de la page
  4. un callback, un nom de fonction ou un tableau avec le nom d'une classe et d'une fonction à appeler lorsque cette URL est demandée

Pour accéder à cette URL, quel que soit le contexte, on utilise ce code :

$core->blog->url.$core->url->getBase('publicexample')

publicexample est l'identifiant de l'URL.

Le fichier _public.php

Création de la page

L'URL "publicexample" que l'on a enregistrée dans le fichier _prepend.php appelle la fonction page() de la classe publicExampleDocument. Cette fonction reçoit un paramètre, il correspond à l'expression régulière de l'URL de la page, ici ^publicexample(?:/(.+))? sélectionne le texte après publicexample/ s'il existe. Le plugin affichera un message différent si on demande l'URL "publicexample/hello".

class publicExampleDocument extends dcUrlHandlers
{
	public static function page($args)
	{
		global $core;
 
		# $_ctx est le contexte, on y insère ce que l'on veut
		$_ctx =& $GLOBALS['_ctx'];
 
		# $_ctx->publicExample sera une chaîne de caractères
 
		# si l'URL est "publicexample/lorem"
		if ($args == 'lorem')
		{
			$_ctx->publicExample = __('Lorem ipsum');
		}
		# sinon, si l'URL est "publicexample"
		else
		{
			$_ctx->publicExample = __('Public');
		}
 
		# enregistrer le répertoire qui contient le fichier template par défaut,
		# le fichier public_example.html
		$core->tpl->setPath($core->tpl->getPath(),
			dirname(__FILE__).'/default-templates/');
 
		self::serveDocument('public_example.html','text/html');
	}
}

La variable $_ctx→publicExample est définie en fonction de la valeur de $args, elle sera utilisée plus tard.

Déclaration de la balise

Voir la page spécifique pour plus d'informations.

# déclarer la balise {{tpl:Public}}
$core->tpl->addValue('PublicExampleValue',
	array('publicExampleTpl','PublicExampleValue'));
 
class publicExampleTpl
{
	public static function PublicExampleValue()
	{
		return('<?php echo($_ctx->publicExample); ?>');
	}
}

Le fichier _public.php complet

<?php 
# ***** BEGIN LICENSE BLOCK *****
# 
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.
# 
# ***** END LICENSE BLOCK *****

if (!defined('DC_RC_PATH')) {return;}
 
global $core;
 
class publicExampleDocument extends dcUrlHandlers
{
	public static function page($args)
	{
		global $core;
 
		# $_ctx est le contexte, on y insère ce que l'on veut
		$_ctx =& $GLOBALS['_ctx'];
 
		# $_ctx->publicExample sera une chaîne de caractères

		# si l'URL est "publicexample/lorem"
		if ($args == 'lorem')
		{
			$_ctx->publicExample = __('Lorem ipsum');
		}
		# sinon, si l'URL est "publicexample"
		else
		{
			$_ctx->publicExample = __('Public');
		}
 
		# enregistrer le répertoire qui contient le fichier template par défaut,
		# le fichier public_example.html
		$core->tpl->setPath($core->tpl->getPath(),
			dirname(__FILE__).'/default-templates/');
 
		self::serveDocument('public_example.html','text/html');
	}
}
 
# déclarer la balise {{tpl:PublicExampleValue}}
$core->tpl->addValue('PublicExampleValue',
	array('publicExampleTpl','PublicExampleValue'));
 
class publicExampleTpl
{
	public static function PublicExampleValue()
	{
		return('<?php echo($_ctx->publicExample); ?>');
	}
}
 
?>

Le fichier de template

Situé dans le répertoire default-templates, le fichier de template est appelé public_page.html et il contient ceci :

<!DOCTYPE html>
<html lang="{{tpl:BlogLanguage}}">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
  <title>{{tpl:lang Public example}} - {{tpl:BlogName encode_html="1"}}</title>
 
  {{tpl:include src="_head.html"}}
</head>
 
<body class="dc-publicExample">
<div id="page">
{{tpl:include src="_top.html"}}
 
<div id="wrapper">
 
<div id="main">
  <div id="content">
 
  <div id="content-info">
    <h2>{{tpl:lang Public example}}</h2>
  </div>
 
  <div class="content-inner">  
  	<h3>{{tpl:PublicExampleValue}}</h3>
 
		<ul>
			<li><a href="{{tpl:BlogURL}}publicexample">{{tpl:lang publicexample}}</a></li>
			<li><a href="{{tpl:BlogURL}}publicexample/lorem">
				{{tpl:lang publicexample/lorem}}</a></li>
		</ul>
  </div>
 
  </div>
</div> <!-- End #main -->
 
<div id="sidebar">
  <div id="blognav">
    {{tpl:Widgets type="nav"}}
  </div> <!-- End #blognav -->
 
  <div id="blogextra">
    {{tpl:Widgets type="extra"}}
  </div> <!-- End #blogextra -->
</div>
 
</div> <!-- End #wrapper -->
 
{{tpl:include src="_footer.html"}}
</div> <!-- End #page -->
</body>
</html>

Il utilise la balise

{{tpl:PublicExampleValue}}

déclarée dans le fichier _public.php.

Télécharger ce plugin exemple

Wiki powered by Dokuwiki.