Ajoutez une section blog et actualités complète à votre site LaraClassifier / JobClass. Créez des articles avec des catégories, des étiquettes, des images à la une et un système de commentaires imbriqués avec modération : le tout entièrement traduisible.

Éditeur d'articles complet

Créez des articles avec des titres, slugs, contenus, extraits et métadonnées SEO traduisibles. Associez des images à la une via la médiathèque.

Catégories & Étiquettes

Organisez le contenu avec des catégories hiérarchiques (via la table unifiée des catégories) et un système d'étiquettes flexible.

Commentaires imbriqués

Réponses aux commentaires imbriquées avec profondeur configurable, file de modération, règles d'approbation automatique et prise en charge du CAPTCHA.

Publication en direct & Auto-modération

Les commentaires, réponses, modifications et suppressions sont envoyés sans recharger la page. Les auteurs connectés peuvent modifier et supprimer leurs propres commentaires.

Multilingue

Tous les articles, catégories et étiquettes prennent en charge les traductions via Spatie Translatable. URLs front-end localisées avec préfixe de langue.

Notifications par e-mail

Les administrateurs sont notifiés des nouveaux commentaires. Les auteurs de commentaires sont notifiés lorsque quelqu'un répond à leur commentaire.

Temps de lecture & Vues

Calcul automatique du temps de lecture (mots par minute configurables) et suivi du nombre de vues pour chaque article.

Cas d'usage

Blog d'entreprise

Publiez les actualités de l'entreprise, les mises à jour produit et les analyses du secteur. Organisez les articles par catégorie (p. ex. “Mises à jour produit”, “Actualités du secteur”, “Tutoriels”) et laissez les visiteurs interagir via les commentaires.

Blog de portfolio

Complétez votre portfolio avec des articles sur les coulisses, des études de cas et des comptes rendus de projets. Étiquetez les articles avec les noms de projets ou technologies pertinents pour faciliter les renvois.

Hub de contenu multilingue

Publiez des articles en plusieurs langues (anglais, français, etc.) avec des slugs et du contenu par langue. Chaque article peut avoir des traductions totalement indépendantes gérées depuis le panneau d'administration.

Section actualités

Utilisez le blog comme section presse/actualités. Exploitez la date de “publication” pour la planification et le flux de travail “brouillon/publié” pour le contrôle éditorial.

Prérequis

  • LaraClassifier / JobClass v19.0.0 ou ultérieur
  • PHP 8.3+
  • MySQL 8.0+ (requis pour JSON_SEARCH dans les recherches de slugs traduisibles)
  • La table categories du cœur doit exister (les catégories du blog utilisent la table unifiée categories avec categorizable_type = 'post')
Remarque : L'add-on blog est autonome et ne dépend d'aucun autre add-on. Il s'intègre à la médiathèque du cœur pour la gestion des images à la une.

Installation

Étape 1 : Téléverser l'add-on

Dans le panneau d'administration, allez dans Admin → Extensions → Add-ons et cliquez sur le bouton Téléverser un add-on. Sélectionnez le fichier ZIP de l’add-on : le système l'extrait automatiquement et l'add-on apparaît dans la liste des add-ons installés.

Étape 2 : Activer l'add-on

Trouvez Blog & News dans la liste et cliquez sur Activer. Ses migrations, seeders (le cas échéant) et permissions sont configurés automatiquement.

Étape 3 : Configurer

Rendez-vous dans Admin → Blog → Paramètres pour configurer le nombre d'articles par page, la modération des commentaires, les notifications et les paramètres de temps de lecture. Voir Configuration.

Code d'achat (clé de licence)

Blog & News est vendu comme un produit séparé ; il possède donc son propre code d'achat (clé de licence) — distinct du code d'achat de l'application principale et de celui de chaque autre add-on. Il vous est demandé lorsque vous activez Blog & News dans Panneau d'administration → Add-ons.

Nos produits sont vendus sur trois plateformes. La façon dont vous recevez un code d'achat dépend de l'endroit où vous avez acheté le produit.

Plateforme / Fournisseur Comment obtenir le code d'achat Où le retrouver
Boutique bedigit.com
Achat sur le site (Boutique)
Généré automatiquement lorsque la commande est payée, puis envoyé par e-mail — soit dans un e-mail de licence dédié, soit dans l'e-mail de confirmation de commande. Mon compte → Mes licences sur bedigit.com
Gumroad Créé dès que Gumroad nous notifie la vente, puis envoyé dans un e-mail séparé, en plus du reçu Gumroad. L'e-mail de licence, votre Bibliothèque Gumroad et Mon compte → Mes licences sur bedigit.com
Envato Market
CodeCanyon
Délivré par Envato, et non par nous, et jamais envoyé par e-mail : vous le téléchargez vous-même depuis votre compte Envato. Compte Envato → DownloadsLicense certificate & purchase code
Vérifiez votre dossier spam. Pour les achats sur la Boutique bedigit.com comme sur Gumroad, le code d'achat est livré par e-mail. Les e-mails de licence automatisés sont très souvent filtrés : si le message n'est pas dans votre boîte de réception, regardez dans votre dossier spam / courrier indésirable avant de contacter le support, et ajoutez notre adresse d'expéditeur à vos contacts ou à votre liste d'autorisation.

