NAV Navbar
php html css js artisan

Introduction

TrixCMS est un CMS (Content Management System ou Système de Gestion de Contenu) ayant comme base de développement : Laravel un framework complet et performant, nous utilisons la version 5.4 de Laravel afin de rendre compatible le CMS à partir de la version 7.2 de php jusqu'à la dernière version (7.3.x). TrixCMS fut crée en Juin 2018, et son développement commença à partir de Août 2018, pensé et développé par Todyxe et Tronai. Depuis Décembre 2018 TrixCMS appartient à l'entreprise "Applin" (fondé et géré par Todyxe et Tronai).

TrixCMS vous offre la possibilité de modifier votre site à 99%, possédant un système de Module et un système de Thème, vous pouvez même sans connaissance approfondie développer vos propres thèmes en vous basant sur ceux déjà existant. Cette documentation ainsi que les plugins déjà mis en ligne dans le market, vous offre toute les connaissances requises afin de développer vos plugins sans encombre.

TrixCMS est un CMS complet et performant, de base lors de l'installation de celui-ci même sans l'installation de plugin, ce CMS vous offre un DashBoard (Panel Administrateur) avec plus de +25 onglets à disposition (Liste déroulante comprise).

les points honorable et fort de ce CMS sont :

Pré-Requis

Afin d'installer le CMS, vous avez besoin de suivre une démarche précise, vous avez à disposition un tutoriel pour Debian / Ubuntu & CentOS.

Extensions requises

Installation sur Debian / Ubuntu

Si vous possédez un Debian ou un Ubuntu, voici une démarche à suivre afin d'installer les extensions sans problème :

ATTENTION : Ce tutoriel s'adresse uniquement pour l'installation d'ioncube et de php 7.2

NGINX

Voici la configuration nginx afin de pouvoir faire fonctionner votre CMS sur votre VPS/Dédié

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name trix.trix.me;
    root /var/www/trix.trix.me;
    error_log /var/log/nginx/trix.trix.me.log warn;

    ssl_certificate /etc/letsencrypt/live/trix.trix.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/trix.trix.me/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/trix.trix.me/fullchain.pem;

    location / {
        try_files $uri /server.php$is_args$args;
    }

    location /storage {
        deny all;
    }

    location /vendor/ {
      try_files /public$uri /server.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}


Valeurs modifiables Information (changez les valeurs si besoin en)
listen 443 ssl; 80 = Site sans HTTPS (Certificat SSL/TLS)
listen [::]:443 ssl; 80 = Site sans HTTPS (Certificat SSL/TLS) supprimez "SSL"
server_name trix.trix.me; server_name VotreDomaineOuSousDomaine.extension;
root /var/www/trix.trix.me; root LeCheminVersVotreTrixCMS;
error_log /var/log/nginx/trix.trix.me.log warn; error_log LeCheminVersLesErreurs;
ssl_certificate /etc/letsencrypt/live/trix.trix.me/fullchain.pem; Ajoutez cette ligne uniquement si vous utilisez un certificat SSL/TLS (HTTPS) sinon supprimez-là, si utilisez changez le chemin
ssl_certificate_key /etc/letsencrypt/live/trix.trix.me/privkey.pem; Ajoutez cette ligne uniquement si vous utilisez un certificat SSL/TLS (HTTPS) sinon supprimez-là, si utilisez changez le chemin
ssl_trusted_certificate /etc/letsencrypt/live/trix.trix.me/fullchain.pem; Ajoutez cette ligne uniquement si vous utilisez un certificat SSL/TLS (HTTPS) sinon supprimez-là, si utilisez changez le chemin
fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_pass unix:CheminVersVotrePHP

APACHE2

Voici la configuration apache2 afin de pouvoir faire fonctionner votre CMS sur votre VPS/Dédié, de base ce fichier est fournit dans le CMS.


<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>


Installation sur CentOS

En rédaction...

Hébergement Compatible

Vous avez à diposition des hébergements listés officiel par notre équipe et ayant été testé et approuvé :

Installation

Démarche à suivre

Afin d'installer le CMS, vous devez suivre les démarches suivantes, rien de compliqué..

API

Nom Langage(s) supporté(s) Auteur Coût Source Documentation Date de création
TrixAuth PHP & Java Todyxe & Cipher_ Gratuit Officielle cliquez-ici 2018/2019
SkinAndCape PHP, Java, JavaScript, Kotlin... Todyxe Gratuit Officielle cliquez-ici 2019


Si vous rencontrez un problème dans l'une de ces API, contactez le développeur ou venez sur le discord de TrixCMS.

Thème

Système de Thème développé complétement par TrixCMS (Todyxe), et n'utilise aucun package externe. Si vous repèrez un bug, merci de nous le faire savoir.

ATTENTION : Ce tutoriel ne fonctionnera pas si vous ne possédez pas de licence Développeur.

Introduction

Bonjour Jean, je vais t'expliquez tout ce que tu es en droit de savoir, visualise un système de thème comme étant un jeu d'arcade, dans ce jeu d'arcade tu possèdes plusieurs mini-jeux, ces mini-jeux tu peux les choisirs à ta guise, et chaque mini-jeux t'offre la merveilleuse possibilité de pouvoir regarder l'arcade d'une autre façon et de pouvoir t'amuser avec toutes ces couleurs et tout ces changements, ce qui fait que tu ne t'ennuyeras jamais en jouant sur ce jeu d'arcade, eh bien un système de thème est tout simplement un gros jeu contenant des modes comme l'arcade, ces modes tu les choisis et tu prends celui que tu aimes visuellement parlant, le système de thème contient plusieurs dossiers appelés 'Thème', tu choisis le thème que tu veux et à partir de là ton site s'est transformé, il a maintenant un changement radical de couleur, de menu... En conclusion le système de thème contient des thèmes et ces thèmes tu choisis celui que tu veux, pour mettre du "peps" en gros du style pour rendre ton site plus beau visuellement parlant.

Eh bien... Un développeur web, mais tu peux en être un toi aussi, tu as juste à apprendre la programmation... Ah, mais ne t'inquiète pas rien de compliqué... Si tu connais les bases du HTML/CSS, cela te suffira. Mais je te recommande d'apprendre le PHP ne serait-ce que les bases, et aussi le Javascript si tu le souhaites, afin de pouvoir implémenter des animations par exemple.

Bien évidement, et je ne dirais jamais le contraire, tout le monde est apte à en développé un, tu n'as juste qu'à posséder une valeur que beaucoup lâche malheureusement... C'est la détermination, tu n'as qu'à être déterminé pour développé ton thème et tu verras que tu en feras pleins sans même te rendre compte, tu seras déjà riche (ironie).

Ce n'est pas très grave, on commence tous par le début c'est comme ça, on y peut rien... Je te conseil de chercher sur internet des tutoriels sur le HTML/CSS et aussi PHP, et d'apprendre doucement, mais demande aussi au développeur de notre communauté ou à notre équipe technique, ils t'aideront certainement. Puis essaie de faire un thème TrixCMS pour commencer, on t'aidera.

Pourquoi le notre ? Nous possédons un système avantageux pour les débutants, nous n'imposons aucune compléxité, plutôt nous recommandons d'être le plus simple possible, afin de laisser votre code lisible et aussi facile à ré-utiliser, nous avons avec nous beaucoup de contributeur : débutants, amateurs, professionnels... De tout genre, ils pourront énormément vous aidez, nous avons un système facilement compréhensible par tous le monde. Pour finir nous sommes un projet fait pour la communauté, donc nous n'imposons aucune modification obligatoire ou restriction, vous êtes libre de vos doigts uniquement si c'est dans le but d'améliorer le CMS.

