# FD2R Event – site PHP/MySQL simple (sans Composer)

PHP 8.1+ (extensions : pdo_mysql, curl, mbstring, fileinfo ; gd recommandé pour la conversion WebP), MySQL/MariaDB, Apache avec `mod_rewrite`.
Aucune bibliothèque à installer : on copie les fichiers par FTP et c'est prêt.

## Structure
```
config.php            vos réglages (copie de config.sample.php) – hors du dossier public
inc/core.php          base de données, utilitaires, droits, e-mail, images
inc/seo.php           title, description, canonical, Open Graph, schema.org, fil d'Ariane
inc/pdf.php           mini générateur PDF (1 classe)    inc/quote.php  calcul du devis + PDF
inc/views.php         gabarit commun                    inc/pages.php  toutes les pages publiques
public/index.php      routeur (table des URL)           public/admin/  espace d'administration
public/.htaccess      réécriture d'URL, HTTPS, cache    public/assets  CSS et logo
```

## Installation
1. Envoyer le dossier sur l'hébergement ; **le dossier racine du site doit être `public/`** (réglage du domaine chez l'hébergeur).
2. Importer `schema.sql` (phpMyAdmin) ; copier `config.sample.php` en `config.php` et le remplir.
3. Créer des clés Cloudflare Turnstile (gratuit) et les placer dans `config.php`.
4. Créer l'admin : `php bin/create-admin.php vous@exemple.fr "Nom" "motdepasse-10-car-min"` (ou insérer un utilisateur via phpMyAdmin avec un hash `password_hash`).
5. Éditer `public/robots.txt` (adresse du sitemap), puis se connecter sur `/admin/`.
Nginx : `location / { try_files $uri $uri/ /index.php?$query_string; }`

## URL (propres, une seule par page)
`/` · `/catalogue` · `/catalogue/tables` · `/produit/table-ronde-180` · `/services` · `/services/decoration` · `/blog` · `/blog/mon-article` · `/mentions-legales` · `/devis` (noindex) · `/sitemap.xml`
Les adresses sont générées depuis le nom (modifiables dans l'admin). Les accents et espaces sont convertis ; sans slash final ; HTTPS forcé ; `/index.php` redirigé vers `/`.

## SEO inclus
- `<title>` et meta description par page (champs « Titre SEO » / « Description SEO » dans l'admin, valeurs automatiques sinon), balise canonical, Open Graph et Twitter.
- Données structurées schema.org : LocalBusiness (toutes les pages), Product avec prix TTC, Service, Article, BreadcrumbList + fil d'Ariane visible.
- Un seul `<h1>` par page, textes alternatifs, images avec dimensions et chargement différé, photos converties en WebP (1400 px max), compression et cache navigateur.
- `sitemap.xml` généré automatiquement ; `robots.txt` ; admin et panier en noindex ; vraie page 404 (code HTTP 404).
- Maillage interne : catégories, produits similaires, fil d'Ariane, liens blog vers le catalogue.
Après la mise en ligne : déclarer `https://votre-site/sitemap.xml` dans Google Search Console, renseigner « Titre SEO » et « Description SEO » des pages clés, ajouter de vraies photos et textes uniques par produit.

## Devis
Demande protégée (Turnstile, champ piège, délai anti-répétition, consentement) → enregistrée en base → e-mail à `notify_email` + accusé au client. En admin : lignes modifiables, PDF généré, envoi au client. Les e-mails partent via la fonction `mail()` de l'hébergeur : configurez SPF/DKIM du domaine pour éviter les spams. Le PDF est volontairement sobre (texte, sans logo).

## À savoir
Code non testé en conditions réelles : essayez-le en local (par ex. avec XAMPP) avant de le publier. Les textes légaux fournis sont des modèles à faire valider.