1. Boutique bedigit.com (achat sur le site)

  • Dès que le statut de paiement de la commande passe à Payée, une clé de licence est générée automatiquement pour chaque produit sous licence de la commande (une clé par unité achetée — acheter 3 unités donne 3 clés distinctes).
  • Elle est envoyée par e-mail à l'adresse utilisée pour la commande, soit dans un e-mail de licence dédié, soit dans l'e-mail de confirmation de commande. Vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
  • La clé reste disponible dans votre compte sous Mon compte → Mes licences. Les clés sont masquées dans la liste ; ouvrez la page de détail de la licence pour révéler et copier la clé complète, voir les domaines sur lesquels elle est activée, et désactiver un domaine pour libérer un emplacement d'activation.
  • La facture correspondante se trouve sous Mon compte → Mes commandes.

2. Gumroad

  • Un achat Gumroad produit deux e-mails distincts : le reçu Gumroad (envoyé par Gumroad, donnant accès aux fichiers) et un e-mail de clé de licence (envoyé par bedigit.com) qui contient votre code d'achat.
  • L'e-mail de clé de licence est généré dès que Gumroad nous notifie la vente ; il arrive donc normalement dans les secondes qui suivent le paiement. Ici aussi, vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
  • Lorsque le produit Gumroad utilise la fonctionnalité de clés de licence propre à Gumroad, la même clé apparaît aussi dans votre reçu Gumroad et sous Bibliothèque → votre achat sur gumroad.com.
  • Utilisez la même adresse e-mail sur bedigit.com que sur Gumroad : vos clés sont alors liées automatiquement à votre compte et listées sous Mon compte → Mes licences, même si vous vous inscrivez après l'achat. Vous pouvez aussi ajouter une clé Gumroad manuellement depuis Mon compte → Mes licences Gumroad.

3. Envato Market (CodeCanyon)

  • Les codes d'achat Envato sont délivrés et fournis par Envato Market, jamais envoyés par e-mail par nos soins — il n'y a donc rien à chercher dans votre dossier spam : vous récupérez le code depuis votre compte Envato.
  • Connectez-vous à votre compte Envato / CodeCanyon, ouvrez la page Downloads, trouvez le produit, puis choisissez License certificate & purchase code dans le menu déroulant Download. Le code est inscrit dans ce certificat.
  • Un code d'achat Envato ressemble à 12345678-90ab-cdef-1234-567890abcdef (8-4-4-4-12 caractères). Il ne change jamais, et le renouvellement du support du produit n'en délivre pas de nouveau.
  • Article officiel Envato : Where Is My Purchase Code?
Vous avez perdu votre code d'achat ? Recherchez dans votre boîte mail (dossier spam inclus) “licence” ou “code d'achat”, puis consultez Mon compte → Mes licences sur bedigit.com pour les achats Boutique et Gumroad, ou Downloads → License certificate sur Envato. S'il est toujours introuvable, ouvrez un ticket sur notre Centre d'aide avec votre numéro de commande (Boutique), l'identifiant de vente Gumroad ou l'e-mail de l'acheteur (Gumroad), ou votre nom d'utilisateur Envato et le nom du produit (Envato).

Configuration

L'add-on blog est livré avec un fichier de configuration config/blog.php qui définit les valeurs par défaut. Tous les paramètres peuvent être remplacés depuis le panneau d'administration (stockés dans la table settings, groupe blog).

