Webdesign ist mehr als

die Summe seiner Pixel und Farben

  • Webdesign_Style
  • Webdesign_Sicherheit
  • Webdesign_Planen
  • Webdesign_Arbeitsplatz
  • Webdesign_im_Wald
  • Webdesign_Responsive
  • Webdesign_Server
  • Webdesign_OpenSourc

Benutzerliste in Joomla importieren

Hier möchte ich aufzeigen, wie man eine Liste von Usern in Joomla importieren kann. Es ist wohl nicht schwierig sich vorzustellen, dass man bei 100 Usern doch schon verzweifeln kann, diese alle einzeln und händisch in die Nutzerverwaltung einzugeben. Ich hatte die Aufgabe für einen Verein und deren Mitglieder einen internen Bereich zu generieren. Die Mitglieder hatte ich, wie zu erwarten, in Excel vorliegen.wink

Wie bekomme ich nun ca. 100 Mitglieder von Excel in die Joomla Datenbank?

1. Schritt

die Exeldaten in eine MySQL Datenbank überführen. Da gibt es mehre Möglichkeiten. Bei Heise kann man sich einen Excel-MySQL Converter downloaden. Da ich jedoch MySQL auch mit Access betreibe, lag es auf der Hand diese Konfiguration zu nutzen. Möglich ist das durch MySQL Connector. Nach dem Export haben Sie dann eine Tabelle mit Id, Name, Vorname und E-Mail als MySQL Tabelle.

2. Schritt

Unsere User brauchen nun ein Password. Die Veschlüsselung muss sich natürlich an die Regeln von Joomla halten. Wie Joomla das macht, ist im nachfolgendem Script ersichtlich.

  1. <?php
  2.     define( '_JEXEC', 1 );
  3.     define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
  4.     define( 'DS', DIRECTORY_SEPARATOR );
  5.  
  6.     require_once( JPATH_BASE .DS.'includes'.DS.'defines.php' );
  7.     require_once( JPATH_BASE .DS.'includes'.DS.'framework.php' );
  8.  
  9.     $mainframe =&amp; JFactory::getApplication('site');
  10.     $mainframe->initialise();
  11.  
  12.     jimport('joomla.user.helper');
  13.     $password = "meinklarespassword";     
  14.     echo "<strong>Password: </strong>" . JUserHelper::hashPassword($password);
  15. ?>

Das Tool habe ich entsprechend angepasst.

den Init Part.

  1. //Joomla Init und Einbindung
  2. define( '_JEXEC', 1 );
  3. define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
  4. define( 'DS', DIRECTORY_SEPARATOR );
  5.  
  6. require_once( JPATH_BASE .DS.'includes'.DS.'defines.php' );
  7. require_once( JPATH_BASE .DS.'includes'.DS.'framework.php' );
  8. $mainframe =&amp; JFactory::getApplication( 'site' );
  9. $mainframe->initialise();

und die Joomla Verschlüsselung

  1. function GetJpasswd($klarpsswd)
  2. {
  3.   $hashpw=JUserHelper::hashPassword($klarpsswd);
  4.   return ($hashpw);
  5. }

3. Schritt

 Mit Joomla kann man ja auch auf weitere Datenbanken zugreifen - und das nutze ich für mein Tool.

  1. // Usertabelle aus Externer Datenbank holen
  2. function ExternUser($host, $databank, $user, $pass, $table, $name, $firstname, $email)
  3. {
  4.   $db = JFactory::getDbo();
  5.   $option = array(); //prevent problems
  6.   $option['driver']   = 'mysqli';            // Database driver name
  7.   $option['host']     = $host;    // Database host name
  8.   $option['user']     = $user;       // User for database authentication
  9.   $option['password'] = $pass;   // Password for database authentication
  10.   $option['database'] = $databank;      // Database name
  11.   $option['prefix']   = '';             // Database prefix (may be empty)
  12.   $db = &amp; JDatabase::getInstance( $option );
  13.   $query = $db->getQuery( true );
  14.   $query->select($db->quoteName(array('id', $name, $firstname, $email)));
  15.   $query->from($db->quoteName($table));
  16.   $db->setQuery( $query );
  17.   $results = $db->loadObjectList();
  18.   return ($results);
  19.   }

4.Schritt

spätestens jetzt sollte man sich Gedanken machen, welcher Nutzergruppe man die "Neuen" hinzufügt. Ggf sollte man im Backend neue Benutzergruppen generiert haben (z.B. die Gruppe "Mitglieder")

Wenn das der Fall ist, lesen wir mal die Benutzergruppen aus.

  1. //Vorhandene Usergruppen auslesen
  2. function ReadUsergroup()
  3. {
  4.   $db = JFactory::getDbo();   // Datenbankverbindung holen
  5.   // Neues Abfrage-Objekt ("Query") erzeugen  
  6.   $query = $db->getQuery( true );
  7.   // Kompletten ersten Datensatz (als "Row") lesen
  8.   $query->select($db->quoteName(array('id', 'title')));
  9.   $query->from($db->quoteName('#__usergroups'));
  10.   $query->order('id DESC');
  11.   // Abfrage ausführen
  12.   $db->setQuery( $query );
  13.   $results = $db->loadObjectList();
  14.  return ($results);
  15. }

