Mandant kopieren: Hier das Script...aber

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

Mandant kopieren: Hier das Script...aber

Beitrag von Axel »

Hallo zusammen,

wegen des leidlichen Problems einen Mandanten möglichst einfach zu kopieren, habe ich ein Script dafür geschrieben. Bin totaler PHP-Anfänger, daher gibts sicherlich optimierungsmöglichkeiten.

Das Script kopiert alle Templates, Layouts, Container, Module und auf Wunsch auch alle Kategorien von einem Kunden auf einen anderen.

Das alles klappt auch wunderbar...lediglich mit den Kategorien haperts noch. In den allen Tabellen, die für die Kategorien zuständig sind (con_cat, con_cat_lang, con_cat_tree) werden alle Werte sauber und korrekt eingetragen, es wird auch kein Fehler gemeldet....nur werden die Kategorien bei Auswahl des Mandanten im Backend einfach nicht angezeigt. Bei den Modulen, Layouts, Containern und Templates gibts keine Probleme.

Wäre dankbar, wenn sich ein Profi das Script mal anschaut...zu korrigieren ist der letzte Teil (Kopieren der Kategorien).

Fast glaube ich, das das Script völlig korrekt ist, nur das man vielleicht die ganzen neuen Kategorien auch in der Tabelle con_rights erzeugen muss...

Hier das Script:
Dieses einfach als Datei ....php abspeichern und im gleichen Pfad wie das Contenido-Verzeichnis abspeichern. Dann die idclient des Mandanten finden, den man kopieren möchte und die idclient des Mandanten auf den kopiert werden soll. Diese beide Zahlen dann im Script einfach bei $old_idclient und $new_idclient angeben...Script starten und fertig.

Code: Alles auswählen

<?
/* Script um Kunden zu kopieren
 * Für Contenido 4.4.2 (Für andere Versionen nicht getestet)
 * Autor: Axel Womatschka
 * Datum: 21.01.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.
*/
 

/* 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)
 * 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 */

/* 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=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 */
}

/* Alles OK....leg los */
echo "<hr><h1><font face='Arial' color='#ff0000'>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];
$MyModSeq++; /* erhöhe um 1 */
}

$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='#ff0000'>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='#ff0000'>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];
$MyLaySeq++; /* erhöhe um 1 */
}

$sql="";
$lauf=0;
echo "<hr><h2><font face='Arial' color='#ff0000'>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='#ff0000'>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];

$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='#ff0000'>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='#ff0000'>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='#ff0000'>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='#ff0000'>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='#ff0000'>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='#ff0000'>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='#ff0000'>FERTIG</font></h1>";
    die("Die Kategorien wurden auf Wunsch nicht mit kopiert.");
    }
    
/*Kategorien 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='#ff0000'>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())
{
  $MyKatSeq++; /* erhöhe um 1 */
  $ArrIdxAltKat[]=$db1->Record[0]; /* Spalte idcat */
  $ArrIdxNeuKat[]=$MyKatSeq;

  $sql = "INSERT INTO ".$cfg["tab"]["cat"]." VALUES ('".$MyKatSeq."', '".$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 */

/*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='#ff0000'>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 */

/* Nun muss die Baum-Struktur der Kategorien kopiert werden (steht in Tabelle con_cat_tree) */
/* Nur die Daten aus cat_tree, die zum zu kopierenden Mandanten gehören */
$sql = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." RIGHT JOIN ".$cfg["tab"]["cat"]." ON ".$cfg["tab"]["cat_tree"].".idcat = ".$cfg["tab"]["cat"].".idcat WHERE ".$cfg["tab"]["cat"].".idclient=".$old_idclient."";
$db1->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/

/* Ermittel den nächsten gültigen Index für idtree aus der Tabelle con_sequences */
$MyKatTreeSeq=0;
$sql="Select nextid as MyNextID from ".$cfg["tab"]["sequence"]." where seq_name = '".$cfg["tab"]["cat_tree"]."'";
$db2->query($sql);
if ($db2->next_record()) $MyKatTreeSeq=$db2->Record[0];
$MyKatTreeSeq++; /* erhöhe um 1 */

while($db1->next_record())
{
    /* Lese nun idcat aus und stelle fest, wo dieser idcat im Array der alten Indizes steht (in ArrIdxAltcat[]) */
    $ArrPosKat=array_search($db1->Record[1], $ArrIdxAltKat);
    if ($ArrPosKat!==False)
    {
        $sql = "INSERT INTO ".$cfg["tab"]["cat_tree"]." VALUES ('".$MyKatTreeSeq."', '".$ArrIdxNeuKat[$ArrPosKat]."', '".$db1->Record[2]."')";
        $db2->query($sql);
        $MyKatTreeSeq++;
    } /* End if */
} /* End While */
$MyKatTreeSeq=$MyKatTreeSeq-1;
/*Korrigiere nun noch die Werte in der Tabelle con_sequences */
$sql="Update ".$cfg["tab"]["sequence"]." set nextid=".$MyKatTreeSeq." where seq_name = '".$cfg["tab"]["cat_tree"]."'";
$db2->query($sql);
echo "<h3><font face='Arial' color='#ff0000'>Die Baumstruktur der Kategorien wurde kopiert....kopiere nun deren Bezeichnungen und Sprache...</font></h3>";
echo "<hr>";
/* Die Baumstruktur (Tabelle con_cat_tree) wurde für den neuen Mandanten kopiert */

