# BlogWeb — CMS Symfony cle en main

CMS professionnel pret a deployer pour chaque client. Site propre, securise, SEO integre, personnalisable, installable en 30 minutes.

---

## Fonctionnalites

### Gestion de contenu

- **Articles de blog** — Editeur visuel TipTap (gras, italique, titres, listes, images, videos YouTube/Vimeo, citations, blocs de code, tableaux, colonnes, callouts). Sauvegarde automatique du brouillon toutes les 30 secondes. Publication immediate ou **programmee** (date future, publication automatique a la prochaine visite). Notification email aux abonnes.
- **Pages** — Pages personnalisees (A propos, Nos services...) + pages systeme (mentions legales, confidentialite, CGV). 3 mises en page : standard, pleine largeur, sidebar gauche. Widgets sidebar (categories, archives, tag cloud, evenements a venir, sommaire automatique).
- **Categories** — Organisation des articles par thematique avec couleur et image. Un article peut appartenir a plusieurs categories.
- **Tags** — Classification fine des articles par mots-cles.
- **Medias** — Bibliotheque d'images avec conversion WebP automatique, generation de 3 tailles responsives (480px, 800px, 1200px), texte alternatif pour l'accessibilite et le SEO.
- **Documents** — Bibliotheque de fichiers telechargeables (PDF, DOCX, XLSX, PPTX, ODT/ODS, ZIP/RAR/7Z, CSV, TXT — max 25 Mo). Insertion directe dans l'editeur via bouton dedie ou commande `/document`, upload depuis l'editeur ou bibliotheque centrale, rendu en carte cliquable (icone + nom + taille).
- **Commentaires** — Systeme de commentaires pour les articles, reserve aux utilisateurs connectes. Moderation dans l'admin.

### Modules activables

Chaque module s'active independamment selon les besoins du client :

| Module | Description |
|--------|-------------|
| **Blog** | Articles, categories, tags, commentaires, archives, article vedette |
| **Services** | Fiches de services/prestations |
| **Catalogue** | Fiches produits avec variantes (taille, duree, formule), categories produits, galerie photos, tarification HT/TTC |
| **E-commerce** | Panier, commandes, paiement Stripe, suivi commandes |
| **Evenements** | Agenda avec evenements a venir, evenements passes, evenements vedettes |
| **Annuaire** | Annuaire des membres avec recherche (entreprise, poste, telephone) |
| **FAQ** | Foire aux questions en accordeon, categories, schema.org FAQPage pour le SEO |
| **Portfolio** | Realisations/projets clients avec galerie, filtres par categorie, page detail |
| **Pages privees** | Visibilite par role (public, membres, admin) sur les articles et pages |

### SEO integre

- **Champs SEO** sur chaque article, page, categorie, tag, service (titre SEO, meta description, mots-cles, noIndex, URL canonique) via SeoTrait partage
- **Sitemap index multi-fichiers** (`/sitemap.xml` → sous-sitemaps par type : articles, pages, categories, services, products, events, portfolio, directory, tags, misc). Filtrage automatique noIndex et pages vides
- **robots.txt** dynamique
- **Canonical URL automatique** sur toutes les pages (genere depuis la route, sans query params)
- **Open Graph** (Facebook, LinkedIn) et **Twitter Cards** automatiques sur toutes les pages
- **Image Open Graph dediee** configurable dans l'identite du site (1200x630). Fallback : `ogImage > heroImage > logo`
- **Schema.org JSON-LD** : Organization (site-wide), Article, Product (avec Offer/availability), Event (dates/location), Service, LocalBusiness (annuaire), CreativeWork (portfolio), FAQPage, BreadcrumbList (tous les templates show)
- **Fallback chain** : champs SEO de l'entite > titre/description du contenu > valeurs par defaut du site
- **ProductCategory noindex** : les pages de listing filtrees par categorie produit sont automatiquement en `noindex, follow`
- **Tags noIndex par defaut** : les tags sont masques des moteurs par defaut, l'admin choisit lesquels promouvoir
- **dns-prefetch** : Google Fonts + Google Tag Manager (conditionnel)
- **Google Analytics** et **Google Search Console** configurables dans l'admin
- **Images WebP** + **lazy-loading** natif pour la performance

### Themes et personnalisation

