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_SEARCHdans les recherches de slugs traduisibles) - La table categories du cœur doit exister (les catégories du blog utilisent la table unifiée
categoriesaveccategorizable_type = 'post')
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 → Downloads → License certificate & purchase code |
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?
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
draftoupublished - 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 |
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. |
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).
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.
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/postsredirige alors vers/blogpour 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.
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 :
- Articles de la même catégorie
- 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
- Si Approbation requise est désactivé → tous les commentaires sont approuvés automatiquement.
- Si le commentateur est authentifié → approuvé automatiquement.
- Si le commentaire est une réponse et que Approbation automatique des réponses est activé → approuvé automatiquement.
- Si Approbation automatique des commentateurs de confiance est activé et que l'e-mail a déjà un commentaire approuvé → approuvé automatiquement.
- 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
- L'administrateur téléverse un fichier image via le formulaire de création/modification d'article.
- Le
PostServicedélègue àMediaService::uploadFor(). - L'image est stockée dans le sous-répertoire
postsdu disque de médias. - 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
CaptchaRuledu 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é)
- Téléchargez le dernier fichier
.zipde cet add-on. - Allez dans Panneau d'administration → Add-ons et cliquez sur le bouton Téléverser.
- Sélectionnez ou glissez le fichier
.zipdans la zone de téléversement. - Une demande de confirmation affichera les numéros de version actuelle et nouvelle. Cliquez sur Remplacer pour continuer.
- Allez dans Panneau d'administration → Mise à 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.
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:clearpour vider le cache des routes. - Vérifiez que le
BlogServiceProviderest 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 nondraft). - Assurez-vous que
published_atest 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_typede la catégorie estpost. - 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_enabledest défini surtruedans 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_commentssoit 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_commentsdans Blog → Paramètres. - Le
StoreCommentRequestvé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_enabledest défini surtruedans les paramètres du blog. - Un fournisseur CAPTCHA doit être configuré dans Admin → Paramètres → CAPTCHA.
- La vérification
CaptchaService::isEnabledFor('blog')doit renvoyertrue.
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_commentet/oublog_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
mediaunmediable_typecorrespondant à 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_SEARCHde 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_atdans 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.