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

Rollenspezifische Einstellungen auslesen (CMS)

In unserem CMS werden wir je nach dem mit welcher Rolle man angemeldet ist eine andere Hintergrundfarbe anzeigen. Als erstes müssen wir alle nicht-eingeloggten User als Gast Kennzeichnen. Dafür benötigen wir einen Konstruktor in der Klasse /system/classes/user.php. Hier wurden außerdem die Funktionen isGuest & load eingefügt:

<?PHP
class User{ 
  public $name;
  public $role;

  function __construct(){
    $this->role = new Role();
    $this->role->load(1);
  }
  
  function login($name,$password){
    $password = $GLOBALS['db']->EscapeString(trim($password));
    if($this->checkPassword($password,trim($name))){
      $this->load(trim($name));
      return true;
    }
    else{
      return false;
    }
  }

  function checkPassword($password,$name){
    $password =$GLOBALS['db']->EscapeString(trim($password));
    $name = $GLOBALS['db']->EscapeString(trim($name));
    $count = $GLOBALS['db']->ReadField("SELECT COUNT(*) FROM {'dbprefix'}user WHERE 
                        name='".$name."' AND password = '".md5($password)."'");
    return $count == 1;
  }
  
  function logout(){
     session_destroy();
  }
  
  function getAllUser(){
    $users = $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}user ORDER by name");
    foreach($users as $user){
      $newUser = new User();
      $newUser->id   = $user->id;
      $newUser->name = $user->name;
      $newUser->role->load($user->role);
      $res[] = $newUser;
    }
    return $res;
  }

  function load($name){
    $name = $GLOBALS['db']->EscapeString(trim($name));
    $user = $GLOBALS['db']->ReadRow("SELECT * FROM {'dbprefix'}user WHERE name = '".$name."'");
    $this->id   = $user->id;
    $this->name = $user->name;
    $this->role->load($user->role);
  }

  function isGuest(){
        return $this->role->ID == 1;
  }
}
?>

Da nun der User von Anfang an vorhanden sein muss, wird dieser auch in der /index.php erstellt:

<?PHP
  function __autoload($class_name){
      require_once "system/classes/".strtolower($class_name).".php";
  }
  session_start();
  include("system/settings.php");
  include("system/filterfilename.php");
  include("system/sys.php");
  $db = new MySQL('system/dbsettings.php');
  $db->Connect();
  if(!isset($_SESSION['user'])) $_SESSION['user'] = new User();
  $currentpage = new Page();
  $currentpage->loadProperties($GLOBALS['db']->EscapeString($_GET['include']));
  if(!$_GET['skin']){
    include(SkinController::getCurrentSkinPath()."/index.php");
  }
  else{
    include('system/skins/'.$_GET['skin']."/index.php");
  }
?>

Zu guter letzt muss noch die Datei /system/classes/login-php auf die neue Situation angepasst werden:

<?PHP
  class Login extends Editor{
  
    public function display(){
        ?>
            <h2>Login</h2>
        <?PHP
        if($_POST['name']){
            if($_SESSION['user']->login($_POST['name'],$_POST['password'])){
                echo "Hallo ".$_SESSION['user']->name;
            }
            else{
                echo "Login fehlgeschlagen!";
            }
        }
        if($_SESSION['user']->isGuest()){
            ?>
            <form action="<?PHP echo $_SERVER['SCRIPT_URI']; ?>" method="POST">
                <table>
                    <tr>
                        <td>Benutzername:</td>
                        <td><input name="name" /></td>
                    </tr>
                    <tr>
                        <td>Passwort:</td>
                        <td> <input name="password" type="password" /></td>
                    </tr>
                </table>
                <input type="submit" value="Login" />
            </form>
            <?PHP
        }
    }
    
    public functiondisplayEditable(){
        ?>
          <input name="save" type="submit" value="&Auml;ndern" onclick="form.action='<?PHP echo $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'] ?>' ; target='_self' ; return true" />
        <?PHP
    }
    
    public function save($newPage,$oldPage){
    }    
}
?>

Jetzt kann man bereits von überall auf den User zugreifen. Was fehlt? Na klar, die Einstellungen. Dafür müssen wir die Funktion getSetting der Datei /system/settings.php bearbeiten. Hier wird mit Hilfe von UNION erst die rollenspezifische und danach die allgemeine Einstellung ausgelesen. Die obere der beiden wird genommen:

function getSetting($area,$areaType,$property){
    $area     = $GLOBALS['db']->EscapeString($area);
    $areaType = $GLOBALS['db']->EscapeString($areaType);
    $property = $GLOBALS['db']->EscapeString($property);
    return $GLOBALS['db']->ReadField("
                SELECT value FROM {'dbprefix'}settings WHERE role = '".$_SESSION['user']->role->ID."' AND area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."' UNION
                SELECT value FROM {'dbprefix'}settings WHERE role = '3' AND area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."'
    ");
}

Um das Ganze zu testen, färben wir jetzt beim Login als Administrators einen roten Hintergrund ein:

INSERT INTO `cms_settings` VALUES (2, 'default', 'skins', 'skinbgcolor', 'f00', 1, 'Hintergrundfarbe', 'colorpicker');

Später habe ich vor, über diese Settings den Admin-Bereich in den allgemeinen Bereich zu verschieben. So sieht der Admin-Skin erst mal aus wie das Standardskin, jedoch wird es später so sein, dass über diese rollenspezifische Einstellungen ein Extra-Skin für den Admin zugewiesen werden kann.

Sorry, dass es in den letzten Tagen keine Beiträge gab. Ich hatte in der Zeit viel Stress und war außerdem noch krank. Ich hoffe ihr versteht dass.

Kommentare

Daniel schrieb am 22.04.2010:

Logisch verstehen (ich) wir das. Ist doch nur menschlich.