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

Rollenspezifische Einstellungen Speichern Teil 1 (CMS)

Im selbst erstelltem CMS geht es heute um das schreiben der Rollenspezifischen Einstellungen. Da jede Einstellung zu einer Rolle zugeordnet sein kann, kommen die Rollen direkt in unsere SettingsForm.

Vorher müssen wir aber die Funktion setSetting der Datei /system/settings.php bearbeiten. Sie bekommt nun den role-Parameter:

function setSetting($area,$areaType,$property,$value,$role){
    $area     = $GLOBALS['db']->EscapeString($area);
    $areaType = $GLOBALS['db']->EscapeString($areaType);
    $property = $GLOBALS['db']->EscapeString($property);
    $value    = $GLOBALS['db']->EscapeString($value);
    $role     = $GLOBALS['db']->EscapeString($role);
    $exists = $GLOBALS['db']->ReadField("SELECT COUNT(*) FROM {'dbprefix'}settings WHERE area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."' AND role = '".$role."'") > 0;
    if($exists){
        $res = $GLOBALS['db']->Execute("UPDATE {'dbprefix'}settings SET value = '".$value."' WHERE area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."' AND role = '".$role."'");
    }
    else{
        $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}settings (value,area,areaType,property,role) VALUES ('".$value."', '".$area."', '".$areaType."', '".$property."', '".$role."')");
    }
    return $res;
}

Die Funktion wird nun in der /system/classes/settingsform.php aufgerufen. Diese funktioniert jedoch erst im Teil 2. Hier werden außerdem die Rollen aufgelistet:

<?PHP
  class SettingsForm{
    public $area     = "global";
    public $areaType = "global";
    public $role     = null;
    
    public function display(){
      $currentRole = 3;
      if($_GET['role']) $currentRole = $_GET['role'];
      if($_POST['save']){
        foreach($_POST as $property=>$value){
          if($property != "save"){
            setSetting($this->area,$this->areaType,$property,$value,$currentRole);
          }
        }
      }
        ?>
        <form style="float:left;width:600px;" action="<?PHP echo $_SERVER['REQUEST_URI']; ?>" method="POST">
        Rolle:
        <select name="roles" onchange="document.location.href='/admin/index.php?page=settings&role=' + this.options[this.selectedIndex].value;">
        <?PHP
        $roles = $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}roles ORDER BY name");
        if($roles){
            foreach($roles as $role){
                if($currentRole == $role->id){
                    echo "<option value="".$role->id."" selected="selected">".$role->name."</option>";
                }
                else{
                    echo "<option value="".$role->id."">".$role->name."</option>";
                }
            }
        }
        ?>
        </select>
        <fieldset style="width:500px;">
          <legend>Einstellungen &auml;ndern</legend>
          <table style="width:100%">
            <?PHP
              $sql = "SELECT * FROM {'dbprefix'}settings WHERE area = '".$this->area."' AND areaType = '".$this->areaType."' AND activated = 1";
              if($this->role){
                $sql .= " AND role = '".$this->role."'";
              }
              $rows = $GLOBALS['db']->ReadRows($sql);
              if($rows){
                foreach($rows as $row){
                  echo "<tr><td><label for="".htmlentities($row->property)."">";
                  echo $row->description.":";
                  echo "</label></td><td>";
                  $control        = new $row->type;
                  $control->name  = $row->property;
                  $control->value = $row->value;
                  $control->display();
                  echo "</td></tr>";
                }
              }
            ?>
          </table>
          <br /><input type="submit" name="save" value="Speichern" />
        </fieldset>
      </form>
    <?PHP
    }
  }
?>

Der basecolor hat noch einen kleinen Fehler im installer entdeckt den wir nun beheben. Und zwar wird die Tabelle settings mit den namen ssettings angelegt. Das geht natürlich nicht. Datei /installer/installer.php:

mysql_query("CREATE TABLE `".$this->params[3]['praefix']."settings` (
  `role` int(10) NOT NULL default '3',
  `area` varchar(20) NOT NULL,
  `areaType` varchar(20) NOT NULL,
  `property` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  `activated` int(1) NOT NULL default '1',
  `description` varchar(75) NOT NULL,
  `type` varchar(50) NOT NULL,
  PRIMARY KEY  (`role`,`area`,`areaType`,`property`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");