2erlei/app/helper/validation.php

239 lines
5.5 KiB
PHP

<?php
/**
* Validierungs-Plugin
*
* @package federleicht
* @subpackage plugin
*/
/**
* Validierungsklasse
*/
class validation {
/**
* Instanzvariablen
*/
var $error_msg;
var $rules;
/**
* Konstruktor
*/
function validation() {
}
/**
* Fehlermeldungen aus Datenbank holen
*/
function get_errormsg($datamodel) {
$result = $datamodel->retrieve('language', '*', "tld = '".LANG."'");
foreach( $result as $key => $value) {
if ( substr($key, 0, 6) != 'error_' ) continue;
$id = substr($key, 6);
if ( !$this->rule_exists($id) ) $this->create_rule($id);
$this->update_rule($id, FALSE, $value);
}
}
/**
* Prüfausdruck hinzufügen
*
* Prüfausdruck wird zur Liste hinzugefügt. Der Rückgabewert zeigt an,
* ob das erfolgreich war.
*
* @param string $id ID des zu überprüfenden Datenfeldes
* @param string $type Art der Überprüfung. Gültige Werte sind
* - string
* - number
* - email
* - regexp
* @param string $rule zusätzliche Überprüfungsregel
* mögliche Werte sind
* - optional
* - multiline
* - [eine Mengenangabe nach RegEx-Syntax]
* - [ein regulärer Ausdruck]
* @return boolean
*/
function set_rule($id, $type, $rule='') {
if ( !is_string($id) ) $id = (string) $id;
if ( !is_string($type) ) $type = (string) $type;
if ( !is_string($rule) ) $rule = (string) $rule;
$start = '/^';
$end = '$/';
switch ($type) {
case 'string':
$regexp = '[- _a-zA-ZäüößÄÖÜ]';
break;
case 'number':
$regexp = '[- 0-9]';
break;
case 'email':
$regexp = '([A-Za-z0-9](([\w.-][^._-]*){0,61})[A-Za-z0-9])@([A-Za-z0-9]([A-Za-z0-9-]{0,61})?[A-Za-z0-9]\.)+([A-Za-z]{2,6})';
break;
case 'regex':
case 'regexp':
$regexp = $rule;
$start = '';
$end = '';
$rule = '';
break;
default:
$regexp = '.';
break;
}
if ( preg_match('/(\{[,0-9]+\}|[*+?]{1,2})/', $rule) ) {
$count = $rule;
} elseif ( $type != 'regexp' AND $type != 'regex' ) {
$rule .= ' ';
$pieces = explode(' ', $rule);
if ( in_array('optional', $pieces) ) {
$count = '*';
} else {
$count = '+';
}
if ( in_array('multiline', $pieces) ) $end = $end . 'm';
} else {
$count = '';
}
if ( !$this->rule_exists($id) ) $this->create_rule($id);
$this->update_rule($id, $start . $regexp . $count . $end, FALSE);
return TRUE;
}
/**
* Fehlermeldung zu einer Prüfregel hinzufügen
*
* @param string $id ID des zu überprüfenden Datenfeldes
* @param string $msg Fehlermeldung, falls die Prüfung Eingabefehler
* feststellt
* @return boolean
*/
function set_msg($id, $msg) {
if ( !is_string($id) ) $id = (string) $id;
if ( !is_string($msg) ) $msg = (string) $msg;
if ( !$this->rule_exists($id) ) $this->create_rule($id);
$this->update_rule($id, FALSE, $msg);
return TRUE;
}
/**
* Formulardaten validieren
*
* Die Formulardaten werden anhand regulärer Ausdrücke auf Plausibilität
* geprüft.
*
* @param array &$data Referenz auf Formulardaten
* @return array
*/
function validate_form(&$data) {
if ( !is_array($data) ) return FALSE;
$rules = $this->get_rules();
if ( empty($rules) ) return FALSE;
$errors = array();
foreach( $rules as $field=>$rule ) {
if ( !preg_match($rule['regexp'], $data[$field]) ) {
# unset($data['field']);
$errors[] = $rule['error'];
}
}
return $errors;
}
/**
* Javascript mit Regeln für die Formulardatenvalidierung zurückgeben
*
* Es wird eine JS mit den Regeln für die Validierung der Formulardaten
* zurückgegeben.
* Außerdem wird der HTML-Code für das Einbinden des allgemeinen
* Validierungsskripts angefügt.
*
* @return string
*/
function get_js() {
$form_variables = $this->get_rules();
if ( empty($form_variables) ) return FALSE;
$js = "var validationSet = {\n";
$entries = array();
foreach ($form_variables as $name => $properties) {
$entries[] = "\t'".$name."': { 'regexp': ".$properties['regexp'].", 'error': ' ".addslashes($properties['error'])."'}";
}
$js .= implode(",\n", $entries) . "\n";
$js .= "}\n";
$html = '<script type="text/javascript">'."\n".'// <[CDATA['."\n";
$html .= $js;
$html .= '// ]]>'."\n".'</script>'."\n";
$html .= '<script type="text/javascript" src="/public/js/validation.js"></script>'."\n";
return $html;
}
################### Verwaltungsfunktionen ###########################
/**
* Prüfen, ob Regel existiert
*
* @param string $id
* @return boolean
*/
function rule_exists($id) {
return ( isset($this->rules[$id]) );
}
/**
* Regelarray erzeugen
*
* @param string $id
*/
function create_rule($id) {
if ( $this->rule_exists($id) ) return;
$this->rules[$id] = array(
'regexp'=>'/.*/',
'error'=>'Error in '.$id
);
}
/**
* Regel aktualisieren
*/
function update_rule($id, $regex=FALSE, $msg=FALSE) {
if ( !$this->rule_exists($id) ) return;
if ( $regex !== FALSE ) $this->rules[$id]['regexp'] = $regex;
if ( $msg !== FALSE ) $this->rules[$id]['error'] = $msg;
}
/**
* Regel entfernen
*/
function remove_rule($id) {
if ( !$this->rule_exists($id) ) return;
unset ($this->rules[$id]);
}
/**
* Regeln als Array zurückgeben
*/
function get_rules() {
return $this->rules;
}
############### Ende der Verwaltungsfunktionen ######################
}
?>