Bien évidement, chaque système est à la foi parfait et imparfait, si nous considérons ce système dans une échelle entre -10 et 10 alors il sera à la foi -1 et 1, mais jamais 0 car nous ne sommes pas parfait. Les inconvéniants ne sont pas nombreux d'après les retours des contributeurs, simplement quelques variables manquantes et parfois incompréhensibilités de quelques codes. Pour les avantages, nous sommes avantagé sur le fait que vous n'avez pas besoin de stocker un fichier dans un autre dossier que celui de votre thème, vous avez une libérté immense dans vos dossiers de thèmes et rien ne peut vous arrêtez de codé, un code lisible et modifiable, des ajouts très simple, une configuration de 60secondes suffit pour déverouiller votre thème et l'utiliser. Pour finir suis notre tutoriel juste en bas afin de comprendre comment fonctionne notre système.

Bonne chance mon cher ami !

Arborescence d'un Thème

Un thème ce présente ainsi :

Création d'un thème

Nous possédons un système spéciale pour créer les thèmes, afin d'en créer un : redirigez-vous vers l'onglet DevTools, vous aurez alors une console appelée Artisan, alors rentrez dans cette console cette commande : php artisan create:theme-example.

A partir de là vous aurez un petit message vous prévenant de la génération du thème, votre thème ce trouve dans le répertoire : resources/views/Theme/Example

Le renommer est tout à fait possible vous devez effectué cette commande : php artisan trixcms:edit-name-theme Example NouveauNom Après avoir effectué cette commande, le système va automatiquement modifier le nom du dossier et de toute la configuration.

Config.json

De base vous n'avez rien à changer, vu que la commande php artisan trixcms:edit-name-theme Example NouveauNom change déjà le nom du thème pour vous, or si vous souhaitez ajouter le système de slider, la configuration etc.. Vous devez vous rendre dans le fichier resources/views/Theme/VotreTheme/config.json et à partir de là, vous aurez de base après la génération du thème une configuration simple.


{
    "name": "Example",
    "slug": "Example",
    "version": "1.0.0",
    "author": "Todyxe",
    "sliders": false,
    "include": "inc",
    "id": "L'IDDuThème",
    "config": []
}


à partir de là, après avoir effectuée la commande php artisan trixcms:edit-name-theme Example NouveauNom les clés : name et slug devraient être changés par le nom que vous avez entré, ainsi que si vous souhaitez activer le slider alors mettez slider sur true, dans le panel administrateur la page slider s'activera.

La clé : config: [] changez la en config: {} et entrez dedans toute la configuration de votre thème, exemple :


{
    "name": "Example",
    "slug": "Example",
    "version": "1.0.0",
    "author": "Todyxe",
    "sliders": false,
    "include": "inc",
    "id": "L'IDDuThème",
    "config": {
      "logo": "/public/img/logo.png",
      "name": "Brexit"
    }
}

à ce moment là, vous pourrez récupéré les valeurs dans vos thèmes via la variable : $perso qui est un tableau, donc votre variable devrait ressembler à ça : $perso['logo'].

Configuration du thème

Vous souhaiterez probablement créer une page de personnalisation à votre thème ? Afin de créer cette page, vous avez un dossier du nom de config contenant le fichier personnalisation.blade.php, ouvrez-le ensuite déposez ce code à l'intérieur :


<form id="form-perso"> <!-- Cette balise est très importante ne changez ni son id ni son nom, placez vos input à l'intérieur -->
  <div id="fetch-message"></div> <!-- balise permettant d'afficher les alertes (messages) -->

  <input type="text" name="logo" class="form-control" value="<?= $perso['logo'] ?>"> <!-- exemple d'input  -->

  <input type="submit" id="send_request" value="Sauvegarder" class="btn btn-success"> <!-- ne touchez pas à cet input, c'est celui qui permet d'envoyer le contenu de vos input -->
</form>



Structurer les input est très simple vous devez simplement suivre deux conditions obligatoires :

Le nom ce rentre ainsi :


<input type="text" name="logo"> <!-- name sera stocké dans votre fichier config.json dans le tableau : config: [] -->


La valeur ce rentre ainsi :


<input type="text" name="logo" value="<?= $perso['logo'] ?>"> <!-- la variable $perso est un tableau qui récupérera la clé que vous avez entrer entre les crochets directement depuis votre config.json -->


Variables/fonctions disponibles