Paramètre Description Valeur par défaut
blog_posts_per_page Nombre d'articles affichés par page sur la liste du blog. 10
blog_related_posts_count Nombre d'articles similaires affichés en bas de chaque page de détail d'article. 3
blog_words_per_minute Vitesse de lecture moyenne utilisée pour calculer l'estimation “X min de lecture”. 200
blog_home_shows_listing Sert la simple liste des articles sur /blog au lieu de l'accueil magazine. /blog/posts redirige alors vers /blog. false
blog_home_hero_enabled Affiche la bannière héro en haut de la page d'accueil du blog. Le reste du héro est stocké dans les autres paramètres blog_home_hero_* (titre, sous-titre, bouton, hauteur, alignement, couleurs de fond et de texte). false
blog_home_trending_enabled Fait défiler les titres les plus lus sur une ligne sous l'en-tête de la page d'accueil du blog. true
blog_home_trending_limit Nombre de titres affichés dans la barre des tendances (1–12). 5
blog_home_sections Les sections de la page d'accueil, au format JSON : une entrée par section avec son type de contenu, sa mise en page, son nombre d'articles, son titre / sous-titre par langue, et les identifiants de catégorie, d'étiquette ou d'articles qu'elle cible. À la une (article principal) + Derniers articles (grille) + Les plus lus (projecteur)
blog_comments_enabled Active ou désactive le système de commentaires globalement. true
blog_comments_require_approval Lorsque activé, les commentaires des invités doivent être approuvés par un administrateur avant d'apparaître. Les commentaires des utilisateurs authentifiés sont approuvés automatiquement. true
blog_allow_guest_comments Autorise les visiteurs non connectés à laisser des commentaires (nom et e-mail requis). false
blog_comments_max_depth Niveau d'imbrication maximal pour les réponses aux commentaires (1–5). 2
blog_auto_approve_trusted_commenters Approuve automatiquement les commentaires des utilisateurs ayant déjà un commentaire approuvé (correspondance par e-mail). false
blog_auto_approve_replies Approuve automatiquement les réponses à un commentaire existant, afin qu'une discussion continue sans qu'un modérateur approuve chaque réponse. Les commentaires de premier niveau suivent toujours les règles de modération normales. false
blog_notify_admin_on_comment Envoie des notifications par e-mail à tous les administrateurs lorsqu'un nouveau commentaire ou une réponse est publié. true
blog_notify_author_on_reply Envoie des notifications par e-mail aux auteurs de commentaires lorsque quelqu'un répond à leur commentaire. true
blog_page_header_mode Style d'en-tête des pages front du blog : simple (titre + fil d'Ariane) ou hero (un bandeau avec son propre fond). Le reste de l'en-tête est stocké dans les autres paramètres blog_page_header_* (interrupteurs de visibilité, hauteur, alignement, couleurs de fond et de texte). simple
blog_page_header_show_header Affiche ou non l'en-tête de page. blog_page_header_show_title, _show_subtitle et _show_breadcrumb activent ses éléments individuellement. true
blog_page_header_show_subnav Affiche la barre de sous-navigation du blog (Blog / Tous les articles) sous l'en-tête de page. true
blog_captcha_enabled Exige une vérification CAPTCHA lors de la publication de commentaires (nécessite qu'un fournisseur CAPTCHA soit configuré dans les paramètres du cœur). false

Valeurs par défaut du fichier de configuration

Le fichier config/blog.php inclut aussi les dimensions des images à la une utilisées lors du traitement des téléversements :

Clé Description Valeur par défaut
featured_images.width Largeur de l'image à la une (px) 1200
featured_images.height Hauteur de l'image à la une (px) 630
featured_images.thumbnail_width Largeur de la miniature (px) 400
featured_images.thumbnail_height Hauteur de la miniature (px) 250

Administration : Articles

La page Articles (Blog → Tous les articles) est l'interface principale pour gérer le contenu du blog.

Liste des articles

Un tableau triable et paginé (20 par page) affichant :

  • Miniature de l'image à la une
  • Titre (traduisible)
  • Catégorie
  • Auteur
  • Statut (Brouillon / Publié)
  • Nombre de vues
  • Nombre de commentaires
  • Date de publication

Filtres & Recherche

La liste des articles prend en charge trois dimensions de filtrage :

  • Recherche : recherche dans les titres des articles (dans toutes les langues traduites via JSON_SEARCH)
  • Statut : filtre par draft ou published
  • Catégorie : filtre par une catégorie spécifique

Création & Modification d'articles

Le formulaire d'article comprend les champs suivants, chacun prenant en charge les traductions par langue :

Champs de contenu (par langue)

Champ Validation Notes
title Requis (langue par défaut), max 255 Traduisible. Utilisé pour générer automatiquement le slug.
slug Optionnel, max 255 Traduisible. Généré automatiquement à partir du titre s'il est laissé vide.
content Optionnel Traduisible. Contenu de l'éditeur WYSIWYG.
excerpt Optionnel, max 500 Traduisible. Court résumé pour les pages de liste.
meta_title Optionnel, max 70 Traduisible. Balise title SEO.
meta_description Optionnel, max 160 Traduisible. Méta-description SEO.

Champs non traduisibles

Champ Validation Notes
category_id Optionnel, doit exister dans categories Catégorie du blog (depuis la table unifiée des catégories)
featured_image Optionnel, fichier image Téléversé via le service de médias du cœur
status Requis, draft ou published Utilise l'enum PageStatus
published_at Optionnel, date Défini automatiquement à la date courante lors de la première publication si vide
tags Optionnel, tableau d'identifiants d'étiquettes Sélection multiple parmi les étiquettes existantes
Génération automatique du slug : Si le champ slug est laissé vide pour une langue, il est généré automatiquement à partir du titre avec Str::slug().

Administration : Catégories

Les catégories du blog (Blog → Catégories) utilisent la table unifiée categories du cœur, délimitée par categorizable_type = 'post'. Elles partagent donc la même structure de table que les catégories du portfolio et des autres add-ons, mais sont isolées via un scope global sur le modèle PostCategory.

Champs de catégorie

Champ Notes
name Traduisible. Requis pour la langue par défaut.
slug Traduisible. Généré automatiquement à partir du nom si vide.
description Traduisible. Optionnel.
parent_id Nullable. Prend en charge un niveau d'imbrication (parent → enfant).
position Entier pour l'ordre manuel.
is_active Booléen. Les catégories inactives sont masquées sur le front-end.
Protection à la suppression : Une catégorie ne peut pas être supprimée si elle contient des articles. Réassignez ou supprimez d'abord les articles.

Administration : Étiquettes

Les étiquettes (Blog → Étiquettes) sont des libellés légers pouvant être attachés à n'importe quel article. Contrairement aux catégories, les étiquettes sont plates (sans hiérarchie) et sont stockées dans la table blog_post_tags.

Champs d'étiquette

Champ Notes
name Traduisible. Le nom affiché de l'étiquette.
slug Traduisible. Identifiant adapté aux URLs.

La liste des étiquettes affiche chaque étiquette avec le nombre d'articles associés. Les étiquettes sont consultables par nom et paginées (20 par page).

Remarque : Lorsqu'une étiquette est supprimée, toutes les associations article-étiquette sont retirées (via detach()), mais les articles eux-mêmes ne sont pas affectés.

Administration : Commentaires

La page Commentaires (Blog → Commentaires) fournit une interface de modération pour tous les commentaires du blog, tous articles confondus.

Liste des commentaires

Un tableau paginé (20 par page) affichant :

  • Auteur : nom de l'utilisateur (si authentifié) ou nom/e-mail de l'invité
  • Contenu : aperçu du texte du commentaire
  • Article : l'article de blog auquel le commentaire appartient
  • Statut : badge Approuvé / En attente
  • Date

Un badge indiquant le nombre de commentaires en attente est affiché dans l'en-tête pour repérer rapidement les éléments nécessitant votre attention.

Modération

Actions par commentaire :

  • Voir : consulter le contenu complet du commentaire, ses réponses et le contexte de l'article
  • Approuver (PATCH) : marque le commentaire comme approuvé
  • Supprimer : supprime définitivement le commentaire

Filtrer par statut

Utilisez le paramètre de requête status pour filtrer :

  • ?status=pending : n'affiche que les commentaires en attente (non approuvés)
  • ?status=approved : n'affiche que les commentaires approuvés

Actions groupées

Sélectionnez plusieurs commentaires à l'aide des cases à cocher et appliquez des actions groupées :

  • Approuver : approuve tous les commentaires sélectionnés en une fois
  • Supprimer : supprime tous les commentaires sélectionnés

Les actions groupées sont envoyées en POST admin/blog/comments/bulk avec action et les ids séparés par des virgules.

Les commentaires supprimés par leur auteur sont placés dans la corbeille comme tout autre commentaire supprimé, avec les réponses qui ont été retirées avec eux. Vous pouvez les consulter ou les restaurer depuis Blog → Commentaires → Corbeille.

Administration : Paramètres

La page des paramètres (Blog → Paramètres) est organisée en six sections :

Affichage des articles

  • Articles par page : nombre d'articles sur la page de liste (1–100)
  • Articles similaires : nombre d'articles similaires affichés sur les pages de détail d'article (0–12)
  • Mots par minute : vitesse de lecture pour le calcul du temps de lecture (100–500)

Page d'accueil

L'onglet s'ouvre sur Mise en page de la page d'accueil, qui détermine ce que sert /blog :

  • Accueil magazine (par défaut) : la page d'accueil construite à partir des cartes ci-dessous. La liste des articles reste sur /blog/posts.
  • Liste des articles : la simple liste paginée des articles. /blog/posts redirige alors vers /blog pour que les deux n'entrent jamais en concurrence pour le même contenu, la liste reprend le titre et le fil d'Ariane propres au blog, et la sous-navigation est retirée (il ne resterait qu'une seule entrée). Les cartes ci-dessous sont masquées mais conservent leurs valeurs ; revenir en arrière restaure l'accueil magazine tel qu'il était.

Les trois cartes restantes construisent la page d'accueil magazine :

  • Bannière héro : un bandeau optionnel au-dessus de la première section. Le titre, le sous-titre et le libellé du bouton sont définis par langue ; la hauteur, l'alignement du texte, le fond (couleur unie, dégradé ou image avec superposition) et les couleurs du titre / sous-titre / fil d'Ariane reprennent les contrôles de l'onglet En-tête de page. Laissez une couleur vide pour l'hériter du thème.
  • Barre des tendances : fait défiler les titres les plus lus sur une ligne sous l'en-tête, avec un nombre de titres configurable (1–12).
  • Sections de l'accueil : le constructeur de sections. Ajoutez, réordonnez, renommez par langue et désactivez des sections. Chaque section a une source de contenu et une mise en page :
    • Contenu : Articles à la une (les articles marqués dans l'éditeur d'article, complétés par les plus lus), Derniers articles, Les plus lus, D'une catégorie, D'une étiquette, ou Articles choisis à la main (sélectionnés un par un, affichés dans l'ordre de votre choix).
    • Mise en page : Article principal, Grille, Liste, Projecteur, Titres ou Carrousel.
    Une section qui ne renvoie aucun article est ignorée, de sorte que la page d'accueil n'affiche jamais de bandeau vide.

La liste complète des sections est stockée en JSON dans le paramètre blog_home_sections ; le héro et la barre des tendances utilisent les paramètres blog_home_hero_* et blog_home_trending_*.

Commentaires

  • Activer les commentaires : interrupteur global du système de commentaires
  • Approbation requise : si les commentaires des invités nécessitent l'approbation d'un administrateur (les utilisateurs authentifiés sont toujours approuvés automatiquement)
  • Commentaires des invités : autoriser les visiteurs non connectés à commenter
  • Profondeur des réponses : niveau d'imbrication maximal des réponses (1–5)
  • Approbation automatique des commentateurs de confiance : approuver automatiquement les commentaires des e-mails ayant déjà un commentaire approuvé
  • Approbation automatique des réponses : approuver automatiquement les réponses à un commentaire existant, sans attendre la modération. Utile pour maintenir le fil d'une discussion tout en modérant les commentaires de premier niveau

Notifications

  • Notification administrateur : envoyer un e-mail aux administrateurs lorsqu'un nouveau commentaire ou une réponse est publié
  • Notification de réponse : envoyer un e-mail aux auteurs de commentaires lorsque quelqu'un répond à leur commentaire

Protection CAPTCHA

  • Activer le CAPTCHA pour les commentaires : exiger une vérification CAPTCHA lors de la publication de commentaires

Nécessite qu'un fournisseur CAPTCHA soit configuré dans les paramètres du cœur. Si aucun fournisseur n'est configuré, un avertissement est affiché avec un lien vers la page de configuration.

En-tête de page

Le bandeau d'en-tête des pages front du blog — la liste des articles et les archives par catégorie, étiquette, auteur et recherche. Le héro de la page d'accueil conserve ses propres paramètres dans l'onglet Page d'accueil et y reste prioritaire ; tout ce qu'il laisse vide retombe sur cet onglet. La page d'article peint son propre bandeau à partir de l’image à la une de l'article et n'est pas affectée.

  • Style d'en-tête : Titre simple + fil d'Ariane (par défaut) conserve le fond propre au thème et ne reprend que l’alignement et les couleurs de texte ; En-tête héro peint un bandeau complet avec sa propre hauteur et son propre fond.
  • Visibilité : activer ou désactiver l'en-tête entier, son titre, son sous-titre, son fil d'Ariane et la barre de sous-navigation du blog.
  • Mise en page : hauteur de l'en-tête (toute longueur CSS) et alignement du contenu (gauche, centre, droite, ou la valeur par défaut du thème).
  • Fond (style héro uniquement) : valeur par défaut du thème, couleur unie, dégradé (deux couleurs et un angle) ou image avec une opacité de superposition. Une couleur unie et un dégradé peuvent aussi porter une image de superposition décorative.
  • Couleurs de texte : titre, sous-titre, texte du fil d'Ariane et lien du fil d'Ariane. Laissez une couleur vide pour l'hériter du thème.

Les valeurs sont stockées dans les paramètres blog_page_header_* et résolues par Addons\Blog\Support\PageHeader, qui retombe sur ses propres valeurs par défaut pour chaque clé jamais enregistrée.

Front-end : Accueil du blog

La page d'accueil du blog (/{locale}/blog) est une page de type magazine assemblée depuis l'onglet Blog → Paramètres → Page d'accueil. De haut en bas, elle affiche :

  • Bannière héro (optionnelle), peinte par l'en-tête de page propre à l'add-on
  • Sous-navigation : Blog et Tous les articles (masquée lorsque la liste est la page principale, ou lorsque Afficher la sous-navigation est désactivé dans l'onglet En-tête de page)
  • Barre des tendances (optionnelle) : les titres les plus lus sur une ligne défilante
  • Sections de contenu : dans l'ordre défini dans l'administration, chacune dans la mise en page choisie
  • Rail des thèmes : chaque catégorie ayant au moins un article, avec son nombre d'articles

Mises en page des sections

  • Article principal : un article dominant dont le bloc de titre déborde sur le bord inférieur de son image, à côté d'une pile d'articles secondaires
  • Grille : une grille de cartes régulière, trois par ligne sur ordinateur
  • Liste : des lignes pleine largeur, miniature à gauche, article à droite
  • Projecteur : un article ouvert à côté d'un panneau compact des autres
  • Titres : une liste de titres dense, sans image, sur jusqu'à trois colonnes
  • Carrousel : un rail horizontal de cartes avec des boutons de défilement

Les sections Les plus lus sont numérotées dans les mises en page Projecteur et Titres, car la position y porte une réelle information. Toutes les autres sources de contenu omettent les numéros.

Articles à la une

La source de contenu À la une lit l'interrupteur Article à la une de la carte Publication de l’éditeur d'article (blog_posts.is_featured), du plus récent au plus ancien. Si moins d'articles sont marqués que la section n'en demande, elle est complétée par les articles les plus vus.

Style

Chaque page front du blog charge une feuille de style partagée (blog::front.partials.styles), de sorte que la page d'accueil, les archives et la page d'article se lisent comme une seule publication. Elle dérive toutes ses couleurs des jetons Bootstrap du thème actif et hérite de la police de titres du thème plutôt que d’en déclarer une, afin que le blog suive le thème et son mode sombre.

Front-end : Liste du blog

La page de liste du blog (/blog/posts) affiche les articles publiés avec pagination.

Les pages de catégorie, d'étiquette, d'auteur et de recherche partagent cette même mise en page.

Contenu principal

  • Cartes d'articles : chacune affichant : miniature de l'image à la une, titre, extrait, badge de catégorie, nom de l'auteur, date de publication, temps de lecture et nombre de vues
  • Pagination : nombre d'articles par page configurable

Barre latérale

  • Catégories : liste des catégories actives avec le nombre d'articles
  • Articles récents : les 5 derniers articles publiés
  • Articles populaires : les 5 articles les plus vus
  • Étiquettes : toutes les étiquettes ayant au moins un article

Front-end : Détail d'un article

La page de détail d'un article (/{locale}/blog/{slug}) affiche le contenu complet de l'article.

Contenu

  • En-tête : titre, catégorie, auteur, date de publication, temps de lecture, nombre de vues
  • Image à la une : image héro pleine largeur (via la relation média polymorphe)
  • Corps du contenu : contenu HTML rendu
  • Étiquettes : badges d'étiquettes liés aux pages de filtrage par étiquette
  • Navigation entre articles : liens vers l'article précédent / suivant
  • Articles similaires : articles partageant la même catégorie ou les mêmes étiquettes (nombre configurable)
  • Section commentaires : commentaires imbriqués avec formulaire de réponse (voir Commentaires)

Suivi du nombre de vues

À chaque chargement de la page de détail d'un article, PostService::incrementViewCount() incrémente la colonne view_count. C'est ce qui alimente le widget “Articles populaires” de la barre latérale.

Algorithme des articles similaires

Les articles similaires sont sélectionnés par correspondance :

  1. Articles de la même catégorie
  2. Articles partageant l'une des mêmes étiquettes

Les résultats sont triés par date de publication (les plus récents en premier) et limités au nombre configuré.

Front-end : Pages de catégorie & d'étiquette

Page de catégorie

URL : /{locale}/blog/category/{slug}

Affiche tous les articles publiés dans la catégorie spécifiée avec la même pagination, les mêmes widgets de barre latérale et la même mise en page de cartes que la liste principale. La catégorie est résolue par son slug traduisible (langue courante d'abord, puis repli sur l'anglais).

Page d'étiquette

URL : /{locale}/blog/tag/{slug}

Affiche tous les articles publiés portant l'étiquette spécifiée. Même mise en page que la page de catégorie. L'étiquette est résolue par son slug traduisible.

Front-end : Recherche

URL : /{locale}/blog/search?q={query}

Recherche plein texte dans les titres et le contenu des articles, dans toutes les langues, via JSON_SEARCH de MySQL. Les résultats sont paginés et affichés avec la mise en page standard de la liste du blog.

Front-end : Commentaires

Le système de commentaires apparaît en bas de chaque page de détail d'article (lorsqu'il est activé).

Formulaire de commentaire

  • Utilisateurs authentifiés : n'ont qu'à saisir le contenu du commentaire. Approuvés automatiquement, sauf si des règles de modération s'appliquent.
  • Invités (si activé) : doivent fournir un nom, un e-mail et le contenu. Soumis à la modération par approbation.
  • Formulaire de réponse : apparaît sous un commentaire en cliquant sur “Répondre”, jusqu'à la profondeur maximale configurée. Un seul formulaire de réponse est partagé par toute la page et déplacé vers le commentaire auquel on répond.
  • Notifier en cas de réponse : case à cocher pour activer ou désactiver les notifications de réponse.
  • CAPTCHA : affiché lorsque le CAPTCHA est activé pour les commentaires du blog, et rafraîchi après chaque envoi.

Publication sans rechargement de page

Les commentaires, réponses, modifications et suppressions sont tous envoyés en arrière-plan : la page n'est jamais rechargée et le visiteur reste là où il était dans la discussion.

  • Pendant l'envoi d'une requête, le formulaire est estompé, ses boutons sont désactivés et le bouton d'envoi affiche un indicateur de chargement. Cela évite les doubles envois et rend l'attente visible.
  • En cas de succès, un commentaire approuvé est inséré directement dans la liste (une réponse se place sous son parent), le compteur de commentaires est mis à jour et un message de confirmation est affiché au-dessus du formulaire.
  • Si le commentaire doit encore être modéré, la confirmation l'indique et rien n'est ajouté à la liste : le commentaire apparaît une fois qu'un administrateur l'a approuvé.
  • Les erreurs de validation sont affichées sous le champ concerné, sans perdre ce qui a été saisi.
  • Si JavaScript n'est pas disponible, les formulaires reviennent à un envoi classique avec rechargement de la page : rien n'est perdu.

Modifier & Supprimer vos propres commentaires

Les visiteurs connectés disposent des actions Modifier et Supprimer sur les commentaires qu'ils ont écrits. Les deux fonctionnent en arrière-plan, comme la publication.

  • Modifier ouvre le texte du commentaire sur place. L'enregistrement remplace le texte immédiatement et marque le commentaire comme “Modifié” à côté de sa date.
  • La modification se ferme dès que quelqu'un répond. L'action Modifier disparaît dès que le commentaire a une réponse, afin que les réponses en dessous ne perdent pas le contexte pour lequel elles ont été écrites. Elle revient si toutes les réponses sont supprimées. Les réponses en attente comptent aussi, même si elles ne sont pas encore affichées.
  • Supprimer demande d'abord une confirmation, puis retire le commentaire ainsi que toutes ses réponses. Les commentaires supprimés sont conservés dans la corbeille plutôt que détruits, afin qu'un administrateur puisse encore les consulter.
  • Ces actions n'apparaissent jamais sur le commentaire de quelqu’un d'autre, et sont refusées par le serveur en plus d'être masquées dans la page. Elles ne sont pas disponibles sur les commentaires d'invités, qui ne portent aucune identité fiable.
  • Désactiver Activer les commentaires désactive aussi la modification et la suppression.

Affichage des commentaires

  • Les commentaires sont affichés sous forme imbriquée (parent → réponses).
  • Seuls les commentaires approuvés sont montrés aux visiteurs du front-end : une réponse en attente de modération reste masquée jusqu'à son approbation.
  • Chaque commentaire affiche : le nom d'affichage de l'auteur, la date, un marqueur “Modifié” si son auteur l'a changé, et le contenu.
  • Le compteur de commentaires à côté du titre de la section compte les commentaires et réponses approuvés.

Règles de validation

Champ Validation
content Requis, 3–2000 caractères
parent_id Optionnel, doit exister dans blog_comments ; vérification de profondeur appliquée
author_name Requis pour les invités, max 255
author_email Requis pour les invités, e-mail valide, max 255
notify_on_reply Booléen optionnel

Logique d'approbation automatique

  1. Si Approbation requise est désactivé → tous les commentaires sont approuvés automatiquement.
  2. Si le commentateur est authentifié → approuvé automatiquement.
  3. Si le commentaire est une réponse et que Approbation automatique des réponses est activé → approuvé automatiquement.
  4. Si Approbation automatique des commentateurs de confiance est activé et que l'e-mail a déjà un commentaire approuvé → approuvé automatiquement.
  5. Sinon → en attente (nécessite l'approbation d'un administrateur).

Prise en charge multilingue

L'add-on blog utilise spatie/laravel-translatable pour tous les champs de contenu. Les traductions sont stockées sous forme de colonnes JSON dans la base de données.

Champs traduisibles par modèle

Modèle Champs traduisibles
Post slug, title, content, excerpt, meta_title, meta_description
PostCategory slug, name, description
PostTag slug, name

Résolution des slugs

Les contrôleurs front-end résolvent les slugs en cherchant d'abord dans la langue courante, puis en se repliant sur l'anglais :

Images à la une

Les articles prennent en charge une seule image à la une via une relation polymorphe MorphOne vers le modèle Media du cœur (mediable). Le trait HasMedia est inclus dans le modèle Post.

Flux de téléversement

  1. L'administrateur téléverse un fichier image via le formulaire de création/modification d'article.
  2. Le PostService délègue à MediaService::uploadFor().
  3. L'image est stockée dans le sous-répertoire posts du disque de médias.
  4. Les miniatures sont générées selon les dimensions de la configuration (featured_images.thumbnail_width/height).

Suppression de l'image

Le formulaire de modification comprend une case à cocher “Supprimer l'image à la une”. Lorsqu'elle est cochée, l'enregistrement média existant et les fichiers sont supprimés via MediaService::delete(). Téléverser une nouvelle image remplace automatiquement l'ancienne.

Notifications par e-mail

L'add-on blog envoie deux types de notifications par e-mail :

Notification de nouveau commentaire

Envoyée à tous les administrateurs (is_admin = true) lorsqu'un nouveau commentaire ou une réponse est publié.

  • Objet : “Nouveau commentaire sur {titre de l'article}” ou “Nouvelle réponse sur {titre de l'article}”
  • Corps : Nom de l'auteur, titre de l'article, aperçu du contenu (200 caractères)
  • Action : Lien “Modérer les commentaires” (si en attente) ou lien “Voir le commentaire” (si approuvé)

Contrôlée par : le paramètre blog_notify_admin_on_comment.

Notification de réponse à un commentaire

Envoyée à l'auteur du commentaire parent lorsque quelqu’un répond à son commentaire.

  • Objet : “Nouvelle réponse à votre commentaire sur {titre de l'article}”
  • Corps : Nom de l'auteur de la réponse, titre de l'article, aperçu du contenu
  • Action : Lien “Voir la réponse”

Contrôlée par : le paramètre blog_notify_author_on_reply.

Les notifications de réponse respectent la préférence notify_on_reply du commentateur et ne sont pas envoyées lorsque quelqu’un répond à son propre commentaire.

Protection CAPTCHA

Lorsque blog_captcha_enabled est défini sur true, le formulaire de commentaire inclut un défi CAPTCHA. L'add-on blog s'intègre au CaptchaService du cœur :

  • Le service vérifie si le CAPTCHA est activé pour le contexte blog.
  • Le nom du champ CAPTCHA approprié est résolu via CaptchaService::getResponseFieldName().
  • La validation utilise la classe CaptchaRule du cœur.

Un fournisseur CAPTCHA (p. ex. reCAPTCHA, hCaptcha) doit être configuré dans les paramètres du cœur pour que cette fonctionnalité fonctionne.

Mise à jour

Il existe deux façons de mettre à jour cet add-on : via le panneau d'administration (recommandé) ou en remplaçant manuellement les fichiers.

Méthode 1 : Téléversement via le panneau d'administration (recommandé)

  1. Téléchargez le dernier fichier .zip de cet add-on.
  2. Allez dans Panneau d'administrationAdd-ons et cliquez sur le bouton Téléverser.
  3. Sélectionnez ou glissez le fichier .zip dans la zone de téléversement.
  4. Une demande de confirmation affichera les numéros de version actuelle et nouvelle. Cliquez sur Remplacer pour continuer.
  5. Allez dans Panneau d'administrationMise à jour du système (/admin/update) pour appliquer les migrations de base de données en attente.

Méthode 2 : Remplacement manuel des fichiers

Étape 1 : Remplacer les fichiers

Remplacez le répertoire de l'add-on par la nouvelle version.

Étape 2 : Exécuter les migrations

Étape 3 : Vider les caches

Étape 4 : Reconstruire les assets

Nécessaire uniquement si la mise à jour inclut des fichiers SCSS/JS de thème nouveaux ou modifiés.

Étape 5 : Vérifier

Visitez Blog → Paramètres pour confirmer que la page des paramètres se charge correctement, puis vérifiez la page de liste du blog sur le front-end.

Sauvegardez d'abord : Sauvegardez toujours votre base de données avant d'exécuter des migrations sur un système en production.

Dépannage

Les pages du blog renvoient une erreur 404

  • Assurez-vous que l'add-on Blog est activé dans Admin → Add-ons.
  • Exécutez php artisan route:clear pour vider le cache des routes.
  • Vérifiez que le BlogServiceProvider est bien enregistré (consultez l'autoloader d'AddonServiceProvider).

Un article affiche “Introuvable” alors qu'il est publié

  • Vérifiez que le statut de l'article est published (et non draft).
  • Assurez-vous que published_at est défini et dans le passé (les articles datés dans le futur ne sont pas visibles).
  • Vérifiez que le slug correspond à l'URL : les slugs sont propres à chaque langue. Le système essaie d'abord la langue courante, puis l'anglais.

La page de catégorie renvoie une erreur 404

  • Assurez-vous que la catégorie est active (is_active = true).
  • Vérifiez que le categorizable_type de la catégorie est post.
  • Vérifiez que le slug de l’URL correspond au slug traduisible de la catégorie pour la langue courante.

Les commentaires n'apparaissent pas sur les articles

  • Vérifiez que blog_comments_enabled est défini sur true dans les paramètres.
  • Si la modération est utilisée, les commentaires doivent d'abord être approuvés. Consultez la page des commentaires de l'administration pour les éléments en attente.
  • Les commentaires des invités nécessitent que blog_allow_guest_comments soit activé.

L'action “Modifier” est absente sur mon propre commentaire

  • Un commentaire ne peut plus être modifié une fois que quelqu'un y a répondu. Supprimez les réponses (ou demandez à un administrateur de le faire) et l'action Modifier revient.
  • Une réponse en attente de modération verrouille aussi la modification, même si elle n'est pas encore affichée. Consultez Blog → Commentaires filtré sur ?status=pending.
  • La modification et la suppression ne sont proposées qu'aux auteurs connectés. Les commentaires publiés en tant qu'invité ne peuvent pas être modifiés, car il n'existe aucun moyen fiable de prouver qui les a écrits.
  • Les deux actions sont masquées lorsque Activer les commentaires est désactivé.

Une réponse a été publiée mais n'apparaît pas

  • Si Approbation requise est activé et que la réponse vient d'un invité, elle est en attente : seules les réponses approuvées sont affichées. Approuvez-la depuis Blog → Commentaires.
  • Pour laisser passer les réponses sans modérer chacune d'elles, activez Approbation automatique des réponses dans Blog → Paramètres.

Publier un commentaire recharge toute la page

  • C'est le comportement de repli utilisé lorsque le JavaScript de la page ne s’est pas exécuté. Le commentaire est tout de même enregistré correctement : seul le comportement sans rechargement est perdu.
  • Vérifiez la console du navigateur à la recherche d'une erreur de script sur la page de l'article, et assurez-vous que les assets du thème sont construits et chargés.

Le formulaire de commentaire ne s'affiche pas pour les invités

  • Activez blog_allow_guest_comments dans Blog → Paramètres.
  • Le StoreCommentRequest vérifie l'autorisation : si les commentaires des invités sont désactivés, l'envoi du formulaire renvoie une erreur 403.

Le CAPTCHA n'apparaît pas sur le formulaire de commentaire

  • Assurez-vous que blog_captcha_enabled est défini sur true dans les paramètres du blog.
  • Un fournisseur CAPTCHA doit être configuré dans Admin → Paramètres → CAPTCHA.
  • La vérification CaptchaService::isEnabledFor('blog') doit renvoyer true.

Les notifications par e-mail ne sont pas envoyées

  • Vérifiez que la messagerie est correctement configurée dans Admin → Paramètres → Mail.
  • Vérifiez que les interrupteurs de notification sont activés : blog_notify_admin_on_comment et/ou blog_notify_author_on_reply.
  • Les notifications de réponse nécessitent que l'auteur du commentaire parent ait notify_on_reply = true.
  • Les réponses à soi-même ne déclenchent pas de notification (par conception).

Impossible de supprimer une catégorie : “Impossible de supprimer une catégorie contenant des articles”

L'add-on empêche la suppression des catégories auxquelles des articles sont assignés. Réassignez les articles à une autre catégorie ou supprimez-les d'abord.

L'image à la une ne s'affiche pas

  • Vérifiez que le fichier média a bien été téléversé (cherchez dans la table media un mediable_type correspondant à l'article).
  • Vérifiez que le lien symbolique du stockage existe : php artisan storage:link.
  • Vérifiez les permissions de fichiers sur le répertoire de stockage.

La recherche ne renvoie aucun résultat malgré des articles correspondants

  • La recherche utilise JSON_SEARCH de MySQL, qui nécessite MySQL 8.0+.
  • La recherche fonctionne par motif (contient), donc les correspondances partielles devraient fonctionner.
  • Seuls les articles publiés (avec published_at dans le passé) sont inclus dans les résultats de recherche.

Le temps de lecture affiche “1 min” pour tous les articles

  • Assurez-vous que l'article a du contenu (le temps de lecture est calculé à partir de strip_tags(content)).
  • Vérifiez le paramètre blog_words_per_minute : la valeur par défaut est de 200 mots par minute.
  • Les articles très courts afficheront toujours 1 minute (le minimum).

Blog & News v1.0.1 : Un add-on LaraClassifier / JobClass.

© BeDigit. Tous droits réservés.

Cet article vous a-t-il été utile ?

Merci pour votre retour !

Besoin d'aide ? Créez un ticket de support

Créer un Ticket