Hooks utilisés
| Hook | Rôle |
|---|---|
displayFooterBefore | Formulaire en bandeau (layoutinline). Emplacement par défaut. |
displayFooter, displayHome | Formulaire en carte, si coché dans les réglages. |
hook libre (WSNL_CUSTOM_HOOK) | Formulaire en carte. |
displayBeforeBodyClosingTag | Fenêtre d'inscription (<dialog>), si activée. |
actionFrontControllerSetMedia | views/css/front.css, views/js/front.js. |
actionCustomerAccountAdd, actionObjectCustomerUpdateAfter | Synchronise la case « newsletter » du compte client. |
registerGDPRConsent, actionDeleteGDPRCustomer, actionExportGDPRData | Module RGPD officiel : effacement et export des données d'un client. |
actionWebsourceBuilderRegisterBlocks | Bloc « Newsletter » de Websource Builder. |
actionWebsourceThemeExport, actionWebsourceThemeImport | Section newsletter (version 1) : emplacements, fenêtre, textes. Jamais exportés : abonnés, WSNL_SECRET, version du consentement, bon, anti-spam. |
actionObjectShopAddAfter, actionShopDataDuplication, actionObjectShopDeleteAfter | Multiboutique. |
Widget
{widget name='websourcenewsletter'}
{widget name='websourcenewsletter' layout='inline'}
{widget name='websourcenewsletter' layout='card' intro='0'}
| Paramètre | Valeurs |
|---|---|
layout | card (défaut), inline |
intro | 0 masque l'introduction |
PHP : Module::getInstanceByName('websourcenewsletter')->renderForm(['layout' => 'inline', 'intro' => true], $idLang, 'builder');
Bloc Websource Builder
Classe Builder\NewsletterBlock, libellé « Newsletter », catégorie « Sections ».
| Champ | Valeurs |
|---|---|
| Présentation | card Carte, inline Sur une ligne (bandeau) |
| Afficher le texte d'introduction | oui / non |
Contrôleurs publics
| Contrôleur | Requête | Réponse |
|---|---|---|
subscribe | POST email, wsnl_consent, token, wsnl_stamp, wsnl_hook, wsnl_submit, champ piège website | Avec X-Requested-With: XMLHttpRequest ou ajax=1 : JSON ; sinon page de résultat. |
confirm | GET id, token | Page « Inscription confirmée » ou « Confirmation impossible ». |
unsubscribe | GET id, token : page avec bouton ; POST wsnl_unsubscribe : désinscription | Page « Se désinscrire » / « Désinscription effectuée ». |
Adresse : index.php?fc=module&module=websourcenewsletter&controller=subscribe (ou la forme réécrite).
POST /index.php?fc=module&module=websourcenewsletter&controller=subscribe
X-Requested-With: XMLHttpRequest
email=client@exemple.fr&wsnl_consent=1&token=…&wsnl_stamp=…&wsnl_hook=displayFooterBefore&wsnl_submit=1&website=
{"success": true, "message": "Merci ! Un e-mail vient de vous être envoyé : cliquez sur le lien pour confirmer votre inscription.", "field": ""}
En cas d'échec, success vaut false et field vaut email, consent ou une chaîne vide. Le texte de consentement enregistré est toujours celui du serveur.
Anti-spam
Jeton CSRF de PrestaShop (Tools::getToken(false)), champ piège website (réponse positive factice, rien n'est enregistré), horodatage signé wsnl_stamp avec délai minimal (WSNL_MIN_DELAY), limite par heure sur une empreinte HMAC de l'adresse IP (WSNL_RATE_MAX, table …_throttle, purgée après 24 h).
Jetons
- Confirmation : 64 caractères hexadécimaux aléatoires, usage unique ; seule l'empreinte SHA-256 est stockée (
token_hash,token_expires). - Désinscription :
hash_hmac('sha256', 'unsub|<id>|<email en minuscules>', WSNL_SECRET), valable tant que l'abonné existe.
Données
| Clé / table | Contenu |
|---|---|
{prefix}websourcenewsletter_subscriber | id_subscriber, id_shop, id_lang, id_customer, email, status (pending, confirmed, unsubscribed), source, token_hash, token_expires, date_mail, consent_date, consent_text, consent_version, consent_shop, consent_lang, voucher_code, date_add, date_upd, date_confirm, date_unsub |
{prefix}websourcenewsletter_throttle | id_throttle, id_shop, ip_hash, date_add |
WSNL_DOUBLE_OPTIN, WSNL_TOKEN_HOURS, WSNL_MIN_DELAY, WSNL_RATE_MAX | Inscription (défauts 1, 48, 3, 5). |
WSNL_HOOKS, WSNL_CUSTOM_HOOK, WSNL_SIGNUP_FIELD | Emplacements. |
WSNL_VOUCHER_ENABLED, _TYPE (percent, amount), _VALUE, _DAYS, _MIN | Bon de bienvenue. |
WSNL_POPUP_ENABLED, _MODE (delay, exit), _DELAY, _DAYS | Fenêtre. |
WSNL_CONSENT_VERSION, WSNL_SECRET | Version du texte de consentement, secret des jetons. |
WEBSOURCENEWSLETTER_KEEP_DATA | Conservation des données à la désinstallation (globale, 1 par défaut). |
Textes par langue (title, intro, consent, policy_url, popup_title, popup_intro) : Service\Settings::text(), repli sur Text\DefaultTexts (fr, en).
Bon de bienvenue
Voucher\VoucherService crée une règle de panier : code WELCOME-XXXXXXXX (alphabet sans caractères ambigus), quantité 1, 1 par utilisateur, sans utilisation partielle, restreinte à la boutique et au client s'il est connu, réduction en pourcentage ou en montant TTC dans la devise par défaut, validité WSNL_VOUCHER_DAYS jours, panier minimum WSNL_VOUCHER_MIN.
E-mails
Gabarits mails/<iso>/wsnl_confirm.{html,txt} et wsnl_welcome.{html,txt} (fr, en ; repli en anglais), envoyés dans la langue de l'abonné. Variables : {shop_name}, {confirm_url}, {hours}, {unsub_url}, {voucher_txt}.
Formulaire d'administration
POST sur index.php?controller=AdminModules&configure=websourcenewsletter&token=… : wsnl_save + wsnl[…] (réglages), wsnl_keep_data, wsnl_row_action = resend, unsubscribe, delete + wsnl_id, wsnl_import_csv + fichier wsnl_file + wsnl_attest, wsnl_import_legacy + wsnl_legacy_customers. GET wsnl_export=1[&wsnl_status=confirmed] (CSV, cellules protégées contre l'injection de formules), wsnl_q, wsnl_status, wsnl_page.
Template et CSS
Templates views/templates/hook/form.tpl, fields.tpl, popup.tpl, views/templates/front/result.tpl, surchargeables dans themes/<theme>/modules/websourcenewsletter/views/templates/…. Variable Smarty $wsnl : uid, layout, title, intro, show_intro, consent, policy_url, action, token, stamp, hook, email, popup (mode, delay, days, title, intro).
Classes : .wsnl, .wsnl--inline, .wsnl--card, .wsnl--popup, .wsnl__form, .wsnl__input, .wsnl__button, .wsnl__consent, .wsnl__status, .wsnl-popup, .wsnl-result.
| Variable CSS | Rôle |
|---|---|
--wsnl-bg, --wsnl-ink, --wsnl-line, --wsnl-tint | Fond, texte, filets, teinte. |
--wsnl-accent, --wsnl-accent-ink | Bouton. |
--wsnl-radius, --wsnl-field-radius, --wsnl-shadow | Arrondis et ombre. |
Tests
php tests/run.php.