Variables/Fonctions Type Retourne la valeur Information/Utilisation
$user tableau (array) les informations de l'utilisateur connecté <?= $user['pseudo'] ?>
$perso tableau (array) la configuration dans le thème fichier : config.json, clé : config [] <?= $perso['logo'] ?> va retourner la valeur stockée dans la clé : logo dans le config.json
getDataUser(id, data) string (chaîne de caractère) l'information de l'utilisateur choisi dans le premier paramètre et la donnée du deuxième paramètre <?= getDataUser(1, 'pseudo') ?> va retourner le pseudo de l'utilisateur 1, si celui-ci n'existe pas alors sa ne retourne rien
$Lang->choose(data, type) méthode si type = true alors sa retournera la chaîne de caractère (si existante) du fichier lang du CMS de base, si type = false alors sa retournera la chaîne de caractère (si existante) du fichier lang de votre thème CMS : <?= $Lang->choose('SEND') ?> va retourner : "Envoyer" (en Français) et "Submit" (En Anglais)...
Thème : <?= $Lang->choose('SEND', false) ?> va retourner : "Valider" (en Français) et "Submit" (En Anglais)...
$minecraft méthode une image en png $minecraft->getProfil(pseudo = CeluiDeL'UtilisateurConnectéDeParDéfaut) = affiche le profil de la tête du skin (si aucun paramètre n'est défini l'utilisateur connecté sera choisit par défaut)

$minecraft->getHead(pseudo = CeluiDeL'UtilisateurConnectéDeParDéfaut) = affiche la tête de l'utilisateur choisit dans le paramètre (si aucun paramètre n'est défini l'utilisateur connecté sera choisit par défaut)

$minecraft->getSkin(pseudo = CeluiDeL'UtilisateurConnectéDeParDéfaut) = affiche la tête de l'utilisateur choisit dans le paramètre (si aucun paramètre n'est défini l'utilisateur connecté sera choisit par défaut)

$minecraft->getCape(pseudo = CeluiDeL'UtilisateurConnectéDeParDéfaut) = affiche la cape de l'utilisateur choisit dans le paramètre (si aucun paramètre n'est défini l'utilisateur connecté sera choisit par défaut)
$website string (chaîne de caractère) le nom de votre site (jadis ajouté dans la configuration du cms) <?= $website ?>
$title string (chaîne de caractère) le titre de la page en question <?= $title ?>
$banner tableau (array) les informations de la bannière de cookie, plus d'information dans la table : banner_config <?= $banner['theme'] ?>
$servers tableau (array) les informations du serveur activé (par le bouton "oeil" dans l'onglet serveurs) <?= $servers[clé] ?>
clés :
online : nombre de joueurs en ligne
max : maximum de joueur du serveur
description : description du serveur
protocol : protocol du serveur
name : nom du serveur (pvpfac)
type : type du serveur (rcon ou ping)
status : En ligne ou Hors ligne
$visitors tableau (array) nombre de visiteurs dans le site total ou status <?= $visitors[clé] ?> clés : get : nombre de visiteurs au total
status : 401 si vous êtes en localhost sinon 200
$register entier (int) nombre d'inscrits total du site <?= $register ?>
$last_register entier (int) (total) dernier inscrit du site <?= $last_register ?>
$last_register_datetime tableau (array) pseudo du dernier inscrit par plage de temps <?= $last_register_datetime[clé] ?> clés :

day : dernier inscrit du jour (total) similaire à $last_register
month : dernier inscrit du mois (total)
year : dernier inscrit de l'année (total)
$theme_actual string (chaîne de caractère) thème utilisé actuellement <?= $theme_actual ?>
$config tableau (array) les informations de la configuration du cms (table : configuration) <?= $config['website_name'] ?>
$tronai méthode méthode de la class : TTFunctions (app/Tools) retourne mixed (diffère par rapport à la fonction) $tronai->plugin('Shop') : retourne "true" si plugin installé sinon "false"
$tronai->theme('Junggle') : retourne "true" si thème installé sinon "false"
$tronai->loadModuleView() : fonction autonome qui liste les M.I.P des Plugins (si existe)
$tronai->loadIntegration() : fonction autonome qui liste les intégrations ajoutées par l'administrateur
$auth méthode méthode de la class : AuthController (app/Http/Controllers) $auth->check() : retourne "true" si utilisateur connecté sinon "false" A voir plus dans le fichier : App/Http/Controllers/AuthController.php
$isLogin boolean true ou false retourne vrai si l'utilisateur est connecté sinon false @if($isLogin) Vous êtes connecté @else Vous n'êtes pas connecté @endif
$isAdmin boolean true ou false retourne vrai si l'utilisateur est connecté et est un administrateur sinon false @if($isAdmin) Vous êtes connecté et administrateur @else Vous n'êtes pas connecté @endif

Développement des pages

layout

De base dans votre thème après la génération via la commande, vous aurez une liste de dossier, intéressant nous au dossier : layout et plus précisément ce qu'il contient : default.blade.php, ce fichier est le fichier mère de votre thème, c'est par lui que le CMS va appelé les pages et les includes ainsi que la plus part du temps les assets...

Voici le code de base que vous devez entrer afin de faire fonctionné votre thème :


<!DOCTYPE html>
<html>
<head> // Laissez cette partie begin
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>{{ $website }} - {{ $title }}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="author" content="Tronai">
    <meta name="description" content="{{ $config['description_website'] }}" >
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="icon" type="image/png" href="{{ $config['favicon'] }}">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css">
    // end


    <?= $todyxe->css('custom') ?> // Permet de charger le fichier css de votre thème : assets/css

</head>
<body>

@extends("fetch.fetch") // Permet de charger les codes fetch (obligatoire)

<?= $todyxe->blade('header') ?> // Permet via la fonction : ->blade('nom') de charger vos inc dans le dossier : inc

    {!! $fetch_all !!} // Permet de charger les pages (exemple : home, users...)

<?= $todyxe->blade('footer') ?> // Permet via la fonction : ->blade('nom') de charger vos inc dans le dossier : inc
<?= $todyxe->img('logo.png') ?> // Permet de charger le fichier img de votre thème : assets/img


@extends('integration.home') // Permet de charger les intégrations 

</body>
<?= $todyxe->js('collapse') ?> // Permet de charger le fichier js de votre thème : assets/js
<script src="{{ asset('/public/js/bootstrap.js') }}"></script>
<script src="{{ asset('/public/js/tooltip.js') }}"></script>
<script src="https://www.google.com/recaptcha/api.js"></script>
<script type="557720d311599c475f12ed98-text/javascript" src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>

</html>


Modifiez ce que vous devez modifier dans ce fichie or laissez les fonctions obligatoire : {!! $fetch_all !!} @extends("fetch.fetch") <meta name="csrf-token" content="{{ csrf_token() }}"> ...

assets

Vos assets sont le dossier : assets contenant toutes vos ressources web, exemple img, script javascript, css etc... Si cela n'est pas créé alors créez les dossiers : css, img, js... Ensuite placez dans ces dossiers vos ressources : css/custom.css... Et appelés-les via les fonctions :


Fonction Utilisation
$todyxe->blade($name) Récupère les pages inc du dossier : inc de votre thème
$todyxe->css($name) Récupère le css du dossier : assets/css de votre thème
$todyxe->js($name) Récupère le js du dossier : assets/js de votre thème
$todyxe->img($name) Récupère les images du dossier : assets/img de votre thème

Modules

Vous pouvez aussi modifier les vues (pages) des Plugins existant, pour ce faire vous possédez un dossier: Modules dans votre thème, ouvrez-le et créez à l'intérieur des dossiers sous le nom des plugins que vous souhaitez modifier, exemple : resources/views/VotreThème/Modules/FAQ, et à partir de là, partez dans le plugin FAQ ce trouvant dans le dossier : Modules de la racine et rendez-vous dans : Modules/FAQ/Resources/views ensuite copiez les fichier que vous avez besoin de modifier et collez-les dans resources/views/VotreThème/Modules/FAQ/fichiers.blade.php, ensuite modifiez-les.

FAQ


<?= $assets->getCss('main') ?> // Fonction du Plugin vous pouvez la supprimer elle permet d'importer le fichier css du plugin

// Code à modifier, n'oubliez pas de laisser le code php
<div class="step1" style="text-align: center;">
    <div class="container">
        <h1>FAQ</h1>
    </div>
</div>
<div class="step2 moduleFAQ">
    <div class="container">
        @if($listExist)
            @foreach($lists as $list)
                <div class="FAQ_Subject">
                    <i class="fa fa-check-circle-o" aria-hidden="true"></i>
                    <a role="button" data-toggle="collapse" href="#faq-{{ $list['id'] }}" aria-expanded="false" aria-controls="test" style="color: white;text-decoration: none;font-size: 1.2em;">
                        {{ $list['title'] }}
                    </a>
                </div>
                <div class="collapse" id="faq-{{ $list['id'] }}">
                    <div class="well dropdown-well-faq">
                        {{ $list['description'] }}
                    </div>
                </div>
                <br>
            @endforeach
        @else
            <div class="alert alert-info">{{ $Module->LangChoose('FAQNODETECTFAQ') }}</div>
        @endif
    </div>
</div>

Autres fichiers

Afin de modifier les autres fichiers, rendez-vous dans les thèmes déjà existant et inspirez-vous de leur code et effectuez leur démarches.

Lang

Sur TrixCMS, nous disposons d'un système de Lang fonctionnel via JSON, pour l'utiliser vous avez à diposition un dossier Lang sur le quel vous possédez de base :

Ces fichiers sont tout simplement des rassembleurs de traduction, $Lang->choose() est une méthode utilisée pour récupérer la valeur de la clé que vous aurez entrer entre les "()", exemple :


// fr_FR.json du CMS (/public/lang/fr_FR.json)
{
  "TEST": "Je suis un Test"
}

// fr_FR.json de votre thème (/resources/views/Theme/votreTheme/Lang/fr_FR.json)
{
  "TEST": "Je suis ton thème"
}


Dans votre code pour récupéré les valeurs vous avez deux solutions qui s'offre à vous.



$Lang->choose('TEST'); // Va récupéré : Je suis un Test du fichier de lang choisit du CMS.
$Lang->choose('TEST', false); // Va récupéré : Je suis ton thème du fichier lang choisit de votre thème.

Plugin

Introduction

TrixCMS possède un système de Module (ou plus communément appelé "Système de Plugin"), il vous permet de développer des extensions afin d'améliorer votre CMS, de le rendre à la fois plus complet et plus performant, tout dépendra du code du plugin en question.

Si vous souhaitez utiliser notre système pour des créations publiques ou privée, suivez cette documentation, pour toutes questions, veuillez vous adressez à l'Équipe Technique.

Arborescence d'un Plugin

Tout comme les thèmes, les plugins possèdent une structure de base qui peut éventuellement être modifiée suivant vos besoins. Voici, de base la structure de tous les plugins :

Certains dossiers peuvent être supprimé, tous les fichiers et dossiers marqués d'un * doivent forcément être présents.

Utilisation d'Artisan

Commandes obligatoires

Commandes Utilisation Utilité
php artisan create:plugin-example Cette commande vous permet de créer un plugin d'exemple avec l'identifiant généré Obligatoire
php artisan trixcms:edit-name-plugin {oldname} {newname} Cette commande vous permet de modifier le nom de votre plugin via les arguments : {oldname} = Nom actuel du plugin {newname} = Nouveau nom Obligatoire
php artisan module:make-command {name} {pluginname) Cette commande vous permet de créer une commande exemple : "php artisan create:plugin-example" {name} = Nom du fichier de la commande {pluginname} = Nom du plugin sur le quel vous souhaitez généré le fichier Facultatif
php artisan module:make-controller {name} {pluginname} Cette commande vous permet de généré un controller pour votre plugin {name} = Nom du controller {pluginname} = Nom du Plugin en question Obligatoire
php artisan module:make-event {name} {pluginname} Cette commande vous permet de généré un event (évenement) pour votre plugin {name} = Nom de l'event {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-job {name} {pluginname} Cette commande vous permet de généré un job (tâche) pour votre plugin {name} = Nom de la tâche (job) {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-listener {name} {pluginname} Cette commande vous permet de généré un écouteur (Listener) pour votre plugin {name} = Nom de l'écouteur (listener) {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-mail {name} {pluginname} Cette commande vous permet de généré un mail pour votre plugin {name} = Nom du mail {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-middleware {name} {pluginname} Cette commande vous permet de généré un middleware pour votre plugin {name} = Nom du middleware {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-migration {name} {pluginname} Cette commande vous permet de généré une migration pour votre plugin {name} = Nom de la migration {pluginname} = Nom du Plugin en question Dépend du Plugin (Si utilise une bdd alors obligatoire)
php artisan module:make-model {name} {pluginname} Cette commande vous permet de généré un model (pour votre plugin) {name} = Nom du model {pluginname} = Nom du Plugin en question Dépend du Plugin (Si utilise une bdd alors obligatoire)
php artisan module:make-provider {name} {pluginname} Cette commande vous permet de généré un provider pour votre plugin {name} = Nom du provider {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-request {name} {pluginname} Cette commande vous permet de généré une request pour votre plugin {name} = Nom de la request {pluginname} = Nom du Plugin en question Facultatif
php artisan module:make-seed {name} {pluginname} Cette commande vous permet de généré un seed pour votre plugin {name} = Nom du seed {pluginname} = Nom du Plugin en question Facultatif
php artisan module:migrate {pluginname} --force Cette commande vous permet d'exécuter toutes les migrations (elle vous permet de créer les tables jadis générées avec la commande php artisan module:make-migration) Dépend du Plugin (Si utilise une bdd alors obligatoire)
php artisan module:seed {pluginname} Cette commande vous permet d'exécuter les seed {pluginname} = Nom du Plugin Facultatif
php artisan trixcms:delete-cache-module Cette commande vous permet de supprimer le cache des modules (assets) Facultatif
php artisan trixcms:update-database-cms Cette commande vous permet de mettre à jour le système de mise à jour de table automatique Facultatif


Création d'une commande

Laravel 5 et TrixCMS vous permettent de créer des commandes pour vos plugins, l'utilité ? Elle est simple, derrière votre commande ce trouve tout un code, et plutôt que d'exécuter ce code plusieurs fois dans le CMS (ce qui peut causer d'énorme latence et probablement des bugs) en créant une commande, l'utilisation de celle-ci devient bénéfique pour vous et pour le CMS.

Si votre plugin permet de mettre en cache des assets, alors en créant une commande de suppression du cache, l'utilisateur n'aura plus qu'à exécuter la commande depuis un terminal ou en cliquant sur un bouton.

Utilisation des systèmes de migration

Il faut savoir que la particularité de laravel et donc de TrixCMS et que vous ne devez pas manipuler la base de donnée directement. Vos plugins devront respecter la logique d'interaction prévue de base. Elle se compose d'un système de migration, de model et d'un supplément apportée par TrixCMS : un système pour mettre à jour automatiquement vos tables.

Migration

Le système de migration disponible dans les modules est le même que celui de laravel. Si vous voulez voir plus en détail se qu'il en retourne, vous pouvez aller lire là documentation officielle de laravel qui est beaucoup plus complète.

Neanmoins, en bref, voici ce que vous devez retenir au minimum :

Chaque migration peut être créée via la commande (obligatoire): module:make-migration dont vous pouvez voir en détail son utilisation dans la section "Commandes obligatoires".

Chaque migrations ainsi créées se trouveront dans le dossier /Database/Migrations/. Voici le code d'une migration (état initiale) :


<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class MaMigration extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

    }
}

Comme vous pouvez le constater, deux fonctions sont présentes up() et down() respectivement utilisées pour la création des tables (mettre à jour etc...) et le rollback (pouvoir revenir en arrière).

Maintenant, imaginons que vous voulez créer une table MaTable. Pour pouvoir manipuler une table (création etc..), vous devez passer par le système de Shema fournit par laravel. En ce qui concerne l'utilisation du système de Schéma, je vous redirige vers la documentation officielle de laravel.

Voici un exemple de migration :

<?php

public function up()
    {
        Schema::create('faq_list', function(Blueprint $table) {
            $table->increments('id'); // on crée une colonne id en autoincrement
            $table->string('title')->nullable($value = true); //on crée une colonne 'title' de type string et pouvant être null
            $table->text('description')->nullable($value = true);//on crée une colonne 'title' de type string et pouvant être null
            $table->timestamps(); //ajoute deux colonnes de types dates updated_at et created_at respectivement mise à jours lors d'une modification dans les données d'une ligne et lors de l'ajout d'une nouvelle ligne.
        });
    }

    public function down()
    {
        Schema::dropIfExists('faq_list');
    }

Pour finir, pour executer ou faire un rollback d'une migration referez-vous aux commandes module:migrate et module:rollback expliquées dans la section "Commandes obligatoires".

Model

De la même façon, laravel met à disposition un outil nommé Eloquent permettant d'intéragir avec votre base de données en terme de données. Plus besoin de taper votre SQL à la main, ici tout est fait pour vous rendre la tâche beaucoup plus simple et pratique. C'est un outil vraiment très complet vous permettant d'avoir des logiques relativement complexes comme les relations. Je vous redirige vers la documentation officielle de laravel.

Pour les models, vous pouvez les créer manuellement ou passer par la commande module:make-model expliquée plus haut. Tous les models se trouvent dans le dossier Entities de votre plugin.

Voici globalement ce à quoi ressembleront une grande majoritée des models (à savoir : l'ensemble des fonctions présentés ci-dessous ne sont maheuresement pas créées automatiquement :/)

<?php

namespace Modules\MonModule\Entities;

use Illuminate\Database\Eloquent\Model;

class Parent extends Model
{
    protected $table = 'parent'; //nom de la table sur laquelle est reliée le model

    public function create(array $attributes = [])
    {
        return parent::create($attributes); 
    }

    public function find($id, $columns = ['*'])
    {
        return parent::find($id, $columns); 
    }

    public function get($columns = ['*'])
    {
        return parent::get($columns); 
    }

    public function where($column, $operator = null, $value = null, $boolean = 'and')
    {
        return parent::where($column, $operator, $value, $boolean); /
    }
}

et par exemple si vous voulez créer une relation ONE-TO-MANY, vous devrez procéder de la sorte : php public function mesEnfants() { return $this->hasMany('Modules\MonModule\Entities\Enfant', 'parent_id'); }

ce qui équivaudrait au schéma suivant :

diagramme uml

Je vous conseil vivement d'aller lire la documentation d'Eloquent :)

Système de mise à jour de table automatique

TrixCMS vous permet de bénéficier d'un système d'auto-update des tables choisit via un fichier JSON, vous vous demandez probablement à quoi ce système peut-il vous servir ? Eh bien c'est très simple, au lieu de supprimer les tables en question et de les re-créer (ce qui peut énormément agasser les utilisateurs de TrixCMS car en faisant cela, toutes les données des tables seront supprimées à cause d'une mise à jour d'un plugin), le système de mise à jour de table automatique vous permet en plus d'éviter la suppression des données mais aussi de baisser la latence des mises à jours de x5 et d'ajouter les colonnes que vous souhaitez.

L'utilisation est très simple.

Dans Modules/NomDeVotrePlugin/Database/ vous devez créer un dossier Update/ suivis du fichier database.json.

database.json doit contenir :


{
  "update": { /* permet d'avertir le CMS que c'est une mise à jour et non pas autre chose */
    "vote__configuration": { /* ici vous devez mettre votre/vos table(s) à mettre à jour */
      "keyAPI": { /* Ici vous mettez le nom de la colonne que vous voulez créer */
        "type": "text", /* "type" représente si la colonne est de type text, string, int... */
        "tall": null, /* la taille de la colonne exemple : 255 (type string) */
        "after": "objectif" /* Ce paramètre permet de dire au système de placer cette colonne après une autre colonne */
      }
    }
  }
}

Ce code est exécuté de base lors de la mise à jour ou l'installation du plugin par l'utilisateur, mais si vous souhaitez l'exécuter de force alors dans votre DevTools ou dans un terminal faites la commande php artisan trixcms:update-database-cms.

Les bases

Controllers

Le système de Controller est plutôt simple à comprendre. Néanmoins, il y a quand même des notions plus ou moins complexe pour celles-ci je vous laisse les découvrir sur la documentation officielle.

Un controller est de base sous la forme :

<?php

namespace Modules\Example\Http\Controllers;

use Illuminate\Routing\Controller;

class ExampleController extends Controller
{
    // Documentation : https://docs.trixcms.eu/
    public function index()
    {

    }
}

Je vous laisse regarder la documentation officielle de laravel pour voir comment manipuler les réponses, les requêtes, sessions etc...

DeveloppementTools

Le DeveloppementTools est un outil d'aide et un outil obligatoire pour certaines fonctions, voici toutes les fonctions disponibles

<?php
    /**
     * @param $name : Name of your route, this name must be similar to route name.
     * @param $file : Name of your file, example : index
     * @param $view : Name of your view.
     * @param $plugin : Name of  your Plugin.
     * @param $callback : Please watch the documentation...
     * @return bool|int
     */
    public function moduleSetViews($name, $file, $view, $plugin, $callback = null) {}

    /**
     * This function return automaticly your view with the elements of current theme
     *
     * @param bool $type
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     * @throws \App\Exceptions\APIConnectFail
     * @throws \App\Exceptions\ApiDoesNotRespond
     * @throws \App\Exceptions\EncryptThemeError
     * @throws \App\Exceptions\NotFoundUrlAPI
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @throws \Symfony\Component\CssSelector\Exception\InternalErrorException
     */
    public function loadView($type = false) {}

    /**
     * This function get the JSON or the ARRAY of the config of your plugin.
     *
     * @param $plugin
     * @param string $method
     * @return bool|mixed|string
     */
    public function getModuleJson($plugin, $method = 'array') {}

    /**
     * This function share your variables to your view by your controller.
     *
     * @param $array
     * @return mixed
     */
    public function shareVar($array)
    {
        return View::share($array);
    }

    /**
     * This function send your message to view.
     * Example : sendMessage('Hello, i am Todyxe', 'error');
     * You have 4 types :
     *  - error
     *  - success
     *  - warning
     *  - info
     *
     * @param $message
     * @param $type
     * @return \Illuminate\Http\JsonResponse
     */
    public function sendMessage($message, $type) {}

    /**
     * @param $message
     * @param $plugin
     * @return mixed
     */
    public function getLangModules($plugin, $message) {}

    /**
     * @param $plugin
     * @param $file
     * @return string
     */
    public function css($plugin, $file) {}

    /**
     * @param $plugin
     * @param $file
     * @return string
     */
    public function js($plugin, $file) {}

    /**
     * @param $plugin
     * @param $file
     * @param null $alt
     * @return string
     */
    public function img($plugin, $file, $alt = null) {}

    /** allows you to integrate your view into the desired page.
     *
     * @param array $pages
     * @param $pluginname
     */
    public function setModuleInPage($pluginname, Array $pages) {}

    /**
     * @param $pluginname
     * @param array $variable
     * @return mixed
     */
    public function shareVarModuleInPage($pluginname, Array $variable) {}

    /**
     * @param $pluginname
     * @param $view_module
     * @return bool
     * @throws \Exception
     */
    public function DeleteModuleInPage($pluginname, $view_module) {}

    /**
     * @param $perm_name
     * @param $rankId
     * @param array $route_name
     */
    public function setPermissionAccess($perm_name, $rankId, Array $route_name) {}

    /**
     * @param $perm_id
     * @param array $route_name
     */
    public function addPermissionToRank($perm_id, Array $route_name) {}

    /**
     * @param $perm_name
     * @param array $rankid
     */
    public function addRankToPermission($perm_name, Array $rankid) {}

    /**
     * @param $object
     * @param $message
     * @param $pseudo
     * @param $status
     * @param bool $checkeur
     */
    public function addNotification($object, $message, $pseudo, $status = 0, $checkeur = false) {}

    /** Add notification to dashboard
     * @param $object
     * @param $message
     * @param int $status
     * @return bool
     */
    public function addAdminNotification($object, $message, $status = 0) {}

    /**
     * @param $host
     * @param $password
     * @param $port
     * @return bool
     * @throws \Symfony\Component\CssSelector\Exception\InternalErrorException
     */
    public function setRedisConfiguration($host, $password, $port) {}

    /**
     * @param int $userid
     * @param $money
     * @param bool $alert
     * @return bool|null
     */
    public function addPoints(int $userid, $money, $alert = false) {}

    /**
     * @param int $userid
     * @param $money
     * @param bool $alert
     * @return bool|null
     */
    public function removePoints(int $userid, $money, $alert = false) {}

    /**
     * @param int $userid
     * @param $money
     * @param bool $alert
     * @return bool|null
     */
    public function setPoints(int $userid, $money, $alert = false) {}

    /**
     * @param int $useridgiver
     * @param int $useridreceive
     * @param $money
     * @param bool $alert
     * @return bool|null
     */
    public function giveToUserPointsFromAnotherUser(int $useridgiver, int $useridreceive, $money, $alert = false) {}

    /**
     * You can send command to server (minecraft) by this function.
     * Please enter : Param1 = id of rcon (Table : servers_rcon)
     * Please enter : Param2 = cmd (command for the server)
     *
     * @param $idRcon
     * @param $cmd
     * @return bool
     * @throws \xPaw\SourceQuery\Exception\InvalidArgumentException
     * @throws \xPaw\SourceQuery\Exception\TimeoutException
     */
    public function sendCommand($idRcon, $cmd) {}

    /**
     * You can get information (minecraft) by this function.
     * Please enter : Param1 = rcon or ping
     * Please enter : Param2 = name of server
     *
     * @param $type
     * @param $name
     * @return bool|string
     * @throws \Exception
     */
    public function getDataServer($type, $name) {}

    /*
     * Please enter : Param1 = name, data or type.
     *
     * @param $type
     * @return ServerController|bool|\Illuminate\Database\Eloquent\Model|null|object|string
     */
    public function getDataServerShow($type) {}

Afin d'utiliser le DeveloppementTools, vous devez ajouter dans votre fichier (controller, event...) ce bout de code tout en haut du fichier juste après le namespace : use App\Facades\DeveloppementTools; et vous n'avez plus qu'à appeler les fonctions de cette façon : DeveloppemenTools::sendCommand(1, 'say Hey');. Simple et efficace n'est-ce pas ?

Routing

Pour faire simple le routing c'est un peu comme un système d'aiguillage qui va vous permettre de rediriger des urls vers des fonctions présent dans des controllers. C'est un système très important et obligatoire que vous ne devez pas prendre à la légère. En effet, via les routes, le cms va par exemple récupérer le nom des pages pour l'afficher dans la balise <title></title> ou encore indispensable pour l'affichage des vues. De plus on peut voir les routes comme un système de "protection".

Encore une fois, TrixCMS utilise le système de routing présent dans laravel, je vous conseil vivement de regarder la documentation officielle.

Toutes les routes sont définies dans le fichier Http/routes.php.

Voici un exemple de structure de routes groupées:



Route::group(['middleware' => 'web', 'prefix' => 'monmodule', 'namespace' => 'Modules\MonModule\Http\Controllers'], function()
{
    Route::get('/', '[email protected]')->name('MaRoute');
});


Globalement, on va préférer créer plusieurs groupes suivant sur quoi va agir les routes. Par exemple on va découper en deux groupes les routes accéssible depuis le site en lui même (vos utilisateurs) et ceux ratachées au panel admin.

Comme expliqué dans la documentation de laravel, vous n'avez bien évidemment pas seulement la possibilité de créer des routes pour la méthode GET, mais également POST, PUT, PATCH etc...

Vous pourrez observer que pour chaque route tout d'abord nous devons spécifier une url, le controller et la fonction qui va être appellé ([email protected]) mais également un nom. En effet, la spécification d'un nom de route est obligatoire. Nom appliqué via l'appel de la fonction name() ou via le paramètre as (présent dans l'exemple ci-dessous). Il permet notamment d'afficher un titre dans une page (balise title) mais également pour le système d'affichage des vues. Chaque nom de route doit être unique ! assurez-vous donc de son unicité.

De plus, on peut également customiser les routes par exemple via l'ajout de middlewares.

Exemple (d'une route appellé via requete ajax/fetch retournant du json):



Route::get('/', ['uses' => '[email protected]', 'as' => 'NOM_DE_MA_ROUTE', 'middleware' => ['InstallExt', 'ApiCall']]);


Le paramètre as correspond a l'identifiant de la route. Vous pourrez ainsi par exemple utiliser {{ route('NOM_DE_MA_ROUTE') }} dans vos vues :).

Vous pourrez retrouver la liste des middlewares dans la section Middleware situé plus bas dans la documentation.

Enfin, si vous souhaitez créer des routes avec des paramètres dynamiques je vous redirige vers la famosa documentation officielle.

Mais briévement pour celles et ceux qui auraient la flemme de la lire : - les paramètres sont présents dans vos routes sous la forme {nom_du_paramètre} (vous ne devez pas utiliser de -). - si vous souhaitez créer des paramètres optionnelles il faut rajouter un ? {param_optionel?} - pour chaque paramètre que vous allez ajouter dans l'url, il faudra ajouter un paramètre dans la fonction associée à la route (l'ordre des paramètres de fonction est le même que l'ordre des paramètres dans l'url, le nom n'importe peu).

Petite notion importante, vous pouvez définir des expréssions régulières pour vos paramètres (et ça c'est cool).

Exemple tirée de la documentation officielle :




Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');



Assets

Via le système de module vous avez la possibilité d'ajouter des assets (css, js, image etc...). Tout ce passe dans le dossier Assets. A savoir : il y a une normalisation des dossiers : - vos css devront être ajouter dans un sous dossier css - vos js devront être ajouter dans un sous dossier js - vos img devront être ajouter dans un sous dossier img

Et pour inclure un assets dans vos vues utilisez pour du css: php {!! \App\Facades\DeveloppementTools::css('NomModule', 'NomFichier') !!}

pour du js :

{!! \App\Facades\DeveloppementTools::js('NomModule', 'NomFichier') !!}

pour une image :

{!! \App\Facades\DeveloppementTools::img('NomModule', 'NomFichier') !!}

Vues

En ce qui concerne les vues, laravel propose d'utiliser un système de template nommé blade (lien de la documentation). Ce système apporte différentes choses comme une syntaxe alternative. Vous n'êtes pas obligé d'utiliser cette syntaxe même si elle est recommandée.

Chaque vue doit se trouver dans le dossier Ressources/views de votre plugin et se nommer de la forme **.blade.php*.

Pour pouvoir charger une vue pour une route donnée, vous devez dans la fonction associé à cette dernière utiliser le DeveloppementTools présenté plus haut.

Attention : c'est un système qui est très sensible à ce que vous allez entrer (sensible à la case etc...) !

Voici un exemple d'affichage d'une vue ou le contexte serait : - Nom du module : MonModule - Nom de la vue index.blade.php (Ressources/views/index.blade.php) - Nom de la route : MaRoute - Identifiant de la vue pour cette route : monmodule_mavue

DeveloppementTools::moduleSetViews('MaRoute', 'monmodule_mavue', 'MonModule::index', 'MonModule');
return DeveloppementTools::loadView();

Explication des paramètres de la fonction moduleSetViews() :

  1. Nom de la route associée à cette fonction
  2. Identifiant généralement nomdumodule_nomdelavue
  3. Chemin pour aller charger la vue sous la forme de NomDuModule::chemin. A noter que dans le chemin vous ne devez pas spécifier les extensions des vues, en l'occurence ici .blade.php. Si vous avez structuré vos vues dans des sous-dossiers, vous ne devez spécifier le chemin par des . au lieu des / exemples si vous avez /Ressources/views/admin/index.blade.php, vous le retranscrirez par MonModule::admin.index
  4. Nom du module

** ATTENTION : Si vous souhaitez que la vue soit uniquement accessible depuis le panel administrateur et uniquement par l'administrateur, mettez "true" dans la fonction return DeveloppementTools::loadView();, ce qui donne return DeveloppementTools::loadView(true); **

Système avancé

ServiceProvider

Le système de ServiceProvider est un très gros système à ne jamais prendre à la légère, c'est d'ailleurs le plus important de laravel.

L'utilité des ServiceProvider ?

Les providers vous serviront à faire appel à des fonctions qui doivent être globalisé partout dans le CMS. La particularité des providers est qu'ils sont appelés avant même les sessions/cookies, donc impossible d'appeler un cookie ou une session. Vous ne pouvez qu'appeler les Model et plus.. Or ne l'utilisez pas juste pour faire cela.

Utilisez les providers pour partager une variable partout dans le CMS ou pour exécuter une fonction importante au fonctionnement de votre plugin.

On va procéder comme cela :

Génération d'un ServiceProvider

Afin d'en généré un vous devez faire cette commande dans un terminal ou dans votre DevTools.

php artisan module:make-provider TestServiceProvider NomDeVotrePlugin




Ensuite très important, afin de déclarer votre Provider, vous devez vous rendre dans le fichier config.json, ouvrez-le et chercher la clé providers qui doit de base contenir une valeur "Modules\\VotrePlugin\\Providers\\VotrePluginServiceProvider". Ne supprimez surtout pas la première valeur, car elle permet de faire fonctionner votre plugin, vous allez plutôt mettre une virgule et ouvrir les guillemets pour rentrer Modules\\VotrePlugin\\Providers\\TestServiceProvider. Après avoir effectué cette manipulation, vous pouvez désormais fermer le config.json.

Développement du ServiceProvider

Vos providers sont répertoriés dans le dossier Providers de votre plugin, vous aurez VotrePluginServiceProvider.php et TestServiceProvider.php, ouvrez TestServiceProvider.php.

Vous aurez ce code :


<?php

namespace Modules\CPS\Providers;

class CPSServiceProvider extends ServiceProvider
{
    /**
     * Boot the application events.
     *
     * @return void
     */
    public function boot() // Qui permet d'appeler un code
    {
       // Intéressant nous plutôt à celle-ci, mettez tous vos codes ici.
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register() // Qui permet d'enregistrer des fonctions
    {
        //
    }

}


Après avoir mis en place votre code dans la fonction boot(), vous pouvez désormais actualiser.

Middleware

Laravel nous offre la possibilité de créer des systèmes appelés : Middleware.

Ces systèmes sont très utile dans un contexte spécifique, je vous donne quelques exemples :

Si vous souhaitez vérifier si l'utilisateur est bien connecté, au lieu d'écrire ce code dans votre controller, un petit coup du middleware et il fera à votre place la manipulation voulue. Pour ce faire rien de difficile :

  1. Créer un middleware
  2. Développer ce middleware
  3. Affiler le middleware à la route

Créer un middleware

Pour en créer un, rien de difficile il suffit d'exécuter cette commande dans votre DevTools ou un terminal.

php artisan module:make-middleware CheckIfUserIsLogin VotrePlugin 




Après avoir fait cette commande, CheckIfUserIsLogin.php sera crée dans le dossier Modules/VotrePlugin/Http/Middleware, ouvrez-le.

Développer ce middleware

Vous aurez de base ce code :


<?php

namespace Modules\VotrePlugin\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckIfUserIsLogin
{
    /**
     * Handle an incoming request.
     * Documentation : https://docs.trixcms.eu/
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }
}


Voici quelques explications :

Voici comment coder ce middleware :



<?php

namespace Modules\VotrePlugin\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckIfUserIsLogin
{
    /**
     * Handle an incoming request.
     * Documentation : https://docs.trixcms.eu/
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if(!(new AuthController)->check()) { // Condition qui permet de dire : Si l'utilisateur n'est pas connecté
            return redirect()->route('Login')->send(); // Alors on le redirige vers la page de connexion
        }
        return $next($request); // Sinon on lui donne accès au "laisser passer" (en gros il aura accès à la page)
    }
}


Affiler le middleware à la route

Pour que ce middleware puisse fonctionner, rien de plus simple, ouvrez le fichier routes.php qui ce trouve dans Modules/VotrePlugin/Http.

Dans le cas du plugin CPS celui-ci ce présente comme cela :


<?php
// Documentation : https://docs.trixcms.eu/
Route::group(['middleware' => 'web', 'prefix' => 'cps', 'namespace' => 'Modules\CPS\Http\Controllers'], function()
{
    Route::get('/', '[email protected]')->name("CPS");
});


Afin d'ajouter le middleware vous devez appeler une nouvelle fonction : ->middleware(), donc finalement votre route ce présentera comme cela :


<?php
// Documentation : https://docs.trixcms.eu/
Route::group(['middleware' => 'web', 'prefix' => 'cps', 'namespace' => 'Modules\CPS\Http\Controllers'], function()
{
    Route::get('/', '[email protected]')->name("CPS")->middleware(Modules\CPS\Http\Middleware\CheckIfUserIsLogin::class); // Attention à bien respecter la façon d'appeler le middleware.
});


Vous devrez appeler votre middleware de cette façon : ->middleware(Modules\CPS\Http\Middleware\CheckIfUserIsLogin::class), si vous en possédez plusieurs, soit vous pouvez faire comme cela : ->middleware([Modules\CPS\Http\Middleware\CheckIfUserIsLogin::class, Modules\CPS\Http\Middleware\Another::class]) ou bien en appelant une deuxième fois ->middleware().

Installation d'un package (vendor - composer)

TrixCMS étant une application web sous Laravel, celui-ci nous offre la possibilité d'installer des extensions (aussi appelé package) ces packages permettent de rendre votre code plus complet et vos plugins beaucoup plus performant.

Comment installer ces fameux packages ?


1 - Ouvrez un terminal, puis faites cd /var/www/html/Modules/VotrePlugin ensuite..


2 - Cherchez votre package sur internet (je vous recommande github ou packagist.org)


3 - Exécutez la commande suivante : composer require nomdupackage (ATTENTION : Vérfifier bien si vous êtes à la racine de votre plugin et non pas à celle du CMS)

Afin que les packages soient bien chargés, rendez-vous dans votre controller (sur le quel vous souhaitez utiliser le(s) package(s)) et créez un constructeur comme suis :


<?php

namespace Modules\CPS\Http\Controllers;
use App\Facades\DeveloppementTools;
use Illuminate\Routing\Controller;

class CPSController extends Controller
{
    public function __construct() 
    {
        require(base_path() . "/Modules/CPS/vendor/autoload.php"); // cette ligne est iomportante, c'est celle-ci qui initialisera vos packages, remplacez "CPS" par le nom de votre plugin
    }

    // Documentation : https://docs.trixcms.eu/
    public function index()
    {
        DeveloppementTools::moduleSetViews("CPS", "home", "CPS::home", "CPS");
        return DeveloppementTools::loadView();
    }
}


Après avoir effectué toutes ces démarches, vous pouvez dès maintenant utiliser votre package à la suite de ce fichier.

ATTENTION : N'importez jamais un package dans le serviceprovider de votre plugin, car celui-ci ralentira beaucoup le CMS.

Http - Adder

Le système d'adder est un système innovant à TrixCMS qui permet entre-autre aux développeurs de plugins d'afficher quelques statistiques directement sur la page d'acceuil du panel admin ! Voici un exemple de statistique : exemple adder.

Pour ajouter des statistiques à vos plugins, vous devrez créer un fichier BlockIndex.php dans le dossier Http/Adder de votre plugin.

Voici la structure de base que devra respecter votre fichier :


<?php

namespace Modules\MonModule\Http\Adder;

class BlockIndex {

    public function set()
    {

        return [];
    }

}

A noter que la fonction set() doit obligatoirement retourner un tableau.

Une statistique est structurée de cette façon :


[
    "icon" => "", //icon du block (font awesome sans le fa- par exemple pour fa-list indiquez juste list)
    "title" => "", //nom du block
    "color" => "", //couleur reprenant les noms des classes bootstrap : warning, success et danger
    "contains" => "" //valeur à afficher
]

Http - ModuleInPage

Avant de vous expliquez ce qu'est que le ModuleInPage, sachez que ce système est difficile à appréhender or lorsque vous comprendrez la partie théorique, la pratique deviendra extrémement simple.

Tout d'abord sachez qu'il y a 3 principes de base dont 2 facultatifs selon l'utilisation.

Le ModuleInPage (M.I.P) contient 3 fonctionnalités qui sont les suivantes :

M.I.P Function

Le M.I.P Function est une fonction à implémenter obligatoirement dans le ServiceProvider (fonction : boot()) qui gère votre Plugin, exemple : Modules/FAQ/Providers/FAQServiceProvider.php, le code à implémenté est :


DeveloppementTools::setModuleInPage('Vote', [
   "profil" => ModuleInPage::$PROFIL
]);

Dans ce code plusieurs points sont à prendre en considération,

ce qui donne :


DeveloppementTools::setModuleInPage("MonPlugin", [
  "MaVue" => "users.profil.home" // "MaVue" est la vue que vous comptez intégrer, et users.profil.home est la vue dans la quel vous comptez intégrer "MaVue", (ATTENTION : Vous ne pouvez intégrer votre vue que dans certaines vues déjà existantes.)
]);


Voici la liste des vues dans lesquels vous pouvez intégrer votre vue :

Sharer

Le Sharer est un système vous permettant de partager vos variables uniquement dans les intégrations (ce qui fait la différence avec le SharerProvider), certainement après l'utilisation de la M.I.P Function vous ne pourrez que mettre du code static (html/css) ou du code php avec des variables globales (comme par exemple $user oou $config), afin de pouvoir implémenter vos variables vous devez sois utiliser le Sharer System (celui-ci) ou bien le SharerProvider System (que nous verrons après). On va ce concentrer sur le Sharer.

L'utilisation est très simple, vous devez pour cela créer un fichier Sharer.php dans le dossier Modules/monPlugin/Http/ModuleInPage.

Ensuite rentrez ce code :

<?php

namespace Modules\MonPlugin\Http\ModuleInPage;

class Sharer {

    public $allVar = [];

    public function setAllVar()
    {
        return $this->allVar = [];
    }
}


Ne stressez pas, je vais vous expliquez comment utiliser ce code... Vous avez à disposition la méthode : public $allVar, cette méthode ne vous servira à rien OR ne la supprimez surtout pas. Elle est très importante, elle permet de partager les variables aux vues, afin de déclarer vos variables, vous devez les ajouter dans la fonction setAllVar() et plus précisément dans le bout de code suivant : return $this->allVar = [];, vous devez vos variables comme suis :


$lol = 1;

return $this->allVar = ["test" => "Hey je suis un test", "lol", => $lol];


En gros dans le tableau [], vous devez placer en clé : "Le Nom de votre variable" et en valeur "la valeur qui sera montrée lorsqu'on appel la variable" (afin d'en créer plusieurs vous devez les séparer par une virgule ["test" => "hey", "lol" => 5]) sa reviens à faire cela :


<?= $test ?> // Retournera : Hey je suis un test
<?= $lol ?> // Retournera : 1


Votre code devrait finalement ressembler à cela :

<?php

namespace Modules\MonPlugin\Http\ModuleInPage;

class Sharer {

    public $allVar = [];

    public function setAllVar()
    {
        $lol = 1;
        return $this->allVar = ["test" => "Hey je suis un test", "lol", => $lol];
    }
}


Parfait maintenant vous pouvez actualiser, les variables fonctionnent.

SharerProvider

Le SharerProvider est un système vous permettant de partager vos variables dans tous le CMS (ce qui fait la différence avec le Sharer), certainement après l'utilisation de la M.I.P Function vous ne pourrez que mettre du code static (html/css) ou du code php avec des variables globales (comme par exemple $user oou $config), afin de pouvoir implémenter vos variables vous devez sois utiliser le Sharer System (celui d'au-dessus) ou bien le SharerProvider System (celui-ci). On va ce concentrer sur le SharerProvider.

L'utilisation est très simple, vous devez pour cela créer un fichier SharerProvider.php dans le dossier Modules/monPlugin/Http/ModuleInPage.

ATTENTION : L'utilisation du SharerProvider n'est pas recommandée, veuillez utiliser ce système uniquement pour des variables qui doivent être globales, comme par exemple le plugin vote qui doit partager le classement vote, les récompenses et le classement pallier

Ensuite rentrez ce code :

<?php

namespace Modules\MonPlugin\Http\ModuleInPage;

class SharerProvider {

    public $allVar = [];

    public function setAllVar()
    {
        return $this->allVar = [];
    }
}


Ne stressez pas, je vais vous expliquez comment utiliser ce code... Vous avez à disposition la méthode : public $allVar, cette méthode ne vous servira à rien OR ne la supprimez surtout pas. Elle est très importante, elle permet de partager les variables aux vues, afin de déclarer vos variables, vous devez les ajouter dans la fonction setAllVar() et plus précisément dans le bout de code suivant : return $this->allVar = [];, vous devez vos variables comme suis :


$lol = 1;

return $this->allVar = ["test" => "Hey je suis un test", "lol", => $lol];


En gros dans le tableau [], vous devez placer en clé : "Le Nom de votre variable" et en valeur "la valeur qui sera montrée lorsqu'on appel la variable" (afin d'en créer plusieurs vous devez les séparer par une virgule ["test" => "hey", "lol" => 5]) sa reviens à faire cela :


<?= $test ?> // Retournera : Hey je suis un test
<?= $lol ?> // Retournera : 1


Votre code devrait finalement ressembler à cela :

<?php

namespace Modules\MonPlugin\Http\ModuleInPage;

class SharerProvider {

    public $allVar = [];

    public function setAllVar()
    {
        $lol = 1;
        return $this->allVar = ["test" => "Hey je suis un test", "lol", => $lol];
    }
}


Parfait maintenant vous pouvez actualiser, les variables fonctionnent partout même dans la page d'accueil ou dans le panel administrateur.

Lang

TrixCMS possède un système de lang qui lui est propre, afin de l'exploiter, vous devez suivre ces étapes :

Création du fichier lang

Ce fichier vous le créez manuellement de cette façon : Rendez-vous dans le dossier Modules/VotrePlugin/Resources créez le dossier lang et ajoutez-y fr_FR.json (plus d'information dans public/lang), ensuite mettez ce code :


{
  "name": "Français",
  "slug": "fr_FR"
}

Utilisation du système

Créez d'abord une clé et une valeur dans le json comme suis :


{
  "name": "Français",
  "slug": "fr_FR",

  "Test" => "Je test",
  "HELLO" => "HEY"
}

Ensuite dans votre controller, utilisez le de cette façon DeveloppementTools::getLangModules('FAQ', 'HELLO')

Fin

Merci d'avoir suivi cette documentation... Si vous avez des questions venez sur le discord ou ouvrez un ticket sur le site.