Skip to content

MelisCmsProspects

Lead-/Kontaktverwaltung: Ein Kontaktformular im Front-Office erfasst Besuchernachrichten als Interessenten (Prospects), und ein React-Back-Office ermöglicht das Durchsuchen, Filtern, Bearbeiten, Exportieren und Löschen sowie die Klassifizierung von Anfragen nach Themen. Paket melisplatform/melis-cms-prospects.

Zweck

MelisCmsProspects erfasst Kontaktformular-Einsendungen von Besuchern als Prospects (Interessenten/Leads) und speichert sie in der Datenbank. Back-Office-Benutzer durchsuchen, filtern, bearbeiten, exportieren (CSV/Excel) und löschen diese Leads und klassifizieren sie nach Themen. Das Modul liefert ein Dashboard-Statistik-Widget und bindet sich in die DSGVO-Werkzeuge der Plattform ein (Benutzerinformationen / Extrahieren / Löschen + automatischer Löschzyklus).

In Melis v6 sind die beiden Back-Office-Werkzeuge — Prospects und Themesnative, vollständig in React umgesetzte Oberflächen, die unter /melis-react bereitgestellt werden und jeweils mit einer JSON-react-api-Schicht kommunizieren. Das zugrunde liegende Daten- modell, die Services, das Show-Form-Plugin im Front-Office und die DSGVO-Verdrahtung sind gegenüber v5 unverändert.

Aktivierung

In config/melis.module.load.php hinzufügen:

php
return [
    'MelisCmsProspects',
];

Abhängigkeiten: melis-core, melis-engine, melis-front, melis-cms und laminas/laminas-mvc-plugin-flashmessenger. Das Modul ist dbdeploy: true — seine Tabellen werden über den dbdeploy-Mechanismus erstellt/aktualisiert. Beide React-Werkzeuge erscheinen im Back-Office nur, solange das Modul aktiv ist (sie werden aus dessen brick.manifest.json ermittelt).

React-Back-Office

Wo: Linke Seitenleiste → MelisMarketingProspectsProspects / Themes. Jedes öffnet sich als eigener oberster Tab. Jedes Werkzeug behält einen New / Old-Umschalter: New ist die React-Oberfläche (Standard), Old rendert das Legacy-Werkzeug in einem iframe (/melis/react-tool-page?key=<melisKey>).

Zwei Bricks werden in einem Bundle ausgeliefert (public/ui-react/brick.manifest.json):

ElementProspectsThemes
Brick-ID / Routeprospects/prospectsprospect-themes/prospect-themes
forwardKey (Menü → Route)MelisCmsProspects/ToolProspectsMelisCmsProspects/ProspectThemes
iframe-melisKey der Old-Ansicht (Zone)MelisCmsProspects_tool_prospectsMelisCmsProspects_tool_themes
melisKey für Rechte / Berechtigungmelisprospects_tool_prospects_sectionmelisprospects_tool_themes_section
API-Basis/melis/react-api/prospects/melis/react-api/prospect-themes
ControllerMelisReactApiProspectControllerMelisReactApiProspectThemeController

Hinweis: Der melisKey im Manifest ist der renderbare Zonen-Schlüssel, der für den iframe der Old-Ansicht verwendet wird — die Rechte hängen nicht daran. Zugriffssschutz und Berechtigungen basieren auf dem Menüknoten melisprospects_tool_..._section (deklariert in config/app.interface.php).

Prospects-Werkzeug

Das React-Prospects-Werkzeug: KPI-Karten (Total / This month / Average per month / Anonymized), Suche, All-sites- und All-types-Filter, ein Datumsbereich-Auswähler, Reset filters, ein Spaltenmanager, Export, der New/Old-Umschalter und eine Aktualisieren-Schaltfläche — jede Zeile hat Bearbeiten- und Löschen-Aktionen

Sie sehen jeden Prospect auf der Plattform. Die Liste hat vier KPI-Karten (Total, This month, Average per month, Anonymized), ein Suchfeld (Name / E-Mail / Telefon / Firma), einen Site- Filter, einen Type-Filter, einen Date-Bereichsauswähler (Today / Yesterday / Last 7 / Last 30 / This month / Last month / Custom), Reset filters, einen dauerhaft gespeicherten Columns-Manager, Export und eine Aktualisieren-Schaltfläche. Klicken Sie auf eine Spaltenüberschrift, um zu sortieren (alle Spalten außer Message). Jede Zeile hat Bearbeiten und Löschen.

