Traitement des marqueurs dans les extensions

De Typo3 CMS / Documentation Typo3 / Support Typo3.

Sommaire

Introduction

L'utilisation des marqueurs ainsi que des templates HTML pose des problèmes récurrents, comme il peut arriver : marqueurs non remplacés, problème de balises vides, trop de code HTML saisi dans le fichier template, etc...

L'idée ici est d'épurer un maximum le PHP et les templates tout en utilisant les fonctions natives de Typo3 - notamment stdWrap.


Hypothèse

Un plugin me renvoie les champs suivants :

$row['title'], $row['date'], $row['img'], $row['bodytext']

Champs de type texte (chaînes simples ou RTE)

Pour charter la sortie en utilisant au maximum la configuration TypoScript, on peut utiliser une fonction de ce type :

function fillMarker ($content,$fieldname)	{
  return $this->cObj->stdWrap($content,$this->conf[$fieldname.'.']['stdWrap.']);
}

Titre

TypoScript :

tx_monPlugin {
 title.stdWrap {
  htmlSpecialChars = 1
  wrap = <h3>|</h3>
  required = 1
 }
}

PHP :

$marker['###title###'] = $this->fillMarker($row['title'],'title');

De cette façon les caractères spéciaux sont traités, et le <h3></h3> autour ne sera affiché que si le texte existe.

Date

TypoScript :

 
tx_monPlugin {
 date.stdWrap {
 strftime = %d/%m/%Y
  noTrimWrap = |<span class= "date">Le : |</span>|
 }
}

PHP :

$marker['###date###'] = $this->fillMarker($row['date'],'date');

Ici on traite directement le timestamp via stdWrap - pas besoin de le préciser dans le plugin comme on le trouve souvent.

De plus, le strftime reprend la LOCALE déclarée dans le TypoScript "config" - aucun souci donc sur un site multilingue.


Texte (RTE)

Pour ce champ il n'est pas obligatoire de passer par al fonction « pi_RTEcssText » ; en effet on peut tout à fait utiliser la même méthode que ci dessus :

TypoScript :

tx_monPlugin {
 bodytext.stdWrap {
  parseFunc = < lib.parseFunc_RTE 
 }
}

PHP :

$marker['###bodytext###'] = $this->fillMarker($row['bodytext'],'bodytext');

Champs image

Ici plutôt que de ne faire que retailler l'image, il vaut mieux utiliser une fonction plus générique, exemple :

$this->conf['img.']['file'] =  'uploads/tx_monPlugin/'.$row['img'];
$this->conf['img.']['altText'] = $altTxt;   // on récupère le alt selon les besoins du module
$marker['###img###'] = $this->cObj->IMAGE($this->conf['img.']);

L'idée étant ici de passer le moins de paramètres possibles à la fonction via PHP - on surcharge juste la config TypoScript avec les champs nécessaires (dans l'exemple : chemin vers le fichier et texte alternatif).

De cette façon on peut pousser plus loin la configuration en TypoScript, exemple :

tx_monPlugin.img {
  emptyTitleHandling=removeAttr
  file.maxW = 150
  imageLinkWrap = 1
  imageLinkWrap {
   bodyTag = <body style="background-color:#49b5d2;">
   wrap = <a href="javascript:close();">|</a>
   width = 800m
   height = 600m
   effects=
   JSwindow = 1
   JSwindow {
    newWindow = 0
    expand = 0,0
   }
   enable = 1
   typolink.parameter.field=image_link
   typolink.extTarget = _blank
  }
  stdWrap.wrap {
   wrap = <div class="image">|</div>
   required= 1
  }
 }

Ici on branche le "clic-enlarge" sur une image retaillée en vignette (largeur maximum : 150px), et on ajoute un <div> autour de l'image (uniquement si cette image est présente)

Outils personnels