Just try it!: Wie kann ich Checkboxen, Radiobuttons und Selectboxen anzeigen aber nicht ändern lassen?

Beitrag lesen

Da ich Felder im Formular abhängig von der Berechtigung editierbar mache, aber das Speichern im Backend nicht für jede Berechtigungsstufe individuell speichern möchte,

Dreh es einfach rum. Speichere die Berechtigungen im Backend. Und wenn Du das Formular zusammenbaust frage eben das selbe Backend nach eben diesen Berechtigungen. Nehmen wir mal ein einfaches Backend mit einer ACL:

<?php
class accesControl {

    private $rights;

	function __construct() {
		$this -> rights = $this -> readRights();
	}

	function hasRight ( $rightname=false, $right='read' ) {
		$rights = $this -> rights[ $rightname ];
		if ( isset( $rights['user'][$_SESSION['username']][$right] ) && $rights['user'][$_SESSION['username']][$right] ) {
			return true;
		} else {
			foreach ($_SESSION['groups'] as $group ) {
				if ( isset( $rights['group'][$group][$right] ) && $rights['group'][$group][$right] ) {
					return true;
				}
			}
		}
		return false;
	}
	
	function readRights() {
	    /*
	    In der Realiät sollten die Daten freilich an anderer Stelle
	    ( Datenbank, Textdatei...) notiert werden!
	    */
	       
	    # Rechteobjekt, ACL-Type,   
	       
    $right['isDenied']['group']['deniedUsers']['read'] = true;
		$right['usermin']['user']['admin_1']['read']  = true;
		$right['usermin']['group']['admins']['read']  = true;
		$right['usermin']['user']['admin_1']['write'] = true;
		$right['usermin']['group']['admins']['write'] = true;		

		$right['logon']['group']['allusers']['read']  = true;
		$right['logon']['group']['logon']['read']     = true;

		$right['data']['group']['allusers']['read']   = true;
		$right['data']['group']['workers']['read']    = true;
		$right['data']['group']['workers']['write']   = true;
		
		return $right;
	}
}

/************************************************************
* Tests
************************************************************/

$acl = new accesControl();

/* 
$_SESSION['username'] und $_SESSION['groups'] sollten bei der Anmeldung 
besetzt werden
*/ 

session_start();

#/*
$_SESSION['username'] = 'admin_1';
$_SESSION['groups']   =  ['logon', 'usermin'];
checkRights( $acl );
#*/

#/*
$_SESSION['username'] = 'chef';
$_SESSION['groups']   =  ['allusers','usermin', 'workers' ];
checkRights( $acl );
#*/

#/*
$_SESSION['username'] = 'Leser';
$_SESSION['groups']   =  ['allusers'];
checkRights( $acl );
#*/

#/*
$_SESSION['username'] = 'Jobber';
$_SESSION['groups']   =  ['allusers', 'workers'];
checkRights( $acl );
#*/

#/*
$_SESSION['username'] = 'Denni';
$_SESSION['groups']   =  ['allusers', 'workers', 'deniedUsers' ];
checkRights( $acl );
#*/


function checkRights( $acl ) {
	if ( $acl -> hasRight( 'usermin' ) && false === $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " darf Benutzer ansehen" . PHP_EOL;
	}

	if ( $acl -> hasRight( 'usermin', 'write' ) && false === $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " darf Benutzer verwalten" . PHP_EOL;
	}

	if ( $acl -> hasRight( 'logon' ) && false === $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " darf sich anmelden" . PHP_EOL;
	}

	if ( $acl -> hasRight( 'data' ) && false === $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " darf Daten ansehen" . PHP_EOL;
	}

	if ( $acl -> hasRight( 'data', 'write' ) && false === $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " darf Daten schreiben" . PHP_EOL;
	}

	if ( $acl -> hasRight( 'isDenied') ) {
		echo  $_SESSION['username'] . " ist angemeldet aber blockiert" . PHP_EOL;
	}
}

Wo ist das Problem, beim Erzeugen des Formulars etwas wie

session_start();
require_once './lib/accesControl.class.php';
$acl = new accesControl();

if ( false === $acl -> hasRight( 'isDenied' ) ) {
?>
<h1>Ihr Account wurde gesperrt.</h1>
<p>Wenden Sie sich an den Chef.</p>
<?php
exit;
}

# …

if ( 
    $acl -> hasRight( 'data', 'write' ) 
 && $acl -> hasRight( 'data', 'read' )  
) {
		?>
<label for="p_serial">Seriennummer:</label>
<input type="text" value="1234" name="p_serial" id="p_serial">
    <?php
} elseif ( $acl -> hasRight( 'data', 'read' ) ) {
		?>
<label for="p_serial">Seriennummer:</label>
<input type="text" disabled value="1234" name="p_serial" id="p_serial">
    <?php
}

# …

zu notieren und vor dem Eintrag in die Datenbank genau das selbe zu machen?