Je me suis basé sur les sources de Dotclear 1.0 RC3 pour ajouter les modifications suivantes : en tant qu'administrateur, je veux pouvoir (ainsi que les rédacteurs avancés) modérer les news qui passent. Pour rajouter ces restrictions, j'ai simplement hacker les fichiers dotclear/ecrire/index.php et dotclear/ecrire/poster.php.

Empêcher l'édition par un simple rédacteur, d'un billet mis en ligne .

Dans index.php

J'ai du modifié le lien permettant d'éditer ou de visualiser un billet. La génération de ce lien est déjà conditionné par ce test :

if ($_SESSION['sess_user_level'] == 9 || $posts->f('user_id') == $_SESSION['sess_user_id']) {
   $edit_links = '[ <strong><a href="poster.php?post_id='.$posts->f('post_id').'">'.
   'éditer</a></strong> | '.
   '<a href="poster.php?post_id='.$posts->f('post_id').'&amp;cancel=1">'.
   $post_cancel.'</a> ] ';
} else {
   $edit_links = '[ <strong><a href="poster.php?post_id='.$posts->f('post_id').'">'.
   'consulter</a></strong> ] ';
}

Ici donc, on met un lien "editer" si l'utilisateur est l'administrateur ou si l'utilisateur est le propriétaire du billet. Sinon on met juste un lien "consulter". Moi je veux qu'en plus, les utilisateurs simple rédacteur ne puissent éditer le billet que si ils sont propriétaires du billet et si le billet n'est pas en ligne (car si il est en ligne, c'est qu'il a été modéré par l'admin, donc ne doit à posteriori, plus à être modifié). Cela se traduit par le test PHP suivant, juste avant celui qu'on vient de voir :

if ($_SESSION['sess_user_level'] == 1 ){ // si l'utilisateur est un redacteur simple
   if($posts->f('post_pub') == 0){ // si le billet n'est pas en ligne
       $edit_links = '[ <strong><a href="poster.php?post_id='.$posts->f('post_id').'">'.
       'éditer</a></strong> ] ';
   }else{
       $edit_links = '[ <strong><a href="poster.php?post_id='.$posts->f('post_id').'">'.
       'consulter</a></strong> ] ';
   }
}else
 if ($_SESSION['sess_user_level'] == 9 || $posts->f('user_id') == $_SESSION['sess_user_id']) {
  ...

On pourra remarquer qu'en fait, dans notre cas, en consultation ou modification, seul le libellé du lien change. On pourrait optimiser mais bon...

dans poster.php

Il faut également refaire ce test dans poster.php, au cas où le redacteur connait le bon lien à taper pour éditer un billet ;-). Dans ce fichier nous avons ce test qui permet de savoir si on peut éditer ou non le billet (test qui est semblable au précédent) :

if( $post->f('user_id') != $_SESSION['sess_user_id'] && $_SESSION['sess_user_level'] < 9){

$is_editable = false;

}

Modifions le pour prendre en compte nos nouvelles règles :

if( ($_SESSION['sess_user_level'] == 1 && $post->f('post_pub')> 0) ||
    ($post->f('user_id') != $_SESSION['sess_user_id'] && $_SESSION['sess_user_level'] < 9) ){

$is_editable = false;

}

Empêcher la mise en ligne d'un billet édité par un rédacteur simple

Reste maintenant à faire les modifications, pour que lorsque un utilisateur simple rédacteur crée ou modifie un de ces billet, celui-ci ne puisse pas être mis en ligne directement. Tout se passe dans poster.php.

On va d'abord limiter le choix dans la petite combo-box "état" que l'on a dans le formulaire, qui permet de choisir si le billet va être mis en ligne ou hors-ligne. Actuellement, cela se présente comme suit (vers la ligne 300) :

 <?php echo php_f_combobox('p_etat',array('En ligne'=>'1','Hors Ligne'=>'0'),$etat); ?>

Pour un utilisateur simple rédacteur, on va limiter le choix dans la combo :

 <?php

if($_SESSION['sess_user_level'] == 1) echo php_f_combobox('p_etat',array('Hors Ligne'=>'0'),$etat); else

 		echo php_f_combobox('p_etat',array('En ligne'=>'1','Hors Ligne'=>'0'),$etat);
 ?>

Trop facile :-). Blindons tout de même le script. En effet, lorsqu'on clique sur "publier", on retourne sur poster.php. Et à un moment, on récupère la valeur sélectionnée, dans $_POST['p_etat'], vers la ligne 175 :

$etat = $_POST['p_etat'];

Transformons ça :

 if($_SESSION['sess_user_level'] == 1)
  	$etat=0;
 else 
       $etat = $_POST['p_etat'];

Voilà qui satisfait mes délires paranoïaques :-)

Avoir la liste des news sur votre home page.

J'ai également fait une autre modif : pouvoir intégrer dans la homepage les x dernière news. J'ai fait pour cela un fichier prepend_home.php, qui est un prepend.php allégé. Ensuite, sur la home, il suffit de rajouter, comme dans le template, mais en plus allégé, les instructions suivantes (ici avec mon propre gabarit HTML..) :

<?php # Si on a une quelconque erreur, on affiche l'erreur
   if ($err_msg != '')
   { ?>
       <div class="erreur"><strong>Erreur : </strong>
       <?php echo $err_msg; ?></div>
   <?php # Si aucune erreur et mode != post on affiche une liste de billets
   }else{ 
       # Boucle sur la liste de billets
       while (!$news->EOF())
       { ?>
        <div class="news">
           <h2 id="p<?php dcPostID(); ?>"><?php dcPostTitle(); ?></h2>
           <?php 
               dcDayDate('<p class="newsdate">%s</p>'); 
               dcPostAbstract('%s'); 
            ?>
           <p class="post-info">Par <?php dcPostAuthor(); ?>,
           à <?php dcPostTime(); ?>
           :: <a href="<?php dcPostCatURL(); ?>"><?php dcPostCatTitle(); ?></a>
           :: <a href="<?php dcPostURL(); ?>"
           title="Lien permanent vers : <?php dcPostTitle(); ?>">#<?php dcPostID(); ?></a>
           :: <a href="<?php dcPostURL(); ?>#co"><?php
           dcPostNbComments('aucun commentaire','un commentaire','%s commentaires');
           ?></a></p>
       </div>
       <?php # Fin de la boucle
       $news->moveNext();
       } 
   }
$con->close();
?>

Téléchargement

Vous trouverez les fichiers modifiés dans cette archive.