Petites Annonces
Une place de marché de petites annonces complète pour votre site Larapen. Les utilisateurs peuvent créer, parcourir, rechercher et gérer des annonces avec des champs personnalisés, un filtrage par localisation, des galeries d'images et une messagerie intégrée : le tout avec modération admin et permissions granulaires.
Champs personnalisés
Définissez un nombre illimité de champs personnalisés par catégorie ou globaux. Support de 10 types de champs incluant texte, sélection, case à cocher, date et fourchette de prix.
Système de modération
Workflow d'approbation admin optionnel. Approuver, rejeter (avec motif) ou publier automatiquement les annonces. Configurable par site.
Recherche & Filtrage
Recherche plein texte dans les titres, descriptions et localisations. Filtrage par catégorie, fourchette de prix, condition, ville et champs personnalisés.
Messagerie acheteur-vendeur
Formulaire de contact intégré avec notifications par e-mail. Messages suivis par annonce avec statut lu/non lu.
Favoris & Sauvegardés
Les utilisateurs authentifiés peuvent mettre en favoris des annonces pour plus tard. Activer/désactiver la sauvegarde en un seul clic.
Multi-langue
Tout le contenu des annonces, catégories et champs personnalisés est traduisible via spatie/laravel-translatable. Support i18n complet.
Expiration automatique
Les annonces expirent après un nombre de jours configurable. Les annonces expirées sont automatiquement masquées de la vue publique.
Signalement communautaire
Les utilisateurs peuvent signaler les annonces inappropriées. Les administrateurs examinent, rejettent ou agissent sur les signalements depuis un panneau dédié.
Cas d'utilisation
Place de marché générale
Gérez un tableau de petites annonces de type Leboncoin où les utilisateurs publient des articles à vendre, des services ou des locations. Les catégories et champs personnalisés vous permettent de structurer tout type d'annonce.
- Activez l'inscription des utilisateurs et la création d'annonces.
- Définissez des catégories (Véhicules, Électronique, Immobilier, Emploi, etc.) avec des champs personnalisés spécifiques à chaque catégorie.
- Activez la modération pour examiner les soumissions avant leur mise en ligne.
- Les acheteurs contactent directement les vendeurs via le formulaire de contact intégré.
Annuaire d'entreprises
Créez un annuaire d'entreprises locales avec des champs personnalisés pour les horaires d'ouverture, les services proposés et les coordonnées.
- Désactivez le champ prix ou rendez-le optionnel.
- Ajoutez des champs personnalisés comme « Horaires d'ouverture », « URL du site web » et « Services proposés ».
- Utilisez les champs de localisation (ville, région, adresse) pour le filtrage géographique.
Tableau d'actifs interne
Un tableau privé pour une organisation afin de lister et échanger des actifs, équipements ou ressources internes.
- Désactivez la navigation pour les visiteurs : exigez la connexion pour voir les annonces.
- Désactivez la publication publique : seuls les administrateurs créent les annonces.
- Utilisez le champ « condition » (neuf, occasion, reconditionné) pour le suivi des actifs.
Prérequis
| Prérequis | Détails |
|---|---|
| Larapen Core | ≥ 1.0.0 |
| PHP | ≥ 8.2 |
| MySQL | ≥ 8.0 |
| Comptes utilisateurs | Requis : l'add-on dépend de la table users du noyau pour la propriété des annonces, la messagerie, les favoris et le signalement. |
| Dépendances | Aucune : aucun autre add-on requis. |
Installation
Étape 1 : Télécharger l'add-on
Placez le dossier classified dans le répertoire addons/ de votre installation Larapen :
Étape 2 : Activer
Allez dans Admin → Add-ons → Add-ons installés et activez Petites Annonces.
Étape 3 : Exécuter les migrations
Cela crée six tables : classified_listings, classified_custom_fields,
classified_custom_field_values, classified_messages,
classified_reports et classified_saved_listings.
Étape 4 : Vider les caches
Étape 5 : Configurer
Allez dans Admin → Petites Annonces → Paramètres pour configurer la modération, les règles de publication, les limites d'images, la durée des annonces et les préférences de notification.
Configuration
Les valeurs par défaut de configuration sont définies dans config/classified.php et peuvent être modifiées via les paramètres admin (stockés dans la base de données avec le préfixe classified_).
| Clé du paramètre | Type | Défaut | Description |
|---|---|---|---|
per_page |
int | 12 | Annonces par page en front-end |
admin_per_page |
int | 15 | Annonces par page dans le panneau admin |
max_images |
int | 5 | Images maximum par annonce (image principale + galerie) |
listing_duration_days |
int | 30 | Jours avant l'expiration d'une annonce (0 = n'expire jamais) |
allow_publishing |
bool | true | Autoriser les utilisateurs à créer des annonces en front-end |
guest_browse |
bool | true | Autoriser les visiteurs non authentifiés à parcourir les annonces |
guest_contact |
bool | false | Autoriser les visiteurs à envoyer des messages aux vendeurs |
moderation_enabled |
bool | true | Exiger l'approbation admin avant la mise en ligne des annonces |
require_phone |
bool | false | Rendre le numéro de téléphone obligatoire sur les annonces |
enable_reports |
bool | true | Autoriser les utilisateurs à signaler les annonces |
enable_favorites |
bool | true | Autoriser les utilisateurs à sauvegarder/mettre en favoris les annonces |
allow_author_translations |
bool | true | Autoriser les auteurs d'annonces à fournir des traductions |
Paramètres de notification
Chaque notification peut être activée ou désactivée individuellement depuis le panneau des paramètres admin :
| Clé du paramètre | Défaut | Description |
|---|---|---|
notify_admin_on_new_listing |
true | Notifier les admins lorsqu'une nouvelle annonce est soumise |
notify_author_on_new_listing |
true | Envoyer un e-mail de confirmation à l'auteur de l'annonce |
notify_author_on_approval |
true | Notifier l'auteur lorsque son annonce est approuvée |
notify_author_on_rejection |
true | Notifier l'auteur lorsque son annonce est refusée |
notify_owner_on_new_message |
true | Notifier le propriétaire de l'annonce lorsqu'un nouveau message est reçu |
notify_admin_on_report |
true | Notifier les admins lorsqu'une annonce est signalée |
notify_owner_on_expiration |
true | Notifier le propriétaire de l'annonce lorsque celle-ci expire |
Admin : Paramètres
Accès via Admin → Petites Annonces → Paramètres. La page des paramètres est organisée en sections logiques :
- Publication : Activer/désactiver la création d'annonces par les utilisateurs, la navigation pour les visiteurs et le contact visiteur.
- Modération : Activer/désactiver l'approbation admin pour les nouvelles annonces.
- Durée des annonces : Définir le nombre de jours pendant lesquels les annonces restent actives (0 pour illimité).
- Images : Nombre maximum d'images par annonce.
- Coordonnées : Si le numéro de téléphone est requis.
- Fonctionnalités : Activer/désactiver les signalements et les favoris.
- Traductions : Autoriser les auteurs à fournir du contenu multilingue.
- Notifications : Activer/désactiver chacun des 7 types de notification.
Affiche le formulaire des paramètres avec les valeurs actuelles.
Enregistre tous les paramètres. Validé via UpdateClassifiedSettingsRequest.
Admin : Annonces
La page de gestion des annonces fournit un tableau paginé de toutes les annonces avec filtrage par statut et catégorie. Chaque ligne affiche le titre de l'annonce, l'auteur, la catégorie, le badge de statut, le prix, le nombre de vues, le nombre de messages, le nombre de signalements et la date de création.
Paramètres de requête
status | Filtrer par statut (draft, pending_review, published, expired, rejected, sold) |
category_id | Filtrer par ID de catégorie |
Création & Édition
Le formulaire d'annonce comprend des champs pour :
- Contenu : Titre (traduisible), contenu/description (traduisible), méta titre, méta description
- Classification : Sélection de catégorie, condition de l'article (neuf, occasion, reconditionné)
- Tarification : Prix, devise, indicateur négociable
- Localisation : Ville, région, pays, adresse, latitude/longitude
- Contact : Nom du contact, e-mail, téléphone
- Média : Image principale + images de galerie (jusqu'au maximum configuré)
- Champs personnalisés : Champs dynamiques chargés en fonction de la catégorie sélectionnée (via AJAX)
- Statut : Brouillon, en attente de revue, publié (l'admin peut contourner la modération)
- Options : Mise en avant, date d'expiration, position
Formulaire de création d'annonce.
Enregistrer une nouvelle annonce. Validé via Admin\StoreListingRequest. Gère les uploads d'images et les valeurs de champs personnalisés.
Formulaire d'édition pour une annonce existante.
Mettre à jour une annonce existante. Supporte le remplacement de l'image principale, l'ajout/suppression d'images de galerie et la mise à jour des valeurs de champs personnalisés.
Supprimer une annonce et tous les médias, valeurs de champs personnalisés, messages, signalements et entrées sauvegardées associés (via cascade).
Modération
Lorsque la modération est activée, les nouvelles annonces sont définies au statut pending_review. Les administrateurs peuvent les approuver ou les rejeter :
Définit le statut de l'annonce à published, enregistre la date de publication et efface tout motif de refus. Envoie une notification d'approbation à l'auteur (si activé).
Corps de la requête
reason | Requis : le motif du refus (envoyé à l'auteur par e-mail) |
Admin : Catégories
Les catégories de petites annonces utilisent la table unifiée categories du noyau avec categorizable_type = 'listing'. Les catégories supportent l'imbrication (hiérarchie parent/enfant via ensemble imbriqué) et sont traduisibles.
Vue arborescente paginée de toutes les catégories d'annonces.
Créer une nouvelle catégorie. Validé via StoreCategoryRequest. Champs : nom (traduisible), slug (traduisible), description (traduisible), méta titre, méta description, catégorie parente, position, statut actif.
Mettre à jour une catégorie et reconstruire l'arbre d'ensemble imbriqué.
Supprimer une catégorie. Les annonces de la catégorie supprimée auront leur category_id défini à null.
Admin : Champs personnalisés
Les champs personnalisés vous permettent d'étendre les annonces avec des attributs spécifiques à une catégorie ou globaux. Les champs peuvent être marqués comme filtrables (affichés dans les filtres de recherche) et recherchables (inclus dans la recherche plein texte).
Liste paginée de tous les champs personnalisés avec filtre par catégorie.
Champs
name | Traduisible : libellé du champ |
slug | Identifiant unique |
type | Un des 10 types de champs supportés |
category_id | Nullable : null signifie que le champ s'applique à toutes les catégories |
placeholder | Traduisible : texte d'espace réservé |
help_text | Traduisible : texte d'aide affiché sous le champ |
options | Tableau JSON : pour les types sélection, case à cocher et bouton radio |
is_required | Si le champ est obligatoire |
is_filterable | Afficher dans la barre latérale de recherche/filtrage |
is_searchable | Inclure dans la recherche plein texte |
min_value / max_value | Bornes de validation pour les champs numériques |
position | Ordre d'affichage |
Types de champs supportés
| Type | Valeur | A des options ? | Champ HTML |
|---|---|---|---|
| Texte | text | Non | <input type="text"> |
| Zone de texte | textarea | Non | <textarea> |
| Nombre | number | Non | <input type="number"> |
| Sélection | select | Oui | <select> |
| Case à cocher | checkbox | Oui | <input type="checkbox"> |
| Bouton radio | radio | Oui | <input type="radio"> |
| Date | date | Non | <input type="date"> |
| Fourchette de prix | price_range | Non | <input type="number"> |
| URL | url | Non | <input type="url"> |
email | Non | <input type="email"> |
GET /api/classified/custom-fields/{categoryId?} retourne les champs pertinents pour cette catégorie (plus les champs globaux).
Admin : Messages
Consultez tous les messages envoyés via les formulaires de contact des annonces. Les messages peuvent être filtrés par statut lu/non lu.
Liste paginée des messages avec expéditeur, annonce, date et statut de lecture. Supporte le filtrage par messages non lus.
Voir les détails du message. Marque automatiquement le message comme lu.
Supprimer un message définitivement.
Admin : Signalements
Consultez et gérez les signalements d'annonces soumis par les utilisateurs. Les signalements incluent un motif (spam, inapproprié, fraude, mauvaise catégorie, doublon ou autre) et une description optionnelle.
Liste paginée des signalements avec filtre par statut (en attente, examiné, rejeté).
Examiner un signalement : définir le statut à reviewed ou dismissed. Enregistre l'examinateur et l'horodatage de l'examen.
Supprimer un signalement définitivement.
Motifs de signalement
| Valeur | Description |
|---|---|
spam | L'annonce est du spam ou de la publicité non sollicitée |
inappropriate | Le contenu viole les règles de la communauté |
fraud | Annonce suspectée d'être frauduleuse |
wrong_category | L'annonce est dans la mauvaise catégorie |
duplicate | Doublon d'une autre annonce |
other | Autre motif (l'utilisateur fournit une description) |
Front-end : Navigation & Recherche
La page publique des petites annonces affiche les annonces publiées et non expirées triées par statut de mise en avant, date de publication et position. Les visiteurs peuvent filtrer et rechercher des annonces selon plusieurs critères.
Options de recherche & filtrage
| Filtre | Paramètre | Description |
|---|---|---|
| Recherche par mot-clé | search | Recherche plein texte dans le titre, le contenu, la ville et la région |
| Catégorie | category_id | Filtrer par catégorie |
| Ville | city | Filtrage par localisation (correspondance LIKE) |
| Prix min | price_min | Seuil de prix minimum |
| Prix max | price_max | Seuil de prix maximum |
| Condition | condition | Condition de l'article (neuf, occasion, reconditionné) |
guest_browse à false dans les paramètres admin. Lorsque désactivé, le middleware ClassifiedGuestAccess redirige les visiteurs non authentifiés vers la page de connexion.
Navigation par catégorie
Accès via /classifieds/category/{slug}. Affiche les annonces filtrées par la catégorie spécifiée, avec recherche et filtrage complets disponibles au sein de cette catégorie.
Front-end : Détail de l'annonce
Accès via /classifieds/{slug}. La page de détail de l'annonce comprend :
- Titre complet, description et valeurs des champs personnalisés
- Galerie d'images (image principale + images de galerie supplémentaires)
- Prix avec formatage de devise et indicateur négociable
- Badge de condition de l'article
- Informations de localisation (ville, région, pays, adresse)
- Coordonnées du vendeur
- Formulaire de contact (pour envoyer un message au vendeur)
- Bouton sauvegarder/retirer des favoris (pour les utilisateurs authentifiés)
- Bouton signaler (pour les utilisateurs authentifiés)
- Annonces similaires (même catégorie ou même ville)
- Nombre de vues (incrémenté à chaque visite)
Front-end : Créer & Modifier des annonces
Les utilisateurs authentifiés peuvent créer et modifier leurs propres annonces depuis le front-end. Cette fonctionnalité peut être désactivée globalement en définissant allow_publishing à false.
Formulaire de création d'annonce. Nécessite une authentification. Protégé par le middleware CheckPublishingEnabled.
Soumettre une nouvelle annonce. Validé via Front\StoreListingRequest. Lorsque la modération est activée, l'annonce est définie au statut pending_review et nécessite l'approbation admin.
Formulaire d'édition pour une annonce. Seul le propriétaire de l'annonce peut accéder à cette page.
Mettre à jour une annonce. Validé via Front\UpdateListingRequest.
pending_review (même si l'utilisateur sélectionne « publié »). Seules les annonces créées ou approuvées par un admin contournent la modération.
Front-end : Mes annonces
Accès via /classifieds/my/listings. Les utilisateurs authentifiés peuvent voir toutes leurs annonces avec des onglets par statut : toutes, actives, en attente, expirées, vendues et brouillons.
Depuis cette page, les utilisateurs peuvent :
- Voir le statut de l'annonce et le nombre de messages
- Modifier leurs annonces
- Supprimer leurs annonces
Supprimer une annonce. Seul le propriétaire de l'annonce peut effectuer cette action.
Front-end : Annonces sauvegardées
Accès via /classifieds/my/saved. Les utilisateurs peuvent mettre en favoris des annonces et les consulter plus tard depuis une page dédiée aux annonces sauvegardées.
Activer/désactiver la sauvegarde d'une annonce. Retourne si l'annonce est maintenant sauvegardée (true) ou retirée des favoris (false). Fonctionne comme un basculement AJAX.
enable_favorites à false dans les paramètres admin.
Front-end : Contacter le vendeur
Chaque page de détail d'annonce inclut un formulaire de contact qui envoie un message au propriétaire de l'annonce.
Corps de la requête
sender_name | Requis : nom de l'expéditeur |
sender_email | Requis : e-mail de l'expéditeur |
sender_phone | Optionnel : téléphone de l'expéditeur |
message | Requis : le corps du message |
Le contact par les visiteurs peut être contrôlé via le paramètre guest_contact. Lorsque désactivé, seuls les utilisateurs authentifiés peuvent envoyer des messages.
Front-end : Signalement
Les utilisateurs authentifiés peuvent signaler les annonces qui violent les règles de la communauté.
Corps de la requête
reason | Requis : un parmi : spam, inappropriate, fraud, wrong_category, duplicate, other |
description | Optionnel : détails supplémentaires sur le signalement |
Notifications
L'add-on inclut 7 classes de notification par e-mail, toutes étendant BaseNotification et utilisant le canal mail. Chaque notification peut être activée/désactivée individuellement via les paramètres admin.
| Notification | Destinataire | Déclencheur | Paramètre |
|---|---|---|---|
NewListingAdminNotification |
Administrateurs | Nouvelle annonce soumise | notify_admin_on_new_listing |
ListingConfirmationNotification |
Auteur de l'annonce | Annonce soumise | notify_author_on_new_listing |
ListingApprovedNotification |
Auteur de l'annonce | Annonce approuvée par l'admin | notify_author_on_approval |
ListingRejectedNotification |
Auteur de l'annonce | Annonce refusée par l'admin | notify_author_on_rejection |
NewMessageNotification |
Propriétaire de l'annonce | Nouveau message de contact reçu | notify_owner_on_new_message |
ListingReportedNotification |
Administrateurs | Annonce signalée par un utilisateur | notify_admin_on_report |
ListingExpiredNotification |
Propriétaire de l'annonce | L'annonce expire | notify_owner_on_expiration |
contact_email de l'annonce en utilisant le routage de notification à la demande.
Mise à jour
É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 : Vérifier
Visitez Admin → Petites Annonces → Paramètres et confirmez que tous les paramètres sont intacts. Parcourez la page des annonces pour vérifier que les annonces s'affichent correctement.
Dépannage
Les annonces ne sont pas visibles en front-end
Vérifiez que :
- Le statut de l'annonce est
published(et non draft, pending, expired, rejected ou sold). - La date
published_atest dans le passé. - La date
expires_atest soit null soit dans le futur. - La navigation pour les visiteurs est activée si vous n'êtes pas connecté (vérifiez le paramètre
guest_browse).
Les utilisateurs ne peuvent pas créer d'annonces
- Assurez-vous que
allow_publishingest défini àtruedans les paramètres admin. - Vérifiez que l'utilisateur est authentifié (la création d'annonces nécessite une connexion).
- Vérifiez que le middleware
CheckPublishingEnabledne bloque pas l'accès.
Les champs personnalisés n'apparaissent pas sur le formulaire d'annonce
- Assurez-vous que le champ personnalisé est actif (
is_active = true). - Vérifiez que le champ est soit global (
category_id = null) soit assigné à la catégorie sélectionnée. - Vérifiez la console du navigateur pour les erreurs AJAX sur l'endpoint
/api/classified/custom-fields/. - Assurez-vous que JavaScript est activé et que l'élément de sélection de catégorie déclenche l'appel AJAX.
Les annonces sont bloquées en « En attente de revue »
- La modération est activée par défaut. Allez dans Admin → Petites Annonces → Annonces et approuvez les annonces en attente.
- Pour désactiver la modération, définissez
moderation_enabledàfalsedans les paramètres admin. Les nouvelles annonces seront publiées immédiatement.
Les notifications ne sont pas envoyées
- Vérifiez que le paramètre de notification correspondant est activé (ex.
notify_admin_on_new_listing). - Assurez-vous que votre configuration de messagerie est correcte dans
.env(SMTP, Mailgun, etc.). - Vérifiez le journal Laravel (
storage/logs/laravel.log) pour les erreurs de messagerie. - Si l'annonce n'a pas d'utilisateur associé, assurez-vous que le
contact_emailest défini sur l'annonce pour la livraison de secours.
Les annonces expirées s'affichent toujours
- La méthode
expireOldListings()dansClassifiedServicedoit être appelée pour mettre à jour le statut. Cela devrait être planifié comme tâche cron ou commande artisan. - Les annonces avec
expires_atdans le passé sont automatiquement exclues du scopeactive(), mais leur champ de statut n'est mis à jour que lorsque le processus d'expiration s'exécute.
Les images ne se téléchargent pas
- Vérifiez les paramètres PHP
upload_max_filesizeetpost_max_size. - Vérifiez que le répertoire
storageest accessible en écriture. - Assurez-vous de ne pas avoir dépassé la limite
max_imagesconfigurée dans les paramètres admin.
Les compteurs d'annonces par catégorie sont incorrects
- Les compteurs d'annonces sont calculés dynamiquement via
withCount. Si les compteurs semblent obsolètes, videz le cache de l'application :php artisan cache:clear.
Le basculement sauvegarder/favoris ne fonctionne pas
- Assurez-vous que l'utilisateur est authentifié (la sauvegarde nécessite une connexion).
- Vérifiez que
enable_favoritesest défini àtruedans les paramètres admin. - Vérifiez la console du navigateur pour les erreurs AJAX sur l'endpoint de basculement.
- Assurez-vous que le jeton CSRF est inclus dans les en-têtes de la requête.