Kopierscript

Hi,

entweder hab ich es nicht gefunden, es braucht (fast) keiner oder was auch immer, aber bis auf eine Nachfrage gibt es wohl noch nichts zu einem Kopierscript, oder?

Also hab ich eins gebaut.

<?
// ID der Variable, wo die Quelle drin steht
$Quelle = GetValue (19601 /*[Testdatenmanipulation\Kopierer\Quelle]*/);
$Ziel = GetValue (49605 /*[Testdatenmanipulation\Kopierer\Ziel]*/);
$eigeneID = 46395;



$Rekursive = GetValueBoolean(42292);
$NeuesObjekt = '';
// Quelle auslesen

$Quellobjekt = IPS_GetObject($Quelle);


if ($Quellobjekt['ObjectType'] == 0) {
$NeueKategorie = IPS_CreateCategory();
IPS_SetName($NeueKategorie, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeueKategorie, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeueKategorie, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeueKategorie, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeueKategorie, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeueKategorie, $Quellobjekt['ObjectIdent']);

IPS_SetParent($NeueKategorie, $Ziel);
$NeuesObjekt = $NeueKategorie;
}

if ($Quellobjekt['ObjectType'] == 1) {
$Quellinstance = IPS_GetInstance($Quelle);
$NeueInstance = IPS_CreateInstance($Quellinstance['ModuleInfo']['ModuleID']);
IPS_SetName($NeueInstance, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeueInstance, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeueInstance, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeueInstance, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeueInstance, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeueInstance, $Quellobjekt['ObjectIdent']);


IPS_SetParent($NeueInstance, $Ziel);
$NeuesObjekt = $NeueInstance;
}

if ($Quellobjekt['ObjectType'] == 2) {
$Quellvariable = IPS_GetVariable($Quelle);
$NeueVariable = IPS_CreateVariable($Quellvariable['VariableValue']['ValueType']);
IPS_SetName($NeueVariable, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeueVariable, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeueVariable, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeueVariable, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeueVariable, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeueVariable, $Quellobjekt['ObjectIdent']);

IPS_SetVariableCustomProfile ($NeueVariable, $Quellvariable['VariableCustomProfile']);
IPS_SetVariableCustomAction ($NeueVariable, $Quellvariable['VariableCustomAction']);
IPS_SetParent($NeueVariable, $Ziel);
$NeuesObjekt = $NeueVariable;
}

if ($Quellobjekt['ObjectType'] == 3) {
$QuellScript = IPS_GetScript($Quelle);
$NeuesScript = IPS_CreateScript($QuellScript['ScriptType']);
IPS_SetName($NeuesScript, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeuesScript, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeuesScript, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeuesScript, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeuesScript, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeuesScript, $Quellobjekt['ObjectIdent']);

$zeilen = file (IPS_GetKernelDir()."scripts\\".$QuellScript['ScriptFile']);

$fh = fopen(IPS_GetKernelDir()."scripts\\".$NeuesScript.".ips.php", 'w') or die("can't open file");
foreach ($zeilen as $zeile) {
           fwrite($fh, $zeile);
           }
        fclose($fh);
        $ScriptPath = $NeuesScript.".ips.php";     //Skriptdatei
        IPS_SetScriptFile($NeuesScript, $ScriptPath);

IPS_SetParent($NeuesScript, $Ziel);
$NeuesObjekt = $NeuesScript;
}

if ($Quellobjekt['ObjectType'] == 4) {
$QuellEreignis = IPS_GetEvent($Quelle);
$NeuesEvent = IPS_CreateEvent($QuellEreignis['EventType']);

//IPS_SetName($NeuesEvent, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeuesEvent, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeuesEvent, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeuesEvent, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeuesEvent, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeuesEvent, $Quellobjekt['ObjectIdent']);

if ($QuellEreignis['EventType'] == 1) {
IPS_SetEventCyclic  ($NeuesEvent, $QuellEreignis['CyclicDateType'],$QuellEreignis['CyclicDateValue'],$QuellEreignis['CyclicDateDay'],$QuellEreignis['CyclicDateDayValue'],$QuellEreignis['CyclicTimeType'],$QuellEreignis['CyclicTimeValue']);
} else {
echo $QuellEreignis['TriggerVariableID'];
IPS_SetEventTrigger  ($NeuesEvent, $QuellEreignis['TriggerType'],$QuellEreignis['TriggerVariableID']);
}
 IPS_SetEventLimit ($NeuesEvent, $QuellEreignis['EventLimit']);
 IPS_SetEventScript ($NeuesEvent, $QuellEreignis['EventScript']);
 IPS_SetEventActive ($NeuesEvent, $QuellEreignis['EventActive']);

IPS_SetParent($NeuesEvent, $Ziel);
$NeuesObjekt = $NeuesEvent;
}

