0251 / 590 837 15
info@a-coding-project.de
;

Benutzerveraltung (CMS)

Gestern gab es im CMS die Rollenverwaltung, heute geht es um das Anlegen und Löschen von Benutzern. Wie bei den Rollen ist auch hier die Auflistung bereits vorhanden.

Die Klasse User bekommt die vier neuen Funktionen Validate, Insert, Delete, Exists und Equals:

/system/classes/user.phpPHP
public function exists(){
  $name     = $GLOBALS['db']->EscapeString(strtolower(trim(
              $this->name)));
  return $GLOBALS['db']->ReadField("SELECT COUNT(*) FROM 
              {'dbprefix'}user WHERE 
              name='".$name."'") > 0;
}

public function insert($password){
  $res = false;
  if($this->validate($password)){
    $name     = $GLOBALS['db']->EscapeString(strtolower(trim(
                  $this->name)));
    $role     = $GLOBALS['db']->EscapeString($this->role);
    $password = $GLOBALS['db']->EscapeString(md5($password));
    $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}user (name, 
           password, role) VALUES ('".$name."','".$password."',
           '".$role."')");
  }
  return $res;
}

public function validate($password){
  $res = true;
  if($res) $res = trim($this->name) != "";
  if($res) $res = trim($this->role) != "";
  if($res) $res = trim($password) != "";
  if($res) $res = !$this->exists();
  return $res;
}

public function delete(){
  $res = false;
  if(!$this->equals($_SESSION['user'])){
    $id  = $GLOBALS['db']->EscapeString(strtolower(trim($this->id)));
    $res = $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}user WHERE 
           id = '".$id."'");
  }
  return $res;
}

public function equals(User $user){
  return $this->id == $user->id;
}

Beim Insert wird zunächst einmal nachgesehen, ob alle Parameter passen und der Benutzer noch nicht existiert. Validate und Equals sind hierfür Hilfsfunktionen. Beim Delete wird über die Funktion equals geüprüft, ob der User der gelöscht werden soll nicht der User der Angemeldete ist (ansonsten kann man sich selbst aussperren).

Im Template der Benutzerliste wurde ein Formular eingefügt. Mit welchem es möglich sein wird, neue Benutzer anzulegen:

/system/templates/user_list.htmlHTML
<p>{VAR:MSG}</p>
<table>
  <thead>
    <tr>
      <td><strong>{LANG:ID}</strong></td>
      <td><strong>{LANG:NAME}</strong></td>
      <td><strong>{LANG:ROLE}</strong></td>
      <td><strong>{LANG:ACTIONS}</strong></td>
    </tr>
  </thead>
  <tbody>
    {LOOP:USERLIST}
    <tr>
      <td>{VAR:ID}</td>
      <td>{VAR:NAME}</td>
      <td>{VAR:ROLE}</td>
      <td>{VAR:ACTIONS}</td>
    </tr>
    {/LOOP:USERLIST}
  </tbody>
</table>
<h2>Benutzer hinzuf&uuml;gen</h2>
<form action="{VAR:URL}" method="POST">
  <table>
    <tr>
      <td>Name:</td>
      <td><input name="name" /></td>
    </tr>
    <tr>
      <td>Rolle:</td>
      <td>{VAR:ROLES}</td>
    </tr>
    <tr>
      <td>Passwort:</td>
      <td><input name="password" type="password" /></td>
    </tr>
  </table>
  <input name="insert" type="submit" value="{LANG:ADD}" />
</form>

Für das Auswählen der Rolle brauchen wir ein neues Control: Der RoleSelector:

/system/classes/roleselector.phpPHP
<?PHP
  class RoleSelector extends Control{
    public $style = '';

    public function getCode(){
      $res = "<select name="".$this->name."" style="".$this->style."">";
      $roles = Role::getAllRoles();
      if($roles){
        foreach($roles as $role){
          if($this->value == $role->ID){
            $res .= "<option value="".$role->ID."" selected="selected">".
                     htmlentities($role->name)."</option>";
          }
          else{
            $res .= "<option value="".$role->ID."">".htmlentities($role->name).
                    "</option>";
          }
        }
      }

      $res .= "</select>";
      return $res;
    }

  }
?>

Zu guter letzt müssen wir das Template mit der Userklasse verbinden. Das geht über die Klasse Userlist:

/system/classes/userlist.phpPHP
public function display(){
  $userlist = new Template();
  $userlist->load("user_list");
  $userlist->assign_var("URL",Settings::getInstance()->get("host").
    $this->page->alias.".html");

  if(isset($_POST['insert'])){
    $user = new User();
    $user->name = $_POST['name'];
    $user->role = $_POST['new_user_role'];
    if(!$user->insert($_POST['password'])){
      $userlist->assign_var("MSG","Benutzer konnte nicht angelegt werden!");
    }
  }

  if(isset($_GET['delete'])){
    $user = new User();
    $user->id = $_GET['delete'];
    if(!$user->delete()){
      $userlist->assign_var("MSG","Benutzer konnte nicht gelöscht werden!");
    }
  }

  $actions = ActionList::get("userlist");

  foreach(User::getAllUser() as $user){
    $index = $userlist->add_loop_item("USERLIST");
    $params = array();
    $params['userid'] = $user->id;

    $userlist->assign_loop_var("USERLIST", $index, "ID", $user->id);
    $userlist->assign_loop_var("USERLIST", $index, "NAME", $user->name);
    $userlist->assign_loop_var("USERLIST", $index, "ROLE", $user->role->name);
    $userlist->assign_loop_var("USERLIST", $index, "ACTIONS",
      $actions->getCode($params));
  }

  $roles = new RoleSelector();
  $roles->name = "new_user_role";
  $userlist->assign_var("ROLES",$roles->getCode());

  $userlist->output();
}

Für den Löschen-Button müssen wir in der Tabelle cl_actionlists bei der userliste folgendes in der Spalte destination eintragen: {VAR:HOST}admin/user.html?delete={VAR:USERID}.

Das wars! Jetzt können Benutzer angelegt und gelöscht werden.

Kommentare

Symphi111 schrieb am 09.11.2011:

Wow ich habe diesen Blog schon bis hier gelesen!! Und das obwohl ich normalerweise ein Lesemuffel bin. Das kann nur heißen dass ihr SUPERGUT seid!