Développement de Thèmes

Introduction

Les thèmes sont essentiels pour un site web et en définissent l’apparence complète. Des dizaines de thèmes prêts à l’emploi sont disponibles sur le marché. Cependant, vous pouvez aussi créer vos propres thèmes pour adapter votre site selon vos besoins.

L’installation d’Azuriom en locale est fortement recommandée pour simplifier le développement de thèmes. Lorsque Azuriom est installé localement, le mode debug peut être activé en modifiant les lignes suivantes dans le fichier .env :

APP_ENV=local
APP_DEBUG=true

Création d’un Thème

La façon recommandée de créer un thème est en utilisant la commande suivante pour générer les fichiers requis :

php artisan theme:create <nom_du_theme>

Structure du Thème

themes/  <-- Dossier contenant tous les thèmes installés
| example/  <-- Identifiant du thème
| | theme.json  <-- Fichier contenant les informations du thème
| | assets/ <-- Dossier contenant les ressources du thème (CSS, JS, images, etc.)
| | views/  <-- Dossier contenant les vues du thème
| | config/
| | | config.blade.php  <-- Vue contenant le formulaire de configuration du thème
| | | rules.php  <-- Règles de validation pour la configuration du thème
| | config.json  <-- Configuration par défaut du thème

Fichier theme.json

Un thème doit inclure un fichier theme.json à sa racine, contenant les informations de base du thème :

{
    "id": "example",
    "name": "Example",
    "version": "1.0.0",
    "description": "Un excellent thème.",
    "url": "https://azuriom.com",
    "authors": [
        "Azuriom"
    ],
    "azuriom_api": "1.2.0"
}

Identifiant

Un thème doit avoir un identifiant unique qui ne contient que des chiffres, des lettres minuscules et des tirets. L’identifiant est utilisé pour identifier le thème dans le système et doit correspondre au nom du dossier du thème. Par exemple, un thème nommé Hello World pourrait avoir l’identifiant hello-world.

Vues

Azuriom est basé sur Laravel et utilise le moteur de templates Blade pour créer les vues. Pour plus d’informations sur Blade, consultez la documentation de Blade.

Lors du rendu d’une vue, Azuriom la recherche d’abord dans le thème. Si elle n’est pas trouvée, elle est ensuite recherchée dans Azuriom ou dans le plugin correspondant. Les parties des vues peuvent être réparties à différents endroits, ce qui permet de personnaliser la mise en page d’Azuriom tout en conservant le contenu par défaut d’une vue.

Mise en Page

Le layout principal d’Azuriom se trouve dans le fichier views/layouts/base.blade.php. Ce layout contient la structure de base du site, y compris le header, footer et le contenu de la page (affiché avec @yield('content')). Toutes les pages, à l’exception de la page d’accueil, étendent un sous-layout, views/layouts/app.blade.php, qui étend le layout de base.

Les composants peuvent être inclus dans le layout à l’aide de @include. Par exemple, pour inclure la barre de navigation :

@include('elements.navbar')

Il est fortement recommandé de ne pas modifier les vues autres que le layout, les composants (comme la barre de navigation) et la page d’accueil, car cela peut entraîner des problèmes de compatibilité avec les plugins et les mises à jour futures.

Il est préférable d’utiliser du CSS pour personnaliser l’apparence du site.

Couleur du Thème

