WiFiManager: add template customization hooks (callback, granular default registrations, rebuild); switch to RootSelector for overridable WM_ROOT_TEMPLATE; minor menu logic fixes

This commit is contained in:
2025-11-16 23:05:12 +10:00
parent 3054123b7f
commit d8046146b5
4 changed files with 84 additions and 9 deletions
@@ -64,6 +64,22 @@ class WiFiManagerServer {
static const char* tplGetMenu();
static const char* tplGetStatus();
// Template customization API
// Consumers can register a callback to customize placeholders
void registerTemplateSetupCallback(std::function<void(PlaceholderRegistry&)> cb) { _tplSetupCallback = cb; }
// Convenience helpers to register our defaults (granular + all)
void registerDefaultStyles(PlaceholderRegistry& reg);
void registerDefaultScripts(PlaceholderRegistry& reg);
void registerDefaultPageTitle(PlaceholderRegistry& reg);
void registerDefaultSubtitle(PlaceholderRegistry& reg);
void registerDefaultMenu(PlaceholderRegistry& reg);
void registerDefaultStatus(PlaceholderRegistry& reg);
void registerDefaultPlaceholders(PlaceholderRegistry& reg);
// Rebuild registry with defaults and optional customizer
void rebuildPlaceholderRegistry(std::function<void(PlaceholderRegistry&)> customizer = nullptr);
// Create server instance
void createServer(uint16_t port);
@@ -93,6 +109,7 @@ class WiFiManagerServer {
// Shared DFTE placeholder registry
std::unique_ptr<PlaceholderRegistry> _tplRegistry;
std::function<void(PlaceholderRegistry&)> _tplSetupCallback;
// Singleton instance
static WiFiManagerServer* s_instance;
@@ -0,0 +1,17 @@
/**
* RootSelector.h
* Allows overriding the root template header via build flag
* Define WM_CUSTOM_ROOT_TEMPLATE_HEADER to a quoted header path.
*/
#ifndef _WM_ROOT_SELECTOR_H_
#define _WM_ROOT_SELECTOR_H_
#ifdef WM_CUSTOM_ROOT_TEMPLATE_HEADER
#include WM_CUSTOM_ROOT_TEMPLATE_HEADER
#else
#include "Root.h"
#endif
#endif // _WM_ROOT_SELECTOR_H_
+1 -1
View File
@@ -13,7 +13,7 @@
#include "templates/HTML.h"
#include "templates/CSS.h"
#include "templates/JS.h"
#include "templates/Root.h"
#include "templates/RootSelector.h"
#include <TemplateEngine.h>
#if defined(ESP8266) || defined(ESP32)
+49 -8
View File
@@ -66,6 +66,49 @@ const char* WiFiManagerServer::tplGetStatus() {
return buf.c_str();
}
void WiFiManagerServer::registerDefaultStyles(PlaceholderRegistry& reg) {
reg.registerProgmemData("%STYLES%", CSS_STYLE);
}
void WiFiManagerServer::registerDefaultScripts(PlaceholderRegistry& reg) {
reg.registerProgmemData("%SCRIPTS%", JS_SCRIPT);
}
void WiFiManagerServer::registerDefaultPageTitle(PlaceholderRegistry& reg) {
reg.registerRamData("%PAGE_TITLE%", &WiFiManagerServer::tplGetPageTitle);
}
void WiFiManagerServer::registerDefaultSubtitle(PlaceholderRegistry& reg) {
reg.registerRamData("%SUBTITLE%", &WiFiManagerServer::tplGetSubtitle);
}
void WiFiManagerServer::registerDefaultMenu(PlaceholderRegistry& reg) {
reg.registerRamData("%MENU%", &WiFiManagerServer::tplGetMenu);
}
void WiFiManagerServer::registerDefaultStatus(PlaceholderRegistry& reg) {
reg.registerRamData("%STATUS%", &WiFiManagerServer::tplGetStatus);
}
void WiFiManagerServer::registerDefaultPlaceholders(PlaceholderRegistry& reg) {
registerDefaultStyles(reg);
registerDefaultScripts(reg);
registerDefaultPageTitle(reg);
registerDefaultSubtitle(reg);
registerDefaultMenu(reg);
registerDefaultStatus(reg);
}
void WiFiManagerServer::rebuildPlaceholderRegistry(std::function<void(PlaceholderRegistry&)> customizer) {
_tplRegistry = std::unique_ptr<PlaceholderRegistry>(new PlaceholderRegistry(12));
registerDefaultPlaceholders(*_tplRegistry);
if (customizer) {
customizer(*_tplRegistry);
} else if (_tplSetupCallback) {
_tplSetupCallback(*_tplRegistry);
}
}
void WiFiManagerServer::setupTemplateEngine() {
// Initialize shared placeholder registry once
if (!_tplRegistry) {
@@ -74,15 +117,13 @@ void WiFiManagerServer::setupTemplateEngine() {
_tplRegistry->clear();
}
// Register PROGMEM assets
_tplRegistry->registerProgmemData("%STYLES%", CSS_STYLE);
_tplRegistry->registerProgmemData("%SCRIPTS%", JS_SCRIPT);
// Register all default placeholders
registerDefaultPlaceholders(*_tplRegistry);
// Register dynamic RAM getters
_tplRegistry->registerRamData("%PAGE_TITLE%", &WiFiManagerServer::tplGetPageTitle);
_tplRegistry->registerRamData("%SUBTITLE%", &WiFiManagerServer::tplGetSubtitle);
_tplRegistry->registerRamData("%MENU%", &WiFiManagerServer::tplGetMenu);
_tplRegistry->registerRamData("%STATUS%", &WiFiManagerServer::tplGetStatus);
// Allow consumers to customize placeholders
if (_tplSetupCallback) {
_tplSetupCallback(*_tplRegistry);
}
}
void WiFiManagerServer::createServer(uint16_t port) {