Objekte in Modulen

Hallo Leute,

für mich eine kleine Herausforderung: Wie bekomme ich ein benutzerdefiniertes Objekt in einem IPS „nachgebildet“?
Beispiel:

private static $configurableOptions = array(
        'defaultSpan',
        'defaultTimeZone',
        'defaultWeekStart',
        'disableCharacterReplacement',
        'skipRecurrence',
        'useTimeZoneWithRRules',
    );

Oder denke ich zu kompliziert?

Joachim

Irgendwie ist die Frage und der Code nicht passend bzw. nicht verständlich was du wirklich willst.
Objekte werden mit dem Schlüsselwort new aus Klassen erzeugt.
Was du da hast ist ein Array welches zu einer Klasse gehört.
Michael

Hallo Michael,

Du hast recht…:stuck_out_tongue:

Was ich eigentlich vor habe: Die ics-parser-PHP-Klasse möglichst „einfach“ in ein Modul zu integrieren…

Wahrscheinlich ist mein Ansatz schon falsch?

Joachim

Nutzt doch einfach das Beispiel welche dort verlinkt ist.
ics-parser/index.php at master · u01jmg3/ics-parser · GitHub

Also mit der autoload die Dateien laden.
Mit new ICal erzeugst du das Objekt aus dem Kalender File.

Weiß zwar nicht warum wir ein x-ten ICAL/ICS Kalender als Modul brauchen; gibt doch schon einige?

Michael

Ja, leider habe ich davon keines gefunden was vollständig funktioniert. Das Modul wird aktuell (und offiziell) im Moment nicht weiter gepflegt, das Skript zeigt bei mir nicht alles an, auf Nachfrage hat dazu keiner Stellung bezogen…
Hätte gerne etwas fertiges genutzt…

Da ich - wenn es denn funktionsfähig ist - gerne teile, wäre es schön, wenn man es mit dem Modul ausliefern könnte, das hört sich bei Dir jetzt nicht so an?

Joachim

Brauch man auch nicht selber mit ausliefern.
Einfach als Submodul in Git einbinden (unterhalb von libs).
Aber erst ab IPS5.0 möglich.
Michael

Hallo Michael,

das war ein guter Anstoss - habe es in der Art schon in zwei von meinen Modulen gemacht…:rolleyes:

Ich habe jetzt die ICal.php unter libs/ICal/ICal.php in meinem Modul abgelegt.

Versuche den Aufruf wie hierbeschrieben aus meinem Modul heraus:

set_include_path(__DIR__.'/libs');
				require_once (__DIR__ . '/libs/ICal/ICal.php');
				
				try {
				    $ical = new ICal(false, array(
					'defaultSpan'                 => 2,     // Default value
					'defaultTimeZone'             => 'UTC',
					'defaultWeekStart'            => 'MO',  // Default value
					'disableCharacterReplacement' => false, // Default value
					'skipRecurrence'              => false, // Default value
					'useTimeZoneWithRRules'       => false, // Default value
				    ));
				    // $ical->initFile('ICal.ics');
				    // $ical->initUrl('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics');
				} catch (\Exception $e) {
				    	die($e);
					$this->SendDebug("Read", "Fehler bei der Obejkterstellung!", 0);
					$this->SetStatus(202);
				}

…bekomme aber die Fehlermeldung, das die Klasse ICal nicht gefunden wurde.

Was könnte falsch sein?

Joachim

Das use im Beispiel ist schon wichtig :wink:
Michael

…hatte ich schon drin, habe ich jetzt wieder reingenommen, macht aber eine Fehlermeldung:

18.09.2018 22:19:34 | IPS2Owncloud | <br />
<b>Parse error</b>:  syntax error, unexpected 'use' (T_USE) in <b>/var/lib/symcon/modules/IPS2Owncloud/IPS2Owncloud/module.php</b> on line <b>118</b><br />

Der Code im relevanten Ausschnitt:

set_include_path(__DIR__.'/libs');
				require_once (__DIR__ . '/libs/ICal/ICal.php');
				
				use ICal\ICal;
				
				try {
				    $ical = new ICal(false, array(
					'defaultSpan'                 => 2,     // Default value
					'defaultTimeZone'             => 'UTC',
					'defaultWeekStart'            => 'MO',  // Default value
					'disableCharacterReplacement' => false, // Default value
					'skipRecurrence'              => false, // Default value
					'useTimeZoneWithRRules'       => false, // Default value
				    ));
				    // $ical->initFile('ICal.ics');
				    // $ical->initUrl('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics');
				} catch (\Exception $e) {
				    	die($e);
					$this->SendDebug("Read", "Fehler bei der Obejkterstellung!", 0);
					$this->SetStatus(202);
				}

Im Beispiel wird ja die „autoload“ angesprochen. Liegt es daran? Oder sollte der Pfad dann nicht in Gänze angegeben werden?

Joachim

Das liegt daran, dass use an der Stelle nicht erlaubt ist.
PHP: Namespaces verwenden: Aliase/Importieren - Manual
Michael

…damit wäre der Ansatz als gescheitert zu betrachten?[emoji848]

Nein, du musst es nur richtig machen…
Lies dir doch die Seite der PHP Doku durch: Gültigkeitsbereiche für Importe.
Michael

…irgendwie bekomme ich das nicht hin - habe diverse Versuche gestartet, sobald ich aber „use“ benutzen möchte, geht das ganze Modul in einen Fehler…:frowning:

Joachim

Du hast einen Pull Request.
Verstehe aber nicht was da so schwer ist :wink:
Wirklich wie das Beispiel, das use muss im globalen Bereich sein.
Michael