La couleur principale par défaut de Bootstrap est le bleu (#0d6efd), mais Azuriom propose une solution simple pour la modifier, en ajoutant simplement la ligne suivante dans la section <head> du layout (après le fichier CSS de Bootstrap), où $color représente la valeur hexadécimale de la couleur :

@include('elements.theme-color', ['color' => $color])

Ressources

Azuriom repose sur Bootstrap 5 afin de garantir une bonne cohérence visuelle sur l’ensemble du site et plugins, tout en profitant des différents composants et utilitaires fournis par Bootstrap. Pour plus d’informations sur Bootstrap, consultez la documentation de Bootstrap.

Vous pouvez ajouter de nouveaux fichiers CSS/JavaScript et images dans le thème, en les plaçant dans le dossier assets du thème. Ces fichiers peuvent ensuite être inclus en utilisant la fonction theme_asset, qui génère l’URL correspondante pour chaque fichier.

<link href="{{ theme_asset('css/style.css') }}" rel="stylesheet">

Veuillez éviter d’utiliser jQuery dans votre thème, car il n’est pas inclus par défaut dans Azuriom et peut être facilement remplacé par du JavaScript natif.

Configuration

Les thèmes peuvent inclure une configuration, pour permettre aux utilisateurs de personnaliser facilement le thème depuis le panel admin.

La vue pour la configuration est créée dans un fichier Blade nommé config.blade.php, situé dans le dossier config du thème, et contient les champs nécessaires à la configuration du thème.

<form action="{{ route('admin.themes.update', $theme) }}" method="POST">
    @csrf

    <div class="form-group">
        <label for="discordInput">{{ trans('theme::messages.discord') }}</label>
        <input type="text" class="form-control @error('discord') is-invalid @enderror" id="discordInput" name="discord" required value="{{ old('discord', theme_config('discord')) }}">

        @error('discord')
        <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
        @enderror
    </div>

    <button type="submit" class="btn btn-primary">
        <i class="bi bi-save"></i> {{ trans('messages.actions.save') }}
    </button>
</form>

Pour pouvoir sauvegarder la configuration, le formulaire doit être envoyé sur la route admin.themes.update avec l’id du thème en paramètre. La configuration doit être validée via un fichier rules.php dans le dossier config du thème, qui contient les règles de validation.

<?php

return [
    'discord' => 'required|string',
];

Pour définir une configuration par défaut pour le thème, créez un fichier config.json à la racine du thème, contenant la configuration par défaut au format JSON.

{
    "discord": "https://azuriom.com/discord"
}

Enfin, vous pouvez accéder à la configuration dans vos vues en utilisant la fonction d’aide theme_config, qui accepte la clé de en paramètre.

<a href="{{ theme_config('discord') }}">Discord</a>

Traductions

Azuriom est entièrement traduit en plusieurs langues, et les thèmes peuvent également être traduits en utilisant le système de traduction de Laravel. Les traductions d’un thème sont stockées dans le dossier lang du thème, avec un sous-dossier pour chaque langue, contenant les fichiers PHP avec les traductions.

Par exemple, un fichier de traduction en français serait stocké dans lang/fr/messages.php :

<?php

return [
    'hello' => 'Bonjour',
];

Une traduction peut ensuite être affichée dans une vue en utilisant la fonction trans avec le préfixe theme:: :

<p>{{ trans('theme::messages.hello') }}</p>

Pour traduire un booléen, vous pouvez utiliser la fonction trans_bool. Par exemple, en français “Oui” ou “Non” sera renvoyé : {{ trans_bool($boolean) }}. Une date peut être formatée avec les fonctions format_date ou format_date_compatct, qui renvoient la date formatée selon la langue actuelle : format_date($date).

Pour plus d’informations sur les traductions, consultez la documentation de Laravel.

Fonctions Communes

Azuriom fournit plusieurs fonctions pour faciliter le développement de thèmes et garantir une certaine cohérence sur l’ensemble du site :

Fonction Description
site_name(): string Retourne le nom du site tel que défini dans les paramètres
site_logo(): string Retourne l’URL du logo tel que défini dans les paramètres
favicon(): string Retourne l’URL du favicon tel que défini dans les paramètres
format_date(Carbon $carbon): string Formate une date selon la langue actuelle. L’argument $carbon doit être une instance de Carbon\Carbon
money_name(): string Retourne le nom de la monnaie du site
format_money(float $amount): string Retourne $amount formaté avec la monnaie du site
dark_theme(bool $defaultDark = false): bool Retourne true si l’utilisateur utilise le thème sombre, et false sinon
hex2rgb(string $hex): [int, int, int] Convertit la couleur $hex en un tableau contenant les valeurs R, G, B sous forme d’int
color_contrast(string $hex): string Retourne black ou white selon celui qui offre le meilleur contraste pour la couleur $hex
trans(string $key): string Retourne la traduction correspondant à la clé $key
trans_bool(bool $value): string Retourne la traduction de la valeur booléenne donnée. Renvoie “Oui” ou “Non” en français
auth()->user(): \Azuriom\Models\user Retourne l’utilisateur connecté sur le site, ou null si l’utilisateur n’est pas connecté

Laravel fournit de nombreuses fonctions pour faciliter le développement d’un site. Pour plus d’informations, consultez la documentation de Laravel.

Directives Blade

Azuriom et Laravel fournissent plusieurs directives Blade pour faciliter le développement de thèmes :

Directive Description
@plugin('<plugin id>') ... @endplugin Inclut le code contenu uniquement si le plugin avec l’id spécifié est activé
@route('<route>') ... @endroute Inclut le code contenu uniquement sur la route spécifiée
@auth ... @endauth Inclut le code contenu uniquement si l’utilisateur est connecté sur le site
@guest ... @endguest Inclut le code contenu uniquement si l’utilisateur n’est pas connecté
@can('<permission>') ... @endcan Inclut le code contenu uniquement si l’utilisateur dispose de la permission donnée