Files
xamxam/app/public/admin
Pontoporeia e6829994b6 Refactor + feat: unify format/fichiers HTMX fragment, reorder format types, add file constraints, fix admin auth
* **Unified Format + Fichiers into a single HTMX fragment**

  * Introduced `app/public/partage/fichiers-fragment.php` as shared dynamic block returning both format checkboxes and adaptive “Fichiers” fieldset
  * Logic adapts inputs based on selected formats:

    * no selection / upload formats → standard file inputs
    * “Site web” → URL fields only
    * “Site web + upload” → file inputs + URL sub-fieldset
  * Added admin wrapper: `app/public/admin/fichiers-fragment.php` (gated via `admin_mode=1`)
  * Added `app/public/admin/format-website-fragment.php` for edit-mode website URL toggling
  * Wired route `/partage/fichiers-fragment` in `app/public/partage/index.php`
  * Refactored `form.php` (add/edit partage) to use single `#format-fichiers-block` instead of separate fragments
  * Edit mode format checkboxes now target `format-website-fragment.php` → `#edit-website-url-fieldset`
  * Added `$hxInclude` support in `checkbox-list.php` for configurable HTMX includes

* **Format system migration + ordering**

  * Migration `020_format_types_sort_and_rename.sql`:

    * added `sort_order` column to `format_types`
    * inserted new format **Image**
    * defined ordering: Écriture · Image · Audio · Vidéo · Site web · Performance · Objet éditorial · Installation · Autre
  * `Database.php`: format queries now use `ORDER BY sort_order, id`
  * `fichiers-fragment.php`:

    * uses ordered format list
    * resolves Image/Vidéo/Audio by name
    * introduces `$hasImage` flag
    * preserves `admin_mode` across HTMX requests

* **File constraints and UX updates**

  * Enforced **100 MB PDF limit**

    * `ThesisCreateController`: `MAX_PDF_SIZE = 100MB` for PDFs only
    * `ThesisEditController`: same PDF-specific constraint applied
    * Other file types remain capped at 500 MB
  * Updated UI hints in `fichiers-fragment.php` and edit form:

    * explicitly mention 100 MB PDF limit
    * added reference to `bentopdf.com` for compression guidance
  * `file-field.php`: added `$hintRaw` to allow HTML rendering in hints

* **Admin authentication fix**

  * Fixed missing auth in admin fragments
  * Added `require_once AdminAuth.php`
  * Replaced direct usage with `AdminAuth::requireLogin()`
  * Applied consistent pattern with existing fragment authentication approach

* **Migrations included**

  * `019_add_ecriture_format.sql`
  * `020_format_types_sort_and_rename.sql`

* **Files affected**

  * Controllers: `ThesisCreateController`, `ThesisEditController`
  * DB layer: `Database.php`
  * Public fragments: `partage/fichiers-fragment.php`, `admin/fichiers-fragment.php`, `admin/format-website-fragment.php`
  * Templates: `form.php`, `checkbox-list.php`, `file-field.php`
  * Routing: `partage/index.php`
  * Misc: `TODO.md`

This consolidates format normalization, HTMX UI simplification, file validation rules, and admin stability fixes into a single coherent system update.
2026-05-13 17:59:13 +02:00
..
2026-05-07 19:44:18 +02:00
2026-05-07 19:44:18 +02:00

Admin Panel Structure

This directory contains the admin panel for managing XAMXAM thesis database.

Directory Structure

public/admin/
├── index.php          # List all theses (main page)
├── add.php            # Add new thesis form
├── edit.php           # Edit existing thesis form
├── import.php         # CSV import form
├── recapitulatif.php  # Recap page after submission
├── actions/           # Backend processing scripts (no HTML output)
│   ├── formulaire.php # Process thesis submission from add.php
│   └── publish.php    # Toggle publish/unpublish status
├── inc/               # Shared templates
│   ├── head.php       # HTML head, CSS, navigation
│   └── footer.php     # HTML footer
└── data/              # Upload directory (not in git)
    ├── theses/        # PDF files
    └── covers/        # Cover images

File Types

User-Facing Templates (Root Directory)

Files that display HTML to users:

  • index.php - Lists all theses with filters and bulk actions
  • add.php - Form to add a new thesis
  • edit.php - Form to edit an existing thesis
  • import.php - CSV import interface
  • recapitulatif.php - Success confirmation page

Backend Scripts (actions/)

Files that process forms and redirect (no HTML output):

  • formulaire.php - Processes thesis submission from add.php
  • publish.php - Handles publish/unpublish actions

Shared Templates (inc/)

Reusable HTML components:

  • head.php - HTML head, CSS links, navigation menu
  • footer.php - HTML footer

Workflow

Adding a Thesis

  1. User visits add.php (displays form)
  2. User submits form to actions/formulaire.php (processes data)
  3. On success, redirects to recapitulatif.php?id=123
  4. On error, redirects back to add.php with error message

Publishing/Unpublishing

  1. User clicks publish/unpublish button in index.php
  2. Form submits to actions/publish.php (processes action)
  3. Redirects back to index.php with success/error message

Security

  • All pages require HTTP Basic Auth (configured in nginx) — primary layer
  • All pages require PHP session auth (AdminAuth::requireLogin()) — defence-in-depth
  • CSRF tokens protect all forms
  • File uploads validated and sanitized
  • Database queries use prepared statements
  • Upload directory outside public/ in production

See nginx/PHP_AUTH_LAYER.md for details on the dual-auth architecture.

Templates

The inc/ folder contains shared templates:

  • head.php - Included at the top of each page (DOCTYPE, CSS, nav)
  • footer.php - Included at the bottom of each page (closing tags)

Usage:

<?php include "inc/head.php" ?>
<!-- Page content here -->
<?php include "inc/footer.php" ?>

URL Structure

  • /admin/ - List theses (index.php)
  • /admin/add.php - Add new thesis
  • /admin/edit.php?id=123 - Edit thesis #123
  • /admin/import.php - Import CSV
  • /admin/recapitulatif.php?id=123 - Recap page

Backend actions (not directly accessed):

  • /admin/actions/formulaire.php - Form processor
  • /admin/actions/publish.php - Publish toggle

Development

Adding a New Page

  1. Create the template in /admin/yourpage.php:
<?php
require_once __DIR__ . "/../../config/bootstrap.php";
require_once __DIR__ . '/../../lib/AdminAuth.php';
AdminAuth::requireLogin();
$pageTitle = "Your Page Title";
?>
<?php include "inc/head.php" ?>

<!-- Your content here -->

<?php include "inc/footer.php" ?>
  1. Add navigation link in inc/head.php if needed

Adding a New Action

  1. Create the script in /admin/actions/youraction.php:
<?php
require_once __DIR__ . "/../../config/bootstrap.php";
require_once __DIR__ . '/../../lib/AdminAuth.php';
AdminAuth::requireLogin();

// Verify CSRF token
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    $_SESSION['error'] = "Security error";
    header('Location: ../index.php');
    exit;
}

// Process action...

// Redirect
header('Location: ../yourpage.php');
exit;
  1. Create form in template that posts to actions/youraction.php

Notes

  • Bootstrap path from actions/: __DIR__ . "/../../config/bootstrap.php"
  • Redirects from actions/: use ../ prefix (e.g., ../index.php)
  • Database class: require_once __DIR__ . '/../../lib/Database.php'
  • All forms must include CSRF token from $_SESSION['csrf_token']