# Corrections techniques — avril 2025

## 1. Module Oracle — Formulaires de création/édition inaccessibles

**Fichier modifié :** `mon-appli/modules/oracle/databases.php`

### Symptôme

Depuis la migration vers les URLs propres (`/oracle/admin/db/new`,
`/oracle/admin/db/{id}/edit`), les formulaires de création et d'édition de
bases de données Oracle n'apparaissaient plus. L'utilisateur voyait toujours le
tableau de liste, quelle que soit l'URL demandée.

### Cause racine

Le front-controller Oracle (`mon-appli/oracle/index.php`) analyse les segments
d'URL et **positionne `$_GET['action']` et `$_GET['id']` à l'exécution** :

```php
// oracle/index.php — extrait
if ($_s2 === 'new') {
    if (!isset($_GET['action'])) $_GET['action'] = 'create';
} elseif ($_s2 !== '' && $_s3 === 'edit' && ctype_digit($_s2)) {
    if (!isset($_GET['action'])) $_GET['action'] = 'edit';
    if (!isset($_GET['id']))     $_GET['id']     = (int)$_s2;
}
require $_OCI_MODULE . '/databases.php';
```

Or, `databases.php` lisait l'action depuis **`$_REQUEST`** :

```php
// AVANT (cassé)
$action = $_REQUEST['action'] ?? 'list';
```

`$_REQUEST` est un snapshot constitué par PHP **au démarrage** de la requête,
avant l'exécution du code applicatif. Toute modification ultérieure de `$_GET`
ne se reflète **pas** dans `$_REQUEST`. L'action était donc toujours `null`,
provoquant le comportement par défaut `'list'`.

### Correction

```php
// APRÈS (corrigé) — ligne 17 de databases.php
$action = $_GET['action'] ?? 'list';
```

---

## 2. Module Oracle — Initialisation du formulaire pour les connexions Cloud/Wallet

**Fichier modifié :** `mon-appli/modules/oracle/databases.php`

### Symptôme

Lors de l'édition d'une base de données de type `tns` (connexion via wallet
Oracle Cloud), les champs `required` HTML5 n'étaient pas positionnés
correctement au chargement de la page. Les champs `host` et `service_name`
restaient obligatoires alors qu'ils ne doivent pas l'être pour ce type de
connexion, empêchant la soumission du formulaire.

### Cause racine

La fonction JavaScript `toggleConnType()` gérait dynamiquement les attributs
`required` selon le type de connexion sélectionné, mais **n'était pas appelée
au chargement de la page**. Elle ne s'exécutait qu'au changement du radio
bouton `conn_type`.

### Correction

Ajout d'un appel d'initialisation immédiatement après la définition de la
fonction, protégé par un test de présence de l'élément (la fonction est incluse
dans le même fichier que le formulaire et le tableau) :

```javascript
// Initialise l'état du formulaire au chargement de la page
if (document.getElementById('conn-cloud')) {
    toggleConnType();
}
```

---

## 3. Module Oracle — Gestion des droits dans les accès directs

**Fichier modifié :** `mon-appli/modules/oracle/access.php`

### Symptôme

La colonne `right` de la table `oracle_access` (introduite en v1.3 avec le
système de rôles) n'était pas exposée dans l'interface de gestion des accès
directs. Tous les accès accordés via ce formulaire étaient systématiquement
créés avec la valeur `'consultation'`, sans possibilité de choisir le droit
`'dba'`.

### Correction

Trois points modifiés dans `access.php` :

**a) Extraction et validation de la valeur POST :**

```php
$right = in_array($_POST['right'] ?? '', ['dba', 'consultation'], true)
          ? $_POST['right'] : 'consultation';
```

**b) Ajout du paramètre `right` dans l'INSERT :**

```php
$db->execute(
    "INSERT OR IGNORE INTO oracle_access (group_id, subgroup, user_id, ad_group, right)
     VALUES (?, ?, ?, ?, ?)",
    [$groupId, $subgroup, $userId, $adGroup, $right]
);
```

**c) Ajout d'un sélecteur `right` dans le formulaire d'accord d'accès :**

```html
<div class="form-group">
    <label><?= t('oracle.role_right') ?></label>
    <select name="right">
        <option value="consultation"><?= t('oracle.right_consultation') ?></option>
        <option value="dba"><?= t('oracle.right_dba') ?></option>
    </select>
</div>
```

**d) Affichage du droit dans le tableau des accès existants** avec badge coloré
(`badge-info` pour Consultation, `badge-danger` pour DBA).
