# SmartMaker - Back (PHP) La partie backoffice de SmartMaker s'intègre dans un module Dolibarr standard. ## Structure des dossiers Lorsque vous déployez SmartMaker dans votre module Dolibarr, les dossiers suivants sont créés : ^ Dossier ^ Description ^ | ''mobile/'' | Code source React de l'application mobile | | ''pwa/'' | Application compilée + point d'entrée ''api.php'' | | ''smartmaker-api/'' | Contrôleurs et mappeurs PHP | Et un fichier ''smartmaker-api-prepend.php'' pour factoriser les includes. ## Le routeur PHP ### Syntaxe ``` Route::action(path, Controller::class, method, protected); ``` ^ Paramètre ^ Description ^ | ''action'' | ''get'', ''post'', ''put'', ''delete'' | | ''path'' | Chemin de l'API (ex: ''items'', ''items/{id}'') | | ''Controller::class'' | Classe PHP à appeler | | ''method'' | Méthode de la classe | | ''protected'' | ''true'' = route authentifiée, ''false'' = publique | ### Exemple complet (api.php) ``` fetch($id); if ($res <= 0) { return ['Not Found', 404]; } // Mapper pour le front $mapping = new dmMyObject(); $data = $mapping->exportMappedData($item); return [$data, 200]; } /** * Créer un item */ public function create($payload = null) { global $db, $user; $item = new \MyObject($db); $item->label = $payload['label']; $item->description = $payload['description']; $res = $item->create($user); if ($res < 0) { return ['Error creating item', 500]; } return [['id' => $res], 201]; } /** * Mettre à jour un item */ public function update($payload = null) { global $db, $user; $id = $payload['id'] ?? null; $item = new \MyObject($db); $res = $item->fetch($id); if ($res <= 0) { return ['Not Found', 404]; } // Mettre à jour les champs if (isset($payload['label'])) { $item->label = $payload['label']; } $res = $item->update($user); if ($res < 0) { return ['Error updating item', 500]; } return ['Updated', 200]; } /** * Supprimer un item */ public function delete($payload = null) { global $db, $user; $id = $payload['id'] ?? null; $item = new \MyObject($db); $res = $item->fetch($id); if ($res <= 0) { return ['Not Found', 404]; } $res = $item->delete($user); if ($res < 0) { return ['Error deleting item', 500]; } return ['Deleted', 200]; } /** * Recherche avec filtres */ public function search($payload = null) { global $db; $filter = $payload['filter'] ?? 'all'; $limit = $payload['limit'] ?? 10; // Construire la requête SQL $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "myobject"; $sql .= " WHERE 1=1"; if ($filter === 'active') { $sql .= " AND status = 1"; } $sql .= " LIMIT " . (int) $limit; $resql = $db->query($sql); $items = []; while ($obj = $db->fetch_object($resql)) { $item = new \MyObject($db); $item->fetch($obj->rowid); $mapping = new dmMyObject(); $items[] = $mapping->exportMappedData($item); } return [$items, 200]; } } ``` ### Accès à l'utilisateur connecté L'utilisateur JWT est disponible dans le payload : ``` public function update($payload = null) { $user = $payload['user']; // Objet User Dolibarr dol_syslog("Action par: " . $user->login); } ``` ## Voir aussi * [[mapping_dolibarr_-_react|Mapping Dolibarr - React]] - Classes dm* * [[controller|Exemple complet de Controller]] * [[../smartauth/start|SmartAuth]] - Authentification JWT