if ($Quellobjekt['ObjectType'] == 5) {
$QuellMedia = IPS_GetMedia($Quelle);
$NeueMedia = IPS_CreateMedia($QuellMedia['MediaType']);

IPS_SetName($NeueMedia, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeueMedia, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeueMedia, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeueMedia, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeueMedia, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeueMedia, $Quellobjekt['ObjectIdent']);

IPS_SetMediaFile($NeueMedia,$QuellMedia['MediaFile'], false);


IPS_SetParent($NeueMedia, $Ziel);
$NeuesObjekt = $NeueMedia;
}
if ($Quellobjekt['ObjectType'] == 6) {
$QuellLink = IPS_GetMedia($Quelle);
$NeuerLink = IPS_CreateLink();

IPS_SetName($NeuerLink, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeuerLink, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeuerLink, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeuerLink, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeuerLink, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeuerLink, $Quellobjekt['ObjectIdent']);

IPS_SetLinkChild($NeuerLink,$QuellLink['LinkChildID']);


IPS_SetParent($NeuerLink, $Ziel);
$NeuesObjekt = $NeuerLink;
}

if ($Rekursive) {
$kinder = $Quellobjekt['ChildrenIDs'];
foreach ($kinder as $child ){
SetValue(19601, $child);
$merker = $NeuesObjekt;

SetValue(49605, $NeuesObjekt);
IPS_RunScriptWait($eigeneID);
$NeuesObjekt = $merker;
}
}

?>

Als Skript abspeichern, die 3 ersten Zeilen befüllen, dafür braucht ihr 3 neue Variablen, die Quelle (Integer), das Ziel (Integer) und den Rekursive-Schalter (Boolean).

In die Quelle tragt ihr ein, was ihr kopieren möchtet.
In das Ziel tragt ihr ein, wo es landen soll (also die Mutter im Tree)
Rekursive True heisst, das Ding kopiert alles was da drunter hängt, false nur den einen Eintrag.

Viel Spaß damit!

