Migration von Instanzen nach Modulupdate

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.

@paresy

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! :slight_smile:

Danke und Grüße,
Chris

@paresy Was für IPSModuleStrict?

Tatsächliche wäre das für beides Möglich. Was hältst du von sowas?

paresy

1 „Gefällt mir“

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

1 „Gefällt mir“