Dynamische Einstellungen
Der K3 erlaubt die Definition von Einstellungen (wie Texte, Zahlen, Vektoren, Bilder etc.) für eine Erweiterung. Diese können dann je Konfigurator gesetzt werden. Das ergibt insbesondere dann Sinn, wenn eine Erweiterung von mehreren Kunden oder in verschiedenen Kontexten wiederverwendet wird.
Die Einstellung wird durch den Entwickler im Code der Erweiterung registriert und eingebunden und durch den Admin eingepflegt. Der Endkunde bekommt davon nichts mit uns sieht nur das, was der Admin eingepflegt hat. Dass die Einstellung dynamisch ist, weiß der Endkunde nicht.
Merkmale werden vom Endkunden geändert, dynamische Einstellungen vom Admin.
Registrierung
Neue Einstellungen werden mit
const settings: DynamicSetting[] = [
{
key: 'additionalPriceDialogText',
valueType: DynamicSettingValueType.TRANSLATION,
label:
'Hier können Sie einen Text festlegen, der unter der Preisübersicht erscheint.',
defaultValue: '',
},
{
key: 'lightPosition',
valueType: DynamicSettingValueType.ARRAY,
label: 'Legen sie die Position der Lampe fest',
defaultValue: [0, 0, 0],
isValid: vectorValidator(3),
},
{
key: 'isNightmodeUnlocked',
valueType: DynamicSettingValueType.BOOLEAN,
label: 'Soll der Nutzer in den Nachtmodus wechseln könnnen?',
defaultValue: false,
},
{
key: 'screwDiameter',
valueType: DynamicSettingValueType.NUMBER,
label: 'Wie dick sollen die Schrauben (in mm) sein?',
defaultValue: 8,
},
];
<K3Main extensions={extensions} additionalDynamicSettings={settings} />
gesetzt. Die Parameter einer Einstellung sind im Typ DynamicSetting
dokumentiert. Es gibt:
key
: Entweder Teil desDynamicSettingsKeys
enum oder ein beliebiger string.valueType
:DynamicSettingValueType
enum: String (unübersetzt), Number, Translation, Boolean, Image oder Array (braucht einen validator)label
: String. Wird im Admin Panel beim enstprechenden Feld angezeigt. Wenn es das nicht gibt wird bei Translations der default Value genutzt, sonst der keyisValid
:Validator
. Funktion die den Value übergeben bekommt und[boolean (isValid?), string (error message)]
zurück gibt. Für ein numerisches Array gibt es dievectorValidator
HOF. Für einen Vektor der Länge 5 würde manisValid: vectorValidator(5)
nutzen. Standardmäßig wird für arrays ein einfacher validator verwendet, der ein,
separated array erwartet.parser
: Nur fürDynamicSettingValueType.ARRAY
relevant. Funktion die den Value als string übergeben bekommt und daraus ein JS Array macht. Gibt es keine Angabe, wird ein Standard Parser, der für die meisten Anwendungsfälle ausreichend sein sollte, verwendet.defaultValue
: Standard-Wert, wenn keiner über settings gesetzt wird. Gibt es keine Angabe, wirdundefined
verwendet.
Setzen
Das Feld zur Eingabe von Einstellungen kann mit
<EditDynamicSettings
keys={[
DynamicSettingsKeys.NAVBAR_BACK,
DynamicSettingsKeys.NAVBAR_NEXT,
]}
/>
eingebunden werden. Statt keys können auch inline neue settings definiert werden (siehe oben). Die Einstellungen können entweder in der Sidebar angezeigt werden oder über display="dialog"
in einem Dialog.
Wenn eine andere Komponente zum Starten der Einstellungen genutzt werden soll, kann man DynamicSettingsLaunch
verwenden, und als component eine beliebige Komponente mit einer onClick
prop verwenden.
Programatisch können settings mit den useSetSetting(s)
hooks gesetzt werden.
Lesen
Übersetzungen werden am besten mit dem useDynamicTranslation
hook abgerufen. Etwa so:
const translate = useDynamicTranslation();
// mit additionalPriceDialogText könnte der Admin einen Text der unter dem Preis-Dialog auftritt pflegen.
return <Typography>
{translate("additionalPriceDialogText")}
</Typography>
Arrays werden am besten mit dem useDynamicSettingArray
hook abgerufen. Etwa so:
const getArray = useDynamicSettingArray();
// Mit light position könnte der Admin eine Lampe in der 3D Szene positionieren
const lightPosition = getArray<number[]>("lightPosition");
Normale Settings mit useDynamicSetting
so:
const getSetting = useDynamicSetting();
// isNightmodeUnlocked würde beispielsweise, wenn durch den Admin auf true gesetzt, dem Konfigurator ein Button zum Wechsel in einen Nachtmodus hinzufügen
const isNightmodeUnlocked = getSetting<boolean>("isNightmodeUnlocked");
// screw diameter könnte vom Admin eingestellt werden. Je nach Einstellung könnten im 3D Modell die Schrauben unterschiedlich dick sein.
const screwDiameter = getSetting<number>("screwDiameter");
Beispiel
Ein Code-Complete Beispiel zu dynamischen Einstellungen findet ihr hier.