Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # **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 :
- * Assets
- - config.php
- * Config *
- * Console
- * Database
- - Migrations
- - Seeders
- - ExampleDatabaseSeeder.php
- * Emails
- * Entities
- * Events
- * Http *
- - Adder
- - Controllers *
- - ExampleController.php
- - Middleware
- - ModuleInPage
- - Requests
- - routes.php *
- * Jobs
- * Listeners
- * Notifications
- * Providers *
- - ExampleServiceProvider.php *
- * Repositories
- * Resources *
- - lang
- - views *
- - layouts
- - master.blade.php
- - index.blade.php
- * Tests
- * composer.json *
- * config.json *
- * start.php *
- 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 |
- <br>
- **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](https://laravel.com/docs/5.4/migrations) 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
- <?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](https://laravel.com/docs/5.4/migrations#tables).
- 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.
- });
- }
- ```
- ```php
- 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](https://laravel.com/docs/5.4/eloquent).
- 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
- <?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](https://i.imgur.com/N4QhrLw.png)
- - Parent possède 0 ou plusieurs enfants
- - Un enfant est possedé par un parent
- 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 :
- ```json
- {
- "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](https://laravel.com/docs/5.4/controllers).
- Un controller est de base sous la forme :
- ```php
- <?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](https://laravel.com/docs/5.4/responses) 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](https://laravel.com/docs/5.4/routing).
- Toutes les routes sont définies dans le fichier _Http/routes.php_.
- Voici un exemple de structure de routes groupées:
- ```php
- Route::group(['middleware' => 'web', 'prefix' => 'monmodule', 'namespace' => 'Modules\MonModule\Http\Controllers'], function()
- {
- Route::get('/', 'MonControlleur@index')->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é (NomController@NomFonction) 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):
- ```php
- Route::get('/', ['uses' => 'MonControlleur@mafonction', '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](https://laravel.com/docs/5.4/routing#route-parameters).
- 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](https://laravel.com/docs/5.4/routing#route-parameters) :
- ```php
- 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 :
- ```php
- {!! \App\Facades\DeveloppementTools::js('NomModule', 'NomFichier') !!}
- ```
- pour une image :
- ```php
- {!! \App\Facades\DeveloppementTools::js('NomModule', 'NomFichier') !!}
- ```
- **Vues**
- En ce qui concerne les vues, laravel propose d'utiliser un système de template nommé **blade** ([lien de la documentation](https://laravel.com/docs/5.4/blade)). 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
- ```php
- 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
- # **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
- * Développement du ServiceProvider
- ###### 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
- <?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 voulu. 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
- <?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 :
- - public function handle() | est la fonction de base, et celle qui doit être utilisée.
- - return $next($request); | est une fonction très importante, car si vous l'enlevez l'accès à votre route devient impossible, elle permet de faire un "laisser passer" si la condition retourne vrai alors cette fonction sera exécutée.
- Voici comment coder ce middleware :
- ```php
- <?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
- <?php
- // Documentation : https://docs.trixcms.eu/
- Route::group(['middleware' => 'web', 'prefix' => 'cps', 'namespace' => 'Modules\CPS\Http\Controllers'], function()
- {
- Route::get('/', 'CPSController@index')->name("CPS");
- });
- ```
- Afin d'ajouter le middleware vous devez appeler une nouvelle fonction : `->middleware()`, donc finalement votre route ce présentera comme cela :
- ```php
- <?php
- // Documentation : https://docs.trixcms.eu/
- Route::group(['middleware' => 'web', 'prefix' => 'cps', 'namespace' => 'Modules\CPS\Http\Controllers'], function()
- {
- Route::get('/', 'CPSController@index')->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 $etes à 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
- <?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](https://i.imgur.com/zPETm1v.png).
- 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
- <?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 :
- ```php
- [
- "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
- * Sharer
- * SharerProvider
- ###### 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 :
- ```php
- DeveloppementTools::setModuleInPage('Vote', [
- "profil" => ModuleInPage::$PROFIL
- ]);
- ```
- Dans ce code plusieurs points sont à prendre en considération,
- * Le nom du plugin
- * Le tableau contenant les intégrations
- ce qui donne :
- ```php
- 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 :
- * users.profil.home (page de profil)
- * users.login.home (page de connexion)
- * users.register.home (page d'inscription)
- * home.home (page d'accueil)
- * news.home (blog)
- * Maintenance.Layout.home (Page LAYOUT de la Maintenance)
- ###### 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
- <?php
- namespace Modules\MonPlugin\Http\ModuleInPage;
- class Sharer {
- public $allVar = [];
- public function setAllVar()
- {
- return $this->allVar = [];
- }
- }
- ```
- <br>
- 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 :
- ```php
- $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 :
- ```php
- <?= $test ?> // Retournera : Hey je suis un test
- <?= $lol ?> // Retournera : 1
- ```
- Votre code devrait finalement ressembler à cela :
- ```php
- <?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];
- }
- }
- ```
- <br>
- 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
- <?php
- namespace Modules\MonPlugin\Http\ModuleInPage;
- class SharerProvider {
- public $allVar = [];
- public function setAllVar()
- {
- return $this->allVar = [];
- }
- }
- ```
- <br>
- 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 :
- ```php
- $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 :
- ```php
- <?= $test ?> // Retournera : Hey je suis un test
- <?= $lol ?> // Retournera : 1
- ```
- Votre code devrait finalement ressembler à cela :
- ```php
- <?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];
- }
- }
- ```
- <br>
- Parfait maintenant vous pouvez actualiser, les variables fonctionnent partout même dans la page d'accueil ou dans le panel administrateur.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement