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. Donnez à chaque article une image à la une.

Catégories & Étiquettes

Organisez le contenu avec des catégories imbriquables 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+
  • Le serveur de base de données pris en charge par LaraClassifier / JobClass (les champs traduisibles sont stockés dans des colonnes JSON)
Remarque : L'add-on blog est autonome et ne dépend d'aucun autre add-on. Il crée ses propres tables (blog_posts, blog_categories, blog_post_tags, blog_post_tag et blog_comments) et enregistre les images à la une via le pipeline d'images du cœur.

Installation

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

Allez dans Panneau d'administration → Extensions → Add-ons, cliquez sur Téléverser un add-on et déposez le fichier .zip de l'add-on dans la zone de téléversement (50 Mo maximum). L'archive est extraite dans extensions/addons/blog/ et Blog & News apparaît dans la liste, désactivé.

Impossible de téléverser depuis le navigateur ? Décompressez l'archive sur votre ordinateur et copiez le dossier de l'add-on dans extensions/addons/blog/ par FTP ou SSH : son fichier addon.json doit se trouver directement dans ce dossier. Ouvrez ensuite Panneau d'administration → Extensions → Add-ons. La page analyse extensions/addons/ à chaque chargement : l'add-on est donc listé immédiatement (le bouton Synchroniser lance la même analyse à la demande).

Étape 2 : Activer l'add-on

Cliquez sur Activer sur la carte Blog & News. C'est un add-on payant : une fenêtre demande son code d'achat, qui est vérifié avant toute autre opération. Un code invalide est refusé dans la fenêtre et rien n'est modifié.

Une fois le code accepté, l'activation se fait en une seule passe : elle crée les tables de base de données de l'add-on (ses migrations), enregistre ses permissions, exécute ses seeders et publie ses assets publics. Rechargez la page pour voir sa nouvelle entrée dans la section Add-ons de la barre latérale d'administration.

Étape 3 : Configurer

Ouvrez Panneau d'administration → Blog depuis la section Add-ons de la barre latérale et configurez l'add-on : 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 → Extensions → 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 / Marketplace 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 → Downloads → License 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

Toutes les options se règlent dans Panneau d'administration → Blog → Paramètres (section Add-ons de la barre latérale). Les valeurs sont enregistrées dans la table settings sous les clés ci-dessous. Une clé jamais enregistrée reprend la valeur par défaut indiquée ici, issue du fichier config/blog.php de l'add-on ou de son code.

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” (100–500). 200
blog_show_post_author Affiche l'auteur sur la page de l'article. true
blog_show_post_date Affiche la date de publication sur la page de l'article. true
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 connectés sont toujours 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_comments_per_page Nombre de commentaires de premier niveau affichés par page sur un article (5–100). 10
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_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 et de réponses. Il utilise le CAPTCHA du site choisi dans Panneau d'administration → Configuration → Paramètres → Sécurité, et l'interrupteur reste verrouillé tant qu'aucun n'y est sélectionné. true

Valeurs par défaut du fichier de configuration

Modifiez ces options depuis la page des paramètres plutôt qu'en éditant config/blog.php : une valeur enregistrée dans le panneau d'administration est toujours prioritaire, et le fichier est remplacé à chaque mise à jour de l'add-on.

Les notifications par e-mail n'ont pas d'interrupteur sur cette page. Les deux e-mails du blog (nouveau commentaire, réponse à un commentaire) sont déclarés comme types de notifications et s'activent ou se désactivent dans Panneau d'administration → Configuration → Paramètres → Notifications, onglet Types de notifications. Voir Notifications par e-mail.

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 et les slugs des articles (dans la langue courante de l'administration et dans la langue de repli)
  • 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 Une catégorie du blog (depuis Blog → Catégories)
featured_image Optionnel, JPG, PNG, GIF ou WebP, 5 Mo maximum Enregistrée via le pipeline d'images du cœur
status Requis, draft ou published Utilise l'enum PostStatus
published_at Optionnel, date Défini automatiquement à la date courante lors de la première publication si vide
is_featured Optionnel, booléen Marque l'article pour les sections Articles en vedette de l'accueil du blog
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) sont stockées dans la table blog_categories propre à l'add-on, distincte des catégories d'annonces de LaraClassifier / JobClass.

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 (Panneau d'administration → Blog → Paramètres) s'ouvre sur l'adresse publique du blog et est organisée en cinq onglets :

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, 0 les désactive)
  • Mots par minute : vitesse de lecture pour le calcul du temps de lecture (100–500)
  • Afficher l'auteur : afficher l'auteur sur la page de l'article
  • Afficher la date : afficher la date de publication sur la page de l'article

Une note en bas de l'onglet rappelle que les e-mails de commentaires partent avec les réglages e-mail du site.

Page d'accueil

L'onglet s'ouvre sur Disposition 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 hero : 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 en vedette (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'un tag, ou Articles choisis (sélectionnés un par un, affichés dans l'ordre de votre choix).
    • Mise en page : Article à la une, Grille, Liste, Pleins feux, 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 anonymes : autoriser les visiteurs non connectés à commenter
  • Profondeur des réponses : niveau d'imbrication maximal des réponses (1–5)
  • Commentaires par page : nombre de commentaires de premier niveau par page sur un article (5–100)
  • Approbation auto. des fidèles : approuver automatiquement les commentaires des e-mails ayant déjà un commentaire approuvé
  • Approuver automatiquement les 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

Protection CAPTCHA

  • Activer le CAPTCHA pour les commentaires : exiger une vérification CAPTCHA lors de la publication de commentaires ou de réponses (activé par défaut)

Les commentaires réutilisent le CAPTCHA du site choisi dans Panneau d'administration → Configuration → Paramètres → Sécurité (Simple Captcha ou Google reCAPTCHA), le même que celui des formulaires de connexion et de contact. L'onglet affiche le fournisseur actuel ; si aucun n'est sélectionné, l'interrupteur est verrouillé et un avertissement renvoie aux paramètres de sécurité.

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 dans le titre, le contenu et l'extrait des articles publiés, dans la langue courante. 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

Chaque article possède une seule image à la une, dont le chemin est enregistré dans la colonne image_path de blog_posts.

Flux de téléversement

  1. L'administrateur téléverse un fichier image (JPG, PNG, GIF ou WebP, 5 Mo maximum) via le formulaire de création/modification d'article.
  2. Le PostService le transmet au pipeline d'images du cœur, qui l'enregistre sous app/blog.
  3. Ce même pipeline génère les versions redimensionnées utilisées sur le front-end.

Suppression de l'image

Le formulaire de modification comprend une case à cocher “Supprimer l'image à la une”. Lorsqu'elle est cochée, les fichiers de l'image sont supprimés et l'article n'a plus d'image. 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 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 type de notification blog_new_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 type de notification blog_comment_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.

Les deux types de notifications s'activent ou se désactivent dans Panneau d'administration → Configuration → Paramètres → Notifications, onglet Types de notifications (tous deux activés par défaut). Les e-mails partent avec les réglages e-mail du site.

Protection CAPTCHA

Lorsque blog_captcha_enabled est activé (valeur par défaut), les formulaires de commentaire et de réponse incluent le défi CAPTCHA du site, et l'envoi est validé comme pour les formulaires du cœur.

Le fournisseur CAPTCHA lui-même (Simple Captcha dans l'un de ses styles, ou Google reCAPTCHA) se choisit dans Panneau d'administration → Configuration → Paramètres → Sécurité. Tant qu'aucun n'y est sélectionné, l'interrupteur du blog reste verrouillé.

Mise à jour

Une mise à jour ne remplace que les fichiers de l'add-on. Ses tables et ses données, ses paramètres, son état d'activation et son code d'achat enregistré sont tous conservés : ne désactivez et ne supprimez pas l'add-on avant de le mettre à jour. Sauvegardez tout de même votre base de données au préalable.

Méthode 1 : Téléverser la nouvelle version (recommandé)

  1. Téléchargez le dernier fichier .zip de l'add-on.
  2. Allez dans Panneau d'administration → Extensions → Add-ons et cliquez sur Téléverser un add-on.
  3. Déposez le fichier .zip dans la zone de téléversement.
  4. Comme Blog & News est déjà installé, une demande de confirmation affiche la version installée et la nouvelle. Cliquez sur Remplacer : le dossier extensions/addons/blog/ est remplacé par les nouveaux fichiers. Annuler la demande abandonne le téléversement.

Méthode 2 : Remplacer les fichiers à la main

  1. Par FTP ou SSH, supprimez le dossier extensions/addons/blog/ et envoyez le nouveau à sa place. Remplacez le dossier entier plutôt que de copier par-dessus, afin que les fichiers retirés par la nouvelle version ne subsistent pas.
  2. Ouvrez Panneau d'administration → Extensions → Add-ons : la page relit addon.json et la carte affiche le nouveau numéro de version.

Une fois les fichiers remplacés

Appliquer la mise à jour de la base de données. Certaines versions de cet add-on fournissent une routine de mise à jour (migrations et corrections de données). Lorsque la nouvelle version en contient une, un bandeau Mises à jour disponibles apparaît dans le panneau d'administration. Allez dans Panneau d'administration → Système → Mises à jour, trouvez Blog & News dans Mises à jour des add-ons payants et cliquez sur Appliquer les mises à jour. Chaque version en attente est appliquée dans l'ordre et consignée dans l'historique des mises à jour. La routine n'est proposée que lorsque l'add-on est actif : si vous avez remplacé les fichiers d'un add-on désactivé, activez-le d'abord.

Si votre installation met en cache sa configuration ou ses routes (php artisan config:cache, route:cache), exécutez php artisan optimize:clear après la mise à jour.

Désinstallation

Éteindre un add-on sans rien perdre, c'est le désactiver : allez dans Panneau d'administration → Extensions → Add-ons, cliquez sur Désactiver sur la carte Blog & News et confirmez.

  • L'add-on n'est plus chargé : ses routes, ses vues, son entrée dans la barre latérale d'administration et ses pages publiques ne répondent plus.
  • Ses tables de base de données et toutes les données qu'elles contiennent sont conservées, et ses fichiers restent dans extensions/addons/blog/. Rien n'est supprimé.
  • Ses permissions et son code d'achat enregistré restent en base de données. Seule la suppression les efface.
  • La désactivation est refusée tant qu'un autre add-on actif dépend de celui-ci : désactivez d'abord cet add-on.

Cliquez sur Activer sur la même carte pour le rallumer. Comme lors de la première activation, le code d'achat est redemandé et vérifié ; ensuite les migrations en attente sont exécutées, les assets republiés, et l'add-on reprend exactement là où il s'était arrêté.

Suppression

La suppression est définitive et détruit les données de l'add-on. Le bouton Supprimer n'apparaît que sur un add-on désactivé : la suppression se fait donc toujours en deux temps :

  1. Désactivez Blog & News (voir Désinstallation).
  2. Cliquez sur Supprimer sur sa carte et confirmez la demande.

Le panneau d'administration, en une seule passe :

  • exécute le hook de désinstallation de l'add-on, s'il en fournit un, tant que son code est encore sur le disque ;
  • révoque les permissions déclarées dans son addon.json ;
  • annule ses migrations, ce qui supprime ses tables de base de données et toutes les lignes qu'elles contiennent, et purge ses entrées de la table migrations, afin qu'une réinstallation ultérieure reparte de zéro ;
  • supprime ses assets publiés : public/addons/blog/, public/vendor/blog/ et storage/app/public/addons/blog/ ;
  • supprime le dossier de l'add-on extensions/addons/blog/ ;
  • supprime sa ligne dans la table addons (le code d'achat enregistré disparaît avec elle) et vide le cache de l'application.
Cette action est irréversible. Sauvegardez votre base de données avant de supprimer un add-on dont les données peuvent encore vous servir : le réinstaller plus tard crée des tables vides, pas votre ancien contenu, et redemande le code d'achat.

La suppression est refusée, avec un message explicatif et avant toute destruction, lorsque l'add-on est encore actif, lorsqu'un autre add-on actif en dépend, ou lorsque l'utilisateur du serveur web (PHP) ne peut pas supprimer extensions/addons/blog/. Dans ce dernier cas, donnez à cet utilisateur le droit d'écriture sur le dossier et sur son parent, puis réessayez.

Supprimer le dossier en FTP ou en SSH n'est pas équivalent : l'add-on est seulement éteint, et ses tables, ses entrées dans la table migrations et sa ligne addons restent en place. Utilisez plutôt Supprimer dans le panneau d'administration.

Dépannage

Les pages du blog renvoient une erreur 404

  • Assurez-vous que l'add-on Blog est activé dans Panneau d'administration → Extensions → Add-ons.
  • Exécutez php artisan route:clear pour vider le cache des routes.

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 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 sélectionné dans Panneau d'administration → Configuration → Paramètres → Sécurité.

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

  • Vérifiez que la messagerie est correctement configurée dans Panneau d'administration → Configuration → Paramètres → Courrier.
  • Vérifiez que les types de notifications du blog sont activés dans Panneau d'administration → Configuration → Paramètres → Notifications (onglet Types de notifications).
  • 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 téléversement a réussi : la colonne image_path de l'article ne doit pas être vide.
  • 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 porte sur le titre, le contenu et l'extrait dans la langue courante uniquement : changez la langue du site pour chercher des articles rédigés dans une autre langue.
  • 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.5 : 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

Guides des add-ons

sept. 14, 2026