- **6 themes inclus** : Default, Corporate, Artisan, Vitrine, Starter, Moderne
- **Home page generique** : un template unique (`_home_generic.html.twig`) adapte par le CSS de chaque theme via des selecteurs `.theme-{name} .home-*`. Les sections (hero, services, articles, evenements, produits, FAQ, portfolio) s'affichent conditionnellement selon les modules actives.
- **Personnalisation sans code** : couleurs (primaire, secondaire, accent), polices (20 Google Fonts), logo, favicon (7 tailles auto-generees depuis le logo + PWA manifest + Windows tiles)
- **CSS custom properties** : la personnalisation s'applique a tous les themes sans rebuild
- **Preview live** des themes avant activation (desktop, tablette, mobile)
- **Images du theme** : hero, about, galerie configurables dans l'admin (slots gallery, logo, testimonial)
- **Cookie consent** : bandeau de consentement cookies (Stimulus controller)

### Administration

- **Dashboard** avec KPI (visites jour/mois, articles publies, pages, commentaires), graphique des visites 30 jours (Chart.js) avec courbe robots separee, derniers articles et commentaires, actions rapides
- **Stats admin** : suivi des pages vues (filtrage automatique bots et admins, IP hashee RGPD), tableau des pages les plus vues avec filtres periode/annee, compteur de vues sur chaque article
- **Tips contextuels** rotatifs sur le dashboard (15 astuces qui tournent a chaque visite)
- **Aide contextuelle** : bouton `?` sur chaque section de l'admin avec panneau lateral d'aide
- **Page Guide** complete (`/admin/guide`) avec 8 sections en accordeon
- **Menu organise** : Contenu | Modules | Communaute | Reglages | Aide
- **Gestionnaire de navigation** drag & drop pour header, footer nav, footer legal

### Formulaire de contact

- **4 couches de securite** : CSRF, honeypot (champ piege invisible), rate limiting (3/min par IP), reCAPTCHA v3 (optionnel)
- **Validation** server-side complete (NotBlank, Email, longueur min/max)
- **Sanitization** HTML sur tous les champs
- **Envoi** via Brevo SMTP avec reply-to vers l'expediteur

### Securite

- **Roles et permissions** : `ROLE_USER` < `ROLE_AUTHOR` < `ROLE_ADMIN` < `ROLE_FREELANCE` < `ROLE_SUPER_ADMIN`
- **`#[IsGranted]`** explicite sur chaque CrudController (defense en profondeur)
- **Verification email** obligatoire a l'inscription (token-based, comptes admin CLI exempts)
- **Reset password** securise par token (ResetPasswordBundle)
- **Protection IDOR** : ownership check sur les profils utilisateur
- **Sanitization XSS** : HtmlSanitizer via Doctrine listener sur les contenus
- **CSRF** active globalement
- **Mot de passe** : minimum 12 caracteres, hash auto
- **Login throttling** : 5 tentatives/minute
- **Headers securite** Nginx : X-Content-Type-Options, X-Frame-Options, X-XSS-Protection, Referrer-Policy

### Notifications

- **Email aux abonnes** a la publication d'un article (via Brevo)
- **Email evenements** : notifications pour les nouveaux evenements (`EventNotificationService`)
- **Formulaire de contact** envoie au email configure dans l'identite du site
- **Mailpit** en dev pour capturer tous les emails sans les envoyer

### Recherche

- **Barre de recherche** avec dropdown AJAX temps reel (articles, pages, categories)
- **Page resultats** dediee (`/recherche`) avec pagination, highlighting des termes, badges par type de contenu
- **Progressive enhancement** : fonctionne sans JavaScript (formulaire HTML classique)

### Images responsives

- **3 tailles WebP** generees automatiquement a l'upload (480px, 800px, 1200px)
- **srcset/sizes** automatique dans les templates et l'editeur TipTap
- **lazy-loading** natif sur toutes les images

---

## Stack technique