//Achtung, wichtiger Hinweis:
Das Ding kopiert alles mit Mann und Maus, so wie es in der Quelle steht. Das kann bei Links, Events und Medien vielleicht zu ungewünschten Ereignissen führen (falls z.B. der Link sich auf einen Teil des selben Baums bezog, so macht die Kopie ja wenig Sinn, weil sie sich auf den alten Baum bezieht. Genauso Events. Aber wenigstens sind sie dann da und ihr könnt sie anpassen.

mmh, braucht wohl wirklich keiner, naja, noch ein Hinweis: Script-Inhalte werden natürlich auch 1:1 kopiert und auch die Trigger-Scripte bei Variablen, da muss man also hinterher noch von Hand ran. Vielleicht mache ich mir noch die Mühe da die Variablen-IDs noch etwas auszutauschen, mal sehen ob das klappt.

Ähm, die meisten Leute arbeiten noch oder sind erst nach Hause gekommen. Was erwartest Du? :rolleyes:

Ich finde es jedenfalls gut, wenn man solche Skripte zur Verfügung stellt. Bevor ich Räder neu erfinde, schaue ich erst mal quer durchs Forum. Daher von mir einfach mal pauschal Danke.

Bau das für den Webfront und Du bist der Held des Tages. :slight_smile:

Ich finde das schon sehr nützlich aber gib den Leuten eine Chance zu reagieren. Ich habe z.b. heute Nacht geschlafen und bin ohne an meinem IPS-Server vorbei zu schauen in die Arbeit gefahren wo ich immer noch sitze. Irgendwie muss das Spielzeug zu Hause ja bezahlt werden…:rolleyes: Das bastelt es sich schlecht parallel an IPS.

Ne, keine Sorge, war kein Vorwurf… hatte nur nochmal auch weiter im Forum gesucht und da war mir aufgefallen, dass wirklich wenig „Nachfrage“ nach war. Lieber wäre mir ja auch eine Funktion in der Console, aber so geht es auch einigermaßen. Hat mir gestern auf jedenfall schon die Zeit rein geholt, die ich zum schreiben des Scripts benötigt habe.

Was meinst du damit? Da steh ich gerade aufm Schlauch.

War nicht ganz ernst gemeint. Hast Du nie das Bedürfnis gehabt einen Webfront zu kopieren und dann nur noch anzupassen anstatt einen ganz neuen von Null angefangen aufsetzen zu müssen?

Du, ich bin leider nicht in der glücklichen Lage eine Unlimited-Version zu haben (wie anscheinend fast alle hier, weil sie sie „geerbt“ haben von alten Lizenzen), deswegen sind die max 5 Webfront schnell voll und mehr als Kategorie einstellen und den Rest per Links und Kategorien im „echten“ Baum machen, mache ich damit deswegen auch nicht. Mich würde ja mal so eins eurer Webfronts interessieren, also das „Livebild“ und der Editor dazu… vielleicht hab ich da ganz falsche Vorstellungen, was ihr damit noch so bastelt?

also ich würde sagen dann ist er der Held des Jahres !!!
(Ich meine das mit dem Webfront)

Im übrigen sehe ich das auch so, zwischendurch muss man ja noch seine Brötchen verdienen und sittz nicht nur vor dem IPS-Fernseher.

Aber ansonsten tolles Script und Lob an Hagbard235 werde es sicherlich
einsetzen.

und mal ehrlich; das merkt man dem Niveau im Forum auch an. Ok, es gibt vereinzelt Ausreißer (hihihi) aber insgesamt ist das sehr anständig.

oh, ich schon überaus häufig…ich könnte… würde… bei der aktuellen usability des WFE-Konfigurators …aber das wäre OT :smiley:
ausserdem gibts dazu grad nen aktuellen Thread :eek:

das liegt ja an Dir. Im Übrigen werden die Unlimited-Lizenzen nicht nur vererbt, IP-Symcon verkauft die sogar!
:eek:

Ich bin jedenfalls froh geerbt zu haben weil 499 Euro sind schon ein Wort - auch wenn die Software es Wert ist. Aber wir driften immer weiter vom Thema ab.

Das Duplizieren von Objekten ist übrigens nicht Trivial. Sonst gäbe es die Funktion längst :wink: Bei Instanzen ist es nicht einfach, da jede anders konfiguriert wird… Oder an anderes Beispiel sind Ereignisse die Bezüge zu Variablen haben, wenn du einen ganzen „Sub-Baum“ Klonen willst. (Woher weist du genau, ob dieser Bezug jetzt relativ oder absolut ist? Man denke da grad an Excel und Copy&Paste als Vergleich)

paresy

Das Duplizieren von Objekten ist übrigens nicht Trivial.

Seit wann beschäftigst Du Dich mit trivialen Dingen? :smiley:

Fände das aber trotzdem toll wei, man dann nicht wieder von vore anfangen muss mit Tabpanes, Links usw.usw. usw…:rolleyes:

jiepp, das hätte was. Hab ich mir auch schon etliche Male gewünscht.
Am Ende ist für den Wunsch nach einer WFE-Copy-Funktion wohl ausschlaggebend, wie groß die Konfigurator-Usebility ist (dürfte sich umgekehrt proportional zum Wunsch verhalten). Im Moment ist der Wunsch nach einer Copy-Funktion wohl riesengroß :smiley:

Das geht Hand in Hand - die Nutzbarkeit des WF-Konfigurator würde dramatisch mit einer Kopierfunktion gewinnen.

Wer Mut zur Lücke hat, hier ein WF-Kopierer.

Als Script anlegen, die Quelle im Script (1. Zeile) auf die ID des zu kopierenden WF ändern. Dann folgende Schritte:

  1. Dienst von IPS beenden (damit Settings.xml neu geschrieben wird)
  2. Dienst wieder starten
  3. Script ausführen
  4. Dienst wieder beenden
  5. Settings.xml im IPS-Verzeichnis umbenennen (z.B. Settings.alt) als Sicherung
  6. Settings2.xml in Settings.xml umbenennen.
  7. Dienst wieder starten
  8. HOFFEN das alles gut ging :wink:

Versucht es mal, bei mir scheint es zu gehen.

<?
// ID Webfront
$Quelle = 12526;



// Quelle auslesen

$Quellobjekt = IPS_GetObject($Quelle);


$Quellinstance = IPS_GetInstance($Quelle);
//$NeuesWF = 12526 /*[Auchteintolles]*/;
$NeuesWF = IPS_CreateInstance($Quellinstance['ModuleInfo']['ModuleID']);

IPS_SetName($NeuesWF, $Quellobjekt['ObjectName']);
IPS_SetInfo($NeuesWF, $Quellobjekt['ObjectInfo']);
IPS_SetIcon($NeuesWF, $Quellobjekt['ObjectIcon']);
IPS_SetPosition($NeuesWF, $Quellobjekt['ObjectPosition']);
IPS_SetHidden($NeuesWF, $Quellobjekt['ObjectIsHidden']);
IPS_SetIdent($NeuesWF, $Quellobjekt['ObjectIdent']);

$zeilen = file (IPS_GetKernelDir()."settings.xml");
$austausch  = array();
for ($i = 0; ; $i++) {
    if ($i >= sizeof($zeilen)) {
        break;
    }
    $zeile = $zeilen[$i];
           if (strpos($zeile , '<ID Value="'.$Quelle.'">')) {
					// Ab hier beginnt der interessante Teil
					// 3 drauf, die Zeilen lassen wir so
					$i = $i + 3;
				for ($x = $i; ; $x++) {


					 if ($x >= sizeof($zeilen)) {
      		  		break;
    				}
    				$zeile = $zeilen[$x];
    				 if (strpos($zeile , '</ID>')) {
    				 break;
    				 }


    				$austausch[] = $zeile;
    				$i = $x;

           }

		}
}


$fh = fopen(IPS_GetKernelDir()."settings2.xml", 'w') or die("can't open file");
for ($i = 0; ; $i++) {
    if ($i >= sizeof($zeilen)) {
        break;
    }
    $zeile = $zeilen[$i];
           fwrite($fh, $zeile);
           if (strpos($zeile , '<ID Value="'.$NeuesWF.'">')) {
           $i++;
           $zeile = $zeilen[$i];
           fwrite($fh, $zeile);
          $i++;
           $zeile = $zeilen[$i];
           fwrite($fh, $zeile);
 /*         $i++;
           $zeile = $zeilen[$i];
           fwrite($fh, $zeile);
*/
           for ($x = 0; ;$x++) {
    if ($x >= sizeof($austausch)) {
        break;
    }

           $zeile = $austausch[$x];
           fwrite($fh, $zeile);

           
           }
			  $i++;
          $zeile = $zeilen[$i];
			while (!strpos($zeile , "</ID>")) {
			 $i++;
			           $zeile = $zeilen[$i];

			}
          fwrite($fh, $zeile);

           }
           }
        fclose($fh);

//IPS_SetParent($NeuesWF, $Ziel);

?>

Hier geht es ja zu wie beim Pizza-Dienst. Kaum bestellt - schon geliefert…

Das stimmt, vor allem wie ich auch schon schrieb auch wenn sich Scripte, ActionTrigger etc. auf den selben Baum beziehen. Ich hatte auch erst überlegt es intelligenter zu machen, aber da kaum Bedarf da war hab ich es erstmal einfach gehalten.

Außerdem hab ich gerade gesehen, dass ich das falsche Subforum erwischt habe, ich glaube es gehört wohl unter „nutzliche Scripte“, denn hier sind ja eher Fragen angebracht, oder?