DotClear 2 et les templates (7)

Nous avons un petit problème à résoudre (voir ce billet pour en retrouver l'énoncé). DotClear 2 inclut la possibilité de définir ses propres balises template au niveau du thème[1]. Pour cela, il faut créer un fichier _public.php qui contiendra tout le code PHP nécessaire au traitement de ces balises.

Revenons à notre problème. Nous avons besoin d'éviter l'imbrication de deux balises <tpl:Entries> (lignes 1 et 4) :

1. <tpl:Entries category="!Flash" no_content="1">
2.   <tpl:Pagination>
3.     <tpl:PaginationIf start="1">
4.       <tpl:Entries category="Flash" lastn="1">
5.         …
6.       </tpl:Entries>
7.     </tpl:PaginationIf>
8.   </tpl:Pagination>
9. </tpl:Entries>

L'idée que j'ai retenue est de faire en sorte de positionner une variable si l'on est sur la première page, juste après la ligne 3, puis de tester cette même variable une fois sorti du bloc template <tpl:Entries> (ligne 9). Voilà le nouveau code (j'ai mis l'emphase sur ce qui est nouveau) :

{{tpl:FlagFirstPage}}
<tpl:Entries category="!Flash" no_content="1">
  <tpl:Pagination>
    <tpl:PaginationIf start="1">
      {{tpl:FlagFirstPage true="1"}}
    </tpl:PaginationIf>
  </tpl:Pagination>
</tpl:Entries>
<tpl:FlagFirstPageIf true="1">
  <tpl:Entries category="Flash" lastn="1">
    …
  </tpl:Entries>
</tpl:FlagFirstPageIf>

Deux nouvelles balises doivent être développées. La première, {{tpl:FlagFirstPage}}, sert à positionner la variable dont je ai parlé précédemment. Si la balise est utilisée sans aucun paramètre, la variable sera initialisée à false (faux). Si la balise contient un attribut true="1" alors la variable sera initialisée à true (vrai). La deuxième, sous forme de bloc de test (<tpl:FlagFirstPageIf></tpl:FlagFirstPageIf>) sert à tester la valeur de la variable ce qui permettra de réutiliser une balise <tpl:Entries> pour récupérer le dernier billet de la catégorie Flash[2].

Voyons maintenant à quoi ressemble ce fichier _public.php qui contiendra tout le code nécessaire.

<?php

class dcFallSeason
{

  static public function FlagFirstPage($attr)
  {
    if (isset($attr['true'])) {
      $flag = 'true';
    } else {
      $flag = 'false';
    }
    return '<?php $dcFallSeasonFlagFirstPage = '.$flag.'; ?>';
  }

  static public function FlagFirstPageIf($attr,$content)
  {
    $if = '';

    if (isset($attr['true'])) {
      $sign = (boolean) $attr['true'] ? '' : '!';
      $if = $sign.'$dcFallSeasonFlagFirstPage';
    }

    if ($if != '') {
      return '<?php if('.$if.') : ?>'.$content.'<?php endif; ?>';
    } else {
      return $content;
    }
  }

}

// Add Flag management to the template scheme
$core->tpl->addValue('FlagFirstPage',
    array('dcFallSeason','FlagFirstPage'));
$core->tpl->addBlock('FlagFirstPageIf',
    array('dcFallSeason','FlagFirstPageIf'));

?>

Que fait tout ce code ? La première fonction, FlagFirstPage, est utilisée lors du remplacement de la balise {{tpl:FlagFirstPage}} et donnera le code PHP suivant :

<?php $dcFallSeasonFlagFirstPage = false; ?>

ou

<?php $dcFallSeasonFlagFirstPage = true; ?>

si on utilise l'attribut true="1" dans la balise. La deuxième fonction, FlagFirstPageIf, est utilisée lors du remplacement de la balise <tpl:FlagFirstPageIf></tpl:FlagFirstPageIf> et donnera le code suivant (si on l'utilise tel que je l'ai fait plus haut) :

<?php if($dcFallSeasonFlagFirstPage) : ?>
 …
<?php endif; ?>

Je vais arrêter là pour la description du code PHP du fichier _public.php à moins que vous vouliez que je détaille tout ce qui s'y trouve, à vous de choisir. En fonction de vos réponses je continuerai la dessus, sinon — ou si je n'ai pas de réponse — je continuerai l'exercice prévu.

À suivre …

Notes

[1] Il est également possible d'en définir avec un plugin mais ça dépasse le cadre de ce tutoriel.

[2] Vous aurez surement remarqué que ce bloc a été déplacé plus bas et en dehors du premier bloc de même nature.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/3113

Haut de page