Prospects werden hier nicht angelegt — sie entstehen ausschließlich über das Kontaktformular im Front-Office. Ein Klick auf Bearbeiten öffnet den Prospect als Unter-Tab des Hosts (← Back) mit einem React-Formular: eine Contact information-Karte (Name, Email, Phone, Company, Country), eine Message-Karte und eine Details- Seitenkarte (Site-Auswähler, Theme-Auswähler, schreibgeschütztes Contact date). Kein Feld ist Pflicht (die E-Mail wird nur bei Eingabe auf das Format geprüft); Contact date und type sind unveränderlich — sie werden zum Erfassungszeitpunkt vom Front-Formular gesetzt.

Das React-Bearbeitungsformular für einen Prospect — eine Contact-information-Karte (Name, Email, Phone, Company, Country), ein Message-Feld und eine Details-Seitenkarte (Site, Theme, schreibgeschütztes Contact date); die Unter-Tab-Leiste zeigt die Detailansicht (← Back · Paul Martin)

Themes-Werkzeug

Die Themes-Liste zeigt zwei KPI-Karten (Total themes, total Items), ein Suchfeld, Reset filters, einen Columns-Manager, Export, den New/Old-Umschalter und + New theme. Jede Zeile zeigt den Namen des Themas und dessen Anzahl an Items, mit drei Aktionen: Umbenennen (Modal mit einem Feld), Bearbeiten (öffnet den Items-Unter-Tab des Themas) und Löschen.

Das React-Themes-Werkzeug: Total- / Items-KPI-Karten, Suche, Reset filters, Columns, Export, New/Old-Umschalter und „+ New theme" — jede Zeile bietet Umbenennen, Bearbeiten (Items öffnen) und Löschen

Das Modal „New theme" — ein einzelnes Name-Feld (der Code wird vom Back-End erhalten und nicht hier eingegeben)

Das Bearbeiten eines Themas öffnet dessen Items-Panel als Unter-Tab (← Back + Themenname): eine durchsuchbare Liste von Items (ID + Name) mit Bearbeiten/Löschen je Zeile und + New item. Das Hinzufügen oder Bearbeiten eines Items öffnet ein Modal, das einen Namen je CMS-Sprache erfasst — eine Reihe von Sprach-Tabs (Flagge + grüner „Ausgefüllt"-Punkt) sowie das Name-Feld für die aktive Sprache. Mindestens eine Sprache muss ausgefüllt sein.

Das Items-Panel eines Themas (Unter-Tab) für „My Billing" — eine durchsuchbare Liste von Items mit Bearbeiten/Löschen je Zeile und einer „+ New item"-Schaltfläche, dargestellt als Detail-Unter-Tab

Das Modal „New item" — „Content per language"-Tabs (English / Français) und das Name-Feld für die aktive Sprache

React-API

Die Routen befinden sich in config/react-api.php (zusammengeführt über Module::getConfig()). Alle unter /melis/react-api/, Vertrag { success, data, error }; jeder Fetch sendet X-Requested-With: XMLHttpRequest und credentials: 'include'.

ProspectsMelisReactApiProspectController:

Methode & URLZweck
GET /prospectsKeyset-Liste (limit,search,site,type,dateFrom,dateTo,sort,dir,after) → {items,total,nextCursor}
GET /prospects/statsKPIs {total, thisMonth, avgPerMonth, anonymized}
GET /prospects/sitesOptionen für den Site-Filter
GET /prospects/typesEindeutige pros_type-Werte
GET /prospects/themesTheme-Item-Optionen für den Theme-Auswähler des Formulars
GET /prospects/:idEin Prospect (formatiert)
POST /prospects/saveNur Aktualisierung (kein Anlegen); Kontaktdatum & Typ serverseitig unveränderlich
DELETE /prospects/delete/:idEinen Prospect löschen

Themes & ItemsMelisReactApiProspectThemeController:

Methode & URLZweck
GET /prospect-themesKeyset-Liste der Themen → {items,total,nextCursor} mit itemCount
GET /prospect-themes/statsKPIs {total, withCode, items}
GET /prospect-themes/:idEin Thema {id,name,code,itemCount}
POST /prospect-themes/saveAnlegen (id=0) / Aktualisieren (Name erforderlich ≤45, eindeutig; Code bleibt erhalten, wenn nicht angegeben)
DELETE /prospect-themes/delete/:idEin Thema + Items + Übersetzungen löschen (Kaskade)
GET /prospect-themes/languagesCMS-Sprachen {languages:[{id,name,locale}]}
GET /prospect-themes/items?themeId=XItems eines Themas (Name in Session-Sprache)
GET /prospect-themes/items/:idEin Item {id,themeId,translations:{langId:text}}
POST /prospect-themes/items/saveEin Item anlegen/aktualisieren (≥1 nicht leere Übersetzung; Upsert/Löschen je Sprache)
DELETE /prospect-themes/items/delete/:idEin Item + dessen Übersetzungen löschen
ts
// update a prospect (no create)
await apiFetch<{id:number}>('/melis/react-api/prospects/save', {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ id: 3, siteId: 1, name: 'Paul Martin',
    email: 'paul.martin@example.com', message: '…', theme: null }),
})
// save a theme item (name per language)
await apiFetch<{id:number}>('/melis/react-api/prospect-themes/items/save', {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ id: 0, themeId: 2, translations: { '1': 'My invoices', '2': 'Mes factures' } }),
})

