Modules

Mise à jour le 05/05/24 17:27

Créer un module pour Proaxive

Proaxive permet de créer des modules sans impacter le code source de l'application. Il faut simplement respecter l'architecture suivante :

  • Dans le dossier src/Modules, créez un nouveau dossier comportant le nom de votre module (en camelcase)
    Exemple : MonModule

Ce nouveau dossier comporte plusieurs autres dossiers. Il est important de bien respecter la hiérarchie.
Il n'est pas nécessaire de suffxer le nom de vos fichiers, mais je le conseil tout même afin de ne pas être embêter avec les Namespace.

[Monmodule] étant le nom de votre addon.

[src/Modules]
.Monmodule
  .Domain
    .Repository
  .Http
    .Admin
      .Controller
    .Controller
  .Type
    .Admin
  .Infrastructure
    .Migrations
  .templates
config.php
MonModule.php

Le fichier MonModule.php est la fichier central du module.
Le fichier config.php contient la configuration du module (définition, paramètres etc.)

Je vous conseil de télécharger un module générique ici => Télécharger l'addon générique afin de mieux comprendre l'architecture et le code de chaque fichier.

Le fichier d'appel XxxxxModule.php

Ce fichier est très important, c'est lui qui va s'occuper de gérer le menu et les routes de votre module.
Son nommage est important, il doit être du nom de votre module suivi du préfixe "Module", le tout en camelcase.
Exemple :
Nom du dossier de votre nouveau module : Fiber Fichier d'appel à la racine du module : FiberModule.php

Cette class doit étendre d'AbstractModule

Ce fichier est une class avec deux méthodes :

  • initMenu
    Cette méthode génère le menu du module, il sera ajouté au menu principal de l'administration.
$menu->addItem('Fiber', '', [
'Accueil' => '/admin/fiber',
'Nouveau' => '/admin/fiber/create',
]);

Dans cette exemple, "Fiber" sera le titre du menu (le nom de votre module).
Le second paramètre correspond à l'URL du menu (utilisé si votre module ne possède pas de sous menu)
Le troisième paramètre est un tableau qui génère les sous-menus de votre module.

['nomDuLien' => 'urlDuLien"]
  • initRoute
    Cette méthode génère les routes du module.
    Vous avez deux façon d'ajouter des routes.
Les grouper par URL
$this->app->group('/admin/fiber', function (RouteCollectorProxy $group) {
 $group->get('', FiberController::class)->setName('module_admin_fiber');
 $group->any('/create', FiberCreateController::class)->setName('module_admin_fiber_create');
});
En URL unique
$this->app->get('/admin/fiber', FiberController::class)->setName('module_admin_fiber');
$this->app->any('/admin/fiber/create', FiberCreateController::class)->setName('module_admin_fiber_create');

/admin/fiber correspond au lien d'accès à l'une des pages du module. Avec le suffixe "admin" seul les administrateurs et techniciens auront accès à la page.
FiberController::class correspond au Controller de traitement de la page.
setName permet de donner un nom à votre URL. Ce dernier n'est pas obligatoire.

Domain

Ce dossier concerne toutes les class liées à la base de données. Vous pouvez y créer un fichier DTO, une entité, un repository etc.
A la racine de ce dossier doit se trouver vos class d'Entity ou de DTO.
Le dossier Repository, lui doit contenir votre class intégrant vos requêtes SQL (FluentPDO).
Cette class MonAddonRespository doit obligatoirement étendre de BaseRepository.

Respository class :

<?php
declare(strict_types=1);
namespace Selmak\Proaxive2\Addon\MonAddon\Domain\Repository;

use Selmak\Proaxive2\Domain\BaseRepository;

class MonAddonRespository extends BaseRepository
{
    protected string $model = 'table_for_monaddon';
}

La class BaseRepository reprend les méthodes génériques de Proaxive :

  • all Permet de récupérer tous les items
  • allBy Récupère tous les items avec une clause where. Cette méthode demande 3 paramètres obligatoires :
    Une clé (champ de la table), une valeur (valeur du champ) et limit (un entier. Limite le nombre de résultat)
  • find Retourne un enregistrement via une clause where. 2 paramètres obligatoires (clé et valeur)

Http

Ce dossier concerne les Controller et les formulaires de votre addon.
Chaque Controller doit étendre d'AbstractController.
Ex : MonAddonController.php

<?php
declare(strict_types=1);
namespace Selmak\Proaxive2\Addon\MonAddon\Http\Admin\Controller;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Selmak\Proaxive2\Http\Controller\AbstractController;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;

class MonAddonController extends AbstractController
{

    /**
     * @param Request $request
     * @param Response $response
     * @return Response
     * @throws LoaderError
     * @throws RuntimeError
     * @throws SyntaxError
     */
    public function __invoke(Request $request, Response $response): Response
    {
        // Your code
    }
}

Le formulaire lui, étend de Type.
Ex : MonAddonType.php

<?php
declare(strict_types=1);
namespace Selmak\Proaxive2\Addon\MonAddon\Http\Type\Admin;

use Palmtree\Form\Form;
use Palmtree\Form\FormBuilder;
use Palmtree\Form\Type\FileType;
use Palmtree\Form\Type\TextType;
use Selmak\Proaxive2\Http\Type\Type;

class MonAddonType extends Type
{

    public function createFormBuilder(mixed $data = null): Form
    {
        $builder = (new FormBuilder('mon_addon', $data))
            ->add('name', TextType::class, [
                'label' => "Nom"
            ])
            ;
        return $builder->getForm();
    }
}

templates:

Proaxive utilise le moteur de template Twig.
Vous pouvez nommer vos templates comme bon vous semble. L'extension est .html.twig pour chaque fichier de template.
Les templates étendent de backoffice/base.html.twig pour l'administration, frontoffice/base.html.twig pour la vue tracker et frontoffice/portal.html.twig pour le portail client.