hi
ich wollt euch an meiner eigenentwicklung teilhaben lassen.
ich habe gesehen, dass mehrere gerne String-Variablen übers Webfront ändern würden.
Folgende Anleitung bezieht sich auf IPS 2.1. Gewähr übernehme ich nicht. Vorher ein Backup machen wäre sinnvoll.
Konventionen:
Es können nur Varablen von Instanzen geändert werden. Also wie in der Doku beschrieben eine Variable unterhelb eines Dummy Moduls erzeugen. Des weiteren muss ein ein Sktipt für die „Eigene Aktion“ eingestellt sein.
Das Skript sollte wie folgt lauten:
<?
SetValue($IPS_VARIABLE, $IPS_VALUE);
?>
Ein neues Variablenprofil mit dem Namen „InPlaceEdit“ (bitte ohne Anführungszeichen und auf die Groß- und Kleinschreibung achten) muss erzeugt und der entsprechenden Variablen zugeordnet werden.
Nun müssen nur noch zwei Dateien wie folgt angepasst werden:
IP-Symcon\webfront\data\IPS.php
nachfolgendes bitte vor der Zeile case „doAction“: einfügen:
case "doStringAction":
$result = "success";
if ((int)$_GET['VariableCustomAction'] > 0)
{
$linkedID = getLinkedID((int)$_GET['VariableID']);
$vars = array();
$vars['IPS_SENDER'] = "WebFront";
$vars['IPS_VARIABLE'] = $linkedID;
$vars['IPS_VALUE'] = utf8_decode($_GET['Value']);
$vars['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
if ($linkedID != (int)$_GET['VariableID']) { $vars['IPS_LINK'] = (int)$_GET['VariableID']; }
$cmdResult = encodeString(IPS_RunScriptWaitEx(getLinkedID((int)$_GET['VariableCustomAction']), $vars));
if (trim($cmdResult) !== "")
{
raiseError($cmdResult, "");
}
else
{
echo prepareContent(array("sid"=>SID, "cmdResult"=>$result));
}
}
break;
Nun zur zweiten Datei. Hier müssen zwei kleine Änderungen durchgeführt werden:
\IP-Symcon\webfront\webfront\modules\ips\BasicView.js
Zuerst muss folgende Zeile (ca. Zeile 965)
if (variableData.VariableType === 3 && variableData.VariableProfile.ProfileName === "~TextBox")
durch
if (variableData.VariableType === 3 && (variableData.VariableProfile.ProfileName === "~TextBox" || variableData.VariableProfile.ProfileName === "InPlaceEdit"))
ersetzt werden
Ca. zwei Zeilen darunter findet man folgende Zeile (ca. Zeile 967):
var bar = this.renderTextBoxBar(container.parentNode.id + "Bar", container, container.parentNode, variableData, value);
direkt nach dieser Zeile muss folgendes eingefügt werden:
if ( variableData.VariableProfile.ProfileName === "InPlaceEdit" ) {
// ToDo:
container.VariableIdent="DUMMY";
var tempvalue = bar.firstChild.firstChild.innerHTML;
dojo.require("dojo.parser");
dojo.require("dijit.InlineEditBox");
dojo.require("dijit.form.TextBox");
bar.firstChild.firstChild.innerHTML = "<span dojoType=\"dijit.InlineEditBox\" title=\"\" onsave=\"alert(\"test\");\">" + tempvalue + "<script type=\"dojo/connect\" event=\"onChange\" args=\"value\"> var string = value; var utftext = \"\"; for (var n = 0; n < string.length; n++) {var c = string.charCodeAt(n); if (c < 128) {utftext += String.fromCharCode(c);}else if((c > 127) && (c < 2048)) {utftext += String.fromCharCode((c >> 6) | 192);utftext += String.fromCharCode((c & 63) | 128);}else {utftext += String.fromCharCode((c >> 12) | 224);utftext += String.fromCharCode(((c >> 6) & 63) | 128);utftext += String.fromCharCode((c & 63) | 128);}}value=escape(utftext); dojo.xhrGet({url: \"data/ips.php?ts=\" + new Date().getTime() + \"&do=doStringAction&InstanceID="+container.VariableInstanceID+"&VariableID="+container.VariableID+"&VariableCustomAction="+container.VariableCustomAction+"&VariableIdent="+container.VariableIdent+"&Value=\"+value, handleAs: \"json\", timeout: ((false) ? 0 : 30000), load: function(response, ioArgs) { return response; }, error: function(response, ioArgs) { return response; }});</script></span>";
dojo.parser.parse(bar);
}
Abschließend beide angepassten Dateien speichern, „Webfront“ aktualisieren und bei einer Variable testen, die die obigen Konventionen erfüllt.
Zum Ändern der Variable einfach auf den Textinhalt im Webfront klicken, dass wird der Inhalt editierbar.
Für Rückfragen stehe ich gerne zur Verfügung.
Ich hoffe es funktioniert bei euch genauso gut wie bei mir
Gruß
Sebastian