Ich habe noch einen Wunsch. Und zwar hätte ich gerne noch eine Update-Method die nach einem Modulupdate aufgerufen wird. Damit möchte ich Anpassungen die nach einem Modulupdate notwendig sind durchführen lassen ohne das der Benutzer hier aktiv werden muss und ggf. etwas bei ihm nicht mehr funktioniert.
Das wäre inzwischen wirklich wichtig. Da viele alte Module des PHP-SDK schon ganz schön viel ‚Müll‘ mit sich rumtragen.
Michael
Wäre ich auch SEHR dafür - hab immer wieder Kram im Modul-Code der sowas macht - wäre dann viiiel schöner und einfacher!
Danke und Grüße,
Chris
Tatsächliche wäre das für beides Möglich. Was hältst du von sowas?
paresy
Feature landet zum nächsten 7.0er Update. Für IPSModule und IPSModuleStrict.
paresy
Jetzt hätte ich einen Fall wo ich genau die Funktion zum Einsatz bringen möchte.
Ich habe eine List, welche ich in ein Tree konvertieren möchte! Wenn ich das richtig verstehe, wird die funktion immer beim Start und beim Update aufgerufen, d.h.
1.) die alte Liste darf ich nicht aus dem Create-Prozess (und form.json) löschen
2.) ich muss mir irgendwie merken ob ich die Konvertierung schon vorgenommen habe
Richtig?
Mein Vorgehen wäre jetzt …
1.) Ich lege ein Tree Property parallel zur List an
2.) setzt das List Property auf visible false (damit da niemand mehr ran kommt)
3.) in der Migrate Methode mache ich die Konvertierung, z.B. nur wenn der Tree keine Values hat
Korrekt?
Frage: sollte man den Test ob Tree keine Values haben über ReadPropertyString machen oder über die übergebenen JSON Data machen?
Danke & Ciao
Heiko
doch. einfach weglassen.
Migrate hat dann genau einmal die Chance das alte Property zu nutzen.
Nein, nur prüfen ob das alte Property noch existiert.
Nur das JSON nutzen (als Objekt, nicht als Array) und das einfach zurückgeben.
Beispiel von mir, ConditionBoolean
ist alt und wird zu Value
migriert.
public function Create(): void
{
parent::Create();
$this->RegisterPropertyInteger('Source', 1);
$this->RegisterPropertyString('Value', '[]');
// ConditionBoolean ist alt
$this->SourceID = 1;
}
public function Migrate(string $JSONData): string
{
$Data = json_decode($JSONData);
if (property_exists($Data->configuration, 'ConditionBoolean')) {
$VarId = $Data->configuration->Source;
if (IPS_VariableExists($VarId)) {
$Source = IPS_GetVariable($VarId);
switch ($Source['VariableType']) {
case VARIABLETYPE_BOOLEAN:
$Value = (bool) $Data->configuration->ConditionBoolean;
break;
case VARIABLETYPE_INTEGER:
$Value = (int) $Data->configuration->ConditionValue;
break;
case VARIABLETYPE_FLOAT:
$Value = (float) $Data->configuration->ConditionValue;
break;
case VARIABLETYPE_STRING:
$Value = $Data->configuration->ConditionValue;
break;
}
$Data->configuration->Value = json_encode($Value);
}
$this->SendDebug('Migrate', json_encode($Data), 0);
$this->LogMessage('Migrated settings:' . json_encode($Data), KL_MESSAGE);
}
return json_encode($Data);
}
Michael
Hi,
ich habe gerade etwas, was mich in den wahnsinn treibt…
Ich muss ein Attribut (VIN) in eine property (VehicleID) wandeln. Dazu nutze ich diese funktion
public function Migrate($JSONData)
{
parent::Migrate($JSONData);
$Data = json_decode($JSONData);
if (property_exists($Data->attributes, 'VIN')) {
$Data->configuration->VehicleID = $Data->attributes->VIN;
$this->LogMessage('MIGRATION: ' . json_encode($Data), KL_MESSAGE);
}
return json_encode($Data);
}
Laut Log sieht es auch gut aus, die VehicleID wird gesetz. Nun habe ich in der Form ein entsprechendes Feld im elements bereich
{
"type": "ValidationTextBox",
"caption": "Vehicle Identification number",
"name": "VehicleID"
}
Ich würde nun erwarten, dass, wen ich die Form öffne, auch den Wert sehe. Leider ist das Feld leer.
Ich habe mir mit
print_r(json_decode(IPS_GetConfiguration(INSTANZ),true));
die Konfig angesehen und dort steht korrekt der übernommene Wert.
[VehicleID] => 121
Also, dachte ich mir, habe ich in der Form einen Schreibfehler, also mit
print_r(json_decode(IPS_GetConfigurationForm(INSTANZ),true));
die Form ausgegeben…
[9] => Array
(
[caption] => Vehicle Identification number
[name] => VehicleID
[type] => ValidationTextBox
)
Muss ich noch irgendwas machen? Die Instanz-Fenster sind immer geschlossen, ich habe auch schon die Prokonsole geschlossen, nix…
Als gegenprobe habe ich in der Form im passendem Feld mal etwas eingetragen (zb „abc“) und gespeichert. Siehe da, dieser wert wird übernommen und auch immer wieder angezeigt.
Habe ich einen Bug gefunden oder übersehe ich da was? Kann das auch ein anderer Nachvollziehen? Es handelt sich um die letzte 8er Version von symcon
Viele Grüße
Hast du die Eigenschaft mir Registerpropery im create registriert?
Michael
ja, sonst würde die gegenprobe auch nicht funktionieren. Ich setze das jetzt mal anders um…