client-side validation

This commit is contained in:
Roland Gruber 2011-10-16 12:06:00 +00:00
parent 7649a52134
commit 43a82b487e
9 changed files with 1703 additions and 25 deletions

View File

@ -139,8 +139,10 @@ D:
Programs and licenses with other licenses and/or authors than the
main license and authors:
lib/fpdf.php A 2008 Olivier Plathey
lib/font/Vera* B 2003 Bitstream, Inc.
templates/lib/wz_tooltip.js C Walter Zorn
templates/lib/jquery*.js D 2010 John Resig, Paul Bakaus, Fred Heusschen
lib/3rdParty/phpseclib C Jim Wigginton
lib/fpdf.php A 2008 Olivier Plathey
lib/font/Vera* B 2003 Bitstream, Inc.
templates/lib/*wz_tooltip.js C Walter Zorn
lib/3rdParty/phpseclib C Jim Wigginton
templates/lib/*jquery*.js D 2010 John Resig, Paul Bakaus, Fred Heusschen
templates/lib/*jquery-validationEngine-*.js D 2010 Cedric Dugas and Olivier Refalo

View File

@ -36,14 +36,20 @@ $Id$
*/
abstract class htmlElement {
const OPTION_ALIGN = 0;
/** align to top */
const ALIGN_TOP = 0;
/** align to left */
const ALIGN_LEFT = 1;
/** align to right */
const ALIGN_RIGHT = 2;
/** align to bottom */
const ALIGN_BOTTOM = 3;
/** align to center */
const ALIGN_CENTER = 4;
/** validation rule to allow only numbers ([0-9]+) */
const VALIDATE_NUMERIC = 'numeric';
/** alignment when inside a table */
public $alignment = null;
/** colspan if inside a table */
@ -351,6 +357,10 @@ class htmlInputField extends htmlElement {
private $isEnabled = true;
/** indicates that the value should be saved in obfuscated form */
private $obfuscate = false;
/** required field */
protected $required = false;
/** validation rule */
private $validationRule = null;
/**
* Constructor
@ -389,8 +399,20 @@ class htmlInputField extends htmlElement {
$this->fieldValue = $values[$this->fieldName][0];
}
}
$validators = array();
if ($this->required) {
$validators[] = 'required';
}
if ($this->validationRule != null) {
$validators[] = 'custom[' . $this->validationRule . ']';
}
// print input field
$class = '';
if (sizeof($validators) > 0) {
$class = ' class="validate[' . implode(',', $validators) . ']"';
}
$name = ' name="' . $this->fieldName . '"';
$id = ' id="inputField_' . $this->fieldName . '"';
$value = '';
if ($this->fieldValue != null) {
$value = ' value="' . $this->fieldValue . '"';
@ -410,7 +432,7 @@ class htmlInputField extends htmlElement {
if (!$this->isEnabled) {
$disabled = ' disabled';
}
echo '<input type="' . $inputType . '"' . $name . $value . $maxLength . $size . $fieldTabIndex . $disabled . '>';
echo '<input type="' . $inputType . '"' . $class . $name . $id . $value . $maxLength . $size . $fieldTabIndex . $disabled . '>';
if ($this->obfuscate) {
return array($this->fieldName => 'text_obfuscated');
}
@ -464,6 +486,25 @@ class htmlInputField extends htmlElement {
$this->obfuscate = $obfuscate;
}
/**
* Specifies if the input field is required.
*
* @param boolean $required required
*/
public function setRequired($required) {
$this->required = $required;
}
/**
* Specifies the validation rule (e.g. htmlElement::VALIDATE_NUMERIC) for this field.
* This rule is checked on client side when the input field looses focus.
*
* @param boolean $rule rule name
*/
public function setValidationRule($rule) {
$this->validationRule = $rule;
}
}
/**
@ -477,8 +518,6 @@ class htmlTableExtendedInputField extends htmlInputField {
private $label;
/** help ID */
private $helpID;
/** required field */
private $required = false;
/**
* Constructor
@ -527,15 +566,6 @@ class htmlTableExtendedInputField extends htmlInputField {
return $return;
}
/**
* Specifies if this input field must be filled.
*
* @param boolean $required required or not
*/
public function setRequired($required) {
$this->required = $required;
}
}
/**

View File

@ -1159,7 +1159,12 @@ class accountContainer {
*/
private function printPageHeader() {
include '../main_header.php';
echo "<form enctype=\"multipart/form-data\" action=\"edit.php\" method=\"post\">\n";
echo '<script type="text/javascript">';
echo 'jQuery(document).ready(function() {';
echo ' jQuery("#inputForm").validationEngine();';
echo '});';
echo '</script>';
echo "<form id=\"inputForm\" enctype=\"multipart/form-data\" action=\"edit.php\" method=\"post\">\n";
}
/**

View File

@ -1086,13 +1086,10 @@ class posixAccount extends baseModule implements passwordService {
$return->addElement($uidInput, true);
$commonName = '';
if (isset($this->attributes['cn'][0])) $commonName = $this->attributes['cn'][0];
$cnInput = new htmlTableExtendedInputField(_("Common name"), 'cn', $commonName, 'cn');
$cnInput->setRequired(true);
$return->addElement($cnInput, true);
$return->addElement(new htmlTableExtendedInputField(_("Common name"), 'cn', $commonName, 'cn'), true);
$uidNumber = '';
if (isset($this->attributes['uidNumber'][0])) $uidNumber = $this->attributes['uidNumber'][0];
$uidNumberInput = new htmlTableExtendedInputField(_('UID number'), 'uidNumber', $uidNumber, 'uidNumber');
$uidNumberInput->setRequired(true);
$uidNumberInput->setFieldMaxLength(20);
$return->addElement($uidNumberInput, true);
$gecos = '';

View File

@ -305,6 +305,7 @@ class shadowAccount extends baseModule implements passwordService {
$pwdWarnInput = new htmlTableExtendedInputField(_('Password warning'), 'shadowWarning', $shWarning, 'shadowWarning');
$pwdWarnInput->setFieldMaxLength(4);
$pwdWarnInput->setFieldSize(5);
$pwdWarnInput->setValidationRule(htmlElement::VALIDATE_NUMERIC);
$return->addElement($pwdWarnInput, true);
$shPwdExpiration = '';
@ -312,6 +313,7 @@ class shadowAccount extends baseModule implements passwordService {
$pwdExpInput = new htmlTableExtendedInputField(_('Password expiration'), 'shadowInactive', $shPwdExpiration, 'shadowInactive');
$pwdExpInput->setFieldMaxLength(4);
$pwdExpInput->setFieldSize(5);
$pwdExpInput->setValidationRule(htmlElement::VALIDATE_NUMERIC);
$return->addElement($pwdExpInput, true);
$shMinAge = '';
@ -319,6 +321,7 @@ class shadowAccount extends baseModule implements passwordService {
$minAgeInput = new htmlTableExtendedInputField(_('Minimum password age'), 'shadowMin', $shMinAge, 'shadowMin');
$minAgeInput->setFieldMaxLength(5);
$minAgeInput->setFieldSize(5);
$minAgeInput->setValidationRule(htmlElement::VALIDATE_NUMERIC);
$return->addElement($minAgeInput, true);
$shMaxAge = '';
@ -326,6 +329,7 @@ class shadowAccount extends baseModule implements passwordService {
$maxAgeInput = new htmlTableExtendedInputField(_('Maximum password age'), 'shadowMax', $shMaxAge, 'shadowMax');
$maxAgeInput->setFieldMaxLength(5);
$maxAgeInput->setFieldSize(5);
$maxAgeInput->setValidationRule(htmlElement::VALIDATE_NUMERIC);
$return->addElement($maxAgeInput, true);
$expirationDate = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

View File

@ -0,0 +1,165 @@
/*
$Id$
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2010 Cedric Dugas and Olivier Refalo
2011 Roland Gruber
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
.inputContainer {
position: relative;
float: left;
}
.formError {
position: absolute;
top: 300px;
left: 300px;
display: block;
z-index: 5000;
cursor: pointer;
}
.ajaxSubmit {
padding: 20px;
background: #55ea55;
border: 1px solid #999;
display: none
}
.formError .formErrorContent {
width: 100%;
background: #ee4f01;
position:relative;
z-index:5001;
color: #fff;
font-family: tahoma;
font-size: 12px;
border: 2px solid #ddd;
box-shadow: 0 0 6px #000;
-moz-box-shadow: 0 0 6px #000;
-webkit-box-shadow: 0 0 6px #000;
padding: 4px 10px 4px 10px;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
}
.greenPopup .formErrorContent {
background: #33be40;
}
.blackPopup .formErrorContent {
background: #393939;
color: #FFF;
}
.formError .formErrorArrow {
width: 15px;
margin: -2px 0 0 13px;
position:relative;
z-index: 5006;
}
.formError .formErrorArrowBottom {
box-shadow: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
margin: 0px 0 0 12px;
top:2px;
}
.formError .formErrorArrow div {
border-left: 2px solid #ddd;
border-right: 2px solid #ddd;
box-shadow: 0 2px 3px #444;
-moz-box-shadow: 0 2px 3px #444;
-webkit-box-shadow: 0 2px 3px #444;
font-size: 0px;
height: 1px;
background: #ee4f01;
margin: 0 auto;
line-height: 0;
font-size: 0;
display: block;
}
.formError .formErrorArrowBottom div {
box-shadow: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
}
.greenPopup .formErrorArrow div {
background: #33be40;
}
.blackPopup .formErrorArrow div {
background: #393939;
color: #FFF;
}
.formError .formErrorArrow .line10 {
width: 15px;
border: none;
}
.formError .formErrorArrow .line9 {
width: 13px;
border: none;
}
.formError .formErrorArrow .line8 {
width: 11px;
}
.formError .formErrorArrow .line7 {
width: 9px;
}
.formError .formErrorArrow .line6 {
width: 7px;
}
.formError .formErrorArrow .line5 {
width: 5px;
}
.formError .formErrorArrow .line4 {
width: 3px;
}
.formError .formErrorArrow .line3 {
width: 1px;
border-left: 2px solid #ddd;
border-right: 2px solid #ddd;
border-bottom: 0 solid #ddd;
}
.formError .formErrorArrow .line2 {
width: 3px;
border: none;
background: #ddd;
}
.formError .formErrorArrow .line1 {
width: 1px;
border: none;
background: #ddd;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
<?php
/*
$Id$
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2010 Cedric Dugas and Olivier Refalo
2011 Roland Gruber
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
?>
(function($){
$.fn.validationEngineLanguage = function(){
};
$.validationEngineLanguage = {
newLang: function(){
$.validationEngineLanguage.allRules = {
"required": {
"regex": "none",
"alertText": "<?php echo _('This field is required.'); ?>",
},
"numeric": {
"regex": /^[0-9]+$/,
"alertText": "<?php echo _('Please enter a number.') ?>"
},
};
}
};
$.validationEngineLanguage.newLang();
})(jQuery);

View File

@ -57,7 +57,9 @@ $jsDirName = dirname(__FILE__) . '/lib';
$jsDir = dir($jsDirName);
$jsFiles = array();
while ($jsEntry = $jsDir->read()) {
if (substr($jsEntry, strlen($jsEntry) - 3, 3) != '.js') continue;
if ((substr($jsEntry, strlen($jsEntry) - 3, 3) != '.js') && (substr($jsEntry, strlen($jsEntry) - 4, 4) != '.php')) {
continue;
}
$jsFiles[] = $jsEntry;
}
sort($jsFiles);