Beide Controller kommunizieren direkt mit den Tabellen über parametrisiertes SQL (AdapterInterface, Keyset- Listen über MelisReactKeysetListTrait) und bilden die Geschäftsregeln der Legacy-Version nach. Sie lösen weiterhin die Legacy-Log-Events aus (meliscmsprospects_toolprospects_save_end / _delete_end, meliscmsprospects_theme_save_end / _delete_end, meliscmsprospects_theme_item_save_end), sodass die Flash-/Log-Listener des Moduls weiterhin funktionieren.

Berechtigungen

Deklariert in config/react.capabilities.php (melisReactToolCapabilities), indiziert nach dem rechteführenden melisKey des Menüknotens. Capabilities::flatten() erzeugt punktierte Strings, die an MelisCan(melisKey, cap) in React und serverseitig an denyUnlessCan(cap) übergeben werden (Standard-Erlaubnis für eine nicht deklarierte Capability).

php
'melisprospects_tool_prospects_section' => ['list', 'edit', 'delete', 'export'], // NO create
'melisprospects_tool_themes_section' => [
    'actions' => ['create', 'list', 'edit', 'delete', 'export'],
    'tabs' => [
        ['key' => 'items', 'label' => 'tr_melis_cms_prospects_theme_items',
         'actions' => ['list', 'create', 'edit', 'delete']],
    ],
],
  • Prospects: list, edit, delete, export (kein create — ein Prospect entsteht nur über das öffentliche Kontaktformular).
  • Themes: create, list, edit, delete, export, plus der items-Unter-Tab (items, items.list, items.create, items.edit, items.delete).

Jede Controller-Aktion prüft zweifach: denyUnlessAccess() (Authentifizierung + MelisCoreRights::canAccess) dann denyUnlessCan('list') usw. save wählt anhand der ID zwischen edit und create.

Wichtige Services

Service-AliasRolle
MelisCmsProspectsService / MelisProspectsServiceHauptservice. saveProspectsDatas($datas, $prosId = null) legt einen Prospect an oder aktualisiert ihn; getProspectsDataForWidgets($widgetId = '') liefert die Anzahl Total / This month / Average zurück; getProspectsDataByDate($type, $date) zählt Registrierungen nach Datum; getWidgetProspects($identifier) ruft Daten für ein Widget ab.
MelisProspectsGdprAutoDeleteServiceVerwaltet den automatischen DSGVO-Löschzyklus (Modulliste, Tag-Liste, Benutzerlisten für Warnung / Zweitwarnung, Kontolöschung).

Tabellen-Gateways: MelisProspects, MelisCmsProspectsThemeTable, MelisCmsProspectsThemeItemTable, MelisCmsProspectsThemeItemTransTable.

Die React-Controller verwenden MelisCmsProspectsService nicht (sie fragen die Tabellen direkt ab); die klassischen Werkzeuge (Old-Ansicht), das Show-Form-Plugin, das Dashboard-Widget und die DSGVO-Listener setzen weiterhin darauf.

Front-Office

Das Controller-Plugin MelisCmsProspectsShowFormPlugin rendert das Kontaktformular im Front- End. Ziehen Sie den Show Form-Block aus dem Plugins-Panel des React-Seiteneditors auf eine Seite (unter Melis Cms Prospects). Sein Einstellungs-Modal behält drei Tabs:

Der React-Seiteneditor mit geöffnetem Plugins-Panel — der „Contact Form"-Block befindet sich unter der Gruppe „Melis Cms Prospects" und ist bereit, auf die Seite gezogen zu werden