| Composant | Technologie |
|-----------|-------------|
| Backend | PHP 8.4 / Symfony 7.4 LTS |
| ORM | Doctrine ORM 3.3 + Migrations |
| Admin | EasyAdmin Bundle 4.12 |
| Editeur | TipTap (ProseMirror) |
| Frontend | Webpack Encore + Bootstrap 5.3 + Stimulus |
| Templates | Twig 3 |
| Base de donnees | MariaDB 11 |
| Infra | Docker (PHP-FPM 8.4 + Nginx + MariaDB 11 + Mailpit) |
| Mailer | Brevo (symfony/brevo-mailer) |
| Paiement | Stripe (optionnel, module e-commerce) |
| Graphiques | Chart.js (dashboard admin) |
| Anti-spam | reCAPTCHA v3 (optionnel) |

---

## Roles utilisateurs

| Role | Qui | Acces |
|------|-----|-------|
| **Utilisateur** | Visiteur inscrit | Lecture, commentaires, profil, annuaire |
| **Auteur** | Redacteur | Articles, pages, medias (creation/edition) |
| **Admin** | Admin client | Gestion complete du site (users, menus, categories, tags, config) |
| **Freelance** | Revendeur | Themes, couleurs, polices + tout ce que fait Admin |
| **Super Admin** | David | Modules, infra, acces total |

---

## Installation

Voir **[SETUP.md](SETUP.md)** pour le process complet.

```bash
git clone git@github.com:laigneletdavid/blog_web.git client-x && cd client-x
cp .env.local.example .env.local   # Editer APP_SECRET, DATABASE_URL, MAILER_DSN
make up && make db && make assets
docker compose exec php php bin/console app:client:setup
docker compose exec php php bin/console app:module:enable blog
docker compose exec php php bin/console app:recaptcha:setup
```

---

## Commandes disponibles

| Commande | Description |
|----------|-------------|
| `app:client:setup` | Installation complete (site + admin + pages legales + menus) — idempotente |
| `app:init-site` | Initialise la configuration du site |
| `app:module:enable <module>` | Active un module |
| `app:module:disable <module>` | Desactive un module |
| `app:recaptcha:setup` | Configure reCAPTCHA v3 |
| `app:menu:sync` | Resynchronise les menus systeme |
| `app:create-super-admin` | Cree un compte super administrateur |
| `app:legal-pages:update` | Met a jour les pages legales (mentions, confidentialite, CGV) |
| `app:media:regenerate-sizes` | Regenere les tailles WebP des medias existants |

---

## Architecture

```
blog_web/
├── docker/                    # Docker config (PHP, Nginx) — multi-stage dev/prod
├── assets/                    # JS/SCSS (Webpack Encore)
│   ├── admin/                 # TipTap editor, dashboard Chart.js, menu manager
│   ├── controllers/           # Stimulus (search, cart, cookie consent, product gallery, TOC...)
│   └── css/base/              # Styles front (variables, blocks, composants, home)
├── src/
│   ├── Controller/            # 25 controllers front + 24 CrudControllers admin (EasyAdmin)
│   ├── Entity/                # ~20 entites Doctrine (Article, Page, Site, Product, Order, Event...)
│   ├── Enum/                  # Module, Role, Visibility, OrderStatus, PaymentMethod, MenuLocation
│   ├── Service/               # SiteContext, ThemeService, SEO, AdminStats, BlockRenderer, Widget, Cart, Stripe, DocumentService...
│   ├── Security/              # Authenticator, ContentVoter, CheckVerifiedUserSubscriber
│   ├── Twig/                  # AppExtension (menus, TOC, reading time), ResponsiveImageExtension
│   └── Command/               # CLI (client:setup, create:super-admin, modules, legal-pages, media...)
├── templates/
│   ├── themes/                # 6 themes (default, corporate, artisan, vitrine, starter, moderne)
│   ├── home/                  # Home generique + contact
│   ├── admin/                 # Dashboard, guide, aide contextuelle
│   ├── widgets/               # Sidebar widgets (categories, archives, tags, evenements)
│   └── ...                    # Templates front (articles, pages, recherche, FAQ, portfolio...)
├── migrations/                # Migrations Doctrine
├── scripts/                   # deploy.sh, backup.sh
├── docker-compose.yml         # Config dev (PHP-FPM + Nginx + MariaDB + Mailpit)
├── docker-compose.prod.yml    # Override prod (port 80, healthchecks, limites ressources)
├── Makefile                   # Raccourcis (up, down, db, migrate, assets, deploy...)
├── SETUP.md                   # Process d'installation client
└── README.md                  # Ce fichier
```
