TypoScript By Example

Transcription

TypoScript By Example
TypoScript By Example
Revised Kasper Spring 2001 – french release 11/2003 (terry Durant)
Extension Key: doc_core_tsbyex_fra
Copyright 2000-2002, Kasper Skårhøj, <[email protected]>
This document is published under the Open Content License
available from http://www.opencontent.org/opl.shtml
The content of this document is related to TYPO3
- a GNU/GPL CMS/Framework available from www.typo3.com
TypoScript By Example - 1
Table of Contents
TypoScript By Example............................... 1
Introduction.....................................................................3
Ce document.............................................................. 3
D'autres documentations........................................... 3
En ai-je besoin?......................................................... 3
Qu'est ce que le TypoScript template (gabarit)?......... 3
Préalable du traducteur.............................................. 3
Overview..................................................................... 3
Exemple cas : “Inclure un gabarit”..............................5
Gérer la hiérarchie des Templates............................. 6
Cas d'exemple : "Extension"..................................... 6
Managing extensions................................................. 7
Pour plus de lecture................................................... 8
Gabarit standard............................................................. 8
Introduction................................................................. 8
Table static_template................................................. 9
Content rendering details........................................... 9
Typical setup of a standard template (paramétrage
typique d'un gabarit standard).................................... 9
Tutorial de base : démarrez un nouveau website......10
Un simple website à partir de zéro...........................10
Un website avec un menu léger...............................12
Insérer un menu graphique...................................... 13
Contenu du site........................................................ 13
Concepts.................................................... 15
“&id” et “&type”........................................................... 15
Enveloppes (wraps)..................................................... 16
Structure de données (arrays) (1,2,3,4...) .................. 17
Numerical arrays (structure de données numériques).
17
String arrays (structure de données de chaîne de
caractères)................................................................17
“styles.content.[xxx]”.................................................. 18
Example from "content (default)"............................. 18
Sections éducatives................................... 21
Introduction...................................................................21
Code notation conventions:........................................ 21
stdWrap...................................................... 23
Le concept “stdWrap”................................................. 23
Propriétés de stdWrap ................................................ 24
Get data.................................................................... 24
Override / Conditions................................................ 26
Objets de contenu (cObject)...................... 28
Introduction...................................................................28
COA.......................................................................... 28
FILE.......................................................................... 30
IMAGE...................................................................... 30
IMG_RESOURCE.....................................................31
CLEARGIF................................................................ 31
HRULER................................................................... 31
CTABLE and OTABLE..............................................32
Gabarit (TEMPLATE)................................................ 35
FORM (formulaire)....................................................38
CAS d'exemple......................................................... 40
LOAD_REGISTER....................................................42
imgResource et GIFBUILDER.................... 44
Introduction...................................................................44
Un fichier normal en entrée......................................... 44
Masques Bitmap...................................................... 44
Importer une image.................................................. 45
GIFBUILDER................................................................. 47
GIFBUILDER - bases............................................... 49
+calc......................................................................... 49
.niceText................................................................... 50
L'objet GIFBUILDER TEXT.......................................51
L'objet IMAGE...........................................................51
Navigation.................................................. 53
HMENU.................................................................... 53
TMENU..................................................................... 53
IMGMENU................................................................ 55
optionSplit.................................................................57
GMENU.................................................................... 57
Images avec GMENU............................................... 59
GMENU_LAYER...................................................... 60
Prolonger un fond d'image au menu entier..............61
PHP include-scripts.................................... 64
PHP_SCRIPT cObject.............................................. 64
Inspiration................................................................. 64
Exemple: “Userdefined tags”....................................65
Content rendering (restitution de contenu)..
68
Introduction............................................................... 68
CONTENT.................................................................69
colPos.......................................................................70
styles.content (default)............................................. 73
lib.stdheader............................................................. 73
RECORD.................................................................. 74
Réponses aux Challenges......................... 77
TypoScript By Example - 2
Introduction
Ce document
C'est une introduction à l'utilisation de TypoScript. Il essaye de vous permettre de comprendre la manière dont est pensé et
fonctionne TypoScript. Beaucoup de petits exemples sont utilisés pour vous aider à saisir TypoScript qui vous préparent peu
à peu à aller de plus en plus loin.
D'autres documentations
Un document très important est TypoScript reference (TSref), qui contient tous les détails sur TypoScript. Le problème
avec un document de référence est qu'il y a très peu d'exemples. Ce présent document est une façon plus amicale pour le
lecteur de se familiariser avec TypoScript.
Tutoriels
Il y a une série d'autres didacticiels très productifs à lire également. Ainsi, “Content_rendering.pdf” en est un dont le sujet
traite de “content rendering” (restitution des contenus).
En ai-je besoin?
Oui. Si vous travaillez dans les couches (layer) au-dessus de F1 dans “Typo3 Overview”. Mais tout dépend de jusqu'où vous
voulez aller. Si vous trouvez TypoScript très embrouillé, vous obtiendrez un excellent résultat avec très peu d'options et
restituerez ensuite le contenu avec vos propres PHP-scripts. Vous pouvez aussi baser votre projet sur un des modèles
(templates) standards qui sont du type “fixed layout”, mais extrêmement facile à configurer pour une large possibilité
d'options différentes.
Qu'est ce que le TypoScript template (gabarit)?
Préalable du traducteur
Je me permets, Kasper m'en excusera d'introduire cet addendum pour tenter de vous faire rapidement et clairement
comprendre quelques mécanismes fondamentaux dans le fonctionnement de Typo3 quand à la restitution des pages.
Je dois cette “illumination” à Maries Cohen qui dans un document, “Typo3 Template Basics” que vous trouvez à cette
adresse http://www.mcuniverse.com/index.php?id=847&type=0 , réussit à nous expliquer, preuve à l'appui, c'est à dire son
site, et avec beaucoup de simplicité et d'efficacité les composants et comment ils interagissent.
Comme elle nous l'explique, vous constaterez qu'il existe trois éléments qui interagissent lors du processus de restitution
puis d'affichage d'une page par Typo3 :
1.
Part 1: “HTML Template“ (Gabarit Html) dont l'exemple qu'elle nous montre correspond à la structure de son site avec le
bandeau, puis le menu du dessus, etc ..
2. Part 2: “Typo3 Template” (Gabarit Typo3) dont elle nous montre le contenu et dont nous pouvons constater les effets sur
son site. Le Template (gabarit) Typo3 définit pour Typo3 au moment de la restitution comment il doit interagir avec le
“HTML Template” et le “CSS Stylesheet” ainsi que différentes manières qu'il doit appliquer pour afficher la page.. Le
“Typo3 Template” est composé de trois sections principales : “Constants”, “Setup” et “Static”.
3. Part 3: “CSS Stylesheet” (Feuille de Style en cascade) habituelle pour tous les habitués de la publication sur Internet ou
en Html.
Noterez la distinction introduite de restitution (pourrait aussi s'appeler mise en page mais ce serait trop restrictif) et affichage
qui met en jeu notamment le cache des pages.
Overview
Normalement un "template" est un FICHIER HTML qui décrit une composition (layout) et certaines des zones (areas) qui
devraient être substitués par un autre contenu (content) déterminé. Dans Typo3 vous pouvez utiliser cette approche, même
si vous faites du TypoScript. Voir les autres didacticiels pour plus d'information.
Mais un "template" ou un "template record" (gabarit enregistré) comme celui dont on parlera dans ce document est en fait
un enregistrement (record) dans une table, nommée "sys_template", de la base de données de Typo3. Le fait d'enregistrer
un lien entre une Page quelconque et ce "template record" va définir la manière dont la page va s'afficher en appliquant le
Template auquel on l'a associée.
Pour comprendre les Templates, vous devriez lire le “Guide d'introduction à TypoScript”. Vous trouverez aussi une
information précise et détaillée dans le document “TSREF” (Ts Référence).
Vous êtes connecté en tant que “admin” sur Typo3 et dans le menu (cadre de gauche) vous sélectionner l'option “Doc”, puis
sélectionner un Template dans la liste des objets proposés, par exemple "NEW SITE, based on standard" qui a été vu dans
TypoScript By Example - 3
“Quickstart tutorial”. Cette page est une vue d'ensemble des champs de la table du Template :
1.
"Template title": titre qui apparaîtra dans la liste des
enregistrements sur l'onglet “web-tab” Choix libre
2.
"Website title": titre du site apparaîtra comme titre du
Browser “HTML-title” et précédant celui des pages affichées
(page-titles). Sur cette page http://typo3.org/1421.0.html
“Typo3.org” (website title) précède “Document library”.
3.
"Constants": contient les "Constantes” que vous déclarez et
qui sont ensuite utilisées à fin de substitution dans le champ
“setup”. Exemple : "styles.content.textStyle.size" déclarée
est insérée dans le champ “setup” de la manière suivante
"{$styles.content.textStyle.size}". Les constantes sont
substituées dans le même ordre que ceux présenté dans ce
champ. Il est important de comprendre que des constantes
ne sont pas employées en tant que variables de
programmation. Elles substituent seulement les instances
des constantes déclarées lors de l'installation. Notez que les
instances des Constantes que vous déclarez sont rajoutées
à celles des gabarits (template) existants de la “rootline”
("RootLine". This is an array with information about title, uid
from $uid an back to the root) et s'ajoutent également aux
constantes déclarés dans les “gabarits inclus” (voir "Clear"
(6)).
4.
"Setup": Ce champ contient le code de configuration de
TypoScript. Employer les constantes du '"champ
Constantes" (3) pour insérer facilement des valeurs de
propriétés avec variantes ou des valeurs globales. Notez que
les instances du champ “setup” sont rajoutés à celles du
champ “setup” inclus dans les gabarits (template)
préexistants dans le rootline ainsi qu'à celles incluses dans
les “gabarits inclus” (voir au-dessous (6))"clear".
5.
"Ressources": Ce champ peut contenir des médias comme
des images, des masques, des polices Truetype, des feuilles
de styles (stylesheets), du HTML et des documents de texte
Ceux-ci peuvent être référencés depuis TypoScript (Datatype
"ressource") et sont alors alors copiés avec les gabarits
(template).
Lors de la libélisation d'une référence à une "ressource",
utilisez cette déclaration : "image*.gif" au lieu de :
"image.gif". L'emploi de l'astérisque prépare le Gabarit pour
la duplication car "image*.gif" permet d'assortir le gabarit
dupliqué avec son image correspondante dont le nom sera
"image_01.gif" qui est justement celui généré lorsque un
gabarit est reproduit par duplication.
6. "Clear" & "Rootlevel": "Clear" donne la possibilité d'annuler
les déclaratifs des champs “constantes” et/ou “configuration
(setup)” de gabarit pré-positionnés dans la lignée (rootline).
Pour une explication plus approfondie, se référer au TSref.
"Rootlevel" détermine que ce point de l'organigramme des
pages va se comporter comme la racine (startpage) d'un
nouveau site Web
7. l"Include static": vous laisse inclure des “gabarits statiques”
fournis avec Typo3 par défaut. L'ordre (à partir de la racine)
est l'ordre avec lequel, les gabarits sont inclus. Les “gabarits
statiques” sont inclus avant le Gabarit du champ "Inclure un
gabarit" (8).
"RootLine". This is an array with information
about title, uid from $uid an back to the root..
= Structure d'information concernant le Titre, le
Uid (identification)et le chemin depuis la
racine)
8. "Include basis template": Pour inclure vos propres Gabarits.
Voir le cas "Include basis template" exposé ci-après.
9. "Template on next level": Vous pouvez inclure un Gabarit qui
s'appliquera pour les pages à partir du prochain niveau dans
l'arbre-structure hiérarchique de Typo3!
10. "Description": Écrire vos propres notes ici..
TypoScript By Example - 4
Exemple cas : “Inclure un gabarit”
Une approche sympathique de l'utilisation des Gabarits est
celle permettant de créer des bibliothèques de code
TypoScript dans un Gabarit pour l'inclure ensuite dans un
autre Gabarit pour y réutiliser le code TypoScript. C'est
exactement ce qu'est le “Gabarit statique”
Mais les “Gabarits statiques” ne peuvent pas être édités. Ils
sont distribués avec Typo3 et ne sont pas destinés à être
changés, mais sont prévus pour que leurs capacités soient
étendues (de nouveaux gabarits statiques seront écrits).
Vous avez par contre la possibilité d'inclure des Gabarits
dans d'autres Gabarits.
Dans cet exemple je (Kasper) montrerai comment j'ai fait les
sites Web de www.typo3.com et www.typo3.dk. Ils sont très
semblables. Par conséquent, j'ai créé un Gabarit commun
pour contrôler la conception. Mais j'ai également fait
différentes "extensions" pour ce qui concerne l'anglais le
danois etc..
Afin de partager un Gabarit entre deux sites ou plus, les
sites doivent résider dans la même base de données. C'est
le cas du site Web Typo3 dans les deux langues. Les
avantages en sont très évidents : Tous les graphiques,
pages et arrangements (layout) sont faciles à copier et à
mettre à jour quand ils sont accessibles à partir de la même
page d'accès Typo3.
Regarder l'image ci-contre (clic-souris pour une fenêtre
séparée). Dans la page racine (rootpage) des sites '"com" et
'dk" il y a un Gabarit ("Rootlevel" étant cliqué). Chaque
Gabarit inclut le Gabarit principal, qui est trouvé dans le
dossier "Skabeloner" (signifie "template" en danois) Le
Template principal contrôle quasiment en totalité
l'arrangement (layout) des sites. Et chaque site partage en
commun ce Template ! !
Regardez maintenant les images ci-contre. Elles font partie
du contenu dans chacun des Templates de "com" et de "dk".
Vous y voyez quelques valeurs qui sont substituées
(remplacées). Pour chaque site, les contenus des métaétiquettes (meta-tag) "mots-clés” (keywords) et "description"
sont différents. Les constantes appropriées sont en effet
substituées afin de les changer. Vous noterez également
que le Template danois change quelques autres
paramètres.
C'est très intéressant. Les changements locaux sont
possibles dans un branchement du site Web tandis que
l'arrangement (layout) global peut encore être changé depuis
le Template principal. C'est fort sympathique de pouvoir
ainsi utiliser des Templates standards. Ils ont un ensemble
de constantes que vous pouvez modifier afin de
personnaliser à votre site.
TypoScript By Example - 5
Gérer la hiérarchie des Templates
Vous pouvez facilement superviser quels sont les Templates inclus dans votre site avec la fonction “Template Analyzer”
dans le module “web_ts” :
Celui-ci montre non seulement quels sont les “Templates” et les “Templates statiques” qui sont inclus mais également dans
quelles commandes (et de là où ils sont lancés) ils sont traités et si un quelconque de ces Templates a des commutateurs
(witch) activés ou non tels que "Clear constants" et "Clear setup"“Clear".
Cas d'exemple : "Extension"
Les exemples ci-dessus ont indirectement montré l'ampleur des possibilités des extensions ; Les changements spécifiques
au site étaient des extensions (TypoScript substitués ou constantes) du Template principal.
A présent, je vais vous montrer comment les pages FAQ de la section “developer” de ce site Web ont est créées :
Tout d'abord, j'utilise un autre genre d'en-tête pour la section FAQ. Ce “headertype” a un cadre gris autour et vous pouvez
choisir cet en-tête pour des items de “contenu” où que ce soit sur le site ("Layout 2"). Mais le type d'en-tête par défaut est
"Layout 1". Ainsi pour la section FAQ (les pages "blueish" sur la première image ci-dessous), j'ai fait une extension car le
type d'en-tête par défaut devrait être "2" et non "1" pour toutes les pages dans cette section, soit ce qui signifie "toutes les
pages de la section FAQ et aussi à l'extérieur". "all pages from FAQ and outwards".
La tâche est effectuée en créant un nouveau Template sur la page "FAQ". Dans ce Template les champs "Clear" et
"Rootline" ne doivent pas être activées. Si ils le sont, une nouvelle mouture du site Web démarrera en partant de ce point au
TypoScript By Example - 6
lieu d'être une extension au Template de base !
Les informations du Gabarit sont montrée sur la deuxième image. Comme vous le voyez le type d'en-tête par défaut est
spécifiée à "2" et la taille du bodytext par défaut est spécifiée à "1" (normalement "2").
Naturellement je pourrais changer la taille de police et le type d'en-tête pour chaque élément de contenu … mais
franchement, c'est une manière tout à fait pénible de faire, alors que vous pouvez la spécifier aussi simplement que ceci …
Contrôler la section FAQ pour voir pour vous-même ! Cela fonctionne. Aucune dispute.
Check the FAQ-section and see for yourself! It works. Aucun désagrément..
Managing extensions
Encore une fois, le “Template Analyzer” montre sa maniabilité ici :
TypoScript By Example - 7
Pour plus de lecture
Dans le TSref il y a également une explication de la façon dont les descripteurs fonctionnent.
Gabarit standard
Introduction
Typo3 offre une approche facile pour créer des sites Web et pour commencé avec TypoScript. Un groupe de Gabarits
standards est packagé avec Typo3.
La plupart des sites Web basés sur Typo3 se fondent sur des Gabarits de TypoScript. Afin de comprendre les Gabarits,
vous devriez lire cette introduction à TypoScript. Vous trouverez également une information complète dans le TSref.
Si vous voulez tester certains des Gabarits standards et étudier des exemples interactifs, se référer s'il vous plaît au
“demosite” sur le site “demo.typo3.com”.
TypoScript By Example - 8
Table static_template
Les Gabarits statiques sont des enregistrements de la table "static_template" et sont des enregistrements de niveau racine.
Cela signifie qu'ils sont toujours trouvés à la racine de la hiérarchie des pages (pagetree) et peuvent seulement être
visualisés par des administrateurs. La table est également "en lecture seulement" (configuration dans les tables.php). C'est
tous simplement parce que les Gabarits statiques ('"static_template") contiennent des enregistrements qui ne sont pas
censés être changés par n'importe qui. Ils agissent comme un socle pré-définis (preset chunks) de code de TypoScript. La
table "static_template" est distribuée avec chaque nouvelle version de Typo3 (contenant les enregistrements ajoutés).
Ci-dessous, vous pouvez voir le contenu du Gabarit statique tel qu'il était en septembre 2000. Celui-ci a pu avoir changé
pour la version en cours de Typo3. Mais il est utile pour expliquer comment cela fonctionne :
1. "template: ...": C'est le Gabarit standard. Quand vous voulez
créer un site Web basé sur un Gabarit standard, vous ajoutez
ceci en-tête de la liste des gabarits statiques inclus dans votre
Gabarit
Tous les Gabarits standards incluent le Gabarit"content
(default)" pour la fonction de restitution de Typo3.
2.
"content (default)": Ce Gabarit contient un cOject "tt_content"
qui sert pour restituer les items de contenu d'une page. Inclus
par tous les Gabarits jusqu'à présent. Certains des types les
plus exotiques (Ctype) concernant des items de contenu ne
sont cependant pas restitués. "styles.content (défaut)" est
inclus dans ce Gabarit.
3. "styles.content (défaut)" : Cet élément contient un grand
nombre d'objets TS prédéfinis pour l'usage avec par exemple
“content-rendering, "powered-by"-logos, content-inserting”,
"actionner-by"-logos, et ainsi de suite. Ces objets sont
largement utilisés par "content (default)" et beaucoup de
propriétés sont réglables en tant que constantes déclarées
pour une modification facile du comportement de la restitution
des contenus
4. "cSet (default)" : C'est un genre d'extension au Gabarit
"styles.content (default)". L'objectif est de substituer par
exemple des définitions cibles (target-definitions) dans un
grand nombre des objets du Gabarit "styles.content (default)"
par une constante commune, ce qui le rend beaucoup plus
commode la modification des valeurs pour tous les objets
cibles.”cSet” concerne également d'autres valeurs applicables
comme les couleurs de fond et les couleurs des polices et il
concerne donc la couche supérieure de “restitution”
(apparence). Très utile pour la création rapide des sites Web
basés sur les Gabarits standards ; 1) Inclure le Gabarit
standard. 2) Inclure "cSet (default)". 3) Remplacer quelques
paramètres de "cSet"..... Voyez comment il est utilisé dans les
Gabarits sur le “demo-site”.
5. "frame set.": Différents frame sets (jeu de cadre) standard.
Utilisé par quelques Gabarits standards.
6. "styles...": Certains objets standards comme les menus, les
sitemaps, les en-têtes et ainsi de suite. Cette section peut se
développer avec un bon nombre de pré réglages intéressants
comme des panneaux(boards), catalogues, calendriers
systèmes (calender-systems) et ainsi de suite.
Content rendering details
Lire le document content_rendering.pdf ou se référer à http://www.typo3.com/Content-rendering_an.1102.0.html
Typical setup of a standard template (paramétrage typique d'un gabarit standard)
C'est la hiérarchie d'un site Web fictif basé sur le Gabarit standard BUG :
TypoScript By Example - 9
Dans le “Template Analyzer” il ressemble à ceci :
Tutoriel de base : démarrez un nouveau website
A partir d'ici, encore plus d'exemples de TypoScript
Un simple website à partir de zéro
Si vous voulez commencer un site Web à partir du tout début, vous devez créer un Gabarit à la première page du site Web.
Cette page peut être référencée comme "racine du site Web" ou généralement “Page d'accueil”. La "page d'accueil" n'est
pas automatiquement la toute première page dans l'arbre hiérarchique des pages (pagetree) de Typo3 mais peut être toute
page de l'arbre que vous voulez voir se comporter en tant que point de départ d'un site Web !
Le Gabarit initial doit avoir les boîtes à cocher (checkboxes) "Clear constants and setup" et "Rootlevel" activées. Afin de
comprendre le pourquoi, vous devez savoir que tous les Gabarits à partir de la racine du pagetree et en parcourant le
pagetree sont lus et exécutés.Ceci s'appelle le "rootline" :
TypoScript By Example - 10
Dans cette image, sur la droite, le rootline (chemin à la racine) de la page "Experienced web...." (3) parcourt tout le chemin
depuis la page "www.typo3.com" (zéro). Ceci parce qu' il y a un Gabarit enregistré à la page "www.typo3.com" avec
l'indicateur de rootlevel activé (voir ci-dessous). Sur la gauche vous voyez comment le rootline est représenté à l'intérieur de
la zone de données PHP (PHP-array .
Si vous vous posez une question comme "Est-ce que la page 730 est dans le rootline?" alors la réponse est oui dans ce
cas-ci, parce que la page avec l'identification 730 ("Introduction") s'avère justement être la deuxième page dans le rootline (à
index 1). Veuillez voir le TSref pour plus d'information
La case "Rootlevel" activée implique que le Gabarit annonce le début d'un nouveau site Web pour la page où le Gabarit se
trouve mis en fonction. Si vous ne placez pas ce checkbox, le Gabarit agit en tant qu'extension à n'importe quel Gabarit
dans le rootline avant lui.
La case "Clear constants" activée implique que toutes les constantes des Gabarits précédents dans le rootline sont effacés
avant que le chargement du Gabarit activé sur cette page.
"Clear setup" activée implique que n'importe quel code de TypoScript des Gabarits précédents dans le rootline sont effacés
avant que le chargement du Gabarit activé sur cette page.
Si vous essayez de regarder la page maintenant, un errormessage apparaîtra
Vous devez écriture quelques instances de TypoScript dans les champs "Constants" et "Setup". Normalement vous incluez
certains des Gabarits statiques pour commencer, mais pour cet exemple nous faisons un petit Gabarit à partir de zéro.
Écrivez donc les instances suivantes dans le champ "Constants" :
bgCol = red
Vous avez à présent défini une constante appelée - "bgCol" – avec la valeur "red". Nous allons insérer d'autres constantes
dans le champ "setup" en insérant :
page = PAGE
page.typeNum = 0
page.bodyTag = <BODY bgColor="{$bgCol}">
page.10 = HTML
page.10.value = Hello World
page.10.value.case = upper
Ceci ressemble à ceci dans votre browser
TypoScript By Example - 11
Cet exemple montre un certain nombre de points concernant TypoScript. Commençons avec les deux premières lignes. Ici
"page" est définie pour être une “PAGE-object”. Une propriété exigée pour un “PAGE-object” est la valeur de 'typeNum” qui
est spécialement utilisé quand un site Web utilise des cadres (frames) (dans ce cas, le typeNum identifierait les différents
cadres). Si le typeNum est zéro, il correspond alors à une page sans la valeur de type, soit par exemple "?id=51". C'est le
cas des sites Web sans cadres (frames)
Une autre propriété de PAGE-objet est "bodyTag". A partir d'ici, vous entrez dans le domaine des étiquettes qui concernent
le corps de page. Veuillez noter que la couleur de fond est rouge parce que nous avons inséré la constante dans le champ
"Constants".
Enfin, un “Content-objet” du type "HTML" est défini. La valeur est mise à "Hello World". Ceci est envoyé hors fonction Typo3
au site Web (fonction Php). Mais vous verrez que la restitution est faite en “haut de casse” (majuscule) par ce que la valeur
et toutes les propriétés sont analysée par la fonction "stdWrap" (habillage standard). Une propriété de "stdWrap" est le
"case" qui peut être "upper" ou "lower". Faites une conjecture de ce que peut faire "lower" …
Un website avec un menu léger
Maintenant nous ajouterons un petit menu au site Web.Ce menu doit être situé au-dessus du texte "Hello World". Ajouter
maintenant ceci au bas du champ "Setup"
page.5 = HMENU
page.5.1 = TMENU
page.5.1.wrap = | <BR><BR>
page.5.1.NO {
linkWrap = &nbsp;<font color=yellow> | </font>&nbsp;
ATagBeforeWrap = 1
}
Et voici comment vous définissez un nouvel objet de contenu (contenu-objet) à la position 5 dans la “content-array”
(structure d'information) de la page. Le type d'objet est HMENU. HMENU a une structure d'information numérique des objets
“menu”. Ici nous utilisons "TMENU" comme menu-objet pour le premier niveau. Ceci nous donne un menu de type texte
TypoScript By Example - 12
“textbased”. Pour le “TMENU-objet” nous avons placé la propriété "enveloppe" (wrap). Comme vous pouvez vous en
rappeler, "a wrap” (enveloppe) signifiera qu'elle sera fractionnée par le caractère "|" et que les deux premières parties seront
placées autour de "quelque chose". Dans ce cas-ci (page.5.1.wrap = | < BR><BR >) le menu entier est enveloppé de sorte
que deux nouvelles lignes apparaissent après le menu.
Puis, quelques propriétés sont définies pour “.NO" sous TMENU. “.NO" signifiant l'installation des éléments de menu en
condition “normale”. Une autre des conditions peut être "ACT" (Active) qui entraînerait que quand un menu-élément est
quelque part dans le “chemin d'accès" (path), il est intégré dans le site Web. Par exemple vous pourriez changer la couleur
de l'élément en blanc si vous voulez indiquer visuellement sur le menu-élément qu'un visiteur surfer a récemment écrit sur
cette section du site.
Sous “.NO" vous définissez que chaque menu-élément est enveloppé dans une étiquette de police qui met en jaune le “lien”.
"ATagBeforeWrap" est une option qui vous indique que l'étiquette de ”Lien” (< A >) doit être habillé dans le menu-élément
avant l'application de l'étiquette de Police (ou bien la couleur jaune sera ignoré par l'étiquette-couleur normale).
Insérer un menu graphique
Au lieu du menu textuel que vous avez juste défini, vous pourriez insérer le menu graphique du site Web Typo3. Ceci serait
effectué en utilisant ce code en lieu et place du code précédent :
page.5 < temp.topmenu
Contenu du site
Maintenant vous voudriez ajouter le contenu au site Web. Dans la solution standard de TypoScript le table de contenu
principale est "tt_content". Ainsi vous ajoutez un nouvel objet contenu du type CONTENT. Vous avez mis la propriété "table"
avec la valeur “tt_content”.
Pour configurer la requête du “sql-select” vous définissez la propriété "pidInList" de l'objet "select". Quand vous le mettez à
TypoScript By Example - 13
"this" le pid correspondant à l'enregistrement du contenu (content-record) DOIT correspondre au “id” de la page actuelle !
"orderBy" est mis avec la valeur "sorting" qui correspond à la colonne dans la table tt_content qui va déterminer le tri des
éléments
page.10 = CONTENT
page.10 {
table = tt_content
select {
pidInList = this
orderBy = sorting
}
}
Pour que cela fonctionne, vous devez définir comment chaque enregistrement de contenu va être disposé (layouted). Par
défaut ceci est défini par le “root-object” l'objet racine "tt_content".
Voici un exemple court de TypoScript qui produirait du contenu pour l'en-tête et le texte de CType :
tt_content = CASE
tt_content.key.field = CType
tt_content.header {
1 = TEXT
1.field = header
1.wrap = {$cHeaderWrap}
1.space = 3 | 2
}
tt_content.text < tt_content.header
tt_content.text {
3 = TEXT
3.field = bodytext
3.fontTag = {$cBodyTextWrap}
3.br = 1
3.space = | 10
3.parseFunc {
makelinks = 1
makelinks.http.keep = path
makelinks.http.wrap = <B>|</B>
makelinks.mailto.keep = path
makelinks.mailto.wrap = <FONT color="blue">|</FONT>
makelinks.mailto.ATagBeforeWrap = 1
}
}
Il y a deux constantes ici, cBodyTextWrap et cHeaderW rap Celles-ci doivent être alors définies dans le champ
“Constantes” du Gabarit et avoir pour valeur i
cHeaderWrap = <FONT face="Verdana" size="3" color="#333333"><B>|</B></FONT>
cBodyTextWrap = <FONT face="verdana" size="2"> | </FONT><BR>
Maintenant, ceci nous donnerait une en-tête de taille 3, Verdana, en gris et gras. Le bodytext serait formaté également avec
le Verdana mais en taille 2 et avec une étiquette < BR>- après la section
TypoScript By Example - 14
Concepts
“&id” et “&type”
id se rapporte au "numéro de page" dans Typo3, au champ "uid" de la “table de page”. Indique quelle page montrer
type indique pour une page, quelle "partie" de la page montrer. Ceci est principalement employé quand vous faites de sites
basés sur des cadres 'frame'. Vous pourriez l'employer pour d'autres situations également. Je n'expliquerai pas le frameset
ici, mais vous trouverez de quoi dans le Tutoriel 3, "Frames avec Typo3". Par contre, je vais donner un conseil sur la façon
dont le paramètre "type" d'un URL est employé :
Considérer le testsite :
id=10 ("index.php?10") ramène cette même page. "type" n'est pas défini, mais par défaut, c'est zéro et le résultat est
identique Essayer de changer la valeur du type
&type=1
&type=2
&type=3
Comme vous pouvez voir une valeur du type avec 3 valeurs différentes donne le même résultats dans une page nonconfigurée. C'est logique parce qu'en regardant le TypoScript dans le Gabarit, nous nous rendons compte que "typeNum=3"
n'est pas défini
TypoScript By Example - 15
Mais comment le Gabarit apparaît?. Jetons un coup d'oeil dans le Template Analyzer
Comme vous voyez le Gabarit inclut beaucoup de “static_template” et le premier d'eux semble être un static_template avec
un cadre (frameset) dedans. En jetant un coup d'oeil à ce static_template, nous voyons ceci:
3 Objets “page” sont définis, "page", "left" et "frameset". Chaque objet PAGE définit l'apparence visible à l'affichage en se
servant de la valeur "&type"
Enveloppes (wraps)
L'enveloppe est un concept très important pour beaucoup d'objets de TypoScript. . Une enveloppe "wrap" est une chaîne de
caractères (text string), qui est délimité (divisé en parties) par "|" (ligne verticale, ALT+0124). Ceci est une enveloppe“wrap”:
<B>
|
</B>
Et si la chaîne de caractères "World" est enveloppée par l'enveloppe, le résultat est ceci :
<B>WORLD</B>
Noter que quoiqu'il y ait les espaces entre les parties de l'enveloppe et le diviseur ("|"), chaque pièce d'enveloppe est
équilibrée (le réglage doit enlever les espaces blancs "whitespace" avant et après quelque chose. Les "Whitespace" sont le
caractère “espace”, “tabulation” et le “linebreak”
Vous allez pouvoir réaliser que c'est très, très utile parce que le HTML est tout à fait sur le même principe qui consiste à
envelopper des “choses” dans des étiquettes HTML. De cette façon, il sera très facile de le contrôler et de l'exploiter. (BTW:
L'enveloppe est énumérée comme un “type de donnée” dans le Tsref).
TypoScript By Example - 16
Structure de données (arrays) (1,2,3,4...)
Parfois, vous verrai les propriétés listées comme suit : "1,2,3,4..." ou "Array...". UN autre cas rencontré est le “datatype set to
"array of strings".
Numerical arrays (structure de données numériques)
Il est nécessaire de comprendre que TypoScript n'est pas un langage comme le Javascript. TypoScript est plus une liste de
déclarations (définitions). L'ordre des déclarations est positionné par les “array numbers”. En fait TypoScript est enregistré
dans une structure de données (array) PHP. Il n'est pas exact de dire qu'on ne puisse enregistrer des déclarations qu'avec
TypoScript. En effet, quelques déclarations fonctionnent par appel de fonctions PHP (comme le stdWrap). Ils peuvent
manipuler et même obtenir des données de résultat. C'est pourquoi TypoScript est beaucoup plus flexible et puissant que
les simples descripteurs de HTML.
Un bon exemple des propriétés qui soient de type “structure de données numériques” (numerical array) est l'objet Page. Le
fait à noter concernant l'objet PAGE est qu'il devrait renvoyer un certain contenu. Afin qu'il puisse le faire, vous devez lui
rattacher quelques objets “contenu” (contents) (cObject) (nous le verrons plus tard). Un objet “cObject” assez simple est
"HTML" ou "TEXT". Ils font la même chose (mais pas de la même manière).
page = PAGE
page.typeNum=0
page.10 = TEXT
page.10.value = Hello world
Ceci définit un objet Page et affichera les textes "Hello world" sur votre browser. "10" pourrait être 934290873 ou tous
nombres entiers. Mais pourquoi "10" alors. Pour moi c'est une tradition, mais ce sujet intervient maintenant, parce que si
vous voulez ajouter encore plus de contenu à la page, comment vous faites cela ? Et bien, vous ajoutez juste un autre
cObject à la structure de données (array) comme ceci :
page = PAGE
page.typeNum=0
page.10 = TEXT
page.10.value = Hello world
page.20 = TEXT
page.20.value = <BR>Are you listening?
Maintenant pourquoi utiliser "20" ? Bien, en fait, utilisez n'importe quel nombre plus grand que “10”. Mais laissez de la place
pour de nouveaux cObjects entre 10 et 20. On ne sait jamais…
Une chose importante à comprendre est que les alignements numériques sont toujours triés. Les alignements non
numériques n'ont jamais n'importe quelle commande attachée à eux, mais les alignements numériques ont. La
conséquence des alignements numériques trié par leur nombre est celle :
Une chose importante à comprendre est qu'une “structure de données” numérique est toujours triée. Les "structures de
données" non numériques n'ont jamais d'ordre rattachée à eux, mais les "structures de données" numériques en ont
toujours. La conséquence des "structures de données" numériques triées par leur nombre est celle-ci :
page = PAGE
page.typeNum=0
page.10 = TEXT
page.10.value = Hello world
page.5 = TEXT
page.5.value = <BR>Are you listening?
... la ligne "<BR>Are you listening?" est maintenant affichée avant "Hello world" quoiqu'elle aient été définies dans un ordre
inverse. Normalement vous verrez TypoScript qui est bien codé dans l'ordre de la "structure de données" numériques, mais
c'est juste une bonne habitude du programmeur du fait qu'il est plus lisible de cette façon.
String arrays (structure de données de chaîne de caractères)
Chaque fois qu'une chaîne de caractères est défini (comme l'objet de META dans TypoScript), c'est parce que les clés
(éléments dans l'array) sont uniques et cela à un sens. META est un bon exemple. Si vous voulez mettre des Métaétiquettes "description" et "mots-clés"(keywords) sur votre page, faites ceci:
page = PAGE
page.typeNum=0
page.meta.REFRESH = 60; index.php?id=34
page.meta.DESCRIPTION = This is the description of the content in this document
page.meta.KEYWORDS = key, words, ...
Ceci a comme conséquence ce code HTML dans l'en-tête du site (qui est très, très vide, si vous essayez ceci …)
<meta http-equiv="REFRESH" content="60; index.php?id=34">
<meta name="DESCRIPTION" content="This is the description of the content in this document">
<meta name="KEYWORDS" content="key, words, ...">
TypoScript By Example - 17
“styles.content.[xxx]”
Si vous étudiez le static_template, particulièrement "content (default)", vous verrez une utilisation étendue des objets du
"styles.content.[xxx]".
Tout d'abord, vous devez comprendre que les objets de niveau supérieur (toplevels object) nommés "temp" et "styles" sont
totalement exclus après qu'un Gabarit ait été (parsed) analysé et "compilé" (by serialize()) pour enregistrement dans
l'antémémoire allouée au gabarits (cache_hash). La raison en est que parfois il est très utile de pouvoir réutiliser un objet
dans beaucoup d'endroits du TypoScript. Créer des objets quelque part dans les objets “styles” ou “Temp” a pour avantage
que les objets peuvent y être recopiés depuis vers vos scripts tout en étant à la fin éliminés pour ménager l'espace libre
dans le cache de gabarits.
Vous devrez utiliser "temp." pour vos propres objets partagés, "styles." étant réservé pour fournir les objets partagés en
commun pour leur utilisation dans les static_templates.
Example from "content (default)"
# CType: image
tt_content.image = COA
tt_content.image {
10 = < lib.stdheader
20 < styles.content.imgtext
}
Dans cet exemple un objet du static_template "styles.content (défaut)" est copié sur la position "tt_content.image.20". Et
cela ressemble à ce que vous voyez dans ce navigateur d'objet (browser object):
Regarder dans le Gabarit statique (tatic_template) "styles.content (défaut)" nous voyons que l'objet "styles.content.imgtext"
est défini comme ceci :
# imgtext
styles.content.imgtext = IMGTEXT
styles.content.imgtext {
imgList.field = image
textPos.field = imageorient
imgPath = uploads/pics/
imgObjNum = 1
1 {
file.import.current = 1
file.width.field = imagewidth
params = align="top"
imageLinkWrap = 1
TypoScript By Example - 18
....
}
maxW = {$styles.content.imgtext.maxW}
maxW.override.data = register:maxImageWidth
....
}
Maintenant, si je veux changer la valeur de "styles.content.imgtext.maxW" en "400", alors j'ai deux options. Mais on y voit
aussi une erreur très commune et on doit plutôt essayer ceci:
styles.content.imgtext.maxW = 400
Vous voyez, ceci ne vous aidera pas. La raison en est que l'on change la valeur dans l'objet "styles.content.imgtext" et pas
dans "tt_content.image.20" où il est de fait et au final utilisé dans ce cas-ci. Alors, vous pouvez choisir l'une de ces
possibilités
1) Puisque "styles.content.imgtext" est copié "tt_content.image.20" par l'opérateur "<" de TypoScript, toutes les propriétés de
"styles.content.imgtext" sont maintenant également dans "tt_content.image.20". Par conséquent vous pouvez changer la
valeur de cette façon:
tt_content.image.20.maxW = 400
C'est manifestement en accord avec le “nodetree” (arbre de noeud) du browser d'objet, n'est-ce pas ?
2) Si vous changez la valeur de "styles.content.imgtext.maxW" directement, vous devez également la reproduire là ou elle
est utilisée :
styles.content.imgtext.maxW = 400
tt_content.image.20 < styles.content.imgtext
Ceci fonctionne également, mais on se rende compte qu'on efface tous les changements précédents faits dans
"tt_content.image.20" (à la manière de la méthode 1 présentée dans l'exemple)
Je recommande la méthode 1
Quoi qu'il en soit vous devez vous rendre compte que l'avantage astucieux des objets 'styles.content.[xxx ]" réside dans ce
qu'il fournit les propriétés par défaut qui peuvent être utilisés dans tout vos Gabarits. Alors que le fait de changer
"styles.content.[xxx]" et de le recopier ailleurs n'apporte pas de changement aux autres objets qui ont été positionnés sur
"styles.content.[xxx]"
Pour exemple, considérez "tt_content.textpic.20" qui utilise également "styles.content.imgtext" :
tt_content.textpic = COA
tt_content.textpic {
10 = COA
10.if.value = 25
10.if.isLessThan.field = imageorient
10.10 = < lib.stdheader
}
20 < styles.content.imgtext
20.text.10 = COA
20.text.10 {
if.value = 24
if.isGreaterThan.field = imageorient
10 = < lib.stdheader
}
20.text.20 = < tt_content.text.20
Afin de changer également la valeur ici, vous devez ajouter cette ligne:
tt_content.textpic.20.maxW = 400
Maintenant, pourriez-vous ajouter ceci maintenant ?
styles.content.imgtext.maxW = 400
tt_content.image.20 < styles.content.imgtext
tt_content.textpic.20 < styles.content.imgtext
La réponse est "non" dans ce cas-ci, parce que si vous jetez un coup d'oeil sur le TypoScript pour “tt_content.textpic”, les
propriétés de “styles.content.imgtext” sont modifiées après que l'objet soit copié
...
20 < styles.content.imgtext
20.text.10 = COA
20.text.10 {
if.value = 24
if.isGreaterThan.field = imageorient
10 = < lib.stdheader
TypoScript By Example - 19
}
20.text.20 = < tt_content.text.20
...
Cette situation est généralement résolue en utilisant les constantes largement mises en application, et dans ce cas
spécifique vous avez l'occasion de changer la constante "styles.content.imgtext.maxW".
TypoScript By Example - 20
Sections éducatives
Introduction
A partir de maintenant, vous êtes encouragé à suivre les exemples en utilisant le “Testsite” fourni avec Typo3. A tout moment, référez-vous à
TSref de manière à vous familiariser avec lui. Ce sera votre bible quand vous travaillez avec Typo3. (When you're not working with Typo3, I can
recommend the true God's Word instead. Much better in real life.)
Utiliser le Testsite standard avec votre nouveau Gabarit rattaché à la racine du branchement de la page "Startpage".
Code notation conventions:
1) Tous les codes TypoScript utilisent la fonte courrier
page = PAGE
page.typeNum=0
page.10 = TEXT
page.10.value = Hello world
2) La plupart des exemples omettent les deux premières lignes qui sont supposées présentes :
page.10 = TEXT
page.10.value = Hello world
TypoScript By Example - 21
3) Le code peut être raccourci dans le cas d'exemples où le changement ne concerne qu'une
seule ligne. Les changements sont mis en valeur en rouge)
page.10 = TEXT
page.10.value = Hello world
page.10.case = upper
a pu également être énoncé de cette manière:
...
page.10.case = upper
TypoScript By Example - 22
stdWrap
Le concept “stdWrap”
(Prononcé "Standard wrap" - “enveloppe standard”). stdWrap est un “assistant” qui conviens dans beaucoup de situations.
Ce concept d'enveloppe est mature. Pour illustrer avec des exemples, je vous présenterai l'utilisation des objets de contenu
“TEXT” et “HTML” (cObjects). Ré ferrez-vous à TSref:
Le "TEXT" cObject semble avoir pour propriété “.value”.Le “Datatype” est ".value" lequel est ce que vous souhaitez du
moment qu'il figure dans la liste des datatypes. (Avec datatype qui est "HTML-color", vous auriez à indiquer une couleur
HTML comme valeur, telle que le “red” ou encore le code "#FF0000").
Le cOobject "HTML" lui aussi a pour propriété “.value”. Il est défini comme étant "HTML" – ce qui concrètement reviens au
même que pour l'objet “TEXT”. De fait, c'est tout simplement une valeur de “chaîne de caractères” (st ring-value).
La différence entre les deux cObjects semble être la manière dont stdWrap est implémenté (mis en oeuvre). Mais jetez
d'abord un coup d'oeil sur la description de l'objet stdWrap dans le TSref.
Ce sont certaines des propriétés de stdWrap. Fondamentalement l'objet stdWrap (parfois également appelé "fonction")
traite (principalement du moins) le contenu de manière quelconque. Une propriété qui a une fonction apparente immédiate
est la propriété “.case” (cass e de caractère) de l'objet stdWrap. ".case" n'est pas énuméré dans ces exemples, mais aller
regarder par vous-même dans le TSref (au fait, il est vraiment temps que vous ouvriez “Le livre")
La propriété “.case” peut convertir la casse (ensemble des caractères d'une même police) en entrée. A présent, en accord
avec la description des cObject TEXT et HTML, on va présenter la manière dont ils fonctionnent :
Le cObject TEXT :
Les propriétés de stdWrap sont incluses dans l'objet TEXT lui même. Ceci signifie que :
page = PAGE
page.typeNum=0
page.10 = TEXT
page.10.value = Hello world
page.10.case = upper
TypoScript By Example - 23
... va afficher en résultat "HELLO WORLD"
Le cObject HTML:
Les propriétés de stdWrap sont incluses dans la propriété “.value” de l'objet HTML. Cela impliquera que
page = PAGE
page.typeNum=0
page.10 = HTML
page.10.value = Hello world
page.10.value.case = upper
... va afficher "HELLO WORLD"
(Commentaires: Les propriétés de stdWrap sont un peu in conséquemment mis en application sur l'objet de TEXT parce
que la propriété '.value" est "mélangée" avec les propriétés de stdWrap. Heureusement la propriété ".value" n'est pas définie
pour l'objet stdWrap. Mais de toute façon, c'est une mauvaise conception - peut-être aussi une confusion concernant l'objet
"TEXT". C'est le cas également de quelques autres objets comme “CARRAY”
Tandis que vous en êtes là...
Essayez de regarder la source de la page que vous avez juste créée. Notez que Typo3 définit par défaut une en-tête et la
bodysection de HTML pour vous ! En plaçant des propriétés pour l'objet “Page”, vous pourrez cependant modifier la teneur
de ces derniers sections. Voir même les neutraliser.
Implémentation générale
Le stdWrap est très puissant et ainsi compense le fait que TypoScript ne peut pas vraiment être programmé pour contrôler
aucun des éléments de la structure, à l'exception de "conditions", puisque vous pouvez faire en sorte que std Wrap compare
des valeurs, puis sur la base du résultat de choisir de renvoyer une autre valeur, et ainsi de suite.
Normalement vous verrez des propriétés stdWrap mises en application comme vous avez pu voir la propriété de “.value” du
cObject HTML. Réferrez-vous à l'exemple “acn” dans le TSref qui est tout comme.... enfin, presque la moitié des valeurs des
propriétés que vous pouvez définir, y compris plusieurs des propriétés pour le stdWrap elle-même!'
Propriétés de stdWrap
Comme nous avons vu précédemment, stdWrap est un concept qui fonctionne - basé sur ses propriétés – et sur un certain
“.value”. Mais il y a une autre tâche importante effectuée par stdWrap qui peut être bien plus populaire (ou nécessaire).
C'est celle permettant d'aller récupérer un contenu externe, par exemple le titre de la page, la date du jour, d'un cObject, du
nombre de rangées d'une requête, d'une liste de fichiers d'un répertoire ou d'une variable globale.
En fait, stdWrap est un concept divisé en trois parties.
1. Get data (obtenir)
2. Override / Conditions
3. Parse data (analyse et traitement)
L'exemple au-dessus montre seulement les possibilités de “parsing” du stdWrap (3). Nous allons maintenant regarder le
"Get Data" (1) et le "Override/Condition" (2), qui fournissent une manière de faire des structures de commande dans Typo3
(bien que de manière un peu simpliste et compliqué)
Get data
La propriété primaire ici est "field". Ceci ramène la valeur du champ donné par la propriété. La bonne question est : "...
valeur d'un champ provenant d'où, quel enregistrement?".
La réponse est par défaut la page encours "by default, the page record..." (ici, “page" se réfère à la page courante sur
laquelle nous sommes) "... Mais pour 'inside of' CONTENT, RECORD and HMENU cObjects, c'est le 'current record' avec
lequel nous sommes en train d'opérer présentement. Vous trouverez des notes à ce sujet en regardant les descriptions
d'objet.
Techniquement tout ceci va dans le contenu de tslib_content rattaché à la classe tslib_cObj et le 'current record' est défini
par cObj->data.
“.current” - Qu'est-ce?
TypoScript By Example - 24
Souvent la valeur courante est référée à quelques fonctions qui doivent passer une simple valeur au "public" (c'est nous et
stdWrap...) et positionne donc sur un registre "register" appelé "current", la valeur que nous avons pu facilement passer par
la propriété de stdWrap ".current = 1" (boolean). Toutes les fois que le registre "courant" devra être utilisé, ce sera précisé
dans le TSref.
Exemple:
page.10 = TEXT
page.10.value = Hello world
page.10.field = title
(Après ces lignes "page = PAGE" et "page.typeNum=0" sont présumés “vrai”)
L'affichage devient "Startpage" et non pas "Hello world". C'est parce que la valeur d'entrée du cObject TEXT est écrasée par
la valeur du champ "title", défini par la propriété du “.field” de stdWrap. Wo w! Si vous voulez voir, quels champs sont
disponibles et leur contenu, ajoutez la propriété ".debugData=1"
C'est ce que vous obtenez (tableau en-dessous). Si vous examinez le code HTML, vous verrez que ceci doit être exactement
les informations de debug ("debug-information") parce qu'elles sont envoyées sur le browser avant n'importe lequel des
contenus de la page.
Maintenant, essayez d'atteindre la page une seconde fois. Ceci n'est pas réapparue parce que la page s'affiche depuis le
cache stocké lors du premier affichage ! Wow. Ainsi parce que ce service produit seulement l'information pendant
l'exécution de TypoScript (pendant la restitution et affichage de la page), vous devez continuellement effacer le cache (ou
placer une option no_cache) afin de voir le processus d'affichage complet (restitution et affichage).
Exemple: Obtenir un autre champ
page.10 = TEXT
page.10.value = Hello world
page.10.field = crdate
Ceci produit un nombre, qui est le temps “UNIX” écoulé depuis 1970 (en nombre de secondes).
TypoScript By Example - 25
Challenge (stdWrap/1)
En utilisant les ”parsing-properties” (propriétés d'analyse et traitement) du stdWrap, pouvez-vous formater cette date sous
une apparence de résultat humainement lisible ?
Exemple: ”.data”
Si vous vouliez obtenir d'autres valeurs, la propriété “.data” est le plus souvent suffisante. Vous pouvez même l'employer
pour obtenir vos champs comme précédemment. Ainsi
page.10 = TEXT
page.10.field = title
ET
page.10 = TEXT
page.10.data = field:title
fait la même chose dans ce cas-ci (exception de l'objet TMENU, pour lequel le '->') Va obtenir la valeur d'une variable
globale. Avant que vous continuiez ici, veuillez aller sur "index.php?id=5"
page.10 = TEXT
page.10.data = global:id
donne "5"
page.10 = TEXT
page.10.data = global:HTTP_GET_VARS|id
donne aussi "5" (cette fois ci proviens de HTTP_GET_VARS[id])
page.10 = TEXT
page.10.data = leveltitle:1
donne "Content elements" (ce qui est le titre de la page au niveau 1 dans la rootline - vous êtes actuellement dans la
branche 'Startpage/Content elements/Insert content')
Challenge (stdWrap/2)
Pouvez-vous faire en sorte que la propriété “.data” ramène le titre de la page située un niveau avant la page courante ('page
du parent ') ?
Override / Conditions
stdWrap fournit simplement un "control structures" (structure de contrôle) au mo yen de la comparaison de certaines
propriétés. Mentionnons certaines d'entre elles qui sont appelés “override”, “ifEmpty”, “required”, “if”, “fieldRequired”.
page.10 = TEXT
page.10.value = Hello world
page.10.override = Hello heaven
donne "Hello heaven" parce que si “override” revoit quelque contenu que ce soit, alors la valeur originale est substituée.
page.10 = TEXT
page.10.value = Hello world
page.10.override.field = subtitle
Meilleur exemple, parce que maintenant "Hello world" est substituée seulement si le champ de substitution de la page
courante n'est pas vide. Dans la plupart des cas ce champ est vide, mais essayez avec "index.php?id=20"...
TypoScript By Example - 26
Challenge (stdWrap/3)
Pourriez vous le contourner en employant d'autres propriétés comparatives (comparing properties) - de sorte que la valeur
par défaut soit le sous-titre, mais au cas où elle serait vide, elle serait remplacée par "Hello World"
Challenge (stdWrap/4)
Avec vos résultats obtenus lors du défi 3, pourriez vous l'envelopper en entier avec les étiquettes <h3>...</h3>? Et pourriezvous remplacer "Hello world" avec le page-titre à sa place, lequel – dans le cas présent – est enveloppé (wrapped) par <font
color="red"> ... </font>
TypoScript By Example - 27
Objets de contenu (cObject)
Introduction
Les objets de contenu (cObjects) sont ceux qui permettent à TypoScript d'y répondre. Ils fournissent des blocs de contenu
de diverses sortes tels que des images, des sources de text/html, des sources à partir d'un fichier, des enregistrements
choisis d'une base de données ou même du code PHP que vous choisissez de coder vous-même
Les cObjects TEXT et HTML ont déjà été expliqués. Ils sont largement utilisés, mais principalement en raison des
propriétés de stdWrap.
COA
Une structure de données (array) de cObjects. Rapide démonstration:
page.10 = COA
page.10.10 = TEXT
page.10.10 {
value = This is the page title:
wrap = <font face="verdana" size=1>|</font>
wrap2 = | <BR>
case = upper
}
page.10.20 = TEXT
page.10.20.field = title
Donne ceci :
Cela pourrait tenir sur une ligne, mais ce choix est un atout pour s'adapter à la situation.
page.10 = TEXT
page.10.field = title
page.10.wrap = <font face="verdana" size=1>THIS IS THE PAGE TITLE:</font><BR> |
Donnons nous un autre exemple :
page.10 = COA
# Header to this section
page.10.10 = TEXT
page.10.10 {
value = This is the page title:
wrap = <font face="verdana" size=1>|</font>
wrap2 = | <BR>
case = upper
}
# Output page title / subtitle
page.10.20 = COA
page.10.20 {
10 = TEXT
10.field = title
10.wrap = Page title: <B> | </B><BR>
20 = TEXT
20.field = subtitle
20.wrap = Subtitle: <B> |</B>
}
donne cela :
TypoScript By Example - 28
Challenge (cObject/1)
Je voudrais que le sous-titre soit renvoyé sur le browser seulement s'il est présent. Qu'allez-vous faire ?
Challenge (cObject/2)
Faire en sorte que tout le COA (page.10) soit renvoyé au browser seulement si le sous-titre est présent.
Challenge (cObject/3)
Faire en sorte que tout le COA (page.10) soit renvoyé au browser seulement si nous sommes au niveau 2 et plus avant dans
le rootline (c'est-à-dire, si nous sommes sur une subpage, par exemple. "Content elements")
FILE
C'est très simple, aussi je vais juste montrer un exemple court :
page.10 = FILE
page.10.file = fileadmin/tsbyex/include_me.txt
donne :
This is a simple textfile with a few HTML-tags in.
… qui est la teneur exacte du dossier. Noter que la propriété de “.file” est un datatype de "ressource", ce qui signifie que les
fichiers doivent résider dans les répertoires /media/ /fileadmin/ et /uploads/ ou encore /typo3temp/. C'est un dispositif de
sécurité afin d'empêcher des programmeurs TS d'inclure tout et n'importe quoi sur le serveur.
Ceci est techniquement installé par “array” $allowedPaths = Array ("media/","fileadmin/","uploads/","typo3temp/"); par “class
t3lib_tstemplate”
Si vous incluez des fichiers images, ils sont montrés à la place en tant que < IMG-étiquettes >.
IMAGE
Inclut une image avec l'étiquette < img>.
Exemple:
page.10 = IMAGE
page.10.file = fileadmin/tsbyex/alligator.jpg
Ceci insère une jolie image d'un bébé alligator (cordialement, un instantané de la Floride).
La propriété de “.file” est une "imgResource" (prononcé "ressource d'image") et il y a plus d'options et de possibilités
disponibles que vous n'en rêvez. Ainsi nous obtiendrons de nouveau celui-ci.
Mais essayons juste quelques petites choses avec l'image. Cet exemple met la largeur à 200 Pixels et ajoute un lien à
l'image qui l'affiche dans une autre fenêtre dans le format de taille originale du document :
page.10 = IMAGE
page.10 {
file = fileadmin/tsbyex/alligator.jpg
file.width = 200
imageLinkWrap = 1
TypoScript By Example - 29
}
imageLinkWrap.enable = 1
Recharger la page. L'image s'affiche maintenant avec une largeur de 200 Pixel dans le browser. Essayer de cliquer l'image,
et une nouvelle fenêtre de browser s'ouvrira affichant l'image avec sa largeur originale.
Questions (cObject/4)
Qu'est ce que Typo3 a fait à l'image quand la taille a été placée à 200 Pixel ? Etait-ce seulement le code HTML qui a été
changé ou l'image a-t-elle été réellement redimensionnée ? Regarder les noms de fichier du premier exemple sans
“file.width” et l'exemple courant. Quels sont les noms et le chemin d'accès affichés ?
Challenge (cObject/5)
En se référant à l'objet ->imageLinkWrap dans TSref, pouvez-vous faire en sorte que 'imageLinkWrap' ouvre l'image
agrandie dans une fenêtre de JavaScript ?
IMG_RESOURCE
Celui-ci fait pareil que le cObject “IMAGE” à la différence très importante que l'étiquette < l'IMG> n'habille (enveloppe-wrap)
pas le fichier.
Exemple:
page.10 = IMG_RESOURCE
page.10 {
file = fileadmin/tsbyex/alligator.jpg
file.width = 200
}
donne :
typo3temp/3de305c72b.jpg
Challenge (cObject/6)
Pouvez-vous faire en sorte que l'image soit en fond d'écran d'un Tableau ?
CLEARGIF
Insérez un fichier “gif-file” (fichier d'une image vide), “clear.gif”:
page.10 = CLEARGIF
page.10.width = 200
produira ce code HTML:
<img src="clear.gif" width=200 height=1 border=0><BR>
Notez que l'étiquette <BR> est toujours ajouté au début. Vous êtes toujours libres d'employer le fichier “clear.gif” que vous
trouverez à la racine du site
HRULER
Ceci insère une "règle" horizontale. Pas celui du style HTML, mais fait avec une table et une couleur de fond.
Exemple:
page.5 = TEXT
page.5.value = Before ruler
page.10 = HRULER
page.10 {
lineThickness = 3
lineColor = red
}
page.15 = TEXT
page.15.value = After ruler
TypoScript By Example - 30
Donnera ce résultat:
Challenge (cObject/7)
Amusez-vous avec les autres propriétés et voyez quels en sont les résultats. Vérifier le code source. En outre, pouvez-vous
placer un espace au-dessus de (10 Pixel) et au-dessous de (20 Pixel) de la règle afin de créer de l'espace pour le texte ?
CTABLE and OTABLE
Ces cObjects ont pour objet de vous donner une possibilité d'obtenir des tableaux instantanés pour y placer votre contenu.
Exemple of OTABLE:
page.10 = OTABLE
page.10 {
tableParams = border=1
offset = 10,10
10 = TEXT
10.value = What a cute little alligator! Dear Lord, may it never grow up!
10.wrap = |<BR>
20 = IMAGE
20.file = fileadmin/tsbyex/alligator.jpg
20.file.width=200
}
a pour résultat :
Ce que fait “offset” ici parait évident. Mais normalement vous voudriez disposer de quelques autres paramètres pour
TypoScript By Example - 31
l'étiquette <table>. Ainsi ce qui suit pourrait être une meilleure solution:
page.10 = OTABLE
page.10 {
tableParams = border=0 cellpadding=0 cellspacing=0 width=100
offset = 10,10
...
Si vous ne précisez pas “.tableParams”, "<TABLE border=0 cellspacing=0 cellpadding=0>" s'applique par défaut <TABLE>start tag.
Challenge (cObject/8)
Installer une OTABLE qui décale avec précision (offset) le coin supérieur gauche à "0, 20" et où le contenu se place dans
une colonne de 250 Pixels. Conseil : Le réglage des marges de bodytag exige que vous regardiez les propriétés de l'objet
“Page”.
Exemple de CTABLE:
Un CTABLE propose un dispositif plus riche pour envelopper (habillage) que le simple OTABLE par ailleurs fort utile. Il
comporte un dispositif avec une colonne de contenu et quatre colonnes l'entourant. Celles-ci peuvent être utiles pour y
mettre des menus. Mais regardez donc ce simple exemple tout d'abord:
page.bodyTagMargins = 0
page.10 = CTABLE
page.10 {
tableParams = border=1 cellpadding=0 cellspacing=0
offset = 0,20
c.10 = TEXT
c.10.value = CONTENT cell
}
produira quelque chose tout à fait identique à ce que produirait le OTABLE avec ceci :
page.bodyTagMargins = 0
page.10 = OTABLE
page.10 {
tableParams = border=1 cellpadding=0 cellspacing=0
offset = 0,20
10 = TEXT
10.value = CONTENT cell
}
Pareil, à l'exception du fait que CTABLE ajoute le "valign=top" aux étiquettes < td>.
Regardez maintenant un exemple plus complexe :
page.bodyTagMargins = 0
page.10 = CTABLE
page.10 {
tableParams = border=1 cellpadding=0 cellspacing=0
offset = 0,20
c.10 = TEXT
c.10.value = CONTENT cell
rm.10 = TEXT
rm.10.value = RIGHT cell
lm.10 = TEXT
lm.10.value = LEFT cell
tm.10 = TEXT
tm.10.value = TOP cell
}
bm.10 = TEXT
bm.10.value = BOTTOM cell
Dans ce cas-ci nous employons chacune des cinq "cellules de contenus" ("content cells") de CTABLE et on obtiendra ceci :
TypoScript By Example - 32
Maintenant, vous pouvez mettre n'importe quel OBJECTS que vous aimez dans les cellules. Mais il y a encore deux
dispositifs à regarder en détail. Avec "cMargin" vous pouvez ajouter des marges entre les cellules et toute autour d'elles et
avec “cWidth” vous pouvez automatiquement fixer l'espace en dehors de la cellule de contenu à une certaine largeur grâce à
l'utilisation de “clear-GIF”..
Essayez d'ajouter:
...
offset = 0,20
cMargins = 10,20,30,40
cWidth=300
rm.TDParams = bgcolor=red valign=bottom
...
... et voilà ce que vous obtenez:
Noter que la cellule de droite (rm) a quelques paramètres supplémentaires qui lui ont été spécifiés avec pour résultat le
rouge du fond de la cellule du tableau. Juste pour le “fun”, laissez vous aller à regarder ce TypoScript dans le “Object
Browser” :
TypoScript By Example - 33
Instructif, n'est-ce pas...
Gabarit (TEMPLATE)
Parfois, vous pouvez vouloir employer un gabarit HTML au lieu de le faire en entier dans TypoScript. C'est exactement pour
çà que l'objet TEMPLATE existe.
Exemple:
Pour que le Gabarit soit actif, c'est tout ce dont vous avez besoin:
page.10 = TEMPLATE
page.10.template = FILE
page.10.template.file = fileadmin/tsbyex/template.html
… et ceci est apparemment ce qui obtenez :
TypoScript By Example - 34
Mais après qu'une inspection plus minutieuse du code source, on s'aperçoit que la totalité du fichier a été inséré :
...
// End Hiding Script -->
</script>
</head>
<body bgcolor="#FFFFFF">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>
</head>
<body>
This is a template that demonstrates the concept of subparts and markers.
<!-- ###DOCUMENT### -->
This is a <i>###SIMPLE_WORD###</i> textfile with a few HTML-tags in.<br>
<br>
Check out the <!--###LINK###-->link to the front page.<!--###LINK###-->
<!-- ###DOCUMENT###-->
</body>
</html>
</body></html>
… et celui n'était pas l'intention - à moins que nous voulions que le dossier entier fût inséré, naturellement. Mais on peut
facilement arranger cela, parce que pour le “cObejct” TEMPLATE vous pouvez définir un "subpart" pour travailler dessus.
Les “Subpart” sont encadrés par deux marqueurs (par défaut "###" ajouté au début) qui peuvent ou ne peuvent pas être
dans un “comment” HTML.
Notre subpart est "###DOCUMENT###", aussi essayez avec ceci:
page.10 = TEMPLATE
page.10.template = FILE
page.10.template.file = fileadmin/tsbyex/template.html
page.10.workOnSubpart = DOCUMENT
Bien mieux. La source du code HTML obtenu nous donne maintenant ceci:
...
</head>
<body bgcolor="#FFFFFF">
This is a <i>###SIMPLE_WORD###</i> textfile with a few HTML-tags in.<br>
<br>
Check out the <!--###LINK###-->link to the front page.<!--###LINK###-->
</body></html>
Maintenant notre intention est de substituer ###SIMPLE_WORD### par le titre de la page et de substituer le subpart
###LINK### par lui-même, mais mais lié à la page d'accueil du site Web (et c'est dur !
TypoScript By Example - 35
Exemple:
page.10 = TEMPLATE
page.10 {
template = FILE
template.file = fileadmin/tsbyex/template.html
workOnSubpart = DOCUMENT
marks.SIMPLE_WORD = TEXT
marks.SIMPLE_WORD.field = title
subparts.LINK = TEXT
subparts.LINK.current = 1
subparts.LINK.debugFunc = 1
}
Voilà ce qu'on obtiens:
Et le code source HTML obtenu est celui-là:
...
// End Hiding Script -->
</script>
</head>
<body bgcolor="#FFFFFF">
This is a <i>Content elements</i> textfile with a few HTML-tags in.<br>
<br>
Check out the link to the front page.
</body></html>
Comme vous pouvez le voir, le marqueur SIMPLE_WORDS a été correctement substitué. Le “Lien-subpart” semble
également fonctionner. Au moins les comments HTML n'y sont plus. Mais la valeur n'est pas traitée au-delà. En fait, c'était
le but afin d'étudier un petit détail :
Selon le TSref, "De plus, la valeur courante est chargée avec le contenu de chaque subpart juste avant que le cObject pour
le subpart soit analysé. " Ainsi ce que les lignes ...
subparts.LINK = TEXT
subparts.LINK.current = 1
subparts.LINK.debugFunc = 1
... devrait faire est de charger le cObject TEXT avec la valeur du registre "courant" (voir stdWrap) et parce que j'étais curieux
au sujet du contenu que l'objet “TEXT” contenait réellement, je l'ai étudié avec le “flag” ".debugFunc = 1" lequel – de la
même manière que nous l'avons montré avec “debugData” précédemment (voir stdWrap) – restitue comme résultat la valeur
contenue durant "l'exécution" du TypoScript.
Aussi, maintenant je monte d'un niveau - l'encapsulation du subpart LINK avec un lien.
...
subparts.LINK = TEXT
subparts.LINK.current = 1
TypoScript By Example - 36
}
subparts.LINK.typolink {
parameter = 1
}
Ceci ajoute la bonne étiquette de lien au subpart qui maintenant permet d'atteindre la page avec le id=1.
Dans ce cas-ci le id=1 s'avère être la "page d'accueil (frontpage)" de mon site, mais je voudrais une solution plus flexible,
ainsi ce que je vais faire est d'aller chercher le ”uid” de la page au niveau 0 dans le rootline. Nous savons déjà comment
faire (.data = leveluid:0 - voir stdWrap et les datatypes dans TSref), mais ne savons pas, si le paramètre de la propriété de
l'objet "typolink" a des propriétés stdWrap ... (obtenir la référence, trouver la fonction de typolink.... regarder. ... YES!).
...
subparts.LINK = TEXT
subparts.LINK.current = 1
subparts.LINK.typolink {
parameter.data = leveluid:0
}
}
Challenge (cObject/9)
Pouvez-vous faire en sorte que le lien vous envoie à la page du niveau 1 dans le rootline au lieu de la page d'accueil ?
Pouvez-vous définir la cible du lien pour être "_ blank" ? Et pouvez-vous également envelopper le lien dans des étiquettes
<B> ?
FORM (formulaire)
Bien sûr, vous pouvez créer des formulaires manuellement, mais l'avantage de laisser Typo3 le faire est que la syntaxe est
assez simple pour l'enseigner aux non techniciens (nn-techies) et vous pouvez le faire valider automatiquement (manière
simple) par JavaScript.
Exemple:
page.10 = FORM
page.10.data = Label | input
page.10.layout = ###LABEL###: ###FIELD###<BR>
C'est le minimum absolu d'information requis pour créer un formulaire.
La propriété “.data” prend les informations en entrée, ce qui est conforme à la syntaxe définie dans TSref et “.layout” est un
minitemplate (mini-gabarit) où ###LABEL### et ###FIELD### représentent respectivement l'étiquette et le champ inséré.
Tout d'abord, comment ajoutons-nous plus de champs ? Et bien, normalement, les valeurs d'entrée qui génèrent le
formulaire vient d'un champ “texte” de la base de données, normalement "bodytext" d'un enregistrement de “tt_content”.
Dans ces valeurs d'entrée chaque ligne représente un nouvel élément. Nous ne pouvons pas faire cela en envoyant une
chaîne de caractère en entrée (with “string-input”) directement sur la propriété de “.data”, alors le moyen détourné
(workaround) est d'entrer un double "|" équivalent à un changement de lgne (linebreak). Par conséquent…
page.10 = FORM
page.10.data = Name|input
||
Address|textarea
page.10.layout = ###LABEL###: ###FIELD###<BR>
||
Send|submit|Send the form
..va nous donner cela :
TypoScript By Example - 37
Le script “tslib/index_ts.php” (qui est le script d'entrée principal, voir Typo3Overview, F1) est capable d'envoyer des
formulaires par emails (formmail-emails). Pour créer un formulaire pour email vous devez au moins préparer ceci:
page.10 = FORM
page.10.data = Name|*input,40 || Address|textarea,40,10 || Send it...|formtype_mail=submit|Send the form ||
|subject=hidden|This is the subject
page.10.recipient = [email protected]
page.10.layout = ###LABEL###: ###FIELD###<BR>
page.10.locationData = 1
page.10.REQ=1
page.10.REQ.layout = ###LABEL### (Required): ###FIELD###<BR>
Noter les changements en rouge :
•
Les champs d'entrée ont donnés un paramètre de taille
•
de même que le textarea
•
le bouton de soumission(submit-button) est appelé "formtype_mail" afin que le script se rendre compte qu'un email est
sur le point d'être envoyé
•
le sujet est placé (subject)
•
le destinataire est placé (recipient)
•
le locationData est mis à “ON” (requis si le script index_ts.php doit envoyer le email)
•
On met en oeuvre REQ qui permet le contrôle du champ requis (required-field) (celui dont le champ "Name" est marqué
comme exigé “as due” par la présence de l'astérisque devant le mot "input” (entrée))
•
REQ.layout est proposé alternativement aux champs exigés.
Cela ressemble à ceci ::
TypoScript By Example - 38
Si vous voulez entrer dans des détails sur ce sujet, allez voir svp les “form-définitions” dans le gabarit statique
"styles.content (defaut)” / “styles.content.mailform”
CAS d'exemple
Ce cObject fournit maintenant une "structure de co mmande"(control structure) à TypoScript. Cela fonctionne comme un
générateur de commutateur (switch-construct) :
Exemple:
page.10 = CASE
page.10.key = cheese
page.10.cheese = IMAGE
page.10.cheese {
file = fileadmin/tsbyex/alligator.jpg
file.width=200
wrap = Cheese.... &nbsp;| &nbsp; is what this guy says
}
page.10.tomatoes = TEXT
page.10.tomatoes.value = Tomatoes are so tasty
TypoScript By Example - 39
page.10.default = TEXT
page.10.default.value = If nothing else is going on, this happens...
Ceci est le résultat obtenu:
Comme vous pouvez le voir, la variable reservèe « key » à l'intèrieur de cObject est « cheese ». Ce qui permet la recherche
de la variable associèe cObject : page.10.cheese.
NB : la liste des variables reservèes : "setCurrent", "key", "default", "stdWrap" et "if".
Remplacez la variable cheese par tomates ou laissez la vide (dans ce dernier cas, page.10.default apparait) Ceci est très
utile si vous souhaitez insérer des donnèes au lieu de valeurs numèriques. Jettons un oeil aur le script.
temp.cheese = IMAGE
temp.cheese {
file = fileadmin/tsbyex/alligator.jpg
file.width=200
wrap = Cheese.... &nbsp;| &nbsp; is what this guy says
}
temp.tomatoes = TEXT
temp.tomatoes.value = Tomatoes are so tasty
temp.default = TEXT
temp.default.value = If nothing else is going on, this happens...
page.10 = CASE
page.10.key.data = level:1
page.10.1 < temp.cheese
page.10.2 < temp.tomatoes
page.10.default < temp.default
page.20 = TEXT
page.20.data = level:1
page.20.wrap = <HR> | page.30 = TEXT
page.30.field = title
le rèsultat :
TypoScript By Example - 40
Essayez d'atteindre les pages "Startpage", "Content ele ments", "Insert content" et parce que chacune est à son propre
niveau spécifique, vous obtiendrez des contenus spécifiques.
...
page.10.1 < temp.cheese
page.10.2 < temp.tomatoes
page.10.default < temp.default
...
Un autre petit conseil concernait mon utilisation des objets provisoires créés dans l'objet “temp. toplevel” temporaire du
niveau supérieur (lisez en plus sur ceci d'ailleurs). Il peut être très utile de définir des gros blocs de TypoScript dans cet
objet de toplevel et puis plus tard de les copier au bon endroit. Ceci crée une occasion d'obtenir une meilleure vue
d'ensemble de vos TypoScripts.
Challenge
Prendre un peu de temps pour examiner le static_template "content (default)". Essayer d'améliorer votre maîtrise avec le
CAS d'exemple cObject utilisé dans l'objet tt_content de toplevel. Toutes les fois que nécessaire, se référer à "styles.content
(default)" qui fournit beaucoup d'objets “préfabriqués” afin d'être utilisé dans "content (default)"
LOAD_REGISTER
Ce cObject ne renvoie aucune valeur. Vous pouvez Plutôt l'employer pour placer quelques valeurs dans le “registre". C'est
un genre de procédé pour passer des valeurs à l'entour entre les objets de TypoScript mais c'est un détournement (hack)
afin de l e permettre à un degré restreint. Se rappeler que TypoScript "n'est pas exécuté" comme du JavaScript. Il reste
toujours un groupe en grappe (bunchof configuration) de configurateurs.
Quoiqu'il en soit, cet exemple montre comment cela fonctionne:
page.10 = LOAD_REGISTER
page.10.MY_VALUE = The register value!
page.5 = TEXT
page.5.value = The default value
page.5.override.data = register:MY_VALUE
page.5.wrap = | <HR>
page.15 < page.5
TypoScript By Example - 41
This is the result:
Explication:
Considérez le TypoScript:
L'objet à la position "5" dans la structure de données (array) de l'object PAGE "page" est “exécuté" avant celui en position
"10" lequel est où le registre MY_VALUE est placé pour la première fois. Puisque la valeur de registre était jusque-là vide
"page.5" a renvoyé la valeur de la propriété de “.value”. C'était "la valeur par défaut"
Quand "page.10" est exécutée la valeur du registre est placée.
Quand "page.20" est exécuté, le registre n'est désormais plus vide, donc la valeur écrase (override) la valeur par défaut. Et le
résultat en sortie devient "valeur du registre!"
Challenge
Essayer de regarder les static_templates "TEMPLATE; FIRST " et "TEMPLATE; MM". Tous les deux utilisent ce dispositif.
Pour accomplir quoi ?
TypoScript By Example - 42
imgResource et GIFBUILDER
Introduction
Le datatype de quelque une des propriétés est apparemment "imgResource". En jetant un coup d'oeil à la définition du
datatype, nous apprenons qu'il peut faire une deux choses.
Soit "imgResource" est une référence à un fichier dans cette même logique du concept de "ressource" mais avec quelques
propriétés additionnelles pour modifier l'image.
Ou bien "imgResource" est un objet GIFBUILDER qui nous laisse concevoir une image en combinant les objets graphiques
comme des images, texte et boîtes pleines.
Un fichier normal en entrée
Nous avons déjà fait ceci (avec l'image de l'alligator), parce que la propriété “.file” du cObject IMAGE est une
"imgResource". Mais donnons nous un autre défi ici. Nous voudrions définir un fond d'image pour notre Gabarit.
En regardant les propriétés d'un objet PAGE, “.bgImg” semble être le choix à faire et il est aussi une imgResource.
Essayez-donc cela:
page.bgImg = fileadmin/tsbyex/sunset_keywest.jpg
Vous devez à présent voir ceci:
[N/A...] (non applicable ...)
Essayez alors d'ajouter cela .. :
page.bgImg = fileadmin/tsbyex/sunset_keywest.jpg
page.bgImg.width = 200
Et vous devez voir cela ::
Masques Bitmap
Avant que nous continuions, amusons nous un peu. Nous allons employer un concept d'image Bitmap appelé “masque ou
cache” (masking). Fondamentalement un masque est une image de grayscale employée pour combiner deux images de
TypoScript By Example - 43
manière à ce que les secteurs noirs et blancs du masque déterminent quels secteurs des deux images combinées sont
visibles ou pas.
Ceci est notre masque (cache), "mask.jpg":
Donc, essayons maintenant avec ceci ::
page.bgImg = fileadmin/tsbyex/sunset_keywest.jpg
page.bgImg.width = 200
page.bgImg.m.bgImg = fileadmin/tsbyex/alligator.jpg
page.bgImg.m.mask = fileadmin/tsbyex/mask.jpg
Résultat:
Essayons plutôt avec ceci
page.bgImg = fileadmin/tsbyex/sunset_keywest.jpg
page.bgImg.width = 300
page.bgImg.m.bgImg = fileadmin/tsbyex/alligator.jpg
page.bgImg.m.bgImg.params = -rotate 90
page.bgImg.m.mask = fileadmin/tsbyex/mask.jpg
Résultat:
[N/A...]
Importer une image
OK, nous voudrions que le fond d'image soit attaché aux différentes pages, ainsi nous pouvons changer l'image facilement
pour chaque page. Dans ce but nous devons associer et rattacher l'image à l'enregistrement de la page dans le champ
prévu à cet effet pour inclure des fichiers médias.
TypoScript By Example - 44
Faites ceci d'abord :
Puis, essayez d'insérer ce TypoScript sur la page (champ setup=:
page.10 =TEXT
page.10.debugData = 1
Vous devriez voir ceci quand vous aller sur la page (la première fois que nous y allons, rappelez-vous que nous sommes en
mode debug pour l'affichage !)
Le champ "média" contient des références aux images en les énumérant séparées par des virgules. Simple, hein ?
Nous voudrions extraire un simple fichier à partir de la liste, plus précisément la deuxième image, "doggiebus.jpg" :
page.10 =TEXT
page.10.field = media
page.10.listNum = 1
".listNum" est le grand tour de passe-passe utilisé ici. Voyez TSref pour une description...
TypoScript By Example - 45
Tout ce dont nous avons besoin est maintenant de savoir où les images sont stockées réellement, ainsi nous pourrons
ajouter le chemin d'accès (filepath) correct. Aussi nous allons sur le module "Tools" et dans le sous-module de
"Configuration" (tools_config), nous passons en revue la structure de données (array) “$tc” :
Comme vous voyez, le chemin de téléchargement était uploads/media.
Afin de réutiliser cette connaissance sur “imgResource”, regardons ce que contient la propriété “.import” (TSref). De ceci,
nous pouvons en conclure que le TypoScript devrait ressembler à :
page.bgImg {
import = uploads/media/
import.field = media
import.listNum = 1
}
Résultat:
[N/A]
Doggiebus est partout. Naturellement vous pouvez toujours ajouter "page.bgImg.width = 200" si vous aimez un plus petit
carreau pour un plus grand sourire : -)
Challenge (imgResource/1)
Vous voudriez un fond d'image par défaut pour une page au cas où il n'y aurait aucune image chargée en position n° 1 dans
le champ des médias associés. Pouvez-vous faire cela ? (il n'est pas si facile – servez-vous de TSref, bonne chance.)
GIFBUILDER
Commençons par un exemple simple:
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file.XY = 200,300
page.10.file.backColor = olive
page.10.file.10 = BOX
page.10.file.10 {
dimensions = 20,20,160,260
color = green
}
Résultat:
TypoScript By Example - 46
OK, essayons en combinant avec le fond d'image précédent :
page.bgImg = GIFBUILDER
page.bgImg {
XY = 200,300
colbacks = olive
10 = BOX
10 {
dimensions = 20,20,160,260
color = green
}
}
page.bgImg.m.bgImg = fileadmin/tsbyex/alligator.jpg
page.bgImg.m.bgImg.params = -rotate 90
page.bgImg.m.mask = fileadmin/tsbyex/mask.jpg
... et le résultat ... est .. :
[N/A...]
… autre chose que ce que nous avions imaginé.
La raison?. Le TypoScript est erroné. Le dispositif censé masquer avec le "m.bgImg...." s'applique aux imgResources si la
valeur de l'imgResource est un nom de fichier et pas un GIFBUILDER. Dans le dernier cas, les propriétés qui s'appliquent
sont trouvées dans une de ses propres sections … Tellement désolé.
Mais vous pouvez le faire, si l'objet de GIFBUILDER n'est pas le "base-image" :
# The base image:
page.bgImg = fileadmin/tsbyex/alligator.jpg
page.bgImg.width = 300
page.bgImg.height = 200
# The GIFBUILDER overlay:
page.bgImg.m.bgImg = GIFBUILDER
page.bgImg.m.bgImg {
XY = 300,200
colbacks = olive
10 = BOX
10 {
dimensions = 20,20,260,160
color = green
}
}
# The mask (not the movie...)
page.bgImg.m.mask = fileadmin/tsbyex/mask2.gif
Et le résultat obtenu est
TypoScript By Example - 47
Le masque "mask2.gif" ressemble à ceci :
GIFBUILDER - bases
Retour aux bases. Le premier exemple nous a montré comment créer une boîte colorée. Maintenant nous allons ajouter un
un peu de texte :
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file {
XY = 200,300
colbacks = olive
10 = BOX
10.dimensions = 20,20,160,260
10.color = green
}
20 = TEXT
20.text = Hello World
20.offset = 10,10
Voilà le résultat :
+calc
Beaucoup de valeurs de “integet” peuvent être définies par des opérations arithmétiques simples comme +, -,/et *. Un usage
particulier est celui qui vous permet d'insérer des codes dans ces expressions qui sont substituées avec la largeur ou la
taille d'un objet “TEXT” ou “ IMAGE-GIFBUILDER”. De cette façon nous pouvons contrôler par exemple la largeur de l'image
en la basant sur la largeur du texte.
TypoScript By Example - 48
Exemple:
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file {
XY = [20.w]+20, 30
colbacks = olive
10 = BOX
10.dimensions = 20,20,160,260
10.color = green
}
20 = TEXT
20.text = Hello World
20.offset = 10,15
Résultat:
Prolongeant ceci à l'objet “BOX” de manière à ce que nous puissions employer l'objet BOX pour créer et souligner du TEXT.
En faisons l'essai de la propriété “.nice” de l'objet “TEXT”.
...
10.dimensions = 11,20,[20.w],1
10.color = blue
}
20 = TEXT
20.text = Hello World
20.offset = 10,15
20.niceText = 1
Résultat:
Évidemment l'objet BOX s'est ajusté selon nos espérances. Mais l'autre changement - l'option “.nice' de l'objet TEXT que
nous avons permise - a eu pour conséquence de modifier le mode de restitution du texte.
.niceText
A voir, ceci est un contournement (workaround) pour compenser le fait que la bibliothèque de freetype employée par GDLib
dans PHP ne peut pas toujours fournir des anti-crénelages (antialiasing) satisfaisants ("soft edges" pour empêcher le
déchiqueté, pixélisés des bords). Ainsi ce “flag” fait en sorte que Typo3 restitue le texte au double de sa taille sur un fichier
cache (mask-file) qui est alors réduit (de moitié) pour corriger la taille et qui est utilisé avec l'outil “combine” (composite) de
ImageMagick permettant de "superposer" (masque/cache) le texte sur le fond. Ceci consomme plus de ressources du CPU.
Le résultat est également meilleur (habituellement).
TypoScript By Example - 49
A gauche : texte normal Anti-crênelage par Freetype. Milieu: .niceText=1 A droite: .antiAlias=0 (Anticrênelage désactivé)
L'objet GIFBUILDER TEXT
Maintenant, nous allons essayer encore plus d'options pour le texte :
...
20 = TEXT
20.text = Hello World
20.offset = 10,15
20.niceText = 1
20.fontSize= 20
20.fontFile = t3lib/fonts/verdana.ttf
20.fontColor = #660000
20.shadow.offset = 2,2
20.shadow.blur = 60
20.shadow.opacity = 40
}
Le résultat est là :
Challenge (GIFBUILDER/1)
Pouvez-vous produire un texte, qui semble être gravé en refief sur le fond ? Et pourriez-vous faire en faire la page de titre et
non pas une valeur statique comme "Hello World" ?
L'objet IMAGE
Vous pouvez également ajouter une image aux objets de GIFBUILDER.
Exemple:
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file {
XY = 200, [10.h]
10 = IMAGE
10.file = fileadmin/tsbyex/sunset_keywest.jpg
10.file.width= 200
20 = TEXT
20.text.field = title
20.offset = 0,120
20.niceText = 1
20.align=center
20.fontSize= 40
20.fontFile = t3lib/fonts/verdana.ttf
20.fontColor = yellow
30 = IMAGE
30.file = fileadmin/tsbyex/alligator.jpg
30.file.width=50
30.tile = 2,2
30.align = c,c
TypoScript By Example - 50
}
Dans cet exemple il y a même deux images impliquées. L'une d'entre elles est couverte de carreaux répartis deux fois
horizontalement et verticalement, l'autre étant aussi alignée au centre dans les mêmes deux directions. Résultat :
Challenge (GIFBUILDER/2)
Pouvez-vous faire en sorte que les images d'alligator apparaissent dans les coins de la grande image, à 5 Pixels du bord ?
(vous pouvez - si vous souhaitez – ignorer le fond d'image et le titre.)
Challenge (GIFBUILDER/3)
Pouvez-vous, aussi, créer un “frame” cadre rouge de 2 Pixel tout autour de l'image ?
TypoScript By Example - 51
Navigation
HMENU
Le' cObject "HMENU" est employé pour produire "des menus hiérarchiques" - c'est la navigation.
Exemple:
page.10 = HMENU
page.10.1 = TMENU
page.10.1.NO {
linkWrap = <B>|</B><BR>
}
Résultat:
Très simple. Maintenant, les choses importantes à savoir à propos de l'objet racine ("mother"-object) HMENU ("TMENU"
dans l'exemple est un enfant dans cette terminologie) est qui est a
•
une structure de données numérique de "menuObj" (menu objects)
•
une définition d'entrée “.entryLevel”. “Entrylevel” détermines à quel niveau dans la rootline, le menu est disposé.
•
Une défnition pour “.begin” et “.maxItems” utile pour commander le nombre d'articles.
Mais vous devriez également savoir qu'un menu se compose des liens version des pages avec le type "Standard",
"Advanced", "External URL" et "Shortcut". Selon la configuration le type "Spacer" peut également apparaître (si .SPC est
définit), mais une page "Spacer" est seulement un placeholder - une manière d'insérer un espace dans un menu si la
menu-configuration est conçue de cette manière.
Cet exemple montre un menu qui fonctionne sur les items de la page "Level2" (rootline level 1).
page.10 = HMENU
page.10.entryLevel = 1
page.10.1 = TMENU
page.10.1.NO {
linkWrap = <B>|</B><BR>
}
Le résultat:
(Ceci apparaît seulement si vous mettez id=2, parce qu'aucune des autres pages (excepté de la page d'accès restreinte) n'a
des sous-ages. La Rootlevel ne montre pas de menu parce que l'entryLevel est placé à 1)
TMENU
Le TMENU est un menu basé sur du texte. Il y a un bon nombre d'exemples alentour. Regarder dans la table du
static_template. Le Gabarit "content (default)" a un groupe d'exemples attachés à la définition de tt_content.menu
TypoScript By Example - 52
Voici un exemple pris du static_template "TEMPLATE; BUSINESS":
page.10 = HMENU
page.10.1 = TMENU
page.10.1.target = page
page.10.1 {
expAll = 1
wrap = <table width="300" border=1 cellspacing=0 cellpadding=0><tr><td><img src="clear.gif" width=1
hspace=200 height=1 vspace=3 border=0></td></tr> | </table>
NO.linkWrap = <font face=Arial size=2 color=black><b> |</b></font>
NO.allWrap = <tr><td><img src="clear.gif" width=1 height=1 vspace=3 border=0><br> | </td></tr>
}
page.10.2 = TMENU
page.10.2 {
wrap = <tr><td nowrap> | </td></tr>
target = page
NO {
beforeImg = media/bullets/bullet1_n.gif
beforeROImg = media/bullets/bullet1_h.gif
beforeImgTagParams = hspace=2
RO = 1
after = <br>
ATagBeforeWrap = 1
linkWrap= <font face=Verdana size=1 color=black> | </font>
}
}
Résultat:
Vous devriez savoir une chose au sujet de TMENU: Il y a deux propriétés, “.before” et “.after”. Elles ont des propriétés
stdWrap toutes les deux et elles sont réellement identiques. Mais - comme indiqué dans TSref – le cObj->data array utilisé
par la propriétés de “.field” du stdWrap's n'est pas chargé avec le page-record de l'item du menu courant lorsqu'il est
exécuté. À l'origine c'était une erreur de conception, mais le contournement afin d'être compatible avec des versions
antérieures a été que stdWrap pet récupérer le field-values de la page du menu-item par le biais de la propriétés ”.data”.
Ainsi au lieu de "before.field = title" (ce qui permet d'obtenir le titre principal de page) utilisez "before.data = page:title".
Challenge (TMENU/1)
Réglez finement le menu à votre goût et insérez une autre image-buleet (image puce), mais en l'insèrent à la droite des
articles !
Challenge (TMENU/2)
Ajouter un troisième niveau
Challenge (TMENU/3)
Ajouter un dispositif qui change la couleur des items en rouge si l'item est "actif" (c'est-à-dire, si un items est l'une des
pages dans la rootline)
Challenge (TMENU/4)
Créer ce menu :
TypoScript By Example - 53
Exemple (TMENU)
C'est une capture d'écran de www.fladsaa.dk. Le code utilisé ici pour le menu est trouvé dans la section Challenge plus
haut, si vous voulez le voir :
IMGMENU
C'est un menu d'imagemap (basé sur image).
Exemple:
temp.topmenu = HMENU
temp.topmenu.1.target = _top
temp.topmenu.maxItems = 6
temp.topmenu.entryLevel = 0
temp.topmenu.1 = IMGMENU
temp.topmenu.1.imgMapExtras = <AREA SHAPE="rect" alt="Frontpage" COORDS="5,5,69,70"
href="http://www.typo3.com" target="_top">
temp.topmenu.1 {
wrap = |<BR>
main.XY = [10.w] , [10.h]
main.10 = IMAGE
main.10.file = fileadmin/tsbyex/imglogo.gif
main.reduceColors = 16
dWorkArea = 77,68
NO.distrib = textX+10, 0
NO.10 = TEXT
NO.10 {
TypoScript By Example - 54
text.field = title
fontSize = 11
fontColor = black
niceText = 1
offset = 0,0
imgMap.explode = 3,2
}
}
NO.20 =
|| BOX
NO.20 {
dimensions = -5,-9,1,11
color = white
}
page.10 < temp.topmenu
Résultat:
Commentaires:
main.
Ceci place l'image de base de l'imagemap. “.reduceColors” est une propriété générale de GIFBUILDER que vous devriez
appliquer largement afin de maintenir la taille de fichiers au plus bas. Moins de couleurs et moins grande sera la taille
dWorkArea = 77,68
Ceci définit l'excentrage des items du menu à partir du coin gauche supérieur
NO.
En général “.main” décrit le fond d'imagemap et “NO.” décrit chaque item sur le “image map”.
NO.distrib = textX+10,0
Ceci définit que chaque article devrait être décalé l'un par rapport à l'autre par la largeur de l'article précédent plus 10 Pixels
supplémentaires.
imgMap.explode
Définit de combien le polygone de 'imagemap” autour de chaque item est augmenté afin de couvrir une surface un peu un
plus grande (ou plus petite avec des nombres “neg.”) que les “textlabels” eux-mêmes.
temp.topmenu.1.imgMapExtras = <AREA SHAPE="rect" alt="Frontpage" COORDS="5,5,69,70"
href="http://www.typo3.com" target="_top">
Ceci ajoute une définition de “Area” (zone) à l'imagemap. La zone couverte dans ce cas-ci est à angle droit vers la gauche
sur le fond d'image. Cette zone est un lien vers http://www.typo3.com
NO.20 =
|| BOX
L'opérateur" "||" (double ligne verticale) est une partie d'un concept très complexe appelé "optionSplit". Ce concept est plus
déroutant qu'un répertoire absent d'une installation de Windows, donc faites attention si vous commencez à jouer avec.
Personnellement je me réfère toujours aux exemples dans le TSref. Voir la discussion ci-dessous
Challenge (IMGMENU/1)
Pouvez vous réarranger les éléments afin qu'ils apparaissent presque comme ceci :
TypoScript By Example - 55
optionSplit
Mais qu'est-ce que c'est “optionSplit” ? Pourquoi est-ce que je m'inquiéterais ?
“optionSplit” est très puissant parce qu'il fournit une manière de définir différentes valeurs pour les propriétés de vos objets
de menu et ceci relié à leur position, qu'ils soient en premier, denier ou au milieu dans l'ordre des éléments du menu
"optionSplit" fonctionne avec toutes les propriétés et leurs valeurs de TypoScript pour la totalité de l'objet “menu”!
Par exemple, si je veut que le premier élément soit jaune, le dernier élément bleu et tous les autres blancs, j'indique :
fontColor = yellow |*| white |*| blue
comme ceci et j'obtiens ce résultat :
Si j'ajoute une autre page au testsite, le menu sera mis à jour en conséquence:
Challenge (IMGMENU/2)
Pouvez-vous définir un optionSplit pour la couleur de la ligne verticale qui la changerait en blanc ou noir ?
GMENU
Maintenant essayons de nous occuper de l'objet de menu GMENU.
Example:
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
XY = [10.w],[10.h]
colbacks = #cccccc || #eeeeee
10 = TEXT
10.text.field = title
10.offset = 0,7
}
TypoScript By Example - 56
Résultat:
C'est pas loin d'être le plus simple GMENu que vous puissiez créer. Modifions le un peu plus pour le rendre plus utilisable:
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
XY = [10.w]+20,20
colbacks = |*| #cccccc || #eeeeee |*|
10 = TEXT
10.text.field = title
10.offset = 0,13
10.align = center
10.niceText = 1
}
Résultat:
Mieux maintenant. Allons-y pour ajouter un effet “roll over” (recouvrement):
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
XY = [10.w]+20,20
colbacks = |*| #cccccc || #eeeeee |*|
10 = TEXT
10.text.field = title
10.offset = 0,13
10.align = center
10.niceText = 1
}
page.10.1.RO < page.10.1.NO
page.10.1.RO = 1
page.10.1.RO {
colbacks = red
10.fontColor = white
}
Résultat:
Challenge (GMENU/1)
Pourriez-vous parvenir à créer ce menu avec les éléments de relief comme celui que nous avons fait avec l'objet
GIFBUILDER plus haut dans ce document ? Et pourriez-vous le faire de sorte que l'effet de refief soit inversée quand vous
faites un “rollover” de l'élément ?
TypoScript By Example - 57
Images avec GMENU
Vous pouvez employer des fonds d'image pour vos items de menu
Exemple:
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
wrap = | <BR>
XY = [4.w], [4.h]
colbacks = olive
4 = IMAGE
4.file = fileadmin/tsbyex/menuback.gif
}
10 = TEXT
10.text.field = title
10.offset = 0,14
10.align = center
10.niceText = 1
L'image "menuback.gif" apparaît comme ceci:
Résultat:
Exemple élaboré (GMENU)
Si vous voulez étudier cet exemple élaboré, où le GMENU crée dynamiquement un fond en relief pour des menuitems,
veuillez aller à la section de Challenge.
Challenge (GMENU/2)
Pourriez-vous créer ce menu, basé sur ce que vous connaissez de l'objet GIFBUILDER ?
Trois images,
left.gif
middle.gif and
right.gif
issu du répertoire “/media/buttons/” sont utilisés
TypoScript By Example - 58
GMENU_LAYER
Typo3 supporte également l'utilisation des menus DHTML basés sur des “layers” (couches). Mais il exige du HMENU de se
composer de deux objets de menu où le premier est GMENU_LAYER. Le second peut être un TMENU ou GMENU
Exemple:
page.includeLibs.gmenu_layers = media/scripts/gmenu_layers.php
page.10 = HMENU
page.10.1 = GMENU_LAYERS
page.10.1 {
layerStyle = position:absolute;left:0px;top:30px;width:10px;VISIBILITY:hidden;
xPosOffset =-10
lockPosition = x
expAll=1
NO {
colbacks = #cccccc
XY = [10.w]+10, 14
10 = TEXT
10.text.field = title
10.offset = 5,10
}
}
page.10.2 = GMENU
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = #99cccc
XY = 120, 14
10 = TEXT
10.text.field = title
10.offset = 5,10
}
Résultat:
Challenge (GMENU_LAYERS/1)
Pouvez vous modifier ce menu avec une disposition comme ceci :
TypoScript By Example - 59
(Toutes les modifications sont faites à l'objet de menu “object 2”, le GMENU)
Challenge (GMENU_LAYERS/2)
Pouvez vous modifier ce menu selon une disposition à peu près comme ceci (au moins l'orientation du menu) :
(Toutes les modifications sont faites à l'objet de menu “object 1”, le GMENU_LAYER)
Prolonger un fond d'image au menu entier
Je voudrais démontrer un dispositif puissant de l'objet de GMENU : Prolonger un fond d'image au-dessus du menu entier :
Basé sur ce menu:
page.includeLibs.gmenu_layers = media/scripts/gmenu_layers.php
page.10 = HMENU
page.10.1 = GMENU_LAYERS
page.10.1 {
layerStyle = position:absolute;left:0px;top:30px;width:10px;VISIBILITY:hidden;
xPosOffset =-10
lockPosition = x
expAll=1
NO {
colbacks = #cccccc
XY = [10.w]+10, 14
10 = TEXT
10.text.field = title
10.offset = 5,10
}
}
page.10.2 = GMENU
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = #99cccc
XY = 200, 20
10 = TEXT
10.text.field = title
10.offset = 5,15
10.fontColor = white
10.niceText = 1
10.fontSize = 20
}
... ajouter ces lignes:
TypoScript By Example - 60
...
page.10.2 = GMENU
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = #99cccc
XY = 200, 20
5 = IMAGE
5.file = fileadmin/tsbyex/sunset_keywest.jpg
10 = TEXT
10.text.field = title
10.offset = 5,15
...
Cela a permis d'insérer l'image “sunset” comme fond. Mais nous voudrions que cette image se prolonge pour le menu
entier, ce qui est effectué par l'ajout d'une propriété à l'objet GMENU au sujet duquel les objets GIFBUILDER sont à modifier
pour ce qui concerne les valeurs d'excentrage (offset). Aussi, ajoutez :
page.10.2.applyTotalH = 5
... et voici ce que vous obtenez!
Concernant la propriété “.applyTotalH”, regardez plus avant dans le TSref. Fondamentalement c'est un indicateur qui
fonctionne comme ceci:
Enfin vous pouvez créer de tels menus tout en souhaitant que vos menus aient une taille en hauteur toujours aussi grande
que celle de l'image de fond pour ne pas couper (“crop”) l'image de fond. Ajoutez ceci:
...
page.10.2 = GMENU
TypoScript By Example - 61
page.10.2.applyTotalH = 5
page.10.2.min = , 200
page.10.2.max = , 200
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = #99cccc
XY = 200, 20
5 = IMAGE
5.file = fileadmin/tsbyex/sunset_keywest.jpg
5.height = 200
10 = TEXT
10.text.field = title
...
Résultat:
Note: Les propriétés “.min” et “.max” définissent les dimensions “x” et “y”. Dans ce cas, nous n'avons spécifié que la valeur
de la dimension “y” par l'utilisation de la virgule “,”:
page.10.2.min = , 200
page.10.2.max = , 200
TypoScript By Example - 62
PHP include-scripts
PHP_SCRIPT cObject
Il n'y a pas beaucoup plus à dire à ce sujet qui n'a pas été déjà dit. Ainsi ce que je vais faire est de vous diriger vers le TSref,
section "PHP include scripts" à la fin du document. Il y une étude de cas ("Casestory”) très pointu que vous pouvez faire
comme exercice.
Il y a en outre une grande démonstration sur le Testsite, mais en fait, vous travaillez dessus. Malheureusement vous avez
travaillé sur un Template de test, aussi en vous dirigeant vers la page "index.php?id=30" vous n'y voyiez seulement que vos
dernières aventures avec le Template de test. Donc, désactivez votre Template de test pour un instant et échappez vous de
ce guide :
(Rappelez-vous d'activer "Clear All Cache" dans le [menu] after deactivating...)
Inspiration
Si vous avez besoin d'inspiration pour vos scripts, vous devriez vraiment jeter un coup d'oeil à certains des scripts d'origine.
Le plus fondamental est le script “af media/scripts/guest.inc” du “guestbook”. Je ne vais pas énumérer le code ici. Il y en a
trop.
N'oubliez pas de regarder le static_template '"content.tt_guest" également. Le TypoScript inclut dedans est la la clef pour
comprendre comment vous reliez TypoScript à vos propres scripts.
TypoScript By Example - 63
Exemple: “Userdefined tags”
J'ai pensé à un grand exemple pour un script d'inclusion (include script). Vraiment utile. Sur le site Web www.typo3.com
j'énumère parfois du code TypoScript. Cela est fait avec une étiquette spéciale que je vais vous présenter ici. Afin de
l'essayer, nous le rajouterons au testsite original, parce qu'il comporte un certain contenu qui viennent nous faciliter les
choses ici.
1) Ouvrir le Template de testsite et ajouter ceci :
# Add the custom tag, <TS>...</TS> to the parseFunc of bodytext
tt_content.text.20.parseFunc.tags {
ts.stripNL = 0
ts = PHP_SCRIPT
ts.file = fileadmin/tsbyex/testtag.inc
}
2) Ouvrir le document fileadmin/tsbyex/testtag.inc avec votre éditeur de texte favori et vérifiez qu'il y a ce contenu :
<?
?>
$contentOfTag = $this->getCurrentVal();
$content = '<B>'.$contentOfTag.'</b>';
3) Ouvrir "Startpage" sur le testsite et ajouter les étiquettes du < ts>… </ts > comme vous voyez ici :
… et espérez pour. Ceci est le résultat :
TypoScript By Example - 64
Avançons nous un peu plus loin, et incluons une bibliothèque avec une classe (class). Par le temps qui court, c'est une
nécessité de toute façon, donc …
1) Ajoutez/modifiez ceci au Template de TypoScript :
# Add the custom tag, <TS>...</TS> to the parseFunc of bodytext
tt_content.text.20.parseFunc.tags {
ts.stripNL = 0
ts = PHP_SCRIPT
ts.file = fileadmin/tsbyex/testtag2.inc
}
includeLibs.testclass_example = fileadmin/tsbyex/testclass.inc
2) ouvrez le document fileadmin/tsbyex/testtag2.inc et fileadmin/tsbyex/testclass.inc avec votre éditeur de texte favori et
vérifiez que le contenu est :
fileadmin/tsbyex/testtag2.inc
<?
?>
$test_object = new testClass;
$contentOfTag = $this->getCurrentVal();
$content = $test_object->formatTS($contentOfTag, 1);
fileadmin/tsbyex/testclass.inc
<?
class testClass {
function formatTS($input, $ln)
{
$input = ereg_replace("^[^".chr(10)."]*.","",$input);
$input = chop($input);
$cArr = explode(chr(10),$input);
}
?>
}
reset($cArr);
$n = ceil(log10(count($cArr)));
$lineNum="";
while(list($k,$v)=each($cArr))
{
if ($ln)
$lineNum = sprintf("% ".$n."d",($k+1)).":
$v=htmlspecialchars($v);
$cArr[$k] = str_replace(" ",chr(160),$lineNum.$v);
}
$output = implode($cArr, "<BR>")."<BR>";
$output = '<font face=verdana size=1 color=maroon>'.$output.'</font>';
return $output;
";
TypoScript By Example - 65
3) Pour finir, saisissez ceci dans le “content record”:
… et vous devriez voir ceci dans votre browser frontend, quand vous rechargez :
Challenge (PHP_SCRIPT1)
Écrire un script qui montre deux formfields, saisissez y deux nombres et quand ils sont envoyés sur la même page, vous
calculez la somme. Et vous l'affichez.
Challenge (PHP_SCRIPT2)
Découvrez ce que la fonction “enableFields()” de la classe cObj (tslib/content.php) fait. (portant la fonction courante est dans
t3lib/page.php). Quels arguments prend-il et comment pourriez vous les employer effectivement ?
TypoScript By Example - 66
Content rendering (restitution de contenu)
Introduction
Vous devriez lire le document Pdf "content_rendering.pdf" sur ce sujet.
Mais une page de contenu régulier est normalement restituée par le static_template "content (default)" que vous incluez
avec votre Template :
Le contenu de static_template "content (default)" inclut lui-même d'autres static_template. L'un d'entre eux est le célèbre
"styles.content (default)" lequel contient beaucoup d'objets TypoScript “premade” (prédéfinis) et qui sont copiés dans des
endroits utiles de la “nodetree” (arbres des noeuds).
Regardez dans le “Object Browser” et vous y verrez qu'un objet “rootlevel” "tt_content" est apparu. L'objet toplevel
"tt_content" est le cObject qui effectue la restitution des contenus à partir de la table "tt_content" par défaut! Et il
semble débuter par un “Case” sur un objet de contenu qui détermine le type de content de l'élément content en question.
TypoScript By Example - 67
CONTENT
Le cObject "CONTENT" est utilisé pour chercher le contenu à partir de la table "tt_content". Il effectue un SELECT-query sur
la database et le résultat est alors - record par record - “rendered” (restitué) par l'objet toplevel "tt_content." (à moins que
nous n'indiquions autre chose)
Exemple:
(d'abord : inclure le static_template "content (default)" si vous ne l'avez pas déjà fait!)
page.10 = CONTENT
page.10 {
table = tt_content
select.orderBy = sorting
select.where = colPos=0
}
Résultat:
TypoScript By Example - 68
C'est aussi simple que cela !
colPos
Mais qu'est-ce "colPos=0"?
Bon, Typo3 peut (par défaut) travailler sur quatre colonnes de contenu définies par le champ "colPos" de la table tt_content.
Ceci montre comment l'interface affiche les colonnes et comme vous le voyez actuellement, il n'y a aucun item dans les
autres colonnes :
TypoScript By Example - 69
Essayez de créer quelque nouveaux contenus dans la colonne "border" :
… et il apparaît bien dans la colonne "border" :
Afin d'insérer le contenu sur le site Web, vous devez savoir quelle valeur le champ "colPos" a pour la colonne “border” (de
bord). Aussi, allez sur “$tc-browser” dans le module “Tools” :
TypoScript By Example - 70
La valeur est "3". Modifiez ainsi votre TypoScript comme ceci :
page.10 = CONTENT
page.10 {
table = tt_content
select.orderBy = sorting
select.where = colPos=3
}
Résultat:
TypoScript By Example - 71
styles.content (default)
Donnons nous une minute pour regarder dans le static_template "styles.content (default)". Tel que indiqué, il contient un
gros paquets de “premade” TypoScript disponible pour que nous l'employons. En fait les tâches ci-dessus pourraient avoir
été beaucoup plus faciles si elles avaient été basées sur ce que nous voyons ici :
page.10 < styles.content.get
substitutes
page.10 = CONTENT
page.10 {
table = tt_content
select.orderBy = sorting
select.where = colPos=0
}
et de même avec la colonne "border":
page.10 < styles.content.getBorder
Vous l'avez? Bon.
lib.stdheader
Dans le static_template "content (default)" vous y voyez un objet "lib.stdheader" ainsi défini :
lib.stdheader = COA
lib.stdheader {
stdWrap.wrapAlign.field = header_position
stdWrap.typolink.parameter.field = header_link
stdWrap.fieldRequired = header
stdWrap.if {
equals.field = header_layout
value = 100
negate = 1
}
...
… et utilisé à beaucoup d'endroits :
# CType: bullet
tt_content.bullets = COA
tt_content.bullets {
10 = < lib.stdheader
20 = CASE
...
# CType: text
tt_content.text = COA
tt_content.text {
10 = < lib.stdheader
20 = TEXT
20 {
...
# CType: multimedia
TypoScript By Example - 72
tt_content.multimedia = COA
tt_content.multimedia {
10 = < lib.stdheader
20 = MULTIMEDIA
...
A l'opposé de l'utilisation normale d'un "shared code" qui est copié réellement à d'autres endroits, des cOjects peuvent être
partagés par référence à un objet “toplevel” (voir le TSref, section "cObjects").
En regardant dans le “Object Browser”, nous nous rendons compte que c'est vrai :
tt_content.text.10 a la valeur "< lib.stdheader" – pas les propriétés de l'objet!
C'est une implémentation très intelligente dans ce cas-ci parce que si le “header” de tous les éléments “content” est rendu
par le même objet “lib.stdheader”, c'est le seul endroit où faire des changements pour changer le rendu du “header” !
Exemple:
page.10 < styles.content.getBorder
lib.stdheader >
lib.stdheader = TEXT
lib.stdheader.value = ALTERNATIVE HEADER !!
donne le résultat :
Indépendamment de ceci, je ne vais pas vous aider davantage avec le rendu de contenu standard. En se basant sur le
matériel de ce document, vous devez passer en revue “tt_content node-treepar” et voir pour vous-même.
C'est comme pour les réponses aux grandes questions de la vie : "tout est dans le “”Scriptures””". : -)
RECORD
Ce cObject est utilisé pour ramener des enregistrements uniques. CONTENT a été conçu pour obtenir une liste
d'enregistrements – normalement depuis la table tt_content. Mais cela pourrait être n'importe quelle table :
Un example rapide:
page.10 = RECORDS
page.10.source = 1
page.10.tables = tt_content
page.10.conf.tt_content = TEXT
page.10.conf.tt_content {
field = header
case = upper
wrap = <B> | </B>
}
résultat :
… parce que l'enregistrement dans la table "tt_content" avec l'uid "1" était :
TypoScript By Example - 73
Un autre exemple:
dans la table “tt_address”, il y a quelques enregistrements avec des personnages des Simpsons. Ils sont à la page "Another
site in.../Lists/Addresses/"
temp.tt_address = COA
temp.tt_address.wrap = | <HR>
temp.tt_address.10 = TEXT
temp.tt_address.10 {
field = name
case = upper
wrap = <B> | </B><BR>
}
temp.tt_address.20 = IMAGE
temp.tt_address.20 {
file.import.field = image
file.import = uploads/pics/
file.import.listNum = 0
file.height = 100
}
page.10 = RECORDS
page.10.source = 3,1,5
page.10.tables = tt_address
page.10.conf.tt_address < temp.tt_address
Résultat ici :
TypoScript By Example - 74
Notez comment "tt_content" dans le premier TypoScript est devenu "tt_address" parce que nous travaillons sur une table
différente.
Une exécution alternative qui fait exactement la même chose est ceci :
tt_address = COA
tt_address.wrap = | <HR>
tt_address.10 = TEXT
tt_address.10 {
field = name
case = upper
wrap = <B> | </B><BR>
}
tt_address.20 = IMAGE
tt_address.20 {
file.import.field = image
file.import = uploads/pics/
file.import.listNum = 0
file.height = 100
}
page.10 = RECORDS
page.10.source = 3,1,5
page.10.tables = tt_address
Notez comment la ligne "page.10.conf.tt_address < temp.tt_address" a été retirée. Cette ligne a copié l'objet
"temp.tt_address" et l'a utilisée pour le “rendering” de l'enregistrement. Mais l'option par défaut doit employer l'objet de
toplevel nommé comme la table. Donc "tt_address" au “toplevel” restituera l'enregistrement si cette ligne est omise et est
exactement ce ce que l'exemple montre ("temp.tt_address" a été changé en "tt_address").
TypoScript By Example - 75
Réponses aux Challenges
Challenge (stdWrap/1)
Vous pouvez employer le date et le “strftime”. Chaque propriété a un type de donnée (datatype), "date-conf" et "strftime-conf"
qui sont de base dans le manuel PHP
page.10 = TEXT
page.10.field = crdate
page.10.date = d-m-y H:i
Donne
01-07-00 15:48
page.10 = TEXT
page.10.field = crdate
page.10.strftime = %A %e. %B, %I:%M %p
Donne
Saturday 1. July, 03:48 PM
page.10 = TEXT
page.10.field = crdate
page.10.strftime = %A %e. %B, %I:%M %p
config.locale_all = deutsch
Donne
Samstag 1. Juli, 03:48
Challenge (stdWrap/2)
page.10 = TEXT
page.10.data = leveltitle:-2
Challenge (stdWrap/3)
page.10 = TEXT
page.10.field = subtitle
page.10.ifEmpty = Hello world
Challenge (stdWrap/4)
page.10 = TEXT
page.10.field = subtitle
page.10.ifEmpty {
field = title
required = 1
wrap = <font color="red">|</font>
}
page.10.wrap = <H3>|</H3>
"ifEmpty" (du stdWrap) est une valeur de chaîne de caractères avec des propriétés de stdWrap, tant et si bien que le jeu
continue, en utilisant “.field” et “.required” (lequel est retourné si “.field” retourne une valeur vide) et “.wrap” (qui est
seulement exécuté si “.required” ne donne pas lieu à un retour de valeur)
Alternativement (en utilisant “.if” au lieu du “.required”)
page.10 = TEXT
page.10.field = subtitle
page.10.ifEmpty {
field = title
if.isTrue.field = title
wrap = <font color="red">|</font>
}
page.10.wrap = <H3>|</H3>
TypoScript By Example - 76
Challenge (cObject/1)
page.10 = COA
# Header to this section
page.10.10 = TEXT
page.10.10 {
value = This is the page title:
...
20.wrap = Subtitle: <B> |</B>
20.required=1
}
Challenge (cObject/2)
page.10 = COA
page.10.if.isTrue.field = subtitle
...
Voir le TSref (- > if) pour des propriétés de cet objet. Dans ce cas-ci le ->if renvoie vrai (true) si le fieldvalue du sous-titre
n'est pas vide
Challenge (cObject/3)
page.10 = COA
page.10.if.value = 1
page.10.if.isGreaterThan.data = level:1
...
Ici nous comparons deux valeurs. C'est un peu 'backwards' un retour en arrière, mais voilà comment cela fonctionne : "if
retourne “true” si le “level” où nous sommes (rootline level, démarre à zéro pour la rootpage) est plus grande que la valeur
définies by le “if.value"”
Questions (cObject/4)
Typo3 redimensionne réellement l'image.
Le premier exemple a le nom de fichier "fileadmin/tsbyex/alligator.jpg".
Le deuxième exemple a le nom de fichier "typo3temp/3de305c72b.jpg". Le nom de fichier est le résultat retaillé d'un “md5hash” calculé pour l'image lors de la fabrication du code de TypoScript. Notez qu'un changement des propriétés pour
“imgResource”, c'est également un nouveau fichier dans le répertoire /typo3temp/ et donc celui ci avec le temps
rassemblera beaucoup d'images inutilisées.
Challenge (cObject/5)
Version exhaustive :
page.10 = IMAGE
page.10 {
file = fileadmin/tsbyex/alligator.jpg
file.width = 200
imageLinkWrap = 1
imageLinkWrap.enable = 1
imageLinkWrap.JSwindow = 1
}
La version "Rolls Royce":
page.10 = IMAGE
page.10 {
file = fileadmin/tsbyex/alligator.jpg
file.width = 200
imageLinkWrap = 1
imageLinkWrap.enable = 1
imageLinkWrap.JSwindow = 1
imageLinkWrap {
bodyTag = <BODY bgColor=black>
wrap = <A href="javascript:close();"> | </A>
width = 400m
height = 300
JSwindow = 1
JSwindow.expand = 22,30
}
}
... donne pour résultat:
La fenêtre est fermée avec un clic sur l'image qui est limitée au une dimensions maximale de 400x300. La taille de la
fenêtre Javascript est basée sur la taille de l'image mais 22 et 30 Pixels sont ajoutés afin de mettre des bords à la fenêtre.
TypoScript By Example - 77
Challenge (cObject/6)
page.10 = IMG_RESOURCE
page.10 {
file = fileadmin/tsbyex/alligator.jpg
file.width = 200
}
page.10.stdWrap.wrap = <table border=1 cellpadding=30 background="|"><tr><td><BR><font color=white
size=4><B>Hello World</b></font></td></tr></table>
(la dernière ligne est une ligne !)
Challenge (cObject/7)
page.5 = TEXT
page.5.value = Before ruler
page.5.wrap = | <BR>
page.10 = HRULER
page.10 {
lineThickness = 3
lineColor = red
}
page.10.stdWrap.spaceAfter = 20
page.10.stdWrap.spaceBefore = 10
page.15 = TEXT
page.15.value = After ruler
Ceci a comme conséquence :
TypoScript By Example - 78
Notez que nous avons du mettre une étiquette <BR> après le "Before ruler" text. Dans le cas contraire, l'espace ci-dessus
n'aurait pas fonctionné. Le code HTML:
Before ruler<BR>
<img src="clear.gif" width=1 height=10 border=0><BR>
<table border=0 cellspacing=0 cellpadding=0 width=99%>
<tr>
<td bgColor="red"><img src="clear.gif" width=1 height=3></td>
</tr>
</table>
<img src="clear.gif" width=1 height=20 border=0><BR>
After ruler
Challenge (cObject/8)
page.bodyTagMargins = 0
page.10 = OTABLE
page.10 {
tableParams = border=0 cellpadding=0 cellspacing=0 width=1
offset = 0,20
10 = TEXT
10.value = What a cute little alligator! Dear Lord, may it never grow up!
10.wrap = |<BR>
20 = IMAGE
20.file = fileadmin/tsbyex/alligator.jpg
20.file.width=200
}
30 = CLEARGIF
30.width=250
30.stdWrap.wrap = <BR> |
Challenge (cObject/9)
page.10 = TEMPLATE
page.10 {
template = FILE
template.file = fileadmin/tsbyex/template.html
workOnSubpart = DOCUMENT
marks.SIMPLE_WORD = TEXT
marks.SIMPLE_WORD.field = title
subparts.LINK = TEXT
subparts.LINK.current = 1
subparts.LINK.typolink {
parameter.data = leveluid:1
wrap = <B>|</B>
target = _blank
}
}
Challenge (PHP_SCRIPT1)
Voir le fileadmin/tsbyex/test_calculate.inc
TypoScript By Example - 79
Essayer ce TypoScript (avec votre Gabarit d'essai) :
page.10 = PHP_SCRIPT
page.10.file = fileadmin/tsbyex/test_calculate.inc
Voici le résultat
Essayer d'entrer quelques nombres et de cliquez "Calculate!"
Voici la liste du code :
<?
if (is_object($this))
{
if (t3lib_div::GPvar("submit"))
{
// Calculate result.
// Disable cache, because the result must not be cached:
$GLOBALS["TSFE"]->set_no_cache();
// Get values:
$value_1 = t3lib_div::GPvar("value_1");
$value_2 = t3lib_div::GPvar("value_2");
// Output result:
$content.="Result is: ".($value_1 + $value_2);
} else {
// Draw the form:
$content.='
<form action="index.php?id='.$GLOBALS["TSFE"]->id.'&type='.$GLOBALS["TSFE"]->type.'&no_cache=1"
method="POST">
<input type="Text" name="value_1"> + <input type="Text" name="value_2"> =<br>
<input type="Submit" name="submit" value="Calculate!">
</form>
';
}
} else die("You MUST include this script as a PHP_SCRIPT cObject.");
?>
Particulièrement, je voudrais que vous notiez que le “URL” du formulaire est la page courante et que le paramètre
“&no_cache=1” est envoyé. Ce paramètre force le script de “index_ts.php” à "exécuter" le TypoScript du Template (restituant
de ce fait les cOjects).Si ce paramètre n'est pas placé, nous pourrions au lieu d'obtenir ce résultat, voir le formulaire du fait
du cache des pages!
Quand le résultat est affiché, le cache est déjà neutralisé si le paramètre de “&no_cache” est envoyé. Mais au cas où il ne le
serait pas, nous nous assurons que la page n'est pas cachée avec la fonction “$GLOBALS["TSFE"]->set_no_cache()”.
Challenge (PHP_SCRIPT2)
Dans vos scritps “include” vous pouvez employer la fonction “$this->enablefields("[table-name>]")” pour obtenir de la partie
provenant de la “Where-clause” les enregistrements “deselects” d'une table, du moment qu'ils sont soit en “cache” ou
“hidden” ou “timed” ou encore user-disabled” - basés sur les paramétrages dans “tables.php”.
Voilà pourquoi il est brillant ! Il vous fournit une manière “blindée” pour obtenir des résultats corrects pour vos “SQL-queries”
en tenant compte des dispositifs dissimulés du “start-/endtime” et du “fe_group” pour les enregistrements retournés - si ces
TypoScript By Example - 80
dispositifs apparaissent.
Essayer cet exemple :
dans votre template (votre template de test)
page.10 = PHP_SCRIPT
page.10.file = fileadmin/tsbyex/test_enablefields.inc
Allez sur le site:
|pages|
| AND NOT pages.deleted AND NOT pages.hidden AND (pages.starttime<=985903309) AND (pages.endtime=0 OR
pages.endtime>985903309) AND pages.fe_group IN (0,-1)|
|tt_content|
| AND NOT tt_content.deleted AND NOT tt_content.hidden AND (tt_content.starttime<=985903309) AND
(tt_content.endtime=0 OR tt_content.endtime>985903309) AND tt_content.fe_group IN (0,-1)|
|tt_address|
| AND NOT tt_address.deleted AND NOT tt_address.hidden|
Comme vous pouvez voir, la fonction va afficher avec le debug() function, voyez le fichier /
”/fileadmin/tsbyex/test_enablefields.inc” le résultat de la “WHERE-clause”.
Pour toutes les “table”, "page", "tt_content" et "tt_address" le champ “deleted” ne peut contenir “true”. Ce champ “deleted”
est disposé pour les enregistrements supprimés de Typo3. Ainsi toutes les tables sont 'checked' sur leur “hidden-field”
Mais apparemment, la table "tt_address" n'a pas de champs “startime” et “endtime” au contraire de "pages" et de
"tt_content".
Une rapide vérification dans “tables.php”:
(pages)
...
$tc[pages] = Array (
"ctrl" => Array (
"label" => "title",
"tstamp" => "tstamp",
"sortby" => "sorting",
"title" => "Page|Side|Seite|Side|Pagina|Page",
"type" => "doktype",
"delete" => "deleted",
"crdate" => "crdate",
"cruser_id" => "cruser_id",
"enablecolumns" => Array (
"fe_group" => "fe_group",
"disabled" => "hidden",
"starttime" => "starttime",
"endtime" => "endtime"
),
"mainpalette" => 1,
"useColumnsForDefaultValues" => "doktype,fe_group,hidden"
...
(tt_content)
$tc[tt_content] = Array (
"ctrl" => Array (
"label" => "header",
"sortby" => "sorting",
"tstamp" => "tstamp",
"title" => "Pagecontent|Sideindhold|Seiteninhalt|Sideinnhold|Contenuto pagina|Contenu de la
page",
"delete" => "deleted",
"type" => "CType",
"enablecolumns" => Array (
"fe_group" => "fe_group",
"disabled" => "hidden",
"starttime" => "starttime",
"endtime" => "endtime"
),
"typeicon_column" => "CType",
"typeicons" => Array (
...
(tt_address)
$tc[tt_address] = Array (
"ctrl" => Array (
TypoScript By Example - 81
...
),
"label" => "name",
"default_sortby" => "ORDER BY name",
"tstamp" => "tstamp",
"delete" => "deleted",
"title" => "Address|Adresse|Adresse|Adresse|Indirizzo:",
"enablecolumns" => Array (
"disabled" => "hidden"
),
"thumbnail" => "image"
Ces exemples montrent où les "enablefields" sont configurés.
“Code” de "fileadmin/tsbyex/test_enablefields.inc"
<?
debug("pages",1);
debug($this->enableFields("pages"),1);
debug("tt_content",1);
debug($this->enableFields("tt_content"),1);
debug("tt_address",1);
debug($this->enableFields("tt_address"),1);
?>
Challenge (imgResource/1)
page.bgImg.import {
cObject = TEXT
cObject.value = fileadmin/tsbyex/alligator.jpg
cObject.override {
required = 1
field = media
listNum = 1
wrap = uploads/media/ |
}
}
page.bgImg.width = 200
Challenge (GIFBUILDER/1)
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file {
XY = [20.w]+20, 30
colbacks = olive
}
20 = TEXT
20.text.field = title
20.offset = 10,20
20.niceText = 1
20.fontSize= 20
20.fontFile = t3lib/fonts/verdana.ttf
20.fontColor = #660000
20.emboss {
offset = -2,-2
highColor = olive : +30
lowColor = olive : -30
blur = 30
opacity = 80
}
Résultat:
TypoScript By Example - 82
Notez les définitions de couleur dans la propriété “.emboss”. Le TSref indique que la valeur est "GraphicColor" laquelle a
une option qui nous laisse arithmétiquement changer la valeur de couleur. Dans ce cas-ci, la couleur "high" (light) est
éclaircie (linear brightness value) de “30” et la "low" est obscurcie de même de “30”. Malheureusement, Typo3
(ImageMagick...) ne supporte pas le mode “blend” (combinaison) "multiply" et "screen" qui sont habituels pour beaucoup
des programmes de manipulation d'image. Ces modes auraient été plus correctes dans ces situations.
Challenge (GIFBUILDER/2)
page.10 = IMAGE
page.10.file = GIFBUILDER
page.10.file {
XY = 200, 160
colbacks = silver
}
20 = TEXT
20.text.field = title
20.offset = 0,120
20.niceText = 1
20.align=center
20.fontSize= 40
20.fontFile = t3lib/fonts/verdana.ttf
20.fontColor = yellow
# Left, top
30 = IMAGE
30.file = fileadmin/tsbyex/alligator.jpg
30.file.width=50
30.offset = 5,5
# Left, bottom
31 < .30
31.align = , b
31.offset = 5,-5
# Right, top
32 < .30
32.align = r , t
32.offset = -5,5
# Right, bottom
33 < .30
33.align = r , b
33.offset = -5,-5
Résultat:
Les propriétés “.align” et “.offset” sont reliées entre elles comme vous voyez. Si vous spécifiez l'alignement à "r,b" (right bottom), l'excentrage est relatif à cette position et vous devez spécifier "-5, -5" pour décaler l'image vers le haut et la gauche.
Notez, en outre, comment la syntaxe de TypoScript est utilisée pour copier le premier objet à la position adéquate dans
l'autre objet, nous préservant de ce fait de redondances qu'auraient impliqué la définition du même nom de fichier à
plusieurs reprises, encore et encore… Voilà comment il apparaît dans le “Object Browser”:
TypoScript By Example - 83
Challenge (GIFBUILDER/3)
Ajoutez:
}
# Left border
40 = BOX
40.color = red
40.dimensions = 0,0,2,160
# Right border
41 < .40
41.align = r
# Top border
42 < .40
42.dimensions = 0,0,200,2
# Bottom border
43 < .42
43.align = ,b
Résultat:
TypoScript By Example - 84
Challenge (TMENU/1)
...
wrap = <tr><td nowrap> | </td></tr>
target = page
NO {
afterImg = media/bullets/bullet1_n.gif
afterROImg = media/bullets/bullet1_h.gif
afterImgTagParams = hspace=2
RO = 1
after = <br>
...
Challenge (TMENU/2)
...
after = <br>
ATagBeforeWrap = 1
linkWrap= <font face=Verdana size=1 color=black> | </font>
}
}
page.10.3 < page.10.2
page.10.3.wrap >
page.10.3.NO.before = <font size=1>&nbsp;&nbsp;&nbsp;</font>
page.10.2.expAll = 1
Résultat:
(afin d'avoir assez d'items de menu, j'ai dû déplacer quelques pages provenant de "Another site in...")
Challenge (TMENU/3)
page.10 = HMENU
page.10.1 = TMENU
page.10.1.target = page
page.10.1 {
expAll = 1
TypoScript By Example - 85
wrap = <table width="300" border=1 cellspacing=0 cellpadding=0><tr><td><img src="clear.gif" width=1
hspace=200 height=1 vspace=3 border=0></td></tr> | </table>
NO.linkWrap = <font face=Arial size=2 color=black><b> |</b></font>
NO.allWrap = <tr><td><img src="clear.gif" width=1 height=1 vspace=3 border=0><br> | </td></tr>
NO.ATagBeforeWrap = 1
ACT < .NO
ACT = 1
ACT.linkWrap = <font face=Arial size=2 color=red><b> |</b></font>
}
page.10.2 = TMENU
page.10.2 {
wrap = <tr><td nowrap> | </td></tr>
target = page
NO {
afterImg = media/bullets/bullet1_n.gif
afterROImg = media/bullets/bullet1_h.gif
afterImgTagParams = hspace=2
RO = 1
after = <br>
ATagBeforeWrap = 1
linkWrap= <font face=Verdana size=1 color=black> | </font>
}
ACT < .NO
ACT =1
ACT.linkWrap = <font face=Verdana size=1 color=red> | </font>
}
Challenge (TMENU/4)
temp.challengeMenu = HMENU
temp.challengeMenu.stdWrap.wrap = <TABLE width="200" border="0" cellspacing="0" cellpadding="0"
bgcolor="#004828"><TR><TD><TABLE border="0" width="100%" cellspacing="1" cellpadding="2">|
</TABLE></TD></TR></TABLE>
temp.challengeMenu.entryLevel = 0
temp.challengeMenu.1 = TMENU
temp.challengeMenu.1.target = _top
temp.challengeMenu.1.NO {
allWrap = <TR><TD bgcolor="#638E7B" align="center" valign="top" width="5"><IMG
src="media/bullets/blackdot.gif" width="5" height="9"></TD><TD bgcolor="#638E7B" width="160"> | </TD></TR>
ATagBeforeWrap = 1
linkWrap = <FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#004B2C"> | </FONT>
stdWrap.case = upper
}
temp.challengeMenu.1.ACT < temp.challengeMenu.1.NO
temp.challengeMenu.1.ACT = 1
temp.challengeMenu.1.ACT {
linkWrap = <FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="white"> | </FONT>
}
temp.challengeMenu.2 = TMENU
temp.challengeMenu.2.target = _top
temp.challengeMenu.2.NO {
allWrap = <TR><TD colspan="2" bgcolor="#D0DCD8">|</TD></TR>
ATagBeforeWrap = 1
linkWrap = <FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#004B2C">|</FONT>
stdWrap.case = upper
}
temp.challengeMenu.2.ACT < temp.challengeMenu.2.NO
temp.challengeMenu.2.ACT = 1
temp.challengeMenu.2.ACT {
allWrap = <TR><TD colspan="2" bgcolor="#FFFBE7">|</TD></TR>
TypoScript By Example - 86
}
linkWrap = <FONT face="Verdana, Arial, Helvetica, sans-serif" size="1" color="#004B2C">|</FONT>
page.noLinkUnderline =1
page.10 < temp.challengeMenu
Exemple (TMENU)
temp.leftmenu = HMENU
temp.leftmenu.entryLevel = 0
temp.leftmenu.1 = TMENU
temp.leftmenu.1.target = _top
temp.leftmenu.1.collapse = 1
temp.leftmenu.1.wrap = <table border=0 cellpadding=0 cellspacing=0> | </table>
temp.leftmenu.1.NO {
allWrap = <TR><TD colspan=2><img src="clear.gif" width=1 height=5></TD></TR><TR><TD colspan=2> |
</TD></TR>
ATagBeforeWrap = 1
linkWrap = <b><font face="verdana" size=1 color=black> | </font></b>
stdWrap.case = upper
}
temp.leftmenu.2 = TMENU
temp.leftmenu.2.target = _top
temp.leftmenu.2.wrap = | <TR><TD><img src="clear.gif" width=1 height=10></TD><TD></TD></TR>
temp.leftmenu.2.NO {
allWrap = <TR><TD><img src="clear.gif" width=10 height=1></TD><TD> | </TD></TR>
after = <BR><img src="media/bullets/stipler3.gif" height=1 vspace=1> |*||*| <img src="clear.gif" width=1
height=1><BR>
ATagBeforeWrap = 1
linkWrap = <font face="verdana" size=1 color=black> | </font>
}
page.10 < temp.leftmenu
Résultat:
Challenge (IMGMENU/1)
...
dWorkArea = 77,15
}
NO.distrib = 0, 15
NO.10 = TEXT
NO.10 {
text.field = title
fontSize = 11
fontColor = black
niceText = 1
offset = 0,0
imgMap.explode = 3,2
}
NO.20 = BOX
NO.20 {
dimensions = 0,3,120,1
color = white
}
TypoScript By Example - 87
page.10 < temp.topmenu
Note que le "||" du "NO.20" est supprimé afin que la ligne blanche apparaisse sous chaque élément!
Challenge (IMGMENU/2):
...
NO.20 = BOX
NO.20 {
dimensions = 0,3,120,1
color = |*| white || black |*|
}
}
Résultat:
Challenge (GMENU/1)
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
XY = [10.w]+20,20
colbacks = olive
10 = TEXT
10.text.field = title
10.offset = 0,13
10.align = center
10.niceText = 1
10.emboss {
offset = -2,-2
highColor = olive : +30
lowColor = olive : -30
blur = 30
opacity = 80
}
}
page.10.1.RO < page.10.1.NO
page.10.1.RO = 1
page.10.1.RO {
10.emboss.offset = 2,2
}
Exemple élaboré (GMENU)
Mettre ceci dans le champ “Constants”:
buttonH = 25
buttonColor = #ccccff
Mettre ceci dans le champ “Setup”:
temp.topmenuText = TEXT
temp.topmenuText {
text.field = title
offset = 10,17
fontFile = fileadmin/fonts/arial_bold.ttf
fontSize = 15
TypoScript By Example - 88
}
niceText = 1
temp.topmenu = HMENU
temp.topmenu.1 = GMENU
temp.topmenu.1.target = _top
temp.topmenu.1.accessKey = 1
temp.topmenu.1.NO {
XY = [100.w]+22, {$buttonH}
colbacks = {$buttonColor}
10 = IMAGE
10.file = GIFBUILDER
10.file {
XY = 6,30
colbacks = {$buttonColor} : *0.5
100 = SCALE
100.width = 6
100.height = {$buttonH}
}
10.mask = GIFBUILDER
10.mask {
XY = 6,30
10 = IMAGE
10.file = media/buttons/maskpart1.tif
100 = SCALE
100.width = 6
100.height = {$buttonH}
}
20 = IMAGE
20.file = GIFBUILDER
20.align = r
20.file {
XY = 6,30
colbacks = {$buttonColor} : *0.5
100 = SCALE
100.width = 6
100.height = {$buttonH}
}
20.mask = GIFBUILDER
20.mask {
XY = 6,30
10 = IMAGE
10.file = media/buttons/maskpart2.tif
100 = SCALE
100.width = 6
100.height = {$buttonH}
}
30 = IMAGE
30.file = GIFBUILDER
30.offset = 6,0
30.file {
XY = [100.w]+10,{$buttonH}
colbacks = {$buttonColor} : *0.5
100 < temp.topmenuText
100.hide = 1
}
30.mask = GIFBUILDER
30.mask {
XY = [40.w], [40.h]
40 = IMAGE
40.file = media/buttons/maskpart3.tif
60 = SCALE
60.width = [100.w]+10
60.height = {$buttonH}
100 < temp.topmenuText
100.hide = 1
}
100 < temp.topmenuText
}
temp.topmenu.1.RO < temp.topmenu.1.NO
temp.topmenu.1.RO=1
temp.topmenu.1.RO.100.fontColor = white
page.10 < temp.topmenu
Résultat:
TypoScript By Example - 89
Challenge (GMENU/2)
page.10 = HMENU
page.10.1 = GMENU
page.10.1.NO {
XY = [10.w]+20,20
colbacks = olive
4 = IMAGE
4.file = media/buttons/middle.gif
4.tile = 10
5 = IMAGE
5.file = media/buttons/left.gif
6 = IMAGE
6.file = media/buttons/right.gif
6.align = r
}
10 = TEXT
10.text.field = title
10.offset = 0,13
10.align = center
10.niceText = 1
Challenge (GMENU_LAYERS/1)
page.includeLibs.gmenu_layers = media/scripts/gmenu_layers.php
page.10 = HMENU
page.10.1 = GMENU_LAYERS
page.10.1 {
layerStyle = position:absolute;left:0px;top:30px;width:10px;VISIBILITY:hidden;
xPosOffset =-10
lockPosition = x
expAll=1
NO {
colbacks = #cccccc
XY = [10.w]+10, 14
10 = TEXT
10.text.field = title
10.offset = 5,10
}
}
page.10.2 = GMENU
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = |*| #99cccc || #99cccc : *1.2 |*|
XY = 120, 20
10 = TEXT
10.text.field = title
10.offset = 5,13
10.niceText = 1
20 = BOX
20.dimensions = 0,0,2,20
20.color = #660000
21 < .20
21.align = r
22 = BOX ||
22.dimensions = 0,0,120,2
22.color = #660000
23 = |*||*|
|| BOX
TypoScript By Example - 90
}
23.dimensions = 0,0,120,2
23.color = #660000
23.align = ,b
Résultat:
Commentaires: Les objects GIFBUILDER 22 et 23 sont activées par optionSplit. Dans le cas du "22" optionSplit assigne
"BOX" comme valeur pour le premier item du menu. Dans le cas du "23" optionSplit assigne "BOX" comme valeur
seulement pour le dernier item. Référez-vous à l'exemple optionSplit de TSref.
Challenge (GMENU_LAYERS/2)
page.includeLibs.gmenu_layers = media/scripts/gmenu_layers.php
page.10 = HMENU
page.10.1 = GMENU_LAYERS
page.10.1 {
layerStyle = position:absolute;left:120px;top:30px;width:10px;VISIBILITY:hidden;
yPosOffset =-30
lockPosition = y
expAll=1
NO {
wrap = |<BR>
colbacks = |*| #ff6600 || #ff6600 : -30 |*|
XY = 130, 15
10 = TEXT
10.text.field = title
10.text.case = upper
10.offset = 5,10
10.niceText = 1
10.fontFace = t3lib/fonts/verdana.ttf
10.fontSize = 8
10.spacing = 2
20 < .10
}
RO < .NO
RO=1
RO.backColor = #ff9900
}
page.10.2 = GMENU
page.10.2.wrap = |<BR>
page.10.2.NO {
colbacks = |*| #99cccc || #99cccc : *1.2 |*|
XY = 120, 20
10 = TEXT
10.text.field = title
10.offset = 5,13
10.niceText = 1
20 = BOX
20.dimensions = 0,0,2,20
20.color = #660000
21 < .20
21.align = r
22 = BOX ||
22.dimensions = 0,0,120,2
22.color = #660000
23 = |*||*|
|| BOX
23.dimensions = 0,0,120,2
23.color = #660000
23.align = ,b
}
TypoScript By Example - 91
Résultat:
Commentaires:
La chose principale est de changer l'orientation du GMENU_LAYERS ici est de réarranger les paramètres pour les couches
dynamiques (dynamic layers):
layerStyle = position:absolute;left:120px;top:30px;width:10px;VISIBILITY:hidden;
yPosOffset =-30
lockPosition = y
Quand vous appliquerez le menu sur une page, vous aurez besoin de fignolez (“tweek”) ces paramètres pour adapter le
design de la page afin que le menu apparaisse correctement avec les coordonnées spécifiées.
Entre autres choses astucieuses dans ce menu, il y a
20 < .10
Ceci crée une copie du textobject, parce que sans le texte, il tend à être trop faiblard. Ainsi c'est un “workaround”
(contournement) du fait que nous ne disposons pas de la version "bold" de la police. Voilà à quoi il ressemblerait sans:
TypoScript By Example - 92