Show Form — Tab „Field list": der Feldbaukasten — je Feld ein Show/Hide-Schalter und ein Mandatory-Kontrollkästchen; die Zeilen sind per Drag-and-drop sortierbar, sodass ihre Reihenfolge die Formularreihenfolge ist

TabSteuerelemente
PropertiesRendering-Template (template_path) und Quell-Site (pros_site_id).
Field listFeldbaukasten — je Feld ein Show/Hide-Schalter und ein Mandatory-Kontrollkästchen (nur aktiv, wenn Show eingeschaltet ist); ziehen Sie die Zeilen, um die Formularreihenfolge festzulegen. Felder: pros_name, pros_company, pros_country, pros_email, pros_telephone, pros_message.
ThemesDas Thema, das die Betreff-Dropdown-Liste des Formulars befüllt.

Konfigurationsdatei: config/plugins/MelisCmsProspectsShowFormPlugin.config.php. Front-Template: view/.../plugins/prospects-form.phtml. Auf dem Back-Office-Dashboard stellt das Widget Prospects Statistics (MelisCmsProspectsStatisticsPlugin, Bereich MelisMarketing) Registrierungen im Zeitverlauf grafisch dar.

Das Dashboard-Widget „Prospects statistics" — ein Diagramm der Registrierungen nach Tag/Monat/Jahr sowie eine Tabelle der neuesten Prospects

Datenbanktabellen

TabelleInhalt
melis_cms_prospectsEin erfasster Lead: Site, Typ, Thema, Name, E-Mail, Telefon, Nachricht, Firma, Land, Kontaktdatum, DSGVO-Letztdatum. PK: pros_id.
melis_cms_prospects_themesBetreff-Themen (pros_theme_name, pros_theme_code). PK: pros_theme_id.
melis_cms_prospects_theme_itemsItems, die zu einem Thema gehören. PK: pros_theme_item_id.
melis_cms_prospects_theme_items_transSprachspezifische Übersetzungen der Theme-Items. PK: item_trans_id.

Event-Hooks

Mit MelisCmsProspects als Ziel-Identifikator anhängen:

Event-NameAusgelöst von
meliscmsprospects_toolprospects_save_start / _endProspects-Werkzeug (klassisch + React-Controller)
meliscmsprospects_toolprospects_delete_start / _endProspects-Werkzeug (klassisch + React-Controller)
meliscmsprospects_theme_save_end / _delete_endThemes-Werkzeug (klassisch + React-Controller)
meliscmsprospects_theme_item_save_endTheme-Items (klassisch + React-Controller)
php
$sharedEvents->attach(
    'MelisCmsProspects',
    'meliscmsprospects_toolprospects_save_end',
    $fn,
    50
);

DSGVO-Listener (Benutzerinformationen, Extrahieren, Löschen, automatisches Löschen) sind in src/Module.php verdrahtet. Die DSGVO- Feldzuordnungen befinden sich in config/app.gdpr.php.

Wichtige Dateien

BereichPfad (unter vendor/melisplatform/melis-cms-prospects/)
Modulkonfiguration / Routen / Servicesconfig/module.config.php
React-api-Routen + Invokablesconfig/react-api.php
React-Berechtigungenconfig/react.capabilities.php
Back-Office-Interface-Baumconfig/app.interface.php
Klassische Werkzeug-Tabellen & -Formulareconfig/app.tools.php
Konfiguration des Templating-Pluginsconfig/plugins/MelisCmsProspectsShowFormPlugin.config.php
Konfiguration des Dashboard-Widgetsconfig/dashboard-plugins/
DSGVO-Feldzuordnungconfig/app.gdpr.php
React-API-Controllersrc/Controller/MelisReactApiProspectController.php, MelisReactApiProspectThemeController.php
Klassische Controllersrc/Controller/ToolProspectsController.php, MelisCmsProspectsThemesController.php, MelisCmsProspectsThemeItemsController.php
Hauptservicesrc/Service/MelisCmsProspectsService.php
DSGVO-Auto-Delete-Servicesrc/Service/
Front-Formular-Pluginsrc/Controller/Plugin/MelisCmsProspectsShowFormPlugin.php
Dashboard-Widgetsrc/Controller/DashboardPlugins/MelisCmsProspectsStatisticsPlugin.php
React-Bricks (Quelle / Build)ui-react/src/public/ui-react/brick.js + brick.manifest.json
Tabellen-Gatewayssrc/Model/Tables/
DSGVO-Listener & Bootstrapsrc/Module.php, src/Listener/

Siehe auch: Modulreferenz · melis-cms · melis-core