Aktualisiert: Mandanten kopieren

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Aktualisiert: Mandanten kopieren

Beitrag von Axel » Do 19. Aug 2004, 13:19

Hallo zusammen,

poste hier mal die aktualisierte Version des Scripts Mandanten kopieren. Getestet unter Version 4.4.4.

Möchte das als nächstes so erweitern, dass auch alle Artikel kopiert werden, was prinzipiel klar ist....allerdings gibts in der Tabelle con_art_lang das Feld time_target_cat. Was ist das? Steht da drin vielleicht die Kategorie-id auf die der Artikel verschoben werden wird?

Wie auch immer:
Hier erst mal das Script um einen Mandanten vollständig (bis auf die Artikel) zu kopieren:

<?
/* Script um Kunden zu kopieren
* Für Contenido 4.4.x (Getestet mit 4.4.4)
* Autor: Axel Womatschka
* Datum: 21.01.2004
* Zuletzt geändert am: 18.8.2004

* Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien
* von einem Kunden (Mandanten) ($old_idclient) auf den anderen ($new_idclient)
* Beide müssen bereits existieren.
*/

/* Folgende Tabellen werden vom Script verändert. Diese daher besser vorher sichern.
* con_lang
* con_clients_lang
* con_mod
* con_lay
* con_tpl
* con_tpl_conf
* con_container
* con_container_conf
* con_cat
* con_cat_lang
* con_sequence
* con_cat_tree (wird automatisch von contenido neu erstellt)
*/

/* Anleitung:
* Kopiere die .php-Datei mit diesem Script in ein Unterverzeichnis von Contenido
* z.B. contenido/Kopiere_Mandant/kopieren.php
*
* 1. Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches das Recht hat Mandanten anzulegen)
* 2. Lege einen neuen Mandanten an
* 3. Unter "Sprachen" nun den neuen Mandanten uas der Liste auswählen und eine neue Sprache anlegen
(Solltest du das vergessen, legt das Script automatisch eine neue Sprache an)
* 4. Merke dir den Index des neuen Mandanten (steht in () dahinter)
* 5. Öffnen dieses Script und setze direkt zu Anfang (Zeile 52) die Variable $new_idclient= Index des neuen Mandanten
Setze (Zeile 56) die Variable $old_idclient= zu kopierender Mandant
* 6. Abmelden von Contenido (falls noch eingeloggt)
* 7. Script starten
* 8. Wenn das Script fertig ist im Ordner contenido das Script im Browser updateseqruntime.php aufrufen (Setzt die Max-Indizes in der Tabelle con_sequence neu)
* FERTIG
*/

/* Zur Zeit noch nötiger Workaround
* Wenn das Script fertig ist müssen wir Contenido dazu bewegen die Tabelle con_cat_tree neu zu schreiben.
* Dazu einfach an Contenido anmelden, den neuen Mandanten auswählen und zu den Kategorien wechseln.
* Nicht erschrecken, weil man hier keine Kategorien sieht..das liegt halt daran, dass die Tabelle con_cat_tree neu geschrieben werden muss.
* Da Contenido die beim Zugriff auf die Kategoriestruktur jedesmal neu erstellt, klicken wir einfach auf "Neuen Baum erstellen"
* Siehe da...die Kategorien erscheinen. Jetzt einfach auf abbrechenklicken, denn wir wollen ja keinen neuen Baum erstellen :-))
*/

/* Was folgt?
* Die Möglichkeit auch alle Artikel mit zu kopieren
*/

/* In der config.php stehen die Basisvariablen von Contenido. In der config.php
* werden zudem via Include noch folgende Dateien geladen
* cfg_sql.inc.php (Hier stehen die Tabellennamen)
* conlib/prepend.php3 (Hier werden weitere Dateien via require geladen, die das Sessions-Managment der MySQL-DB regeln
* unter anderem auch die my_sql.inc)
*
*/

Include "../contenido/includes/config.php"; /* Die braucht man immer */
Include "../contenido/includes/functions.str.php";; /* Brauchen wir um Navigationsbaum für neuen Mandanten zu erzeugen */

/* MACHE DEINE INDIVIDUELLEN ANGABEN HIER*******************************************************/
/* Neuer Kunde auf den kopiert werden soll. Dieser muss vorher angelegt werden*/
$new_idclient=4;
/* Kunde, der kopiert werden soll */
$old_idclient=1;
/*Auch die Kategorien (Menübaum) mit kopieren? */
$CopyKategorien=1; /* 0=Nein, 1=Ja */
$CopyArtikel=0; /* 0=Nein, 1=Ja */
/***********************************************************************************************/

/* Instanz der Klasse DB_Sql (die ist in der Datei my_sql.inc zu finden)*/
$db1 = new DB_Sql();
$db1->Host = $contenido_host;
$db1->Database = $contenido_database;
$db1->User = $contenido_user;
$db1->Password = $contenido_password;

$db2 = new DB_Sql();
$db2->Host = $contenido_host;
$db2->Database = $contenido_database;
$db2->User = $contenido_user;
$db2->Password = $contenido_password;

$new_client_Name="";
$old_client_Name="";

/* Für die Layouts */
$ArrIdxAltLayout=array();
$ArrIdxNeuLayout=array();

/* Für die Module */
$ArrIdxAltModul=array();
$ArrIdxNeuModul=array();

/* Für die Templates */
$ArrIdxAltTpl=array();
$ArrIdxNeuTpl=array();
$ArrIdxAltTplConf=array();
$ArrIdxNeuTplConf=array();

/* Für die Kategorien */
$ArrIdxAltKat=array();
$ArrIdxNeuKat=array();

/* Ermittel Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT idclient, name from ".$cfg["tab"]["clients"]." where (idclient=".$old_idclient." OR idclient=".$new_idclient.")";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db1->next_record())
{
if ($db1->Record[0]==$new_idclient) $new_client_Name=trim($db1->Record[1]);
if ($db1->Record[0]==$old_idclient) $old_client_Name=trim($db1->Record[1]);
}
if ($old_client_Name=="" OR $new_client_Name=="")
{
/* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
$Meldung="Zu den verwendeten Mandantennummern (idclient) ".$old_idclient." und ".$new_idclient." gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummern (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
echo "<hr><h3><font face='Arial' color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>";
die($Meldung); /* Scriptausführung abbrechen */
}

/* Prüfe nun ob beide Mandanten die gleichen SprachID haben. In einem Forumartikel Timo schrieb Timo am 3.2.2004 (Contenido Entwickler)
das Mandanten eine eigene SprachID haben sollten, weil diese auch in den Tabellen Keywords und Rights übernommen wird */
/* Sehe dazu erst in der Tabelle con_clients_lang nach, ob der zweite Mandant dort existiert */
echo "<h3><font face='Arial' color='#525169'>Ermittel die Spracheinstellung des neuen Mandanten...</font></h3>";

$sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE ((idclient=".$old_idclient.") OR (idclient=".$new_idclient."))";
$db1->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db1->next_record())
{
if ($db1->Record[1]==$old_idclient) $merk_idlang_old=$db1->Record[2]; /*Merke hier die SprachID des alten Mandanten */
if ($db1->Record[1]==$new_idclient)
/* Ja, neuer Mandant existiert in der Tabelle clients_lang...das bedeutet, der Anwender hat über Contenido selbst den Mandanzen sauber angelegt und eine neue
Sprache zugeordnet. Merke hier die SprachID des neuen Mandanten */
{
$MandantNeuExist=1;
$merk_idlang_neu=$db1->Record[2]; /*Merke hier die SprachID des neuen Mandanten */
echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu."</font></h3>";
echo "<hr>";
} /*End If */
} /* End While */

echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des alten Mandanten: idlang = ".$merk_idlang_old."</font></h3>";

/* Nein, neuer Mandant existiert nicht in der Tabelle clients_lang. Um ihn dort einzutragen brauchen wir erst eine neue SprachID
Erzeuge neue SprachID in Tabelle con_lang und merke diese für den neuen Mandanten */

if ($MandantNeuExist==0) /* Neuer Mandant existiert nicht in Tabelle client_lang */
{
$sql = "SELECT * FROM ".$cfg["tab"]["lang"]." WHERE (idlang=".$merk_idlang_old.")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db1->query($sql);
$MyLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyLangSeq=$db2->Record[0];
$merk_idlang_neu=$MyLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
$db1->next_record();
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}
$sql = $sql .")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$merk_idlang_neu." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);

/* Nun der neue Eintrag in con_clients_lang */
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyClientsLangSeq=$db2->Record[0];
$MyClientsLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";

/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyClientsLangSeq." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);

echo "<h3><font face='Arial' color='#ff0000'>Spracheinstellung des neuen Mandanten existierte nicht und wurde deshalb erzeugt (idlang = ".$merk_idlang_neu.")</font></h3>";
echo "<hr>";
} /*End If*/



/* Alles OK....leg los */
echo "<hr><h1><font face='Arial' color='#525169'>Kopiere den Mandanten >".$old_client_Name."< (idclient ".$old_idclient.") auf den Mandanten >".$new_client_Name."< (idclient ".$new_idclient."):</font></h1><hr>";

/*****************************************************************************************/
/*Module KOPIEREN*/
/* ermittel alle Module des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["mod"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyModSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyModSeq=$db2->Record[0];
}

$sql="";
$lauf=0;
/* $db1->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_mod..das ist der Modulname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["mod"]." VALUES ('".$MyModSeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_mod */

/*Merke im Array $ArrIdxAltModule[] den Index (idmod) der Module des alten Mandanten */
$ArrIdxAltModule[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuModule[] den Index (idmod) der Module des neuen Mandanten */
$ArrIdxNeuModule[]=$MyModSeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idmod welchem neuen idmod entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyModSeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyModSeq bei con_mod in die Tabelle con_sequence */
$MyModSeq=$MyModSeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyModSeq." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Module vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["mod"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*****************************************************************************************/
/*LAYOUTS KOPIEREN*/
/* ermittel alle Layouts des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["lay"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyLaySeq=$db2->Record[0];
}

$sql="";
$lauf=0;
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_lay..das ist der Layoutname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["lay"]." VALUES ('".$MyLaySeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_lay */

/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltLayout[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuLayout[] den Index (idlay) der Layouts des neuen Mandanten */
$ArrIdxNeuLayout[]=$MyLaySeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idlay welchem neuen idlay entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyLaySeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyLaySeq bei con_lay in die Tabelle con_sequence */
$MyLaySeq=$MyLaySeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyLaySeq." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Layouts vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["lay"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";


/*****************************************************************************************/
/*TEMPLATES KOPIEREN*/
/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_template aus */
$MyTplSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyTplSeq=$db2->Record[0];
$MyTplSeq++;

$MyTplConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyTplConfSeq=$db2->Record[0];
$MyTplConfSeq++;
}

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/*Lese die idtpl der Templates erst mal in ein Array um sich die alten Indizes zu merken */
while($db1->next_record())
{
/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltTpl[]=$db1->Record[2]; /* Spalte idtpl */
$ArrIdxNeuTpl[]=$MyTplSeq;
$MyTplSeq++; /* erhöhe um 1 */

$ArrIdxAltTplConf[]=$db1->Record[3]; /* Spalte idtplcfg */
$ArrIdxNeuTplConf[]=$MyTplConfSeq;
$MyTplConfSeq++; /* erhöhe um 1 */
}

/*Hinweis:
$MyTplSeq ist der Wert, der für nextid con_tpl in con_sequence eingetragen werden muss
$MyTplConfSeq-1 ist der Wert, der für nextid con_tplConf in con_sequence eingetragen werden muss
*/

/* Nun sind alle ID's, die alten und die neuen bekannt. Kopiere nun die Daten der Tabelle con_Templates */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Templates:</font></h2>";
$lauf=0;
while($db1->next_record())
{
$lauf++;
/* Lese nun idlay aus und stelle fest, wo dieser idlay im Array der alten Indizes steht (in ArrIdxAltLayer[]) */
$ArrPosLay=array_search($db1->Record[1], $ArrIdxAltLayout);

/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[2], $ArrIdxAltTpl);

/* dito für idtplconf */
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'";
$db1->Record[1]=$ArrIdxNeuLayout[$ArrPosLay];
$db1->Record[2]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf];

