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.

Astuce : Après l'activation, un groupe de menus « Petites Annonces » apparaît dans la barre latérale admin avec des liens vers Annonces, Catégories, Champs personnalisés, Messages, Signalements et Paramètres.

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.
GET /admin/classified/settings

Affiche le formulaire des paramètres avec les valeurs actuelles.

PUT /admin/classified/settings

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.

GET /admin/classified/listings
Paramètres de requête
statusFiltrer par statut (draft, pending_review, published, expired, rejected, sold)
category_idFiltrer 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
GET /admin/classified/listings/create

Formulaire de création d'annonce.

POST /admin/classified/listings

Enregistrer une nouvelle annonce. Validé via Admin\StoreListingRequest. Gère les uploads d'images et les valeurs de champs personnalisés.

GET /admin/classified/listings/{listing}/edit

Formulaire d'édition pour une annonce existante.

PUT /admin/classified/listings/{listing}

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.

DELETE /admin/classified/listings/{listing}

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 :

POST /admin/classified/listings/{listing}/approve

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é).

POST /admin/classified/listings/{listing}/reject
Corps de la requête
reasonRequis : 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.

GET /admin/classified/categories

Vue arborescente paginée de toutes les catégories d'annonces.

POST /admin/classified/categories

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.

PUT /admin/classified/categories/{category}

Mettre à jour une catégorie et reconstruire l'arbre d'ensemble imbriqué.

DELETE /admin/classified/categories/{category}

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).

GET /admin/classified/custom-fields

Liste paginée de tous les champs personnalisés avec filtre par catégorie.

POST /admin/classified/custom-fields
Champs
nameTraduisible : libellé du champ
slugIdentifiant unique
typeUn des 10 types de champs supportés
category_idNullable : null signifie que le champ s'applique à toutes les catégories
placeholderTraduisible : texte d'espace réservé
help_textTraduisible : texte d'aide affiché sous le champ
optionsTableau JSON : pour les types sélection, case à cocher et bouton radio
is_requiredSi le champ est obligatoire
is_filterableAfficher dans la barre latérale de recherche/filtrage
is_searchableInclure dans la recherche plein texte
min_value / max_valueBornes de validation pour les champs numériques
positionOrdre d'affichage

Types de champs supportés

Type Valeur A des options ? Champ HTML
TextetextNon<input type="text">
Zone de textetextareaNon<textarea>
NombrenumberNon<input type="number">
SélectionselectOui<select>
Case à cochercheckboxOui<input type="checkbox">
Bouton radioradioOui<input type="radio">
DatedateNon<input type="date">
Fourchette de prixprice_rangeNon<input type="number">
URLurlNon<input type="url">
E-mailemailNon<input type="email">
Chargement dynamique : Les champs personnalisés sont chargés dynamiquement via AJAX lorsque l'utilisateur sélectionne une catégorie sur le formulaire d'annonce. L'endpoint 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.

GET /admin/classified/messages

Liste paginée des messages avec expéditeur, annonce, date et statut de lecture. Supporte le filtrage par messages non lus.

GET /admin/classified/messages/{message}

Voir les détails du message. Marque automatiquement le message comme lu.

DELETE /admin/classified/messages/{message}

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.

GET /admin/classified/reports

Liste paginée des signalements avec filtre par statut (en attente, examiné, rejeté).

PUT /admin/classified/reports/{report}

Examiner un signalement : définir le statut à reviewed ou dismissed. Enregistre l'examinateur et l'horodatage de l'examen.

DELETE /admin/classified/reports/{report}

Supprimer un signalement définitivement.

Motifs de signalement

Valeur Description
spamL'annonce est du spam ou de la publicité non sollicitée
inappropriateLe contenu viole les règles de la communauté
fraudAnnonce suspectée d'être frauduleuse
wrong_categoryL'annonce est dans la mauvaise catégorie
duplicateDoublon d'une autre annonce
otherAutre 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ésearchRecherche plein texte dans le titre, le contenu, la ville et la région
Catégoriecategory_idFiltrer par catégorie
VillecityFiltrage par localisation (correspondance LIKE)
Prix minprice_minSeuil de prix minimum
Prix maxprice_maxSeuil de prix maximum
ConditionconditionCondition de l'article (neuf, occasion, reconditionné)
Accès visiteur : La navigation peut être restreinte aux utilisateurs authentifiés uniquement en définissant 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.

GET /classifieds/create/new

Formulaire de création d'annonce. Nécessite une authentification. Protégé par le middleware CheckPublishingEnabled.

POST /classifieds/create/new

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.

GET /classifieds/{listing}/edit

Formulaire d'édition pour une annonce. Seul le propriétaire de l'annonce peut accéder à cette page.

PUT /classifieds/{listing}/edit

Mettre à jour une annonce. Validé via Front\UpdateListingRequest.

Modération : Lorsque la modération est activée, les annonces nouvellement créées sont automatiquement définies au statut 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
DELETE /classifieds/{listing}

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.

POST /classifieds/{listing}/save

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.

Activation de la fonctionnalité : La fonctionnalité favoris peut être désactivée entièrement en définissant 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.

POST /classifieds/{listing}/contact
Corps de la requête
sender_nameRequis : nom de l'expéditeur
sender_emailRequis : e-mail de l'expéditeur
sender_phoneOptionnel : téléphone de l'expéditeur
messageRequis : 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é.

POST /classifieds/{listing}/report
Corps de la requête
reasonRequis : un parmi : spam, inappropriate, fraud, wrong_category, duplicate, other
descriptionOptionnel : 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
Repli : Si une annonce n'a pas d'utilisateur associé (ex. utilisateur supprimé), les notifications sont envoyées à l'adresse 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.

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

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_at est dans le passé.
  • La date expires_at est 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_publishing est défini à true dans 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 CheckPublishingEnabled ne 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 à false dans 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_email est défini sur l'annonce pour la livraison de secours.

Les annonces expirées s'affichent toujours

  • La méthode expireOldListings() dans ClassifiedService doit être appelée pour mettre à jour le statut. Cela devrait être planifié comme tâche cron ou commande artisan.
  • Les annonces avec expires_at dans le passé sont automatiquement exclues du scope active(), 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_filesize et post_max_size.
  • Vérifiez que le répertoire storage est accessible en écriture.
  • Assurez-vous de ne pas avoir dépassé la limite max_images configuré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_favorites est défini à true dans 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.

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