5. Schritt

jetzt brauchen wir noch eine Funktion zum Schreiben

  1. //Neue User in die Joomladatenbank schreiben.
  2. function writeNewuser($name, $username, $email, $keypasswd, $usertype, $regdate)
  3. {
  4.   $db = JFactory::getDbo();   // Datenbankverbindung holen
  5.    // Zu schreibende Daten setzen
  6.    $query = $db->getQuery( true );   // Neues Abfrage-Objekt
  7.    $columns = array( 'name','username', 'email', 'password', 'registerDate');
  8.    $values = array( $db->quote( $name ) , $db->quote( $username ), $db->quote( $email ),  $db->quote($keypasswd) , $db->quote($regdate)
  9.    );
  10.  
  11.    // Abfrage-Objekt mit den Daten befüllen
  12.    $query
  13.      ->insert( $db->quoteName('#__users') )
  14.      ->columns( $db->quoteName($columns) )
  15.      ->values( implode(',', $values) );
  16.    // Abfrage ausführen
  17.    $db->setQuery( $query );
  18.    $db->execute();
  19.    //Letze User ID holen
  20.   $query = $db->getQuery( true );   // Neues Abfrage-Objekt
  21.   $query->select($db->quoteName(array('id')));
  22.   $query->from($db->quoteName('#__users'));
  23.   $query->order('id DESC LIMIT 1');
  24.   $db->setQuery( $query );
  25.   $lastid = $db->loadObjectList();
  26.   foreach ($lastid as $key => $object)
  27.   {
  28.     $lid=$object->id;
  29.   }
  30.   //User zur Usergroup mappen
  31.   $query = $db->getQuery( true );   // Neues Abfrage-Objekt
  32.   $columns = array('user_id', 'group_id');
  33.   $values = array( $db->quote( $lid ) , $db->quote( $usertype ));
  34.      $query
  35.      ->insert( $db->quoteName('#__user_usergroup_map') )
  36.      ->columns( $db->quoteName($columns) )
  37.      ->values( implode(',', $values) );
  38.   $db->setQuery( $query );
  39.   $db->execute();
  40. }
  41.  
  42. //Ende der Joomla Funktionen

6. Schritt

jetzt ist eigentlich alles beisammen was man als Joomlafunktionen braucht. Nun kommen die Eingaben die notwendig sind. Zur Sicherheit muss man das Schreiben der Neuen bewusst aktivieren. Bevor die Joomla DB vollgemüllt wird mit "Irrtümern" läuft das Tool mit einem Testlauf. Erst wenn man sich Sicher ist, kann man das Schreiben aktivieren.

<?php $groups=ReadUsergroup();//Auslesen der Nutzergruppen für das Auswahlfeld
$title=array();
$id=array();
 
foreach ($groups as $key => $object)
{
  $id=$object->id;
  $title[$id]= $object->title; 
}
?>
<form  name="group" action="<?php $_SERVER['PHP_SELF'];?>" method="post">
<fieldset style="text-align:center">
<legend style="padding:20px;text-align:center">Vorhandene Nutzergruppen</legend>
<label>
Ist Ihre Gruppe im Auswahfeld nicht vorhanden, bitte im Backend neu generieren. Danach Seite nochmal laden.<br>
Achtung bitte sorgfältig auswählen! <br>
<select name="gruppe">
<?php foreach($title AS $key=>$group)
{
  echo "<option value=\"".$key."\">".$group."</option>";
}
?>
</select>
</label>
</fieldset>
<fieldset style="text-align:center">
<legend style="padding:20px;text-align:center">Daten der Externen Datenbank</legend>
<label>
<input type="text" placeholder="Hostname" name="host">
<input type="text" placeholder="Name der Datenbank" name="database"> 
<input type="text" placeholder="Benutzername" name="usernamedb"> 
<input type="password" placeholder="Benutzerpassword" name="passwddb"> 
</label>
</fieldset>
<fieldset style="text-align:center">
<legend style="padding:20px;text-align:center">Tabelle der Externen Datenbank</legend>
<label>
Ihre Quelldatenbank/Tabelle braucht 4 Spalten. Die erste ist "id" dann eine für den Nachnamen, Vornamen und E-Mail.<br>
<input type="text" placeholder="Tabellenname" name="table">
<input type="text" placeholder="Spalte Name" name="name"> 
<input type="text" placeholder="Spalte Vorname" name="firstname">
<input type="text" placeholder="Spalte E-Mail" name="email"> 
</label>
</fieldset>
<fieldset style="text-align:center">
<legend style="padding:20px;text-align:center">Präfix zum Password</legend>
<label>
<input type="text" placeholder="Präfix" name="praefix">
<input type="checkbox"   name="crypt" value="yes">
Verschlüsseltes Password anzeigen. Standard "No".
</label>
</fieldset>
<fieldset style="text-align:center">
<legend style="padding:20px;text-align:center">Senden</legend>
<label>
<input type="checkbox"   name="test" value="yes"> Das Häckchen erst setzen wenn die Daten OK sind.(Testlauf) Das Häckchen aktiviert den Schreibvorgang in die Joomla DB.<br>
<input type="submit" value="Abschicken" name="submit">
<input type="reset" value="Abrechen" name="submit">
</label>
</fieldset>
</form>