echo "<font face='Arial' color='#000000'>".$db1->Record[4]."</font><BR>";

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/*Neuen Datensatz auch in Tabelle tplconf */
$sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl, author) VALUES ('".$ArrIdxNeuTplConf[$ArrPosTplConf]."', '".$ArrIdxNeuTpl[$ArrPosTpl]."', 'admin')";
$db2->query($sql);
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplSeq." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
$MyTplConfSeq=$MyTplConfSeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplConfSeq." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Templates vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["tpl"]." und für ".$cfg["tab"]["tpl_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER kopieren */
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[1], $ArrIdxAltTpl);
if ($ArrPosTpl<>False)
{ /* if */
$lauf++;
$ArrPosModul=array_search($db1->Record[3], $ArrIdxAltModul);

$MyContainerSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container"]." VALUES ('".$MyContainerSeq."'";

$db1->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuModul[$ArrPosModul];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerSeq." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER CONF kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql="SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerConfSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtplcfg aus und stelle fest, wo dieser idtplcfg im Array der alten Indizes steht (in ArrIdxAltTplConf[]) */
$ArrPosTplConf=array_search($db1->Record[1], $ArrIdxAltTplConf);
if ($ArrPosTplConf!==False)
{ /* If */
$lauf++;
$MyContainerConfSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." VALUES ('".$MyContainerConfSeq."'";

$db1->Record[1]=$ArrIdxNeuTplConf[$ArrPosTplConf];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /* End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerConfSeq." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container Conf-Daten vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

if ($CopyKategorien=0) /* 0=Nein */
{
echo "<h1><font face='Arial' color='#525169'>FERTIG</font></h1>";
die("Es wurden alle Templates, Layouts, Container und Module kopiert. Die Kategorien wurden auf Wunsch nicht mit kopiert.");
}
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */

/*KATEGORIEN kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Kategorien/Men&uuml;s:</font></h2>";
/* lese aus der Tabelle con_cat alle Kategorien des zu kopierenden Mandanten ($old_idclient) aus */
$sql = "SELECT * from ".$cfg["tab"]["cat"]." where idclient=".$old_idclient." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
$MyKatSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatSeq=$db2->Record[0];

/* Lese nun die vorhanden Kategorie-IDs in das Array ein und generiere gleichzeitig das Array
* der neuen Kategorie-IDs. Dananch ist bekannt, welche neue idcat welcher alten idcat entsprach
*/
while($db1->next_record())
{
if ($db1->Record[0]==0)
{
$neueCatid=0;
} else {
$neueCatid=$MyKatSeq;
$MyKatSeq++; /* erhöhe um 1 */
}

$ArrIdxAltKat[]=$db1->Record[0]; /* Spalte idcat */
$ArrIdxNeuKat[]=$neueCatid;
/* Neu am 29.7.2004 */
/* Um die Kategorien zu kopieren, reicht es nicht nur die Werte idcat für den neuen Mandanten zu generieren
* Es müssem auch die Werte preid, postid und parentid kopiert und angepasst werden
* denn diese bestimmen später den Aufbau des Navigationsbaumes!
* Die Funktion strRemakeTreeTable der Datei functions.str.php erzeugt die Einträge nach jeder Änderung der Struktur neu.
* Dazu werden die Werte der Tabelle con_cat ausgelesen. Hier steht zu jeder catid (Kategorie bzw. Menüpunkt)
* die Vorgänger-Kategorie (preid) und der Nachfolger (postid). */
/* Ende neu am 29.7.2004 */
$ArrIdxAltParentID[]=$db1->Record[2]; /* Spalte parentid */
$ArrIdxAltPreID[]=$db1->Record[3]; /* Spalte preid */
$ArrIdxAltPostID[]=$db1->Record[4]; /* Spalte postid */

$sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End while */

/* Die neuen idcat wurden in die Datenbank geschrieben, allerdings haben die neuen Kategorien noch die Zuordnungen zu den alten
* parentid, preid und postid
* Das muss nun noch korrigiert werden
* ACHTUNG: Ist parentid, preid oder postid 0, so bleibt er 0 ! */

/* parentid: Für jeden Eintrag in $ArrIdxAltParentID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltParentID);
foreach ($ArrWerte as $value)
{
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
if ($ArrIdxAltParentID[$lauf]==0)
{
$ArrIdxNeuParentID[$lauf]=0;
} else {
/* Hinweis: array_search(suche das, hier drin) */
$i=array_search($ArrIdxAltParentID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuParentID[]=$ArrIdxNeuKat */
$ArrIdxNeuParentID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* preid: Für jeden Eintrag in $ArrIdxAltPreID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPreID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPreID[$lauf]==0)
{
$ArrIdxNeuPreID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPreID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPreID[]=$ArrIdxNeuKat */
$ArrIdxNeuPreID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* postid: Für jeden Eintrag in $ArrIdxAltPostID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPostID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPostID[$lauf]==0)
{
$ArrIdxNeuPostID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPostID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPostID[]=$ArrIdxNeuKat */
$ArrIdxNeuPostID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* Schreibe diese nun zu den neuen idcat in die Datenbank */
$lauf=0;
$ArrWerte=array_values($ArrIdxNeuKat);
foreach ($ArrWerte as $value)
{
$sql="Update ".$cfg["tab"]["cat"]." set parentid=".$ArrIdxNeuParentID[$lauf].", preid=".$ArrIdxNeuPreID[$lauf].", postid=".$ArrIdxNeuPostID[$lauf]." where idcat = ".$value."";
$db2->query($sql);
$lauf++;
}


/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatSeq." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Kategorien wurden kopiert....kopiere nun deren Baumstruktur...</font></h3>";
echo "<hr>";
/* Die Daten der Tabelle con_cat wurden für den neuen Mandanten kopiert */



echo "<h3><font face='Arial' color='#525169'>Die Daten der Tabelle con_cat (Kategorien) wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>";
echo "<hr>";

/* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */
$sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." where idlang = ".$merk_idlang_old." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
$MyKatLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatLangSeq=$db2->Record[0];

while($db1->next_record())
{
/* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
$ArrPosKat=array_search($db1->Record[1], $ArrIdxAltKat);
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'";

$db1->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */
if ($ArrPosTplConf!==False) $db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */

/* Achtung: Einträge der Tabelle cat_lang sind Sprachabhängig. Schreibe daher hier auch die idlang (SprachID) des neuen
Mandanten mit rein...diese wude zu Beginn des Scripts ermittelt und in $merk_idlang_neu gemerkt */
$db1->Record[2]=$merk_idlang_neu;
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

$MyKatLangSeq++;

} /* End While */

$MyKatLangSeq=$MyKatLangSeq-1;
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatLangSeq." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
echo "<hr>";

echo "<h1><font face='Arial' color='#0055dd'>FERTIG</font></h1>";
echo "<font face='Arial' color='#525169'>Es wurden alle Module, Templates, Layouts, Container und Kategorien kopiert.</font>";

/* Wenn alles fertig ist sollte man die Datei contenido/updateseqruntime.php ausführen */
echo "<br><font face='Arial' color='#FF0022'>Nun sollte noch das Script ".$contenido_host." contenido/updateseqruntime.php ausgeführt werden. (aktualisiert die Tabelle con_sequence)</font>";

/* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */
strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */
echo "<br><font face='Arial' color='#FF0022'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)</font>";
?>

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: Aktualisiert: Mandanten kopieren

Beitrag von emergence » Fr 20. Aug 2004, 09:25

Axel hat geschrieben:...allerdings gibts in der Tabelle con_art_lang das Feld time_target_cat. Was ist das?
Steht da drin vielleicht die Kategorie-id auf die der Artikel verschoben werden wird?
ist für die zeitsteuerung...
die zielkategorie in die der artikel nach offlineschaltung verschoben wird....
*** make your own tools (wishlist :: thx)

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Beitrag von Axel » Fr 20. Aug 2004, 09:29

Hab ich befürchtet...Muss also beim kopieren auch diesen Wert aktualisieren, bzw. mit der neuen ID versehen.
Dann leg ich mal los...

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 20. Aug 2004, 11:36

okay ich hab mir jetzt dein script mal genau durchgesehen...
saubere arbeit :-)

ich hab jetzt ein paar modifikationen vorgenommen die ich für ganz nützlich halte...

das script habe ich so modifiziert das es an sich im contenido ordner befinden muss...

beim aufruf bekommt man ein ganz normales login fenster... erst wenn man sich angemeldet hat wird das script ausgeführt... ist nicht unpraktisch...

ich verwende für das script jetzt die db klassen von contenido
ebenso wird die con_sequence am ende des komplette kopiervorgangs upgedatet...
alle includes laufen über die contenido interne cInclude

die funktion strRemakeTreeTable wird auch ausgeführt... ;-)

das script ist somit etwas länger geworden... sieh es dir mal an...

Code: Alles auswählen

<?php 
include_once ('./includes/config.php'); 
cInclude ("includes", 'functions.general.php'); 

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime(); 

cInclude ("includes", 'functions.i18n.php'); 
cInclude ("includes", 'functions.api.php'); 
cInclude ("includes", 'functions.general.php'); 

cInclude ("includes", 'functions.database.php'); 

cInclude ("classes", 'class.xml.php'); 
cInclude ("classes", 'class.navigation.php'); 
cInclude ("classes", 'class.template.php'); 
cInclude ("classes", 'class.backend.php'); 
cInclude ("classes", 'class.notification.php'); 
cInclude ("classes", 'class.area.php'); 
cInclude ("classes", 'class.action.php'); 

cInclude ("classes", 'class.layout.php'); 
cInclude ("classes", 'class.treeitem.php'); 
cInclude ("classes", 'class.user.php'); 
cInclude ("classes", 'class.group.php'); 
cInclude ("classes", 'class.cat.php'); 
cInclude ("classes", 'class.client.php'); 
cInclude ("classes", 'class.inuse.php'); 
cInclude ("classes", 'class.table.php'); 

cInclude ("includes", 'functions.str.php'); 

page_open(array('sess' => 'Contenido_Session', 
                'auth' => 'Contenido_Challenge_Crypt_Auth', 
                'perm' => 'Contenido_Perm')); 

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang); 
cInclude ("includes", 'cfg_language_de.inc.php'); 

class DB_Upgrade extends DB_Contenido { 
}

// code goes here 

/* Script um Kunden zu kopieren 
* Für Contenido 4.4.x (Getestet mit 4.4.4) 
* Autor: Axel Womatschka 
* Datum: 21.01.2004 
* Zuletzt geändert am: 20.08.2004 

* Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien 
* von einem Kunden (Mandanten) ($old_idclient) auf den anderen ($new_idclient) 
* Beide müssen bereits existieren. 
*/ 

/* Folgende Tabellen werden vom Script verändert. Diese daher besser vorher sichern. 
* con_lang 
* con_clients_lang 
* con_mod 
* con_lay 
* con_tpl 
* con_tpl_conf 
* con_container 
* con_container_conf 
* con_cat 
* con_cat_lang 
* con_sequence 
* con_cat_tree (wird automatisch von contenido neu erstellt) 
*/ 

/* Anleitung: 
* Kopiere die .php-Datei mit diesem Script in das Contenido verzeichnis 
* z.B. contenido/client_kopieren.php 
* 
* 1. Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches das Recht hat Mandanten anzulegen) 
* 2. Lege einen neuen Mandanten an 
* 3. Unter "Sprachen" nun den neuen Mandanten uas der Liste auswählen und eine neue Sprache anlegen 
     (Solltest du das vergessen, legt das Script automatisch eine neue Sprache an) 
* 4. Merke dir den Index des neuen Mandanten (steht in () dahinter) 
* 5. Öffnen dieses Script und setze direkt zu Anfang (Zeile 94) die Variable $new_idclient= Index des neuen Mandanten 
     Setze (Zeile 96) die Variable $old_idclient= zu kopierender Mandant 
* 6. Abmelden von Contenido (falls noch eingeloggt) 
* 7. Script starten 
*  FERTIG 
*/ 

/* Was folgt? 
* Die Möglichkeit auch alle Artikel mit zu kopieren 
*/ 

/* MACHE DEINE INDIVIDUELLEN ANGABEN HIER*******************************************************/ 
    /* Neuer Kunde auf den kopiert werden soll. Dieser muss vorher angelegt werden*/ 
    $new_idclient= 100; 
    /* Kunde, der kopiert werden soll */ 
    $old_idclient= 1; 
    /*Auch die Kategorien (Menübaum) mit kopieren? */ 
    $CopyKategorien=1; /* 0=Nein, 1=Ja */ 
    $CopyArtikel=0; /* 0=Nein, 1=Ja */ 
/***********************************************************************************************/ 

/* Instanzen der DB_Contenido */ 
$db = new DB_Contenido;
$db2 = new DB_Contenido; 
$db_str = new DB_Contenido; // wird für functions.str.php benötigt... 

$new_client_Name=""; 
$old_client_Name=""; 

/* Für die Layouts */ 
$ArrIdxAltLayout=array(); 
$ArrIdxNeuLayout=array(); 

/* Für die Module */ 
$ArrIdxAltModul=array(); 
$ArrIdxNeuModul=array(); 

/* Für die Templates */ 
$ArrIdxAltTpl=array(); 
$ArrIdxNeuTpl=array(); 
$ArrIdxAltTplConf=array(); 
$ArrIdxNeuTplConf=array(); 

/* Für die Kategorien */ 
$ArrIdxAltKat=array(); 
$ArrIdxNeuKat=array(); 

/* Ermittel Kundennamen und prüfe die Gültigkeit der idclient-Nummern */ 
$sql = "SELECT idclient, name from ".$cfg["tab"]["clients"]." where (idclient=".$old_idclient." OR idclient=".$new_idclient.")"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 
while ($db->next_record()) 
{ 
    if ($db->Record[0]==$new_idclient) $new_client_Name=trim($db->Record[1]); 
    if ($db->Record[0]==$old_idclient) $old_client_Name=trim($db->Record[1]); 
} 
if ($old_client_Name=="" OR $new_client_Name=="") 
{ 
    /* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */ 
    $Meldung="Zu den verwendeten Mandantennummern (idclient) ".$old_idclient." und ".$new_idclient." gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummern (idclient) in Ihrem Script. Die Ausführung wird abgebrochen."; 
    echo "<hr><h3><font face='Arial' color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>"; 
    die($Meldung); /* Scriptausführung abbrechen */ 
} 

/* Prüfe nun ob beide Mandanten die gleichen SprachID haben. In einem Forumartikel Timo schrieb Timo am 3.2.2004 (Contenido Entwickler) 
   das Mandanten eine eigene SprachID haben sollten, weil diese auch in den Tabellen Keywords und Rights übernommen wird */ 
/* Sehe dazu erst in der Tabelle con_clients_lang nach, ob der zweite Mandant dort existiert */ 
echo "<h3><font face='Arial' color='#525169'>Ermittel die Spracheinstellung des neuen Mandanten...</font></h3>"; 

$sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE ((idclient=".$old_idclient.") OR (idclient=".$new_idclient."))"; 
$db->query($sql); 
$merk_idlang_old=0; 
$MandantNeuExist=0; 

while($db->next_record()) 
{ 
    if ($db->Record[1]==$old_idclient) $merk_idlang_old=$db->Record[2]; /*Merke hier die SprachID des alten Mandanten */ 
    if ($db->Record[1]==$new_idclient) 
    { 
        /* Ja, neuer Mandant existiert in der Tabelle clients_lang...das bedeutet, der Anwender hat über Contenido selbst den Mandanzen sauber angelegt und eine neue 
        Sprache zugeordnet. Merke hier die SprachID des neuen Mandanten */ 
        $MandantNeuExist=1; 
        $merk_idlang_neu=$db->Record[2]; /*Merke hier die SprachID des neuen Mandanten */ 
        echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu."</font></h3>"; 
        echo "<hr>"; 
    } /*End If */ 
} /* End While */ 

echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des alten Mandanten: idlang = ".$merk_idlang_old."</font></h3>"; 

/* Nein, neuer Mandant existiert nicht in der Tabelle clients_lang. Um ihn dort einzutragen brauchen wir erst eine neue SprachID 
    Erzeuge neue SprachID in Tabelle con_lang und merke diese für den neuen Mandanten */ 

if ($MandantNeuExist==0) /* Neuer Mandant existiert nicht in Tabelle client_lang */ 
{ 
    $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." WHERE (idlang=".$merk_idlang_old.")"; 
    /*echo "SQL lautet: ".$sql."<br>";*/ 
    $db->query($sql); 
    $MyLangSeq=0; 
    $sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lang"]."'"; 
    $db2->query($sql); 
    if ($db2->next_record()) $MyLangSeq=$db2->Record[0]; 
    $merk_idlang_neu=$MyLangSeq++; /* erhöhe um 1 */ 
    $sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'"; 
    $db->next_record(); 
    for ($i=1;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 
    $sql = $sql .")"; 
    /*echo "SQL lautet: ".$sql."<br>";*/ 
    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */ 
    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
    $sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$merk_idlang_neu." where seq_name = '".$cfg["tab"]["lang"]."'"; 
    $db2->query($sql); 

    /* Nun der neue Eintrag in con_clients_lang */ 
    $sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["clients_lang"]."'"; 
    $db2->query($sql); 
    if ($db2->next_record()) $MyClientsLangSeq=$db2->Record[0]; 
    $MyClientsLangSeq++; /* erhöhe um 1 */ 
    $sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')"; 

    /*echo "SQL lautet: ".$sql."<br>";*/ 
    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */ 
    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
    $sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyClientsLangSeq." where seq_name = '".$cfg["tab"]["clients_lang"]."'"; 
    $db2->query($sql); 

    echo "<h3><font face='Arial' color='#ff0000'>Spracheinstellung des neuen Mandanten existierte nicht und wurde deshalb erzeugt (idlang = ".$merk_idlang_neu.")</font></h3>"; 
    echo "<hr>"; 
} /*End If*/ 



/* Alles OK....leg los */ 
echo "<hr><h1><font face='Arial' color='#525169'>Kopiere den Mandanten >".$old_client_Name."< (idclient ".$old_idclient.") auf den Mandanten >".$new_client_Name."< (idclient ".$new_idclient."):</font></h1><hr>"; 

/*****************************************************************************************/ 
/*Module KOPIEREN*/ 
/* ermittel alle Module des zu kopierenden Kunden */ 
$sql = "SELECT * from ".$cfg["tab"]["mod"]." where idclient=".$old_idclient; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel ! 
   Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_mod aus */ 
$MyModSeq=0; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["mod"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) 
{ 
    $MyModSeq=$db2->Record[0]; 
} 

$sql = ""; 
$lauf=0; 
/* $db->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht 
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */ 
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Module:</font></h2>"; 
while($db->next_record()) 
{ 
    echo "<font face='Arial' color='#000000'>".$db->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_mod..das ist der Modulname */ 

    $lauf++; 
    $sql = "INSERT INTO ".$cfg["tab"]["mod"]." VALUES ('".$MyModSeq."','".$new_idclient."'"; 

    $db->Record[4]="YES"; /* Spalte deletable der Tabelle con_mod */ 

    /*Merke im Array $ArrIdxAltModule[] den Index (idmod) der Module des alten Mandanten */ 
    $ArrIdxAltModule[]=$db->Record[0]; 
    /*Merke im Array $ArrIdxNeuModule[] den Index (idmod) der Module des neuen Mandanten */ 
    $ArrIdxNeuModule[]=$MyModSeq; 
    /*Das Merken im Array ist nötig um später noch zu wissen welcher alte idmod welchem neuen idmod entspricht*/ 

    for ($i=2;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 

    $sql = $sql .")"; 
    $db2->query($sql); 

    /* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */ 
    $MyModSeq++; /* erhöhe um 1 */ 
} 

/* schreibe nun den letzten wert von $MyModSeq bei con_mod in die Tabelle con_sequence */ 
$MyModSeq=$MyModSeq-1; 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyModSeq." where seq_name = '".$cfg["tab"]["mod"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Module vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["mod"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>"; 
echo "<hr>"; 

/*****************************************************************************************/ 
/*LAYOUTS KOPIEREN*/ 
/* ermittel alle Layouts des zu kopierenden Kunden */ 
$sql = "SELECT * from ".$cfg["tab"]["lay"]." where idclient=".$old_idclient; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel ! 
   Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */ 
$MyLaySeq=0; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lay"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) 
{ 
    $MyLaySeq=$db2->Record[0]; 
} 

$sql = ""; 
$lauf=0; 
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Layouts:</font></h2>"; 
while($db->next_record()) 
{ 
    echo "<font face='Arial' color='#000000'>".$db->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_lay..das ist der Layoutname */ 

    $lauf++; 
    $sql = "INSERT INTO ".$cfg["tab"]["lay"]." VALUES ('".$MyLaySeq."','".$new_idclient."'"; 

    $db->Record[4]="YES"; /* Spalte deletable der Tabelle con_lay */ 

    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */ 
    $ArrIdxAltLayout[]=$db->Record[0]; 
    /*Merke im Array $ArrIdxNeuLayout[] den Index (idlay) der Layouts des neuen Mandanten */ 
    $ArrIdxNeuLayout[]=$MyLaySeq; 
    /*Das Merken im Array ist nötig um später noch zu wissen welcher alte idlay welchem neuen idlay entspricht*/ 

    for ($i=2;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 

    $sql = $sql .")"; 
    $db2->query($sql); 

    /* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */ 
    $MyLaySeq++; /* erhöhe um 1 */ 
} 

/* schreibe nun den letzten wert von $MyLaySeq bei con_lay in die Tabelle con_sequence */ 
$MyLaySeq=$MyLaySeq-1; 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyLaySeq." where seq_name = '".$cfg["tab"]["lay"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Layouts vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["lay"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>"; 
echo "<hr>"; 


/*****************************************************************************************/ 
/*TEMPLATES KOPIEREN*/ 
/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel ! 
   Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_template aus */ 
$MyTplSeq=1; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) $MyTplSeq=$db2->Record[0]; 
$MyTplSeq++; 

$MyTplConfSeq=1; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl_conf"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) 
{ 
    $MyTplConfSeq=$db2->Record[0]; 
    $MyTplConfSeq++; 
} 

/* ermittel alle Templates des zu kopierenden Kunden */ 
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/*Lese die idtpl der Templates erst mal in ein Array um sich die alten Indizes zu merken */ 
while($db->next_record()) 
{ 
    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */ 
    $ArrIdxAltTpl[]=$db->Record[2]; /* Spalte idtpl */ 
    $ArrIdxNeuTpl[]=$MyTplSeq; 
    $MyTplSeq++; /* erhöhe um 1 */ 

    $ArrIdxAltTplConf[]=$db->Record[3]; /* Spalte idtplcfg */ 
    $ArrIdxNeuTplConf[]=$MyTplConfSeq; 
    $MyTplConfSeq++; /* erhöhe um 1 */ 
} 

/*Hinweis: 
    $MyTplSeq ist der Wert, der für nextid con_tpl in con_sequence eingetragen werden muss 
    $MyTplConfSeq-1 ist der Wert, der für nextid con_tplConf in con_sequence eingetragen werden muss 
*/ 

/* Nun sind alle ID's, die alten und die neuen bekannt. Kopiere nun die Daten der Tabelle con_Templates */ 
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Templates:</font></h2>"; 
$lauf=0; 
while($db->next_record()) 
{ 
    $lauf++; 
    /* Lese nun idlay aus und stelle fest, wo dieser idlay im Array der alten Indizes steht (in ArrIdxAltLayer[]) */ 
    $ArrPosLay=array_search($db->Record[1], $ArrIdxAltLayout); 

    /* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */ 
    $ArrPosTpl=array_search($db->Record[2], $ArrIdxAltTpl); 

    /* dito für idtplconf */ 
    $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf); 

    $sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'"; 
    $db->Record[1]=$ArrIdxNeuLayout[$ArrPosLay]; 
    $db->Record[2]=$ArrIdxNeuTpl[$ArrPosTpl]; 
    $db->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; 

    echo "<font face='Arial' color='#000000'>".$db->Record[4]."</font><BR>"; 

    for ($i=1;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 

    $sql = $sql .")"; 
    $db2->query($sql); 

    /*Neuen Datensatz auch in Tabelle tplconf */ 
    $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl, author) VALUES ('".$ArrIdxNeuTplConf[$ArrPosTplConf]."', '".$ArrIdxNeuTpl[$ArrPosTpl]."', 'admin')"; 
    $db2->query($sql); 
} 

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyTplSeq." where seq_name = '".$cfg["tab"]["tpl"]."'"; 
$db2->query($sql); 
$MyTplConfSeq=$MyTplConfSeq-1; 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyTplConfSeq." where seq_name = '".$cfg["tab"]["tpl_conf"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Templates vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["tpl"]." und für ".$cfg["tab"]["tpl_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>"; 
echo "<hr>"; 

/*CONTAINER kopieren */ 
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */ 
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container:</font></h2>"; 

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* Ermittel aus der Tabelle sequences den max. Index von con_container */ 
$MyContainerSeq=1; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) $MyContainerSeq=$db2->Record[0]; 

$lauf=0; 
while($db->next_record()) 
{ 
    /* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */ 
    $ArrPosTpl=array_search($db->Record[1], $ArrIdxAltTpl); 
    if ($ArrPosTpl<>False) 
    { /* if */ 
        $lauf++; 
        $ArrPosModul=array_search($db->Record[3], $ArrIdxAltModul); 

        $MyContainerSeq++; 
        $sql = "INSERT INTO ".$cfg["tab"]["container"]." VALUES ('".$MyContainerSeq."'"; 

        $db->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl]; 
        $db->Record[3]=$ArrIdxNeuModul[$ArrPosModul]; 

        for ($i=1;$i<$db->num_fields();$i++) 
        { 
            $sql = $sql .","; 
            $cont = $db->Record[$i]; 
            $cont = str_replace('\\','\\\\',$cont); 
            $cont = str_replace('"','\"',$cont); 

            $sql = $sql ."\"".$cont."\""; 
        } 

        $sql = $sql .")"; 
        $db2->query($sql); 
    } /*End if */ 
} 
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerSeq." where seq_name = '".$cfg["tab"]["container"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>"; 
echo "<hr>"; 

/*CONTAINER CONF kopieren */ 
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container_Conf:</font></h2>"; 

$sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg "; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */ 
$MyContainerConfSeq=1; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container_conf"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) $MyContainerConfSeq=$db2->Record[0]; 

$lauf=0; 
while($db->next_record()) 
{ 
    /* Lese nun idtplcfg aus und stelle fest, wo dieser idtplcfg im Array der alten Indizes steht (in ArrIdxAltTplConf[]) */ 
    $ArrPosTplConf=array_search($db->Record[1], $ArrIdxAltTplConf); 
    if ($ArrPosTplConf!==False) 
        { /* If */ 
        $lauf++; 
        $MyContainerConfSeq++; 
        $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." VALUES ('".$MyContainerConfSeq."'"; 

        $db->Record[1]=$ArrIdxNeuTplConf[$ArrPosTplConf]; 

        for ($i=1;$i<$db->num_fields();$i++) 
        { 
            $sql = $sql .","; 
            $cont = $db->Record[$i]; 
            $cont = str_replace('\\','\\\\',$cont); 
            $cont = str_replace('"','\"',$cont); 

            $sql = $sql ."\"".$cont."\""; 
        } 

        $sql = $sql .")"; 
        $db2->query($sql); 
    } /* End if */ 
} 
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerConfSeq." where seq_name = '".$cfg["tab"]["container_conf"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container Conf-Daten vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>"; 
echo "<hr>"; 

if ($CopyKategorien=0) /* 0=Nein */ 
{ 
    echo "<h1><font face='Arial' color='#525169'>FERTIG</font></h1>"; 
    die("Es wurden alle Templates, Layouts, Container und Module kopiert. Die Kategorien wurden auf Wunsch nicht mit kopiert."); 
} 
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */ 

/*KATEGORIEN kopieren */ 
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Kategorien/Men&uuml;s:</font></h2>"; 
/* lese aus der Tabelle con_cat alle Kategorien des zu kopierenden Mandanten ($old_idclient) aus */ 
$sql = "SELECT * from ".$cfg["tab"]["cat"]." where idclient=".$old_idclient." order by idcat"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */ 
$MyKatSeq=0; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) $MyKatSeq=$db2->Record[0]; 

/* Lese nun die vorhanden Kategorie-IDs in das Array ein und generiere gleichzeitig das Array 
* der neuen Kategorie-IDs. Dananch ist bekannt, welche neue idcat welcher alten idcat entsprach 
*/ 
while($db->next_record()) 
{ 
    if ($db->Record[0]==0) 
    { 
        $neueCatid=0; 
    } else { 
        $neueCatid=$MyKatSeq; 
        $MyKatSeq++; /* erhöhe um 1 */ 
    } 

    $ArrIdxAltKat[]=$db->Record[0]; /* Spalte idcat */ 
    $ArrIdxNeuKat[]=$neueCatid; 
    /* Neu am 29.7.2004 */ 
    /* Um die Kategorien zu kopieren, reicht es nicht nur die Werte idcat für den neuen Mandanten zu generieren 
     * Es müssem auch die Werte preid, postid und parentid kopiert und angepasst werden 
     * denn diese bestimmen später den Aufbau des Navigationsbaumes! 
     * Die Funktion strRemakeTreeTable der Datei functions.str.php erzeugt die Einträge nach jeder Änderung  der Struktur neu. 
     * Dazu werden die Werte der Tabelle con_cat ausgelesen. Hier steht zu jeder catid (Kategorie bzw. Menüpunkt) 
     * die Vorgänger-Kategorie (preid) und der Nachfolger (postid). */ 
    /* Ende neu am 29.7.2004 */ 
    $ArrIdxAltParentID[]=$db->Record[2]; /* Spalte parentid */ 
    $ArrIdxAltPreID[]=$db->Record[3]; /* Spalte preid */ 
    $ArrIdxAltPostID[]=$db->Record[4]; /* Spalte postid */ 

    $sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'"; 
    for ($i=2;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 

    $sql = $sql .")"; 
    $db2->query($sql); 
} /*End while */ 

  /* Die neuen idcat wurden in die Datenbank geschrieben, allerdings haben die neuen Kategorien noch die Zuordnungen zu den alten 
   * parentid, preid und postid 
   * Das muss nun noch korrigiert werden 
   * ACHTUNG: Ist parentid, preid oder postid 0, so bleibt er 0 !  */ 

    /* parentid: Für jeden Eintrag in $ArrIdxAltParentID[] */ 
    $lauf=0; 
    $ArrWerte=array_values($ArrIdxAltParentID); 
    foreach ($ArrWerte as $value) 
    { 
    /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */ 
    if ($ArrIdxAltParentID[$lauf]==0) 
    { 
        $ArrIdxNeuParentID[$lauf]=0; 
    } else { 
        /* Hinweis: array_search(suche das, hier drin) */ 
        $i=array_search($ArrIdxAltParentID[$lauf], $ArrIdxAltKat); 
        /* Setze nun $ArrIdxNeuParentID[]=$ArrIdxNeuKat[i] */ 
        $ArrIdxNeuParentID[$lauf]=$ArrIdxNeuKat[$i]; 
    } /* end if */ 
    $lauf++; 
    } 

    /* preid: Für jeden Eintrag in $ArrIdxAltPreID[] */ 
    $lauf=0; 
    $ArrWerte=array_values($ArrIdxAltPreID); 
    foreach ($ArrWerte as $value) 
    { 
    if ($ArrIdxAltPreID[$lauf]==0) 
    { 
        $ArrIdxNeuPreID[$lauf]=0; 
    } else { 
        /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */ 
        $i=array_search($ArrIdxAltPreID[$lauf], $ArrIdxAltKat); 
        /* Setze nun $ArrIdxNeuPreID[]=$ArrIdxNeuKat[i] */ 
        $ArrIdxNeuPreID[$lauf]=$ArrIdxNeuKat[$i]; 
    } /* end if */ 
    $lauf++; 
    } 

    /* postid: Für jeden Eintrag in $ArrIdxAltPostID[] */ 
    $lauf=0; 
    $ArrWerte=array_values($ArrIdxAltPostID); 
    foreach ($ArrWerte as $value) 
    { 
        if ($ArrIdxAltPostID[$lauf]==0) 
        { 
            $ArrIdxNeuPostID[$lauf]=0; 
        } else { 
            /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */ 
            $i=array_search($ArrIdxAltPostID[$lauf], $ArrIdxAltKat); 
            /* Setze nun $ArrIdxNeuPostID[]=$ArrIdxNeuKat[i] */ 
            $ArrIdxNeuPostID[$lauf]=$ArrIdxNeuKat[$i]; 
        } /* end if */ 
        $lauf++; 
    } 

    /* Schreibe diese nun zu den neuen idcat in die Datenbank  */ 
    $lauf=0; 
    $ArrWerte=array_values($ArrIdxNeuKat); 
    foreach ($ArrWerte as $value) 
    { 
        $sql = "UPDATE ".$cfg["tab"]["cat"]." set parentid=".$ArrIdxNeuParentID[$lauf].", preid=".$ArrIdxNeuPreID[$lauf].", postid=".$ArrIdxNeuPostID[$lauf]." where idcat = ".$value.""; 
        $db2->query($sql); 
        $lauf++; 
    } 


/*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyKatSeq." where seq_name = '".$cfg["tab"]["cat"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Die Kategorien wurden kopiert....kopiere nun deren Baumstruktur...</font></h3>"; 
echo "<hr>"; 
/* Die Daten der Tabelle con_cat wurden für den neuen Mandanten kopiert */ 



echo "<h3><font face='Arial' color='#525169'>Die Daten der Tabelle con_cat (Kategorien) wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>"; 
echo "<hr>"; 

/* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */ 
$sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." where idlang = ".$merk_idlang_old." order by idcat"; 
$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/ 

/* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */ 
$MyKatLangSeq=0; 
$sql = "SELECT nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_lang"]."'"; 
$db2->query($sql); 
if ($db2->next_record()) $MyKatLangSeq=$db2->Record[0]; 

while($db->next_record()) 
{ 
    /* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */ 
    $ArrPosKat=array_search($db->Record[1], $ArrIdxAltKat); 
    $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf); 

    $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'"; 

    $db->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */ 
    if ($ArrPosTplConf!==False) $db->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */ 

    /* Achtung: Einträge der Tabelle cat_lang sind Sprachabhängig. Schreibe daher hier auch die idlang (SprachID) des neuen 
    Mandanten mit rein...diese wude zu Beginn des Scripts ermittelt und in $merk_idlang_neu gemerkt */ 
    $db->Record[2]=$merk_idlang_neu; 
    for ($i=1;$i<$db->num_fields();$i++) 
    { 
        $sql = $sql .","; 
        $cont = $db->Record[$i]; 
        $cont = str_replace('\\','\\\\',$cont); 
        $cont = str_replace('"','\"',$cont); 

        $sql = $sql ."\"".$cont."\""; 
    } 

    $sql = $sql .")"; 
    $db2->query($sql); 

    $MyKatLangSeq++; 

} /* End While */ 

$MyKatLangSeq=$MyKatLangSeq-1; 
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */ 
$sql = "UPDATE ".$cfg["tab"]["sequence"]." set nextid=".$MyKatLangSeq." where seq_name = '".$cfg["tab"]["cat_lang"]."'"; 
$db2->query($sql); 
echo "<h3><font face='Arial' color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>"; 
echo "<hr>"; 

echo "<h1><font face='Arial' color='#0055dd'>FERTIG</font></h1>"; 
echo "<font face='Arial' color='#525169'>Es wurden alle Module, Templates, Layouts, Container und Kategorien kopiert.</font>"; 

/* con_sequence update */ 
$sql = "SHOW TABLES"; 
$db->query($sql); 

while ($db->next_record()) 
{ 
    dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0)); 
} 

echo "<br><font face='Arial' color='#FF0022'>con_sequence wurde upgedated.</font>"; 

/* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */ 
strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */ 

echo "<br><font face='Arial' color='#FF0022'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)</font>"; 

// code ends here 

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime(); 

if ($cfg["debug"]["rendering"] == true) 
{ 
    echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>"; 
    echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>"; 

    if (function_exists("memory_get_usage")) 
    { 
        echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>"; 
        echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>"; 

    } 

} 
page_close(); 
?>
ach ja fehler werden im errorlog.txt mitprotokolliert...
es kann sein das ich am anfang ein paar klassen zu viel include die in der 4.4.x serie nicht zur verfügung stehen... im dem fall die entsprechende cInclude zeile am beginn einfach rauswerfen...
Zuletzt geändert von emergence am Fr 20. Aug 2004, 18:05, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Beitrag von Axel » Fr 20. Aug 2004, 17:36

Hy emergence,

danke.
Werd deine Anpassungen einbauen und auch die Möglichkeit die Artikel optional mit zu kopieren...dann wird von einem Mandanten wirklich alles kopiert. Werd das neue Script dann voraussichtlich am Dienstag posten.

PS: in deiner Ergänzung setzt du zu Anfang (Zeile 104) $db = new DB_Contenido; und gegen Ende (Zeile 725) nochmal. Einmal zu viel?

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 20. Aug 2004, 18:00

Axel hat geschrieben:in deiner Ergänzung setzt du zu Anfang (Zeile 104) $db = new DB_Contenido; und gegen Ende (Zeile 725) nochmal. Einmal zu viel?
ähm ja stimmt, es macht im dem sinne aber nichts...
die klassen definition für upgrade kann man an sich am anfang gleich mit definieren... sollte keine auswirkungen haben ich ändere es noch im obrigen posting....

jetzt gibts nur mehr 3 werte
$db,$db2,$db_str

da ist mir noch aufgefallen, aber das ist nur mehr optik das bei der ersten fehlermeldung wenn der client noch nicht angepasst wurde -> die meldung nochmals bei die() mit ausgegeben wird...

mir gefällt das script...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 20. Aug 2004, 18:16

da sind mir noch ein paar nette ideen gekommen was man noch damit machen kann...

einen sql export könnte man ebenso für genau einen client realisieren...
wobei die werte durch platzhalter ersetzt werden... müsste man sich aber wirklich genau überlegen...

eins hat mich heute beim testen etwas verwundert, als ich den neu angelegten wieder gelöscht habe...
als ich das template gelöscht habe, war es beim ersten client möglich das layout zu löschen...
beim kopierten client konnte ich das layout nur löschen als ich den wert deleteable in der con_lay auf 1 gesetzt habe... kann sein das eine zuordnung irgendwo im script nicht passt...
aber da hab ich mich noch nicht durchgearbeitet...

lg
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 20. Aug 2004, 19:04

ach ja einen bug hab ich da gefunden...

es werden immer die kategorien kopiert..

Code: Alles auswählen

if ($CopyKategorien=0) /* 0=Nein */
sollte

Code: Alles auswählen

if ($CopyKategorien==0) /* 0=Nein */
sein...
*** make your own tools (wishlist :: thx)

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Beitrag von Axel » Mo 23. Aug 2004, 07:59

Richtig...ist bereits korrigiert. Artikel lassen sich auch optional kopieren. Werd das Script noch testen und dann mal posten.

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Manadanten kopieren, inkl. Artikel

Beitrag von Axel » Mo 23. Aug 2004, 17:51

Hier nun das vollständige Script. Kategorien und Artikel können optional kopiert werden. Bitte Anleitung im Script lesen. Durch die Anpassung von emergence fordert das Script zum Login auf.

<?
/* Script um Kunden zu kopieren
* Version 2.0
* Für Contenido 4.4.x (Getestet mit 4.4.4)
* Autor: Axel Womatschka
* Datum: 21.01.2004
* Zuletzt geändert am: 23.8.2004

* Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien und Artikel
* von einem Kunden (Mandanten) ($old_idclient) auf einen anderen (neuen) Mandanten ($new_idclient)
* Beide müssen bereits existieren.
*/

/* Folgende Tabellen werden vom Script verändert. Diese daher besser vorher sichern.
* con_lang
* con_clients_lang
* con_mod
* con_lay
* con_tpl
* con_tpl_conf
* con_container
* con_container_conf
* con_cat
* con_cat_lang
* con_sequence
* con_cat_tree (wird automatisch von contenido neu erstellt)
* Wenn die Artikel kopiert werden auch folgende sichern
* con_art
* con_art_lang
* con_cat_art
*/

/* Anleitung:
* Kopiere die .php-Datei mit diesem Script den Contenido-Ordner
* z.B. contenido/kopieren.php
*
* 1. Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches das Recht hat Mandanten anzulegen)
* 2. Lege einen neuen Mandanten an
* 3. Unter "Sprachen" nun den neuen Mandanten uas der Liste auswählen und eine neue Sprache anlegen
(Solltest du das vergessen, legt das Script automatisch eine neue Sprache an)
* 4. Merke dir den Index des neuen Mandanten (steht in () dahinter)
* 5. Öffnen dieses Script und setze direkt zu Anfang (Zeile 72) die Variable $new_idclient= Index des neuen Mandanten
Setze (Zeile 74) die Variable $old_idclient= zu kopierender Mandant
Angeben ob Kategorien, Artikel mit kopiert werden sollen
* 6. Abmelden von Contenido (falls noch eingeloggt)
* 7. Script starten
* 8. Wenn das Script fertig ist im Ordner contenido das Script im Browser updateseqruntime.php aufrufen (Setzt die Max-Indizes in der Tabelle con_sequence neu)
* FERTIG
*/

/* In der config.php stehen die Basisvariablen von Contenido. In der config.php
* werden zudem via Include noch folgende Dateien geladen
* cfg_sql.inc.php (Hier stehen die Tabellennamen)
* conlib/prepend.php3 (Hier werden weitere Dateien via require geladen, die das Sessions-Managment der MySQL-DB regeln
* unter anderem auch die my_sql.inc)
*
*/

Include "includes/config.php"; /* Die braucht man immer */
cInclude ("includes", 'functions.general.php');
$cfg["debug"]["backend_exectime"]["fullstart"] = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');
cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');
cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php'); /* Brauchen wir um Navigationsbaum für neuen Mandanten zu erzeugen */

page_open(array('sess' => 'Contenido_Session',
'auth' => 'Contenido_Challenge_Crypt_Auth',
'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');

/* MACHE DEINE INDIVIDUELLEN ANGABEN HIER*******************************************************/
/* Neuer Kunde auf den kopiert werden soll. Dieser muss vorher angelegt werden*/
$new_idclient=4;
/* Kunde, der kopiert werden soll */
$old_idclient=1;
/*Auch die Kategorien (Menübaum) mit kopieren? */
$CopyKategorien=1; /* Kategorien kopieren? 0=Nein, 1=Ja */
$CopyArtikel=1; /* Artikel kopieren? (setzt $CopyKategorien=1 voraus 0=Nein, 1=Ja */
/***********************************************************************************************/

/* Instanzen der DB_Contenido */
$db1 = new DB_Contenido;
$db2 = new DB_Contenido;
$db = new DB_Contenido;
$db_str = new DB_Contenido; // wird für functions.str.php benötigt

$new_client_Name="";
$old_client_Name="";

/* Für die Layouts */
$ArrIdxAltLayout=array();
$ArrIdxNeuLayout=array();

/* Für die Module */
$ArrIdxAltModul=array();
$ArrIdxNeuModul=array();

/* Für die Templates */
$ArrIdxAltTpl=array();
$ArrIdxNeuTpl=array();
$ArrIdxAltTplConf=array();
$ArrIdxNeuTplConf=array();

/* Für die Kategorien */
$ArrIdxAltKat=array();
$ArrIdxNeuKat=array();
$ArrIdxNeuParentID=array();
$ArrIdxNeuPostID=array();
$ArrIdxNeuPreID=array();

/* Für die Artikel */
$ArrIdxAltArt=array();
$ArrIdxNeuArt=array();


/* Ermittel Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT idclient, name from ".$cfg["tab"]["clients"]." where (idclient=".$old_idclient." OR idclient=".$new_idclient.")";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db1->next_record())
{
if ($db1->Record[0]==$new_idclient) $new_client_Name=trim($db1->Record[1]);
if ($db1->Record[0]==$old_idclient) $old_client_Name=trim($db1->Record[1]);
}
if ($old_client_Name=="" OR $new_client_Name=="")
{
/* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
$Meldung="Zu den verwendeten Mandantennummern (idclient) ".$old_idclient." und ".$new_idclient." gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummern (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
echo "<hr><h3><font face='Arial' color='#ff0000'>Prüfen: <BR>".$Meldung."</font></h3><hr>";
page_close();
die($Meldung); /* Scriptausführung abbrechen */
}

if ($CopyArtikel==1 and $CopyKategorien==0)
{
$Meldung="Artikel können nur kopiert werden wenn auch die Kategorien kopiert werden sollen. Die Ausführung wird abgebrochen.";
echo "<hr><h3><font face='Arial' color='#ff0000'>Prüfen: <BR>".$Meldung."</font></h3><hr>";
page_close();
die($Meldung); /* Scriptausführung abbrechen */
}

/* Prüfe nun ob beide Mandanten die gleichen SprachID haben. In einem Forumartikel Timo schrieb Timo am 3.2.2004 (Contenido Entwickler)
das Mandanten eine eigene SprachID haben sollten, weil diese auch in den Tabellen Keywords und Rights übernommen wird */
/* Sehe dazu erst in der Tabelle con_clients_lang nach, ob der zweite Mandant dort existiert */
echo "<h3><font face='Arial' color='#525169'>Ermittel die Spracheinstellung des neuen Mandanten...</font></h3>";

$sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE ((idclient=".$old_idclient.") OR (idclient=".$new_idclient."))";
$db1->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db1->next_record())
{
if ($db1->Record[1]==$old_idclient) $merk_idlang_old=$db1->Record[2]; /*Merke hier die SprachID des alten Mandanten */
if ($db1->Record[1]==$new_idclient)
/* Ja, neuer Mandant existiert in der Tabelle clients_lang...das bedeutet, der Anwender hat über Contenido selbst den Mandanzen sauber angelegt und eine neue
Sprache zugeordnet. Merke hier die SprachID des neuen Mandanten */
{
$MandantNeuExist=1;
$merk_idlang_neu=$db1->Record[2]; /*Merke hier die SprachID des neuen Mandanten */
echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu."</font></h3>";
echo "<hr>";
} /*End If */
} /* End While */

echo "<h3><font face='Arial' color='#525169'>Spracheinstellung des alten Mandanten: idlang = ".$merk_idlang_old."</font></h3>";

/* Nein, neuer Mandant existiert nicht in der Tabelle clients_lang. Um ihn dort einzutragen brauchen wir erst eine neue SprachID
Erzeuge neue SprachID in Tabelle con_lang und merke diese für den neuen Mandanten */

if ($MandantNeuExist==0) /* Neuer Mandant existiert nicht in Tabelle client_lang */
{
$sql = "SELECT * FROM ".$cfg["tab"]["lang"]." WHERE (idlang=".$merk_idlang_old.")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db1->query($sql);
$MyLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyLangSeq=$db2->Record[0];
$merk_idlang_neu=$MyLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
$db1->next_record();
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}
$sql = $sql .")";
/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$merk_idlang_neu." where seq_name = '".$cfg["tab"]["lang"]."'";
$db2->query($sql);

/* Nun der neue Eintrag in con_clients_lang */
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyClientsLangSeq=$db2->Record[0];
$MyClientsLangSeq++; /* erhöhe um 1 */
$sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";

/*echo "SQL lautet: ".$sql."<br>";*/
$db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyClientsLangSeq." where seq_name = '".$cfg["tab"]["clients_lang"]."'";
$db2->query($sql);

echo "<h3><font face='Arial' color='#ff0000'>Spracheinstellung des neuen Mandanten existierte nicht und wurde deshalb erzeugt (idlang = ".$merk_idlang_neu.")</font></h3>";
echo "<hr>";
} /*End If*/



/* Alles OK....leg los */
echo "<hr><h1><font face='Arial' color='#525169'>Kopiere den Mandanten >".$old_client_Name."< (idclient ".$old_idclient.") auf den Mandanten >".$new_client_Name."< (idclient ".$new_idclient."):</font></h1><hr>";

/*****************************************************************************************/
/*Module KOPIEREN*/
/* ermittel alle Module des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["mod"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyModSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyModSeq=$db2->Record[0];
}

$sql="";
$lauf=0;
/* $db1->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_mod..das ist der Modulname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["mod"]." VALUES ('".$MyModSeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_mod */

/*Merke im Array $ArrIdxAltModule[] den Index (idmod) der Module des alten Mandanten */
$ArrIdxAltModule[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuModule[] den Index (idmod) der Module des neuen Mandanten */
$ArrIdxNeuModule[]=$MyModSeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idmod welchem neuen idmod entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyModSeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyModSeq bei con_mod in die Tabelle con_sequence */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyModSeq." where seq_name = '".$cfg["tab"]["mod"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Module vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["mod"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*****************************************************************************************/
/*LAYOUTS KOPIEREN*/
/* ermittel alle Layouts des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["lay"]." where idclient=".$old_idclient;
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyLaySeq=$db2->Record[0];
}

$sql="";
$lauf=0;
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db1->next_record())
{
echo "<font face='Arial' color='#000000'>".$db1->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_lay..das ist der Layoutname */

$lauf++;
$sql = "INSERT INTO ".$cfg["tab"]["lay"]." VALUES ('".$MyLaySeq."','".$new_idclient."'";

$db1->Record[4]="YES"; /* Spalte deletable der Tabelle con_lay */

/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltLayout[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuLayout[] den Index (idlay) der Layouts des neuen Mandanten */
$ArrIdxNeuLayout[]=$MyLaySeq;
/*Das Merken im Array ist nötig um später noch zu wissen welcher alte idlay welchem neuen idlay entspricht*/

for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyLaySeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyLaySeq bei con_lay in die Tabelle con_sequence */
$MyLaySeq=$MyLaySeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyLaySeq." where seq_name = '".$cfg["tab"]["lay"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Layouts vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["lay"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";


/*****************************************************************************************/
/*TEMPLATES KOPIEREN*/
/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_template aus */
$MyTplSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyTplSeq=$db2->Record[0];
$MyTplSeq++;

$MyTplConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyTplConfSeq=$db2->Record[0];
$MyTplConfSeq++;
}

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/*Lese die idtpl der Templates erst mal in ein Array um sich die alten Indizes zu merken */
while($db1->next_record())
{
/*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
$ArrIdxAltTpl[]=$db1->Record[2]; /* Spalte idtpl */
$ArrIdxNeuTpl[]=$MyTplSeq;
$MyTplSeq++; /* erhöhe um 1 */

$ArrIdxAltTplConf[]=$db1->Record[3]; /* Spalte idtplcfg */
$ArrIdxNeuTplConf[]=$MyTplConfSeq;
$MyTplConfSeq++; /* erhöhe um 1 */
}

/*Hinweis:
$MyTplSeq ist der Wert, der für nextid con_tpl in con_sequence eingetragen werden muss
$MyTplConfSeq-1 ist der Wert, der für nextid con_tplConf in con_sequence eingetragen werden muss
*/

/* Nun sind alle ID's, die alten und die neuen bekannt. Kopiere nun die Daten der Tabelle con_Templates */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Templates:</font></h2>";
$lauf=0;
while($db1->next_record())
{
$lauf++;
/* Lese nun idlay aus und stelle fest, wo dieser idlay im Array der alten Indizes steht (in ArrIdxAltLayer[]) */
$ArrPosLay=array_search($db1->Record[1], $ArrIdxAltLayout);

/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[2], $ArrIdxAltTpl);

/* dito für idtplconf */
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'";
$db1->Record[1]=$ArrIdxNeuLayout[$ArrPosLay];
$db1->Record[2]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf];

echo "<font face='Arial' color='#000000'>".$db1->Record[4]."</font><BR>";

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

/*Neuen Datensatz auch in Tabelle tplconf */
$sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl, author) VALUES ('".$ArrIdxNeuTplConf[$ArrPosTplConf]."', '".$ArrIdxNeuTpl[$ArrPosTpl]."', 'admin')";
$db2->query($sql);
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplSeq." where seq_name = '".$cfg["tab"]["tpl"]."'";
$db2->query($sql);
$MyTplConfSeq=$MyTplConfSeq-1;
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyTplConfSeq." where seq_name = '".$cfg["tab"]["tpl_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Templates vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["tpl"]." und für ".$cfg["tab"]["tpl_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER kopieren */
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
$ArrPosTpl=array_search($db1->Record[1], $ArrIdxAltTpl);
if ($ArrPosTpl<>False)
{ /* if */
$lauf++;
$ArrPosModul=array_search($db1->Record[3], $ArrIdxAltModul);

$MyContainerSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container"]." VALUES ('".$MyContainerSeq."'";

$db1->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl];
$db1->Record[3]=$ArrIdxNeuModul[$ArrPosModul];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerSeq." where seq_name = '".$cfg["tab"]["container"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER CONF kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql="SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq=1;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyContainerConfSeq=$db2->Record[0];

$lauf=0;
while($db1->next_record())
{
/* Lese nun idtplcfg aus und stelle fest, wo dieser idtplcfg im Array der alten Indizes steht (in ArrIdxAltTplConf[]) */
$ArrPosTplConf=array_search($db1->Record[1], $ArrIdxAltTplConf);
if ($ArrPosTplConf!==False)
{ /* If */
$lauf++;
$MyContainerConfSeq++;
$sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." VALUES ('".$MyContainerConfSeq."'";

$db1->Record[1]=$ArrIdxNeuTplConf[$ArrPosTplConf];

for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /* End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyContainerConfSeq." where seq_name = '".$cfg["tab"]["container_conf"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." Container Conf-Daten vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
if ($CopyKategorien==1) /* End if ist in Zeile 696 */
{
/*KATEGORIEN kopieren */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die Kategorien/Men&uuml;s:</font></h2>";
/* lese aus der Tabelle con_cat alle Kategorien des zu kopierenden Mandanten ($old_idclient) aus */
$sql = "SELECT * from ".$cfg["tab"]["cat"]." where idclient=".$old_idclient." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
$MyKatSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatSeq=$db2->Record[0];

/* Lese nun die vorhanden Kategorie-IDs in das Array ein und generiere gleichzeitig das Array
* der neuen Kategorie-IDs. Dananch ist bekannt, welche neue idcat welcher alten idcat entsprach
*/
while($db1->next_record())
{
if ($db1->Record[0]==0)
{
$neueCatid=0;
} else {
$neueCatid=$MyKatSeq;
$MyKatSeq++; /* erhöhe um 1 */
}

$ArrIdxAltKat[]=$db1->Record[0]; /* Spalte idcat */
$ArrIdxNeuKat[]=$neueCatid;
/* Neu am 29.7.2004 */
/* Um die Kategorien zu kopieren, reicht es nicht nur die Werte idcat für den neuen Mandanten zu generieren
* Es müssem auch die Werte preid, postid und parentid kopiert und angepasst werden
* denn diese bestimmen später den Aufbau des Navigationsbaumes!
* Die Funktion strRemakeTreeTable der Datei functions.str.php erzeugt die Einträge nach jeder Änderung der Struktur neu.
* Dazu werden die Werte der Tabelle con_cat ausgelesen. Hier steht zu jeder catid (Kategorie bzw. Menüpunkt)
* die Vorgänger-Kategorie (preid) und der Nachfolger (postid). */
/* Ende neu am 29.7.2004 */
$ArrIdxAltParentID[]=$db1->Record[2]; /* Spalte parentid */
$ArrIdxAltPreID[]=$db1->Record[3]; /* Spalte preid */
$ArrIdxAltPostID[]=$db1->Record[4]; /* Spalte postid */

$sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
for ($i=2;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);
} /*End while */

/* Die neuen idcat wurden in die Datenbank geschrieben, allerdings haben die neuen Kategorien noch die Zuordnungen zu den alten
* parentid, preid und postid
* Das muss nun noch korrigiert werden
* ACHTUNG: Ist parentid, preid oder postid 0, so bleibt er 0 ! */

/* parentid: Für jeden Eintrag in $ArrIdxAltParentID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltParentID);
foreach ($ArrWerte as $value)
{
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
if ($ArrIdxAltParentID[$lauf]==0)
{
$ArrIdxNeuParentID[$lauf]=0;
} else {
/* Hinweis: array_search(suche das, hier drin) */
$i=array_search($ArrIdxAltParentID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuParentID[]=$ArrIdxNeuKat */
$ArrIdxNeuParentID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* preid: Für jeden Eintrag in $ArrIdxAltPreID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPreID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPreID[$lauf]==0)
{
$ArrIdxNeuPreID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPreID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPreID[]=$ArrIdxNeuKat */
$ArrIdxNeuPreID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* postid: Für jeden Eintrag in $ArrIdxAltPostID[] */
$lauf=0;
$ArrWerte=array_values($ArrIdxAltPostID);
foreach ($ArrWerte as $value)
{
if ($ArrIdxAltPostID[$lauf]==0)
{
$ArrIdxNeuPostID[$lauf]=0;
} else {
/* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
$i=array_search($ArrIdxAltPostID[$lauf], $ArrIdxAltKat);
/* Setze nun $ArrIdxNeuPostID[]=$ArrIdxNeuKat */
$ArrIdxNeuPostID[$lauf]=$ArrIdxNeuKat[$i];
} /* end if */
$lauf++;
}

/* Schreibe diese nun zu den neuen idcat in die Datenbank */
$lauf=0;
$ArrWerte=array_values($ArrIdxNeuKat);
foreach ($ArrWerte as $value)
{
$sql="Update ".$cfg["tab"]["cat"]." set parentid=".$ArrIdxNeuParentID[$lauf].", preid=".$ArrIdxNeuPreID[$lauf].", postid=".$ArrIdxNeuPostID[$lauf]." where idcat = ".$value."";
$db2->query($sql);
$lauf++;
}


/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatSeq." where seq_name = '".$cfg["tab"]["cat"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Kategorien wurden kopiert....kopiere nun deren Baumstruktur...</font></h3>";
echo "<hr>";
/* Die Daten der Tabelle con_cat wurden für den neuen Mandanten kopiert */



echo "<h3><font face='Arial' color='#525169'>Die Daten der Tabelle con_cat (Kategorien) wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>";
echo "<hr>";

/* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */
$sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." where idlang = ".$merk_idlang_old." order by idcat";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
$MyKatLangSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatLangSeq=$db2->Record[0];

while($db1->next_record())
{
/* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
$ArrPosKat=array_search($db1->Record[1], $ArrIdxAltKat);
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);

$sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'";

$db1->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */
if ($ArrPosTplConf!==False) $db1->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */

/* Achtung: Einträge der Tabelle cat_lang sind Sprachabhängig. Schreibe daher hier auch die idlang (SprachID) des neuen
Mandanten mit rein...diese wude zu Beginn des Scripts ermittelt und in $merk_idlang_neu gemerkt */
$db1->Record[2]=$merk_idlang_neu;
for ($i=1;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}

$sql = $sql .")";
$db2->query($sql);

$MyKatLangSeq++;

} /* End While */

$MyKatLangSeq=$MyKatLangSeq-1;
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatLangSeq." where seq_name = '".$cfg["tab"]["cat_lang"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
echo "<hr>";
} /* End if von if ($CopyKategorien==1) Zeile 513*/

/*****************************************************************************************/
/*ARTIKEL kopieren*/
if ($CopyArtikel==1 and $CopyKategorien==1)
{
echo "<h3><font face='Arial' color='#525169'>Kopiere nun alle Artikel</font></h3>";
/* ermittel alle Artikel des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["art"]." where idclient=".$old_idclient." order by idart";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_art aus */
$MyArtSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["art"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyArtSeq=$db2->Record[0];
}
$sql="";
$lauf=0;
/* $db1->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
echo "<hr><h2><font face='Arial' color='#525169'>Kopiere die folgenden Artikel:</font></h2>";
while($db1->next_record())
{
$lauf++;
/*Merke im Array den Index (idart) der Artikel des alten Mandanten */
$ArrIdxAltArt[]=$db1->Record[0];
/*Merke im Array $ArrIdxNeuArt[] den Index (idart) der Artikel des neuen Mandanten */
$ArrIdxNeuArt[]=$MyArtSeq;
/*Das Merken im Array ist nötig um später noch zu wissen welche alte idart welcher neuen idart entspricht*/

$sql = "INSERT INTO ".$cfg["tab"]["art"]." VALUES (".$MyArtSeq.", ".$new_idclient."";
$sql = $sql .")";
$db2->query($sql);

/* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
$MyArtSeq++; /* erhöhe um 1 */
}

/* schreibe nun den letzten wert von $MyArtSeq bei con_mod in die Tabelle con_sequence */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyArtSeq." where seq_name = '".$cfg["tab"]["art"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art"]."< erzeugt.</font></h3>";
echo "<hr>";

/* Jetzt noch die Einträge der Tabelle con_art_lang erzeugen - hier stehen die eigentlichen Artikelinhalte */
/**************Tabelle CON_ART_LANG************************************************************************************************************/
echo "<h3><font face='Arial' color='#525169'>Erzeuge nun mit diesen neuen Einträgen die neuen Texte der Artikel (Tabelle >".$cfg["tab"]["art_lang"]."<)</font></h3>";
/* ermittel alle Einträge des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["art_lang"]." where idlang = ".$merk_idlang_old."";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
$lauf=0;
while($db1->next_record())
{

/* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
$ArrPosArt=array_search($db1->Record[1], $ArrIdxAltArt);
if ($ArrPosArt!==False) /* Nötig, weil in con_art_lang auch Artikel andere Mandanten der gleichen Sprche stehen könnten */
{
/* An welcher Position im Array steht der Wert idtplcfg */
$ArrPosTplConf=array_search($db1->Record[3], $ArrIdxAltTplConf);
echo "<font face='Arial' color='#000000'>Kopiere Artikel ".$db1->Record[4]."</font><BR>";
$lauf++;

$sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idLang_neu.", ".$ArrIdxNeuTplConf[$ArrPosTplConf]."";

/* im Feld time_target_cat steht die Kategorie in die nach Zeitablauf der Artikel verschoben wird. Diese ist für den neuen Mandanten auch noch anzupassen */
$ArrPosKat=array_search($db1->Record[24], $ArrIdxAltKat);
$db1->Record[24]=$ArrIdxNeuKat[$ArrPosKat];
for ($i=4;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}
$sql = $sql .")";
$db2->query($sql);
}
}
echo "<h3><font face='Arial' color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art_lang"]."< erzeugt.</font></h3><BR>";
echo "<h3><font face='Arial' color='#525169'>Kopiere nun die Zuordnungen der Artikel zu den Kategorien (Tabelle >".$cfg["tab"]["cat_art"]."<)</font></h3>";
$sql = "SELECT * from ".$cfg["tab"]["cat_art"]." order by idart";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
Lese daher erst hier den aktuelen Index-Wert für die Tabelle con_cat_art aus */
$MyCatArtSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_art"]."'";
$db2->query($sql);
if ($db2->next_record())
{
$MyCatArtSeq=$db2->Record[0];
}
$sql="";
$lauf=0;
while($db1->next_record())
{
/* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
$ArrPosArt=array_search($db1->Record[2], $ArrIdxAltArt);
if ($ArrPosArt!==False) /* Nötig, weil in con_cat_art auch Artikel anderer Mandanten der gleichen Sprache stehen könnten */
{
$lauf++;
$ArrPosKat=array_search($db1->Record[1], $ArrIdxAltKat);
$sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." VALUES (".$MyCatArtSeq.", ".$ArrIdxNeuKat[$ArrPosKat].", ".$ArrIdxNeuArt[$ArrPosArt]."";

for ($i=3;$i<$db1->num_fields();$i++)
{
$sql = $sql .",";
$cont = $db1->Record[$i];
$cont = str_replace('\\','\\\\',$cont);
$cont = str_replace('"','\"',$cont);

$sql = $sql ."\"".$cont."\"";
}
$sql = $sql .")";
$db2->query($sql);
$MyCatArtSeq++;
}
}
/* schreibe nun den letzten wert von $MyCatArtSeq bei con_mod in die Tabelle con_sequence */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyCatArtSeq." where seq_name = '".$cfg["tab"]["cat_art"]."'";
$db2->query($sql);
/*****************************************************************************************/

echo "<h3><font face='Arial' color='#525169'>Die Artikel wurden kopiert.</font></h3>";
echo "<hr>";
} /* End if von ($CopyArtikel==1 and $CopyKategorien==1) Zeile 704*/

echo "<h1><font face='Arial' color='#0055dd'>FERTIG</font></h1>";
echo "<font face='Arial' color='#525169'>Es wurden alle Module, Templates, Layouts, Container und Kategorien kopiert.</font>";
/* con_sequence update -aktualisiert die Tabelle con_sequence*/
class DB_Upgrade extends DB_Contenido {
}

$db = new DB_Contenido;

$sql = "SHOW TABLES";
$db->query($sql);

while ($db->next_record())
{
dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
}

echo "<br><font face='Arial' color='#FF0022'>Tabelle con_sequence wurde aktualisiert.</font>";

/* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */
strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */

echo "<br><font face='Arial' color='#FF0022'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)</font>";

// code ends here

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime();

if ($cfg["debug"]["rendering"] == true)
{
echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>";
echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>";

if (function_exists("memory_get_usage"))
{
echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>";
echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>";

}

}
page_close();
?>

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 25. Aug 2004, 12:35

ähm ad

Code: Alles auswählen

$db1->Record[4]="YES";
ergeben sich zwei probleme
ergibt bei mir beim feld deletable dein eintrag 0
in der 4.5.x serie stimmt diese position bei con_mod bei einer neuinstall nicht, bei einem upgrade von der 4.4.x serie hingegen schon....
da hat sich dazwischen ein neues feld hinein geschoben...

wenn ich es rausnehme werden die werte 1:1 vom ersten client mitübernommen...

nun ja da hab ich noch ne funktion die die con_sequence updatet...
sieh es dir mal an ob du sie brauchen kannst...

updateSequence(); updatet alle einträge
und
updateSequence($cfg["tab"]["con"]); genau diesen einen...

Code: Alles auswählen

// simple function to update con_sequence
function updateSequence($table=false) {

    global $db, $cfg;

    if (!$table) {

        $sql = "SHOW TABLES";
        $db->query($sql);

        while ($db->next_record())
        {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
        }

    } else {

        dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);

    }

}
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 25. Aug 2004, 12:50

ach ja es werden keine artikel kopiert

-> $merk_idLang_neu müsste $merk_idlang_neu sein...

das führt sonst zu einem sql fehler ...

noch was intressantes, kann auch sein das der fehler von mir kam, die einstellungen wo welches modul sich im template befindet sind irgendwie nicht vorhanden...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 25. Aug 2004, 15:07

okay ich hab mir das jetzt mal etwas überlegt...
um dich zu motivieren... der fehler mit den templates kommt nicht von dir und ist vom ansatz her auch richtig gelöst, wenn keine vorkonfiguration vorhanden ist und man keine kategorien und keine artikel kopiert...
mit der con_container stimmt trotzdem leider was nicht...

die sache ist folgende (da muss ich jetzt etwas weiter ausholen) mal sehen ob ich es hinbekomme

con_template, con_template_conf, con_container, con_container_conf

jede kategorie bzw jeder artikel besitzt das feld idtplcfg
dieses feld ist nun verknüpft mit con_template_conf

wenn eine kategorie bei idtplcfg den wert 0 hat, ist sie nicht konfiguriert -> es muss somit nichts kopiert werden...
wenn eine kategorie einen wert hat, müssen die werte entsprechend kopiert und eingetragen werden...

wenn ein artikel keine idtplcfg hat -> wert 0 -> wird die konfiguration der kategorie genommen -> muss nichts kopiert werden
wenn ein artikel einen wert besitzt müssen die werte wieder entsprechend kopiert werden...

wenn dies noch mit eingebaut wird ist dein script wirklich perfekt...
*** make your own tools (wishlist :: thx)

Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Beitrag von Axel » Mi 25. Aug 2004, 17:05

emergence hat geschrieben:okay ich hab mir das jetzt mal etwas überlegt...
um dich zu motivieren... der fehler mit den templates kommt nicht von dir und ist vom ansatz her auch richtig gelöst, wenn keine vorkonfiguration vorhanden ist und man keine kategorien und keine artikel kopiert...
mit der con_container stimmt trotzdem leider was nicht...

die sache ist folgende (da muss ich jetzt etwas weiter ausholen) mal sehen ob ich es hinbekomme

con_template, con_template_conf, con_container, con_container_conf

jede kategorie bzw jeder artikel besitzt das feld idtplcfg
dieses feld ist nun verknüpft mit con_template_conf

wenn eine kategorie bei idtplcfg den wert 0 hat, ist sie nicht konfiguriert -> es muss somit nichts kopiert werden...
wenn eine kategorie einen wert hat, müssen die werte entsprechend kopiert und eingetragen werden...

wenn ein artikel keine idtplcfg hat -> wert 0 -> wird die konfiguration der kategorie genommen -> muss nichts kopiert werden
wenn ein artikel einen wert besitzt müssen die werte wieder entsprechend kopiert werden...

wenn dies noch mit eingebaut wird ist dein script wirklich perfekt...
:?: Bezieht sich das auf die Funktionalität in der Version 4.5 ? In meiner 4.4.4 habe ich keine Probs, auch nicht mit den Containern....
Das mit den Templates schau ich mir noch mal an, aber auch wenn eine Kategorie noch nicht mit einem Template konfiguriert wurde, so muss ich sie dennoch auf den neuen Mandanten kopieren.

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 25. Aug 2004, 18:55

okay, damit ich das ganze jetzt wirklich komplett versteh was du da gemacht hast, hab ich jetzt ein paar dinge umgebaut... die es für mich leichter machten das ganze nachzuvollziehen...

ein paar fehler hab ich dabei entdeckt... zb

Code: Alles auswählen

if ($ArrPosTpl<>False) 
sollte

Code: Alles auswählen

if ($ArrPosTpl!==False) 
sein... das war der fehler in der con_container -> der wert bei 0 wird dabei ignoriert....
ähm das andere

Code: Alles auswählen

$merk_idlang_neu=$MyLangSeq++; /* erhöhe um 1 */
ist eigentlich auch ganz intressant in dem fall erhält $merk_idlang_neu den wert von $MyLangSeq bevor dort 1 dazu gezählt wird...
wirkt sich aber nicht weiters aus....

sonst ein paar kleiner dinge wie variablen namen deckten sich zeitweise nicht -> einmal ein e zuviel etc.. nichts dragisches an sich...

ich hab die sequenceid ermittlung durch ne neue funktion ersetzt ebenso das updaten der sequence...

die einzigen sachen die jetzt noch nicht drinnen sind ist die zuordnung der idtplcfg bei kategorie und artikel....

hier meine modifizierte version des scripts...

Code: Alles auswählen

<?php
/* Script um Kunden zu kopieren
 * Version 2.1
 * Für Contenido 4.4.x (Getestet mit 4.4.4)
 * Autor: Axel Womatschka
 * Datum: 21.01.2004
 * Zuletzt geändert am: 25.08.2004

 * Dieses Script kopiert die Module, Layouts, Templates, Container und auf Wunsch auch Kategorien und Artikel
 * von einem Kunden (Mandanten) ($old_idclient) auf einen anderen (neuen) Mandanten ($new_idclient)
 * Beide müssen bereits existieren.
 */

/* Folgende Tabellen werden vom Script verändert. Diese daher besser vorher sichern.
 * con_lang
 * con_clients_lang
 * con_mod
 * con_lay
 * con_tpl
 * con_tpl_conf
 * con_container
 * con_container_conf
 * con_cat
 * con_cat_lang
 * con_sequence
 * con_cat_tree (wird automatisch von contenido neu erstellt)
 * Wenn die Artikel kopiert werden auch folgende sichern
 * con_art
 * con_art_lang
 * con_cat_art
 */

/* Anleitung:
 * Kopiere die .php-Datei mit diesem Script in das Contenido verzeichnis
 * z.B. contenido/client_kopieren.php
 *
 * 1. Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches das Recht hat Mandanten anzulegen)
 * 2. Lege einen neuen Mandanten an
 * 3. Unter "Sprachen" nun den neuen Mandanten uas der Liste auswählen und eine neue Sprache anlegen
 *    (Solltest du das vergessen, legt das Script automatisch eine neue Sprache an)
 * 4. Merke dir den Index des neuen Mandanten (steht in () dahinter)
 * 5. Öffnen dieses Script und setze direkt zu Anfang (Zeile 50) die Variable $new_idclient= Index des neuen Mandanten
 *    Setze (Zeile 52) die Variable $old_idclient= zu kopierender Mandant
 * 6. Abmelden von Contenido (falls noch eingeloggt)
 * 7. Script starten
 * FERTIG
 */

/* MACHE DEINE INDIVIDUELLEN ANGABEN HIER*******************************************************/
    /* Neuer Kunde auf den kopiert werden soll. Dieser muss vorher angelegt werden*/
    $new_idclient= 3;
    /* Kunde, der kopiert werden soll */
    $old_idclient= 1;
    /*Auch die Kategorien (Menübaum) mit kopieren? */
    $CopyKategorien=1; /* 0=Nein, 1=Ja */
    $CopyArtikel=1; /* 0=Nein, 1=Ja */
/***********************************************************************************************/

include_once ('./includes/config.php');
cInclude ("includes", 'functions.general.php');

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');

cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');

cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php');

page_open(array('sess' => 'Contenido_Session',
                'auth' => 'Contenido_Challenge_Crypt_Auth',
                'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');

class DB_Upgrade extends DB_Contenido {
}

/* Instanzen der DB_Contenido */
$db = new DB_Contenido;
$db2 = new DB_Contenido;
$db_str = new DB_Contenido;

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();

/* con_sequence update */
updateSequence();

?>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="styles/contenido.css" />
    <script type="text/javascript" src="scripts/general.js"></script>
<style type="text/css">
<!--
/* Cascading Style Sheet */

BODY,P,TD { font-family : verdana, arial, helvetica, sans-serif; }
BODY,P,TD { font-size : 11px; }

A:active,A:link,A:visited { text-decoration : none; }
A:hover { text-decoration : underline; }

P { text-align : justify; line-height: 140%; }

.red  { color : #FF0000; }
.grey  { color : #333333; }
.white { color : #FFFFFF; }

-->
</style>
</head>
<body style="margin: 10px">
<?php

$new_client_Name="";
$old_client_Name="";

/* Für die Layouts */
$ArrIdxAltLayout=array();
$ArrIdxNeuLayout=array();

/* Für die Module */
$ArrIdxAltModul=array();
$ArrIdxNeuModul=array();

/* Für die Templates */
$ArrIdxAltTpl=array();
$ArrIdxNeuTpl=array();
$ArrIdxAltTplConf=array();
$ArrIdxNeuTplConf=array();

/* Für die Kategorien */
$ArrIdxAltKat=array();
$ArrIdxNeuKat=array();
$ArrIdxNeuParentID=array();
$ArrIdxNeuPostID=array();
$ArrIdxNeuPreID=array();

/* Für die Artikel */
$ArrIdxAltArt=array();
$ArrIdxNeuArt=array();

/* Ermittle Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT idclient, name from ".$cfg["tab"]["clients"]." WHERE (idclient=".$old_idclient." OR idclient=".$new_idclient.")";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db->next_record())
{
    if ($db->Record[0]==$new_idclient) $new_client_Name=trim($db->Record[1]);
    if ($db->Record[0]==$old_idclient) $old_client_Name=trim($db->Record[1]);
}
if ($old_client_Name=="" OR $new_client_Name=="")
{
    /* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
    $Meldung="Zu den verwendeten Mandantennummern (idclient) ".$old_idclient." und ".$new_idclient." gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummern (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
    echo "<hr><h3><font color='#ff0000'>Fehler: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* Scriptausführung abbrechen */
}

if ($CopyArtikel==1 and $CopyKategorien==0)
{
    $Meldung="Artikel können nur kopiert werden wenn auch die Kategorien kopiert werden sollen. Die Ausführung wird abgebrochen.";
    echo "<hr><h3><font color='#ff0000'>Prüfen: <BR>".$Meldung."</font></h3><hr>";
    page_close();
    die(); /* Scriptausführung abbrechen */
}

/* Prüfe nun ob beide Mandanten die gleichen SprachID haben. In einem Forumartikel Timo schrieb Timo am 3.2.2004 (Contenido Entwickler)
   das Mandanten eine eigene SprachID haben sollten, weil diese auch in den Tabellen Keywords und Rights übernommen wird */
/* Sehe dazu erst in der Tabelle con_clients_lang nach, ob der zweite Mandant dort existiert */
echo "<h3><font color='#525169'>Ermittel die Spracheinstellung des neuen Mandanten...</font></h3>";

$sql = "SELECT * FROM ".$cfg["tab"]["clients_lang"]." WHERE ((idclient=".$old_idclient.") OR (idclient=".$new_idclient."))";

$db->query($sql);
$merk_idlang_old=0;
$MandantNeuExist=0;

while($db->next_record())
{
    if ($db->Record[1]==$old_idclient) $merk_idlang_old=$db->Record[2]; /*Merke hier die SprachID des alten Mandanten */
    if ($db->Record[1]==$new_idclient)
    {
        /* Ja, neuer Mandant existiert in der Tabelle clients_lang...das bedeutet, der Anwender hat über Contenido selbst den Mandanzen sauber angelegt und eine neue
        Sprache zugeordnet. Merke hier die SprachID des neuen Mandanten */
        $MandantNeuExist=1;
        $merk_idlang_neu=$db->Record[2]; /*Merke hier die SprachID des neuen Mandanten */
        echo "<h3><font color='#525169'>Spracheinstellung des neuen Mandanten existiert bereits (idlang = ".$merk_idlang_neu.")</font></h3>";
        echo "<hr>";
    } /*End If */
} /* End While */

echo "<h3><font color='#525169'>Spracheinstellung des alten Mandanten: idlang = ".$merk_idlang_old."</font></h3>";

/* Nein, neuer Mandant existiert nicht in der Tabelle clients_lang. Um ihn dort einzutragen brauchen wir erst eine neue SprachID
   Erzeuge neue SprachID in Tabelle con_lang und merke diese für den neuen Mandanten */

if ($MandantNeuExist==0) /* Neuer Mandant existiert nicht in Tabelle client_lang */
{
    $sql = "SELECT * FROM ".$cfg["tab"]["lang"]." WHERE (idlang=".$merk_idlang_old.")";

    $db->query($sql);

    /* Nun der neue Eintrag in con_lang */
    $MyLangSeq = getSequenceId($cfg["tab"]["lang"]);

    $merk_idlang_neu = $MyLangSeq;

    $sql = "INSERT INTO ".$cfg["tab"]["lang"]." VALUES ('".$merk_idlang_neu."'";
    $db->next_record();
    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

        $sql = $sql ."\"".$cont."\"";
    }
    $sql = $sql .")";

    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["lang"]);

    /* Nun der neue Eintrag in con_clients_lang */
    $MyClientsLangSeq = getSequenceId($cfg["tab"]["clients_lang"]);

    $sql = "INSERT INTO ".$cfg["tab"]["clients_lang"]." VALUES ('".$MyClientsLangSeq."', '".$new_idclient."', '".$merk_idlang_neu."')";


    $db2->query($sql); /* Erzeuge hier neuen Datensatz in Tabelle con_lang */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["clients_lang"]);

    echo "<h3><font color='#ff0000'>Spracheinstellung des neuen Mandanten existierte nicht und wurde deshalb erzeugt (idlang = ".$merk_idlang_neu.")</font></h3>";
    echo "<hr>";
} /*End If*/


/* Alles OK....leg los */
echo "<hr><h1><font color='#525169'>Kopiere den Mandanten >".$old_client_Name."< (idclient ".$old_idclient.") auf den Mandanten >".$new_client_Name."< (idclient ".$new_idclient."):</font></h1><hr>";

/*****************************************************************************************/
/*Module KOPIEREN*/
/* ermittel alle Module des zu kopierenden Kunden */
$sql = "SELECT * FROM ".$cfg["tab"]["mod"]." where idclient=".$old_idclient;

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
   Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_mod aus */

$MyModSeq = getSequenceId($cfg["tab"]["mod"]);


$lauf=0;
/* $db->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
echo "<hr><h2><font color='#525169'>Kopiere die folgenden Module:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_mod..das ist der Modulname */

    $lauf++;
    $sql = "INSERT INTO ".$cfg["tab"]["mod"]." VALUES ('".$MyModSeq."','".$new_idclient."'";

    /*Merke im Array $ArrIdxAltModul[] den Index (idmod) der Module des alten Mandanten */
    $ArrIdxAltModul[]=$db->Record[0];
    /*Merke im Array $ArrIdxNeuModul[] den Index (idmod) der Module des neuen Mandanten */
    $ArrIdxNeuModul[]=$MyModSeq;
    /*Das Merken im Array ist nötig um später noch zu wissen welcher alte idmod welchem neuen idmod entspricht*/

    for ($i=2;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

        $sql = $sql ."\"".$cont."\"";
    }

    $sql = $sql .")";

    $db2->query($sql);

    /* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
    $MyModSeq++; /* erhöhe um 1 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["mod"]);

echo "<h3><font color='#525169'>Es wurden ".$lauf." Module vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["mod"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*****************************************************************************************/
/*LAYOUTS KOPIEREN*/
/* ermittel alle Layouts des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["lay"]." where idclient=".$old_idclient;

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
   Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_mod aus */
$MyLaySeq = getSequenceId($cfg["tab"]["lay"]);

$lauf=0;
echo "<hr><h2><font color='#525169'>Kopiere die folgenden Layouts:</font></h2>";
while($db->next_record())
{
    echo "<font color='#000000'>".$db->Record[2]."</font><BR>"; /* Index 2 des Arrays. Entspricht dem Inhalt der 2.ten Datenspalte der Tabelle con_lay..das ist der Layoutname */

    $lauf++;
    $sql = "INSERT INTO ".$cfg["tab"]["lay"]." VALUES ('".$MyLaySeq."','".$new_idclient."'";

    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltLayout[]=$db->Record[0];
    /*Merke im Array $ArrIdxNeuLayout[] den Index (idlay) der Layouts des neuen Mandanten */
    $ArrIdxNeuLayout[]=$MyLaySeq;
    /*Das Merken im Array ist nötig um später noch zu wissen welcher alte idlay welchem neuen idlay entspricht*/

    for ($i=2;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

        $sql = $sql ."\"".$cont."\"";
    }

    $sql = $sql .")";

    $db2->query($sql);

    /* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
    $MyLaySeq++; /* erhöhe um 1 */
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["lay"]);

echo "<h3><font color='#525169'>Es wurden ".$lauf." Layouts vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["lay"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";


/*****************************************************************************************/
/*TEMPLATES KOPIEREN*/
/* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
   Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_template aus */
$MyTplSeq = getSequenceId($cfg["tab"]["tpl"]);
$MyTplConfSeq = getSequenceId($cfg["tab"]["tpl_conf"]);

/* ermittel alle Templates des zu kopierenden Kunden */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/*Lese die idtpl der Templates erst mal in ein Array um sich die alten Indizes zu merken */
while($db->next_record())
{
    /*Merke im Array $ArrIdxAltLayout[] den Index (idlay) der Layouts des alten Mandanten */
    $ArrIdxAltTpl[]=$db->Record[2]; /* Spalte idtpl */
    $ArrIdxNeuTpl[]=$MyTplSeq;
    $MyTplSeq++; /* erhöhe um 1 */

    $ArrIdxAltTplConf[]=$db->Record[3]; /* Spalte idtplcfg */
    $ArrIdxNeuTplConf[]=$MyTplConfSeq;
    $MyTplConfSeq++; /* erhöhe um 1 */
}

/* Nun sind alle ID's, die alten und die neuen bekannt. Kopiere nun die Daten der Tabelle con_Templates */
$sql = "SELECT * from ".$cfg["tab"]["tpl"]." where idclient=".$old_idclient." order by idtpl";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

echo "<hr><h2><font color='#525169'>Kopiere die folgenden Templates:</font></h2>";
$lauf=0;
while($db->next_record())
{
    $lauf++;
    /* Lese nun idlay aus und stelle fest, wo dieser idlay im Array der alten Indizes steht (in ArrIdxAltLayer[]) */
    $ArrPosLay=array_search($db->Record[1], $ArrIdxAltLayout);

    /* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
    $ArrPosTpl=array_search($db->Record[2], $ArrIdxAltTpl);

    /* dito für idtplconf */
    $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);

    $sql = "INSERT INTO ".$cfg["tab"]["tpl"]." VALUES ('".$new_idclient."'";
    $db->Record[1]=$ArrIdxNeuLayout[$ArrPosLay];
    $db->Record[2]=$ArrIdxNeuTpl[$ArrPosTpl];
    $db->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf];

    echo "<font color='#000000'>".$db->Record[4]."</font><BR>";

    for ($i=1;$i<$db->num_fields();$i++)
    {
        $sql = $sql .",";
        $cont = $db->Record[$i];
        $cont = str_replace('\\','\\\\',$cont);
        $cont = str_replace('"','\"',$cont);

        $sql = $sql ."\"".$cont."\"";
    }

    $sql = $sql .")";

    $db2->query($sql);

    /*Neuen Datensatz auch in Tabelle tplconf */
    $sql = "INSERT INTO ".$cfg["tab"]["tpl_conf"]." (idtplcfg, idtpl, author) VALUES ('".$ArrIdxNeuTplConf[$ArrPosTplConf]."', '".$ArrIdxNeuTpl[$ArrPosTpl]."', 'admin')";

    $db2->query($sql);
}

/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["tpl"]);
updateSequence($cfg["tab"]["tpl_conf"]);

echo "<h3><font color='#525169'>Es wurden ".$lauf." Templates vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["tpl"]." und für ".$cfg["tab"]["tpl_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER kopieren */
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
echo "<hr><h2><font color='#525169'>Kopiere die Container:</font></h2>";

$sql = "SELECT * from ".$cfg["tab"]["container"]." order by idtpl";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container */
$MyContainerSeq = getSequenceId($cfg["tab"]["container"]);

$lauf=0;

while($db->next_record())
{
    /* Lese nun idtpl aus und stelle fest, wo dieser idtpl im Array der alten Indizes steht (in ArrIdxAltTpl[]) */
    $ArrPosTpl=array_search($db->Record[1], $ArrIdxAltTpl);

    if ($ArrPosTpl!==False)
    { /* if */
        $lauf++;
        $ArrPosModul=array_search($db->Record[3], $ArrIdxAltModul);

        $MyContainerSeq++;
        $sql = "INSERT INTO ".$cfg["tab"]["container"]." VALUES ('".$MyContainerSeq."'";

        $db->Record[1]=$ArrIdxNeuTpl[$ArrPosTpl];
        if ($db->Record[3] != 0) {
            $db->Record[3]=$ArrIdxNeuModul[$ArrPosModul];
        }

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->Record[$i];
            $cont = str_replace('\\','\\\\',$cont);
            $cont = str_replace('"','\"',$cont);

            $sql = $sql ."\"".$cont."\"";
        }

        $sql = $sql .")";

        $db2->query($sql);
    } /*End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["container"]);

echo "<h3><font color='#525169'>Es wurden ".$lauf." Container vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/*CONTAINER CONF kopieren */
echo "<hr><h2><font color='#525169'>Kopiere die Container_Conf:</font></h2>";

$sql = "SELECT * FROM ".$cfg["tab"]["container_conf"]." Order by idtplcfg ";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel aus der Tabelle sequences den max. Index von con_container_conf */
$MyContainerConfSeq = getSequenceId($cfg["tab"]["container_conf"]);

$lauf=0;
while($db->next_record())
{
    /* Lese nun idtplcfg aus und stelle fest, wo dieser idtplcfg im Array der alten Indizes steht (in ArrIdxAltTplConf[]) */
    $ArrPosTplConf=array_search($db->Record[1], $ArrIdxAltTplConf);
    if ($ArrPosTplConf!==False)
    { /* If */
        $lauf++;
        $MyContainerConfSeq++;
        $sql = "INSERT INTO ".$cfg["tab"]["container_conf"]." VALUES ('".$MyContainerConfSeq."'";

        $db->Record[1]=$ArrIdxNeuTplConf[$ArrPosTplConf];

        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->Record[$i];
            $cont = str_replace('\\','\\\\',$cont);
            $cont = str_replace('"','\"',$cont);

            $sql = $sql ."\"".$cont."\"";
        }

        $sql = $sql .")";

        $db2->query($sql);
    } /* End if */
}
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
updateSequence($cfg["tab"]["container_conf"]);

echo "<h3><font color='#525169'>Es wurden ".$lauf." Container Conf-Daten vom Mandanten ".$old_idclient." auf den Mandanten ".$new_idclient." kopiert. Der Eintrag für ".$cfg["tab"]["container_conf"]." wurde in der Tabelle ".$cfg["tab"]["sequence"]." korrigiert.</font></h3>";
echo "<hr>";

/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */

/*****************************************************************************************/
/*KATEGORIEN kopieren */
if ($CopyKategorien==1)
{

    echo "<hr><h2><font color='#525169'>Kopiere die Kategorien/Men&uuml;s:</font></h2>";
    /* lese aus der Tabelle con_cat alle Kategorien des zu kopierenden Mandanten ($old_idclient) aus */
    $sql = "SELECT * from ".$cfg["tab"]["cat"]." where idclient=".$old_idclient." order by idcat";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcat aus der Tabelle con_sequences */
    $MyKatSeq = getSequenceId($cfg["tab"]["cat"]);

    /* Lese nun die vorhanden Kategorie-IDs in das Array ein und generiere gleichzeitig das Array
     * der neuen Kategorie-IDs. Dananch ist bekannt, welche neue idcat welcher alten idcat entsprach
     */
    while($db->next_record())
    {
        if ($db->Record[0]==0)
        {
            $neueCatid=0;
        } else {
            $neueCatid=$MyKatSeq;
            $MyKatSeq++; /* erhöhe um 1 */
        }

        $ArrIdxAltKat[]=$db->Record[0]; /* Spalte idcat */
        $ArrIdxNeuKat[]=$neueCatid;
        /* Neu am 29.7.2004 */
        /* Um die Kategorien zu kopieren, reicht es nicht nur die Werte idcat für den neuen Mandanten zu generieren
         * Es müssem auch die Werte preid, postid und parentid kopiert und angepasst werden
         * denn diese bestimmen später den Aufbau des Navigationsbaumes!
         * Die Funktion strRemakeTreeTable der Datei functions.str.php erzeugt die Einträge nach jeder Änderung  der Struktur neu.
         * Dazu werden die Werte der Tabelle con_cat ausgelesen. Hier steht zu jeder catid (Kategorie bzw. Menüpunkt)
         * die Vorgänger-Kategorie (preid) und der Nachfolger (postid). */
        /* Ende neu am 29.7.2004 */
        $ArrIdxAltParentID[]=$db->Record[2]; /* Spalte parentid */
        $ArrIdxAltPreID[]=$db->Record[3]; /* Spalte preid */
        $ArrIdxAltPostID[]=$db->Record[4]; /* Spalte postid */

        $sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$neueCatid."', '".$new_idclient."'";
        for ($i=2;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->Record[$i];
            $cont = str_replace('\\','\\\\',$cont);
            $cont = str_replace('"','\"',$cont);

            $sql = $sql ."\"".$cont."\"";
        }

        $sql = $sql .")";

        $db2->query($sql);
    } /*End while */

    /* Die neuen idcat wurden in die Datenbank geschrieben, allerdings haben die neuen Kategorien noch die Zuordnungen zu den alten
     * parentid, preid und postid
     * Das muss nun noch korrigiert werden
     * ACHTUNG: Ist parentid, preid oder postid 0, so bleibt er 0 !  */

    /* parentid: Für jeden Eintrag in $ArrIdxAltParentID[] */
    $lauf=0;
    $ArrWerte=array_values($ArrIdxAltParentID);
    foreach ($ArrWerte as $value)
    {
        /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
        if ($ArrIdxAltParentID[$lauf]==0)
        {
            $ArrIdxNeuParentID[$lauf]=0;
        } else {
            /* Hinweis: array_search(suche das, hier drin) */
            $i=array_search($ArrIdxAltParentID[$lauf], $ArrIdxAltKat);
            /* Setze nun $ArrIdxNeuParentID[]=$ArrIdxNeuKat[i] */
            $ArrIdxNeuParentID[$lauf]=$ArrIdxNeuKat[$i];
        } /* end if */
        $lauf++;
    }

    /* preid: Für jeden Eintrag in $ArrIdxAltPreID[] */
    $lauf=0;
    $ArrWerte=array_values($ArrIdxAltPreID);
    foreach ($ArrWerte as $value)
    {
        if ($ArrIdxAltPreID[$lauf]==0)
        {
            $ArrIdxNeuPreID[$lauf]=0;
        } else {
            /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
            $i=array_search($ArrIdxAltPreID[$lauf], $ArrIdxAltKat);
            /* Setze nun $ArrIdxNeuPreID[]=$ArrIdxNeuKat[i] */
            $ArrIdxNeuPreID[$lauf]=$ArrIdxNeuKat[$i];
        } /* end if */
        $lauf++;
    }

    /* postid: Für jeden Eintrag in $ArrIdxAltPostID[] */
    $lauf=0;
    $ArrWerte=array_values($ArrIdxAltPostID);
    foreach ($ArrWerte as $value)
    {
        if ($ArrIdxAltPostID[$lauf]==0)
        {
            $ArrIdxNeuPostID[$lauf]=0;
        } else {
            /* Suche Wert in $ArrIdxAltKat[] und merke Arrayindex $i */
            $i=array_search($ArrIdxAltPostID[$lauf], $ArrIdxAltKat);
            /* Setze nun $ArrIdxNeuPostID[]=$ArrIdxNeuKat[i] */
            $ArrIdxNeuPostID[$lauf]=$ArrIdxNeuKat[$i];
        } /* end if */
        $lauf++;
    }

    /* Schreibe diese nun zu den neuen idcat in die Datenbank  */
    $lauf=0;
    $ArrWerte=array_values($ArrIdxNeuKat);
    foreach ($ArrWerte as $value)
    {
        $sql = "UPDATE ".$cfg["tab"]["cat"]." set parentid=".$ArrIdxNeuParentID[$lauf].", preid=".$ArrIdxNeuPreID[$lauf].", postid=".$ArrIdxNeuPostID[$lauf]." where idcat = ".$value."";

        $db2->query($sql);
        $lauf++;
    }


    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat"]);

    echo "<h3><font color='#525169'>Die Kategorien wurden kopiert....kopiere nun deren Baumstruktur...</font></h3>";
    echo "<hr>";
    /* Die Daten der Tabelle con_cat wurden für den neuen Mandanten kopiert */



    echo "<h3><font color='#525169'>Die Daten der Tabelle con_cat (Kategorien) wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>";
    echo "<hr>";

    /* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */
    $sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." where idlang = ".$merk_idlang_old." order by idcat";

    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* Ermittel den nächsten gültigen Index für idcatlang aus der Tabelle con_sequences */
    $MyKatLangSeq = getSequenceId($cfg["tab"]["cat_lang"]);

    while($db->next_record())
    {
        /* Lese nun ids aus und stelle fest, wo diese im Array der alten Indizes stehen */
        $ArrPosKat=array_search($db->Record[1], $ArrIdxAltKat);
        $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);

        $sql = "INSERT INTO ".$cfg["tab"]["cat_lang"]." VALUES ('".$MyKatLangSeq."'";

        $db->Record[1]=$ArrIdxNeuKat[$ArrPosKat]; /* Die korrespondierende neue idcat */
        if ($ArrPosTplConf!==False) $db->Record[3]=$ArrIdxNeuTplConf[$ArrPosTplConf]; /* Die korrespondierende neue idtplcfg */

        /* Achtung: Einträge der Tabelle cat_lang sind Sprachabhängig. Schreibe daher hier auch die idlang (SprachID) des neuen
        Mandanten mit rein...diese wude zu Beginn des Scripts ermittelt und in $merk_idlang_neu gemerkt */
        $db->Record[2]=$merk_idlang_neu;
        for ($i=1;$i<$db->num_fields();$i++)
        {
            $sql = $sql .",";
            $cont = $db->Record[$i];
            $cont = str_replace('\\','\\\\',$cont);
            $cont = str_replace('"','\"',$cont);

            $sql = $sql ."\"".$cont."\"";
        }

        $sql = $sql .")";

        $db2->query($sql);

        $MyKatLangSeq++;

    } /* End While */

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_lang"]);

    echo "<h3><font color='#525169'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
    echo "<hr>";

    /* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */
    strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */

    echo "<br><font color='#FF0022'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)</font>";

} /* End if von if ($CopyKategorien==1) */

/*****************************************************************************************/
/*ARTIKEL kopieren*/
if ($CopyArtikel==1 and $CopyKategorien==1)
{
    echo "<h3><font color='#525169'>Kopiere nun alle Artikel</font></h3>";
    /* ermittel alle Artikel des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art"]." where idclient=".$old_idclient." order by idart";
    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
       Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_art aus */
    $MyArtSeq = getSequenceId($cfg["tab"]["art"]);

    $lauf=0;
    /* $db->next_record() liefert Zeiger auf nächsten Datensatz, der noch nicht
    ausgelesen wurde und gibt ein Array in der Eigenschaft Record zurück */
    echo "<hr><h2><font color='#525169'>Kopiere die folgenden Artikel:</font></h2>";
    while($db->next_record())
    {
        $lauf++;
        /*Merke im Array den Index (idart) der Artikel des alten Mandanten */
        $ArrIdxAltArt[]=$db->Record[0];
        /*Merke im Array $ArrIdxNeuArt[] den Index (idart) der Artikel des neuen Mandanten */
        $ArrIdxNeuArt[]=$MyArtSeq;
        /*Das Merken im Array ist nötig um später noch zu wissen welche alte idart welcher neuen idart entspricht*/

        $sql = "INSERT INTO ".$cfg["tab"]["art"]." VALUES (".$MyArtSeq.", ".$new_idclient."";
        $sql = $sql .")";
        $db2->query($sql);

        /* erhöhe um eins um den neuen maximalen Index-Wert zu merken, der wieder in die Tabelle con_Sequence geschrieben werden muss */
        $MyArtSeq++; /* erhöhe um 1 */
    }

    /* schreibe nun den letzten wert von $MyArtSeq bei con_mod in die Tabelle con_sequence */
    updateSequence($cfg["tab"]["art"]);

    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art"]."< erzeugt.</font></h3>";
    echo "<hr>";

    /* Jetzt noch die Einträge der Tabelle con_art_lang erzeugen - hier stehen die eigentlichen Artikelinhalte */
    /**************Tabelle CON_ART_LANG************************************************************************************************************/
    echo "<h3><font color='#525169'>Erzeuge nun mit diesen neuen Einträgen die neuen Texte der Artikel (Tabelle >".$cfg["tab"]["art_lang"]."<)</font></h3>";
    /* ermittel alle Einträge des zu kopierenden Kunden */
    $sql = "SELECT * from ".$cfg["tab"]["art_lang"]." where idlang = ".$merk_idlang_old."";
    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
    $lauf=0;
    while($db->next_record())
    {

        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->Record[1], $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_art_lang auch Artikel andere Mandanten der gleichen Sprche stehen könnten */
        {
            /* An welcher Position im Array steht der Wert idtplcfg */
            $ArrPosTplConf=array_search($db->Record[3], $ArrIdxAltTplConf);
            echo "<font color='#000000'>Kopiere Artikel ".$db->Record[4]."</font><BR>";
            $lauf++;

            $sql = "INSERT INTO ".$cfg["tab"]["art_lang"]." VALUES (".$ArrIdxNeuArt[$ArrPosArt].", ".$ArrIdxNeuArt[$ArrPosArt].", ".$merk_idlang_neu.", ".$ArrIdxNeuTplConf[$ArrPosTplConf]."";

            /* im Feld time_target_cat steht die Kategorie in die nach Zeitablauf der Artikel verschoben wird. Diese ist für den neuen Mandanten auch noch anzupassen */
            $ArrPosKat=array_search($db->Record[24], $ArrIdxAltKat);
            $db->Record[24]=$ArrIdxNeuKat[$ArrPosKat];
            for ($i=4;$i<$db->num_fields();$i++)
            {
                $sql = $sql .",";
                $cont = $db->Record[$i];
                $cont = str_replace('\\','\\\\',$cont);
                $cont = str_replace('"','\"',$cont);

                $sql = $sql ."\"".$cont."\"";
            }
            $sql = $sql .")";

            $db2->query($sql);
        }
    }
    echo "<h3><font color='#525169'>Es wurden ".$lauf." neue Einträge in der Tabelle >".$cfg["tab"]["art_lang"]."< erzeugt.</font></h3><BR>";
    echo "<h3><font color='#525169'>Kopiere nun die Zuordnungen der Artikel zu den Kategorien (Tabelle >".$cfg["tab"]["cat_art"]."<)</font></h3>";
    $sql = "SELECT * from ".$cfg["tab"]["cat_art"]." order by idart";
    $db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

    /* In der Tabelle con_sequence stehen die Werte der Indizes der Primärschlüssel !
       Lese daher erst hier den aktuellen Index-Wert für die Tabelle con_cat_art aus */
    $MyCatArtSeq = getSequenceId($cfg["tab"]["cat_art"]);

    $lauf=0;
    while($db->next_record())
    {
        /* Lese nun idart aus und stelle fest, wo dieser idart im Array der alten Indizes steht (in ArrIdxAltArt[]) */
        $ArrPosArt=array_search($db->Record[2], $ArrIdxAltArt);
        if ($ArrPosArt!==False) /* Nötig, weil in con_cat_art auch Artikel anderer Mandanten der gleichen Sprache stehen könnten */
        {
            $lauf++;
            $ArrPosKat=array_search($db->Record[1], $ArrIdxAltKat);
            $sql = "INSERT INTO ".$cfg["tab"]["cat_art"]." VALUES (".$MyCatArtSeq.", ".$ArrIdxNeuKat[$ArrPosKat].", ".$ArrIdxNeuArt[$ArrPosArt]."";

            for ($i=3;$i<$db->num_fields();$i++)
            {
                $sql = $sql .",";
                $cont = $db->Record[$i];
                $cont = str_replace('\\','\\\\',$cont);
                $cont = str_replace('"','\"',$cont);

                $sql = $sql ."\"".$cont."\"";
            }
            $sql = $sql .")";

            $db2->query($sql);
            $MyCatArtSeq++;
        }
    }

    /*Korrigiere nun noch die Werte in der Tabelle con_sequences */
    updateSequence($cfg["tab"]["cat_art"]);

    echo "<h3><font color='#525169'>Die Artikel wurden kopiert.</font></h3>";
    echo "<hr>";
} /* End if von ($CopyArtikel==1 and $CopyKategorien==1) */


echo "<h1><font color='#0055dd'>FERTIG</font></h1>";
echo "<font color='#525169'>Es wurden alle Module, Templates, Layouts, Container und Kategorien kopiert.</font>";

/* con_sequence update */
updateSequence();

echo "<br><font color='#FF0022'>con_sequence wurde upgedated.</font>";

?>
</body>
</html>
<?php


// simple function to update con_sequence
function updateSequence($table=false) {

    global $db, $cfg;
    if (!$table) {
        $sql = "SHOW TABLES";
        $db->query($sql);
        while ($db->next_record())
        {
            dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $db->f(0));
        }
    } else {
        dbUpdateSequence($cfg['sql']['sqlprefix']."_sequence", $table);
    }
}

// read out next free id
function getSequenceId($table) {

    global $db2, $cfg;

    $sql= "SELECT nextid FROM ".$cfg['sql']['sqlprefix']."_sequence"." where seq_name = '$table'";
    $db2->query($sql);
    if ($db2->next_record()) {
        return $db2->f("nextid");
    } else {
        return 0;
    }
}

$cfg["debug"]["backend_exectime"]["end"] = getmicrotime();

if ($cfg["debug"]["rendering"] == true)
{
    echo "Rendering this page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["start"])." seconds<br>";
    echo "Building the complete page took: " . ($cfg["debug"]["backend_exectime"]["end"] - $cfg["debug"]["backend_exectime"]["fullstart"])." seconds<br>";

    if (function_exists("memory_get_usage"))
    {
        echo "Include memory usage: ".human_readable_size(memory_get_usage()-$cfg["debug"]["oldmemusage"])."<br>";
        echo "Complete memory usage: ".human_readable_size(memory_get_usage())."<br>";

    }

}
page_close();
?>
bei mir läuft das ganze mit einer 4.5.x version...
*** make your own tools (wishlist :: thx)

Gesperrt