ich habe ein problem mit der Funktion IPS_CreateScript(0) die Funktion wird soweit ohne Fehlermeldung ausgeführt.
Wenn ich allerdings anschließend in den Objektbaum gehe sehe ich das der Scriptname grün geschrieben ist und auch keinen Wert enthällt.
Sobald ich versuche das Script zu bearbeiten und anschließend zu speichern bekomme ich folgende Fehlermeldung „Cannot create file „C:\IP-Symcon\script“. Das System kann den angegebenenen Pfad nich finden“.
Was mache ich falsch?
Ich benutze IP-Symcon Version 2.20
Hallo,
es wird daran liegen, dass noch keine entsprechende Datei (*.ips.php) im Script-Ordner existiert.
ich habe mir mal eine Funktion geschrieben, die eine entsprechende Datei anlegt und auch gleich einen beliebigen Text in das Skript schreibt:
$ScriptNAME: Name, wie er in IPS angezeigt wird
$ParentID: ID der Kategorie, Instanz, etc. unter der das Skript angelegt werden soll
$ScriptTEXT: Inhalt des Skripts
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $IPS_SELF;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
fwrite($fh, $ScriptTEXT);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
// echo "Die Skript-ID lautet: ". $ScriptID;
}
}
diese Probleme hatte ich auch, als ich für Helmut seine Schaltsteckdosen ein Installationsskript zusammen bastelte.
Der nachfolgende Skriptauszug, welcher als Basis ein zuvor gefüttertes Array verwendet, funktioniert und soll nur als Gerüst für die Vorgehensweise dienen:
for($i=0; $i < count($Scripteanlegen); $i++) // For Schleife einklingeln
{
$Scripteanlegen [$i][0] = IPS_CreateScript(0); // neuen Script anlegen und ID merken
IPS_SetName($Scripteanlegen [$i][0], $Scripteanlegen [$i][1].$Name.$Scripteanlegen [$i][3]); // dem Skript den neuen, aussagekraeftigen, Namen verpassen
IPS_SetParent($Scripteanlegen [$i][0], $ModID); // den Skript im Hierarchiebaum richtig plazieren
IPS_SetInfo($Scripteanlegen [$i][0], "$Info"); // Info zur Variable hinzufügen
$Scripteanlegen [$i][4] = $Scripteanlegen [$i][0]. ".ips.php"; // Skriptdateinamen zusammenhäkeln
$handle = fopen($Scripteanlegen [$i][4], "w"); // diesen Befehl findet man nicht im IPS Manual, da hilft nur das Suchen im PHP Handbuch
fwrite( $handle,
$InfoScriptePrefix.chr(13).chr(10).$Scripteanlegen [$i][2].chr(13).chr(10).chr(13).chr(10). $InfoScripteSuffix);
fclose( $handle);
IPS_SetScriptFile($Scripteanlegen [$i][0], $Scripteanlegen [$i][4]); // ohne das Zuweisen zur Datei lüppt dat nich
} // For Schleife beenden
Das Geheimnis ist das manuelle Erzeugen der Skriptdatei und der abschliessende Befehl IPS_SetScriptFile.
habe jetzt nur ein Problem versuche nach den erzeugen des Scripts den Script namen im Scripts ordner zu setzen. Da dieser mit einem Inculde Befehl in ein Externes Script muss.
<?
//sucht die ID des übergeordneten Objekts
$ParentID = IPS_GetObject($IPS_SELF);
$ParentID = $ParentID['ParentID'];
$VarID_RGBFader = 665544;
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $IPS_SELF;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
fwrite($fh, $ScriptTEXT);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
// echo "Die Skript-ID lautet: ". $ScriptID;
return $ScriptID;
}
}
$ScriptNAME = 'variablenidsrgbsteuerung';
$ScriptID = CreateScriptByName($ScriptNAME,$ParentID,
'<?
define("chromo_id", XXXXX /**/, true); // ID der ChromoFlex Instanz
define("dimmer", '.$VarID_RGBFader.' /**/, true); // ID der Variable DIMMER
define("dimmer_prg", XXXXX /**/, true); // ID der Variable DIMMER_PRG
define("programm", XXXXX /**/, true); // ID der Variable PROGRAMM (Programm kommen von 1-18)
define("rgbfader", XXXXX /**/, true); ; // ID der Variable RGB Steuerung mit dem HEXCOLOR Profil
?>'
);
$ScriptPath = "variablenidsrgbsteuerung.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
?>
Hier meine ersten Versuche. Script wird sauber angelegt Inhalt stimtt auch aber bekomme den namen nicht gesetzt.
Parse error: syntax error, unexpected ‚SELF‘ (T_STRING) in [Scripte\Rolläden est\Script einrichten] on line 7
Das Script sieht so aus:
<?
$ScriptNAME = "Mein Script";
$ParentID = 32468; /*[Scripte\Rolläden est]*/;
$ScriptTEXT = '
<?
echo ("Das ist ein Text!".$_IPS['SELF']);
phpinfo();
?>';
CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT);
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $IPS_SELF;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
fwrite($fh, $ScriptTEXT);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
// echo "Die Skript-ID lautet: ". $ScriptID;
}
}
?>
Ich scheitere an den ’ und " im einzufügenden Text. Gibt es dafür eine Lösung? Ich möchte den Scriptinhalt eines bestehenden Scriptes in ein neues dynamisch erzeugtes einfügen.