/* Nun müssen die Bezeichnungen der Kategorien kopiert werden (steht in Tabelle con_cat_lang) */
$sql = "SELECT * FROM ".$cfg["tab"]["cat_lang"]." 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];
$MyKatLangSeq++; /* erhöhe um 1 */

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 */

    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='#ff0000'>Die Bezeichnungen der Kategorien wurden kopiert.</font></h3>";
echo "<hr>";
echo "<h1><font face='Arial' color='#ff0000'>FERTIG</font></h1>";
?>
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

das korrigieren der werte für die con_sequence kannst du dir sparen in dem du einfach die datei contenido/updateseqruntime.php
am ende mittels include einfügst...

die erledigt dann das für dich...

ich hab mir das script jetzt nicht weiters angesehen
ad. con_cat, con_cat_lang, con_cat_tree
das mit con_rights glaub ich nicht, dass das der grund ist...
wie sieht das mit dem client aus...

zuerst muss man den client ja anlegen oder ? und diese werte übernimmt man dann für dein script... (ne neue sprache für den client hast du dann auch oder ? ne aktive meine ich)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

tja so wie es aussieht kopierst du die sprache mit den selben id wert wie beim alten client...
bei einem neuen client gibts eigene werte für die selbe sprache... (muss auch angepasst werden)

schau mal ob es das ist...

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

Beitrag von Axel »

emergence hat geschrieben:das korrigieren der werte für die con_sequence kannst du dir sparen in dem du einfach die datei contenido/updateseqruntime.php
am ende mittels include einfügst...

die erledigt dann das für dich...

ich hab mir das script jetzt nicht weiters angesehen
ad. con_cat, con_cat_lang, con_cat_tree
das mit con_rights glaub ich nicht, dass das der grund ist...
wie sieht das mit dem client aus...

zuerst muss man den client ja anlegen oder ? und diese werte übernimmt man dann für dein script... (ne neue sprache für den client hast du dann auch oder ? ne aktive meine ich)
idlang=1 bleibt auch so beim neuen client, dabei steht die 1 standardmäßig für deutsch.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

idlang=1 bleibt auch so beim neuen client, dabei steht die 1 standardmäßig für deutsch.
tja und genau das ist es...

wenn du einen neuen mandanten anlegst -> hat der keine sprachen.

wenn eine neue sprache für diesen mandanten angelegt wird hast du erst die möglichkeit eine kategorie anzulegen...

wie soll ich das am besten erklären:
mandant und sprache eines kunden sind eine einheit
-> client = 1 angelegte sprache deutsch lang=1
der neue client = 2 (kann auf die lang=1 nicht zugreifen !!) und braucht eine neue zielsprache also für client = 2 sprache deutsch lang = 2(je nachdem welche id natürlich frei ist -> con_sequence)

für einen neuen kunden muss eine sprache existieren (eine zielsprache)
das muss beim kopieren der daten auch mit angepasst werden...

am besten ist es du kopiert die angelegte sprache des zu kopierenden mandanten mit neuer id gleich mit... (wenn es mehrere gibt mittels eigener vergabe der neuen id für die sprache) -> die werte müssten dem entsprechend dann onthefly mit ausgetauscht werden...

ich hoffe diese info hilft dir was...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

anscheinend hast es geschaft... ;-)
Axel
Beiträge: 82
Registriert: Di 26. Aug 2003, 08:35
Kontaktdaten:

Beitrag von Axel »

emergence hat geschrieben:anscheinend hast es geschaft... ;-)
Ja. Hatte allerdings nicht direkt was der Sprache zu tun. Unterschiedliche Mandanten können durchaus auf die gleiche idlang zugreifen, sonst müßte man ja mehrmals die Sprache "deutsch" anlegen...das ist nicht nötig.

Der Fehler lag in der Select-Anweisung der Baumstruktur (Tabelle cat_tree). Hier fehlte lediglich das Sortierte abrufen der Daten (order by idtree), denn die korrekte Darstellung des Menübaums folgt bei Contenido direkt aus der Sortierreihenfolge der Werte idtree.

Zur Sicherheit wird dann am Scriptende noch sichergestellt, dass Contenido beim anlegen des neuen Mandanten auch die Sprache "deutsch" zuordnet, bzw. die gleiche Sprache wie der erste Mandant.

Danke für deine Hilfe.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

gut dann mach ich mal hier zu...

-> http://contenido.de/forum/viewtopic.php ... highlight=
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

da kann ich dir nicht zustimmen.

Die Sprache "Deutsch" für Mandant 1 ist komplett anders als für Mandant 2!

Auch wenn dort als Titel "Deutsch" drübersteht, sind das trotzdem 2 verschiedene paar Schuhe! Wenn du weiterhin dein "Eine Sprache für 2 Mandanten"-Konzept verfolgst, wirst du sehr bald in Probleme laufen. Ein Mandant hat mit dem anderen nichts zu tun.
Gesperrt