Proaxive permet de créer des modules sans impacter le code source de l'application. Il faut simplement respecter l'architecture suivante :
src/Addon
, créez un nouveau dossier comportant le nom de votre module (en camelcase)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 le 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.
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
Ce fichier est une class avec deux méthodes :
$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"]
$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');
});
$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.
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 :
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();
}
}
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.