# 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).
- **Landing pages** — Pages d'atterrissage sans navigation (module Marketing). Layout epure (mini-header logo, footer minimal), hero plein ecran avec image de fond, CTA configurable (lien RDV externe ou formulaire integre), capture UTM automatique (source, medium, campagne), noindex par defaut, formulaire allege (nom, email, activite) avec anti-spam (reCAPTCHA + honeypot), conversions tracees dans les stats. Action "Copier l'URL" dans l'admin pour partage rapide.
- **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), dimensions width/height stockees en base (anti-CLS), texte alternatif contextuel automatique (nom media + titre SEO de l'entite).
- **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 |
| **Marketing** | Landing pages (conversion sans navigation), stats avancees |

### 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, avec `og:image:width`, `og:image:height`, `og:image:alt` et `twitter:site`
- **Image Open Graph dediee** configurable dans l'identite du site (1200x630). Fallback : `ogImage > heroImage > logo`
- **Schema.org JSON-LD** : Organization/LocalBusiness dynamique (site-wide, @type configurable, contactPoint, sameAs, openingHours, priceRange), Article, Product (avec Offer/availability), Event (dates/location), Service, LocalBusiness (annuaire), CreativeWork (portfolio), FAQPage, BreadcrumbList (tous les templates show)
- **Fiche entreprise Google** : type d'activite, gamme de prix, horaires d'ouverture — injectes dans le JSON-LD Organization
- **Reseaux sociaux** : liens Facebook, Instagram, LinkedIn, Twitter/X injectes dans `sameAs` du schema.org
- **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
- **Feux tricolores SEO** : score visuel sur chaque entite dans l'admin (titre, description, contenu, headings, image, slug) avec panneau de detail
- **Auto-noindex** : pages vides ou thin automatiquement exclues des moteurs
- **Redirections 301** : redirection automatique au changement de slug (chaine de resolution)
- **Commande crawl simulation** (`app:seo:crawl-simulation`) : audit de toutes les entites indexables
- **Images WebP** + **lazy-loading** natif + **dimensions width/height** natives pour la performance (anti-CLS)

### 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 sections en accordeon (dont landing pages conditionnelle au module Marketing)
- **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
```