7. Schritt

Nachdem die Daten abgesendet wurden, wird nun das eigentliche Script gestartet.

  1. // Übergabe der Formulareingaben
  2. if(isset($_POST['submit']))
  3. {
  4.   if (isset($_POST['gruppe']))
  5.   {
  6.     $group=($_POST['gruppe']);
  7.   }
  8.   if (isset($_POST['host']))
  9.   {
  10.     $host=($_POST['host']);
  11.   }
  12.   if (isset($_POST['database']))
  13.   {
  14.     $database=($_POST['database']);
  15.   }
  16.   if (isset($_POST['usernamedb']))
  17.   {
  18.     $usernamedb=($_POST['usernamedb']);
  19.   }
  20.    if (isset($_POST['passwddb']))
  21.   {
  22.     $passwddb=($_POST['passwddb']);
  23.   }
  24.   if (isset($_POST['table']))
  25.   {
  26.     $table=($_POST['table']);
  27.   }
  28.   if (isset($_POST['name']))
  29.   {
  30.     $name=($_POST['name']);
  31.   }
  32.   if (isset($_POST['firstname']))
  33.   {
  34.     $firstname=($_POST['firstname']);
  35.   }
  36.   if (isset($_POST['email']))
  37.   {
  38.     $email=($_POST['email']);
  39.   }
  40.   if (isset($_POST['praefix']))
  41.   {
  42.     $praefix=($_POST['praefix']);
  43.   }
  44.   if (isset($_POST['crypt']))
  45.   {
  46.     $crypt=($_POST['crypt']);
  47.   }
  48.   if (isset($_POST['test']))
  49.   {
  50.     $test=($_POST['test']);
  51.   }
  52.   $ext_user=ExternUser($host, $database, $usernamedb, $passwddb, $table, $name, $firstname, $email );
  53. }
  54. if (isset($ext_user))
  55. {
  56.   foreach ($ext_user as $key => $object)
  57.   {
  58.     $id=$object->id;
  59.     $lastname[$id]= $object->$name;
  60.     $lastname[$id]=str_replace(' ','',$lastname[$id]); //Nachname gesäubert von ev. Leerzeichen
  61.     $part_lastname[$id]=mb_substr($lastname[$id], 0, 3, "UTF-8");
  62.     $part_lastname[$id]=strtolower($part_lastname[$id]); //die ersten 3 kleinen Buchstaben des Nachnamens
  63.     $vorname[$id]= $object->$firstname;
  64.     $vorname[$id]=str_replace(' ','',$vorname[$id]); //Vorachname gesäubert von ev. Leerzeichen
  65.     $small_vorname[$id]= strtolower($vorname[$id]); //Vorname nur noch in Kleinbuchstaben
  66.     $new_username[$id]=$small_vorname[$id]."_".$part_lastname[$id]; //Username = vorname(klein) + ersten 3 Buchstaben Nachname
  67.     $e_mail[$id]= $object->$email;
  68.     $e_mail[$id]=str_replace(' ','',$e_mail[$id]); //E-Mail gesäubert von ev. Leerzeichen
  69.     $klarpasswd[$id]=$praefix.$small_vorname[$id]; //klares Password aus Präfix + vorname (klein)
  70.     $cryppw[$id]=GetJpasswd($klarpasswd[$id]); //Joomla Verschlüsselung
  71.     $jname[$id]=$vorname[$id]." ".$lastname[$id]; // Voller Name für Joomla
  72.     $datum = date("Y-m-d  H:i:s"); // Reg-Datum.
  73.     echo "<b>Zeit: </b>".$datum."<br>";
  74.     echo $id." <b>Vorname: </b>".$vorname[$id]."<b> Nachname: </b>".$lastname[$id]."<b> E-Mail: </b>".$e_mail[$id]."<b> Username: </b>".$new_username[$id]."<b> Password: </b>".$klarpasswd[$id]."<br>";
  75.     echo "<b>Joomla Name: </b>". $jname[$id]."<br>";
  76.     if ((isset($crypt))&amp;&amp;($crypt=='yes'))
  77.     {
  78.         echo "<b>Cryp Pass: </b>".$cryppw[$id]."<br><br>";
  79.     }
  80.     else
  81.     {
  82.       echo "<br>";
  83.     }
  84.     if ((isset($test)) &amp;&amp; ($test=='yes'))
  85.     {
  86.       $write=writeNewuser($jname[$id], $new_username[$id], $e_mail[$id], $cryppw[$id], $group, $datum );
  87.       $commend="<b>Die neuen User sind geschrieben, die Kontrolle im Backend durchführen! </b><br>";
  88.     }
  89.      else
  90.     {
  91.       $commend="<b>Wenn die Daten OK sind, können Sie das Häckchen im Fieldset \"Senden\" setzen!</b><br>";
  92.     }
  93.   }
  94.   echo $commend;
  95. }