Système de Hook

Gestion de la validation

Problématique

Un module est validé alors qu'il manque des champs importants. Le gestionnaire de service todd.ws.php n'a pas connaissance de la particularité d'un module. Nous ne pouvons pas implémenter dans ce service généraliste pour l'extension des contrôle qui seraient propres à un certain module.

Il faut déléguer au module lui-même la capacité à être validé ou pas.

Solution

Le gestionnaire de service de validation d'un module doit interroger le module lui-même afin de savoir s'il est prêt à être validé.

Nous installons un hook qui va respecter l'architecture MVC :

  1. Dans todd.ws.php, lors d'une action saveContent (hors brouillon), submitContent, ou moderateApprove, le script interroge désormais dynamiquement le module concerné en invoquant son handler.php avec l'action $module_action = 'check_ready_state'.
  2. Le cœur écoute deux variables que le module peut modifier : $is_ready_for_validation (booléen) et $validation_error_msg.
  3. Dans todd_poll/handler.php, j'ai implémenté l'écoute de cette action check_ready_state. Le module S'ÉVALUE LUI-MÊME et décide seul que s'il manque les dates de campagne, il n'est pas prêt. Il bloque alors l'action globale de todd.ws.php.

Ce mécanisme est propre, 100% agnostique côté cœur, et désormais reproductible pour n'importe quel autre module TODD ; chaque module déclarera ses états que le cœur interrogera.

Implémentation

Dans le gestionnaire de service todd.ws.php (côté cœur) :

// --- MODULE HANDLER HOOK (Pre-Save & Validation) ---
if ($module_code) {
    $handlerFile = PLUGIN_PATH . 'todd/modules/' . $module_code . '/handler.php';
    if (file_exists($handlerFile)) {
        // Hook standard Pre-Save
        $module_action = 'saveContent';
        include $handlerFile;

        // Hook de conversation de validation (uniquement si on ne sauvegarde pas en simple brouillon)
        if ($status !== 'draft') {
            $is_ready_for_validation = true;
            $validation_error_msg = "";

            $module_action = 'check_ready_state';
            include $handlerFile;

            if (!$is_ready_for_validation) {
                echo json_encode(['status' => 0, 'msg' => $validation_error_msg ?: "Ce contenu ne remplit pas les conditions pour changer de statut."]);
                exit;
            }
        }
    }
}

On pourra implémenter dans un module cette vérification dans handler.php de cette manère par exemple :

// ------------------------------------------------------------------------
// HOOK: Validation avant changement de statut (Brouillon -> En attente -> Approuvé)
// ------------------------------------------------------------------------
case 'check_ready_state':
    // Vérification des règles métier spécifiques au module
    if (empty($payload['ma_donnee_obligatoire'])) {
        $is_ready_for_validation = false;
        $validation_error_msg = "Veuillez d'abord définir la donnée obligatoire.";
    }
    break;