Marquer les nouvelles pages dans les menus

Les pages de Typo3 peuvent être définies comme "nouvelles" jusqu'à une certaine date (champ newUntil).

Pour indiquer les nouvelles pages avec une mention "new" ou "nouveau" dans les menus, ajoutez les définitions TypoScript suivantes dans la construction du menu.

Dans l'exemple ci-après, un objet TMENU général est déclaré. Ensuite, il est utilisé pour chaque niveau de menu en ajoutant les wrap spécifiques du niveau.

Déclaration du TMENU général

Le TMENU "temp.tmenu_general" est déclaré dans l'objet template "temp" (au début).

Pour avoir la marque après le wrap du titre, utiliser after dans les NO et ACT. Pour les avoir avant, utiliser before.

Before et after sont des stdWrap. Il n'y a pas besoin de définir le "|". Ils suivent les conditions if de stdWrap.

La condition sur la valeur de newUntil de la page (inférieure à la date système) est faite par un if de la "fonction" wrap. "negate = 1" annule la réalisation du wrap si la condition n'est pas remplie.

La condition aurait aussi pu être réalisée par une condition sur le TypoScript :[date:U < page:newUntil]. Pas essayé mais ca devrait marcher.

ATagTitle définit le texte du title dans le tag "a" du lien. Il est utilisé uniquement pour les items non actifs. Il fonctionne comme une stdWrap.

Le texte du title dans le tag "a" et le "new" dans l'item du menu sont redondants. Choisissez la présentation que vous préférez.

noTrimWrap est une "special stdWrap", qui ne supprime pas les espaces avant et après les textes du wrap. Elle utilise un "|" en plus au début du texte du wrap pour indiquer les espaces voulus.

TypoScript du TMENU général :

// contient les éléments généraux pour les TMenu des contenus
// notamment la gestion des markeurs New, dans le texte et dans le title du lien (title="new - ...">)
// ce TMenu est copié comme base pour tous les TMENU de chaque niveau des 3 menus
temp.tmenu_general = TMENU
temp.tmenu_general { 
  # menu non explosé par défaut, sauf level 1 (override de la valeur dans le TMenu du level1)
  // par défaut, les sous-menus ne sont pas présenté.
  expAll = 0 

  // pour parser les wrap avec les caractères spéciaux html
  NO.stdWrap.htmlSpecialChars = 1 

  // marque (new) après le texte du titre
  NO {
    after =  (new)
    after.if {
      value.data = date: U
      isLessThan.field = newUntil
      negate = 1
      }
    } 

  // Titre du "new : +titre" pour etiquette si souris dessus
  NO {
    ATagTitle {
      field = title
      noTrimWrap=  |new - |
      if {
        value.data = date: U
        isLessThan.field = newUntil
        negate = 1
        }
      }
    }
  ACT = 1
  ACT.stdWrap.htmlSpecialChars = 1 

  // marker new après le texte du titre
  ACT {
    after = (new)
    after.if {
      value.data = date: U
      isLessThan.field = newUntil
      negate = 1
      } 
  } 
}

Utilisation du TMENU général

Il suffit de copier le TMENU temp.tmenu_general dans les TMENU de chaque niveau des menus.

Ainsi :

# Menu cls cObject
temp.menu_cls = HMENU
  # level 1 menu-object / copie l'objet général TMENU défini dans tmenu_general
  temp.menu_cls.1 < temp.tmenu_general
  temp.menu_cls.1 {
    # menu non explosé par défaut, sauf level 1 (override de la valeur dans le TMenu du level1)
    expAll = 1
    # Normal state properties
    NO.allWrap = <tr class="menuContenusLevelOne"><td class="menuContenusLevelOneImageBullet-no">{$styles.menu.symbolBulletNoAct}</td><td colspan="4" class="menuContenusLevelOne-no"> | </td></tr>
    # Active state properties:
    ACT.allWrap = <tr class="menuContenusLevelOne"><td class="menuContenusLevelOneImageBullet-act">{$styles.menu.symbolBulletActive}</td><td colspan="4" class="menuContenusLevelOne-act" > | </td></tr>
  } 

   # level 2 menu-object
  temp.menu_cls.2 < temp.tmenu_general
  temp.menu_cls.2 {
    # Normal state properties
    NO.allWrap = <tr class="menuContenusLevelTwo"><td> </td><td class="menuContenusLevelTwoImageBullet-no">{$styles.menu.symbolBulletNoAct}</td><td&nbsp; colspan="3" class="menuContenusLevelTwo-no"> | </td></tr>
    # Active state properties:
    ACT.allWrap = <tr class="menuContenusLevelTwo"><td> </td><td class="menuContenusLevelTwoImageBullet-act">{$styles.menu.symbolBulletActive}</td><td colspan="3" class="menuContenusLevelTwo-act"> | </td></tr>
  } 

  # level 3 menu-object
  temp.menu_cls.3  < temp.tmenu_general
  temp.menu_cls.3 {
    # Normal state properties
    NO.allWrap = <tr class="menuContenusLevelThree"><td> </td><td> </td><td class="menuContenusLevelThreeImageBullet-no">{$styles.menu.symbolBulletNoAct}</td><td colspan="2" class="menuContenusLevelThree-no"> | </td></tr>
    # Active state properties:
    ACT.allWrap = <tr class="menuContenusLevelThree"><td> </td><td> </td><td class="menuContenusLevelThreeImageBullet-act">{$styles.menu.symbolBulletActive}</td><td colspan="2" class="menuContenusLevelThree-act"> | </td></tr>
  }