Werte im Konfigurationsformular nur bei Erstanlage der Instanz

Evt. ist es ja für den ein oder anderen hilfreich.
Mir kam die Idee, gewisse Eigenschaften nur bei der Erstanlage der Instanz einstellen zu können.
In meinem speziellen Fall ging es darum, das Logging für die erzeugten Variablen nur einmalig beim Start über alle Variablen zu definieren. Im Anschluss sollen die Einstellungen des Anwenders bestehen bleiben und ggf. pro Variable manipuliert werden.

Folgendes kurzes Beispiel ist dabei rausgekommen:

class ConfigurationExample extends IPSModule
{
    const CREATE_TIME = "IPSCreate";

    public function Create()
    {
        parent::Create();

        //Buffer mit Create-Time erstellen
        $this->SetBuffer(self::CREATE_TIME, round(microtime(true)));
		
		$this->RegisterPropertyBoolean("CheckBoxProperty", true);
    }

    private function CheckCreating()
    {
        $ret     = false;
        $aktTime = round(microtime(true));
        $creTime = (float) $this->GetBuffer(self::CREATE_TIME);
		
		//Innerhalb der ersten 2 Sekunden zulassen, sollte auch auf langsamen Systemen reichen
        if (($aktTime - $creTime) <= 2) 
        {
            $ret = true;
        }
        return $ret;
    }

    public function GetConfigurationForm()
    {
		$elements = '{ "type": "Label", "label": "Dieser Text ist immer sichtbar!" },';

        //Nur beim ersten Mal anzeigen
        if ($this->CheckCreating())
        {
            $elements .= '{ "type": "Label", "label": "ACHTUNG! Diese Einstellung steht nur bei Erstanlage der Instanz zur Verfügung!" },';
            $elements .= '{ "type": "CheckBox", "name": "CheckBoxProperty", "caption": "CheckBoxProperty - Caption" },';
        }

		return '{"elements": [ ' . $elements . ' ]}';
    }

    public function ApplyChanges()
    {
        parent::ApplyChanges();
		
        //Einstellung nur bei erstem erstellen auswerten
        if ($this->CheckCreating())
        {
			//Do Something special
        }
    }
}

Anregungen, Kritik usw. erwünscht, vor allem wenn es einen eleganteren Weg geben sollte.

SetBuffer ist flüchtig. Nach einem Neustart ist der wieder leer :wink:

Meine Persönliche Meinung ist, dass das Logging aus einem PHP Modul gar nicht angefasst werden sollte. Eben um den von dir beschriebenen Effekt zu vermeiden. Falls wirklich erforderlich, würde ich eine echte Property hinzufügen, welche steuert, ob das Logging aktiviert oder deaktiviert werden soll, welches per Default auf Inaktiv steht.

paresy

Das Create wird aber ja beim Start des Dienstes aufgerufen und ist somit wieder gefüllt. Und ich glaube kaum das es jemand in den 2 Sekunden schafft die Konsole zu öffnen und dann die Instanz, nachdem der Dienst gestartet wurde :wink:

Das mit dem Logging der Variablen war ein Beispiel wo ich auf dieses Konstrukt gekommen bin.
Evt. gib es ja den ein oder anderen Modul-Entwickler der sich die Möglichkeit für eine Einstellung wünscht und bisher hatte ich in diese Richtung noch nichts gefunden.

Andere Möglichkeit wäre ja auch einen Button einzublenden, der einmalig einen Token oder was auch immer von einem Webservice generiert…