TYPO3 est un système de gestion de contenu (CMS) open-source professionnel, flexible et extensible. Il est particulièrement adapté aux sites web d'entreprise de moyenne à grande taille nécessitant des fonctionnalités avancées.

🎯 Points clés :
  • CMS open-source mature (depuis 1998)
  • Architecture flexible et extensible
  • Gestion multisite et multilingue
  • Droits d'accès granulaires
  • Communauté active et extensions nombreuses

Architecture TYPO3

Structure des répertoires

Plaintext
typo3conf/
├── ext/                    # Extensions locales
│   └── mon_extension/
│       ├── Configuration/
│       ├── Resources/
│       └── Classes/
├── LocalConfiguration.php  # Configuration principale
└── AdditionalConfiguration.php

public/
├── typo3/                 # Backend TYPO3
├── typo3conf/             # Lien symbolique
├── fileadmin/             # Fichiers utilisateurs
└── index.php              # Point d'entrée

var/
├── cache/                 # Cache système
├── log/                   # Fichiers de log
└── session/               # Sessions

Configuration de base

PHP
// LocalConfiguration.php (extrait)
return [
    'BE' => [
        'debug' => false,
        'installToolPassword' => '$argon2i$...',
    ],
    'DB' => [
        'Connections' => [
            'Default' => [
                'charset' => 'utf8mb4',
                'dbname' => 'typo3_db',
                'driver' => 'mysqli',
                'host' => 'localhost',
                'password' => 'motdepasse',
                'port' => 3306,
                'user' => 'typo3_user',
            ],
        ],
    ],
];

TypoScript

Configuration de page

TypoScript
# Page configuration de base
page = PAGE
page {
    typeNum = 0
    
    # Meta tags
    meta {
        viewport = width=device-width, initial-scale=1
        description.field = description
        keywords.field = keywords
    }
    
    # CSS
    includeCSS {
        main = EXT:mon_extension/Resources/Public/Css/main.css
    }
    
    # JavaScript
    includeJS {
        main = EXT:mon_extension/Resources/Public/JavaScript/main.js
    }
    
    # Template principal
    10 = FLUIDTEMPLATE
    10 {
        templateName = TEXT
        templateName.stdWrap.cObject = CASE
        templateName.stdWrap.cObject {
            key.data = pagelayout
            default = TEXT
            default.value = Default
        }
        
        templateRootPaths {
            0 = EXT:mon_extension/Resources/Private/Templates/
        }
        
        variables {
            contentMain < styles.content.get
            contentMain.select.where = {#colPos}=0
        }
    }
}

Menu de navigation

TypoScript
# Menu principal
lib.mainMenu = HMENU
lib.mainMenu {
    1 = TMENU
    1 {
        wrap = <ul class="nav-menu">|</ul>
        
        NO = 1
        NO {
            wrapItemAndSub = <li>|</li>
            ATagTitle.field = nav_title // title
        }
        
        ACT < .NO
        ACT = 1
        ACT {
            wrapItemAndSub = <li class="active">|</li>
        }
    }
}

Fluid Templates

Layout principal

HTML
<!-- Resources/Private/Layouts/Default.html -->
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" 
      data-namespace-typo3-fluid="true">

<f:render section="Header" />

<main>
    <f:render section="Main" />
</main>

<f:render section="Footer" />

</html>

ViewHelpers courants

HTML
<!-- Liens -->
<f:link.page pageUid="1">Accueil</f:link.page>

<!-- Images -->
<f:image src="{file}" width="300" height="200" />

<!-- Conditions -->
<f:if condition="{variable}">
    <f:then>Vrai</f:then>
    <f:else>Faux</f:else>
</f:if>

<!-- Boucles -->
<f:for each="{items}" as="item">
    {item.title}
</f:for>

<!-- Formatage -->
<f:format.date format="d.m.Y">{date}</f:format.date>

Extensions TYPO3

Structure d'une extension

Plaintext
mon_extension/
├── Classes/
│   ├── Controller/
│   ├── Domain/
│   │   ├── Model/
│   │   └── Repository/
│   └── ViewHelpers/
├── Configuration/
│   ├── TCA/
│   ├── TypoScript/
│   └── FlexForms/
├── Resources/
│   ├── Private/
│   │   ├── Templates/
│   │   ├── Partials/
│   │   └── Layouts/
│   └── Public/
├── ext_emconf.php
└── ext_localconf.php

Controller Extbase

PHP
namespace Vendor\MonExtension\Controller;

use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class ProductController extends ActionController
{
    protected $productRepository;
    
    public function __construct(
        \Vendor\MonExtension\Domain\Repository\ProductRepository $productRepository
    ) {
        $this->productRepository = $productRepository;
    }
    
    public function listAction(): void
    {
        $products = $this->productRepository->findAll();
        $this->view->assign('products', $products);
    }
}

Commandes CLI

Bash
# Cache
php vendor/bin/typo3 cache:flush
php vendor/bin/typo3 cache:warmup

# Base de données
php vendor/bin/typo3 upgrade:run
php vendor/bin/typo3 database:updateschema

# Extensions
php vendor/bin/typo3 extension:activate mon_extension
php vendor/bin/typo3 extension:deactivate mon_extension

Bonnes Pratiques

✅ Recommandations :
  • Utiliser Composer : Gérer TYPO3 et extensions via Composer
  • Versionner la configuration : Exclure LocalConfiguration.php
  • Optimiser le cache : Utiliser Redis/Memcached en production
  • Sécurité : Déplacer typo3conf/ hors de public/ si possible
  • Extensions : Privilégier les extensions officielles du TER

Extensions essentielles

  • news : Gestion d'actualités/blog
  • powermail : Formulaires avancés
  • ke_search : Moteur de recherche
  • gridelements : Layouts de contenu flexibles
  • mask : Création d'éléments personnalisés

Ressources