918 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			918 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | <?php | ||
|  | /** | ||
|  |  * Classes and functions for the template engine. | ||
|  |  * | ||
|  |  * @author The phpLDAPadmin development team | ||
|  |  * @package phpLDAPadmin | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * Represents an attribute of a template. | ||
|  |  * | ||
|  |  * @package phpLDAPadmin | ||
|  |  * @subpackage Templates | ||
|  |  */ | ||
|  | class Attribute { | ||
|  | 	# Attribute Name
 | ||
|  | 	public $name; | ||
|  | 	# Source of this attribute definition
 | ||
|  | 	protected $source; | ||
|  | 
 | ||
|  | 	# Current and Old Values
 | ||
|  | 	protected $oldvalues = array(); | ||
|  | 	protected $values = array(); | ||
|  | 
 | ||
|  | 	# MIN/MAX number of values
 | ||
|  | 	protected $min_value_count = -1; | ||
|  | 	protected $max_value_count = -1; | ||
|  | 
 | ||
|  | 	# Is the attribute internal
 | ||
|  | 	protected $internal = false; | ||
|  | 	# Has the attribute been modified
 | ||
|  | 	protected $modified = false; | ||
|  | 	# Is the attribute being deleted because of an object class removal
 | ||
|  | 	protected $forcedelete = false; | ||
|  | 	# Is the attribute visible
 | ||
|  | 	protected $visible = false; | ||
|  | 	protected $forcehide = false; | ||
|  | 	# Is the attribute modifiable
 | ||
|  | 	protected $readonly = false; | ||
|  | 	# LDAP attribute type MUST/MAY
 | ||
|  | 	protected $ldaptype = null; | ||
|  | 	# Attribute property type (eg password, select, multiselect)
 | ||
|  | 	protected $type = ''; | ||
|  | 	# Attribute value to keep unique
 | ||
|  | 	protected $unique = false; | ||
|  | 
 | ||
|  | 	# Display parameters
 | ||
|  | 	protected $display = ''; | ||
|  | 	protected $icon = ''; | ||
|  | 	protected $hint = ''; | ||
|  | 	# Helper details
 | ||
|  | 	protected $helper = array(); | ||
|  | 	protected $helpervalue = array(); | ||
|  | 	# Onchange details
 | ||
|  | 	protected $onchange = array(); | ||
|  | 	# Show spacer after this attribute is rendered
 | ||
|  | 	protected $spacer = false; | ||
|  | 	protected $verify = false; | ||
|  | 
 | ||
|  | 	# Component size
 | ||
|  | 	protected $size = 0; | ||
|  | 	# Value max length
 | ||
|  | 	protected $maxlength = 0; | ||
|  | 	# Text Area sizings
 | ||
|  | 	protected $cols = 0; | ||
|  | 	protected $rows = 0; | ||
|  | 
 | ||
|  | 	# Public for sorting
 | ||
|  | 	public $page = 1; | ||
|  | 	public $order = 255; | ||
|  | 	public $ordersort = 255; | ||
|  | 	public $rdn = false; | ||
|  | 
 | ||
|  | 	# Schema Aliases for this attribute (stored in lowercase)
 | ||
|  | 	protected $aliases = array(); | ||
|  | 
 | ||
|  | 	# Configuration for automatically generated values
 | ||
|  | 	protected $autovalue = array(); | ||
|  | 	protected $postvalue = array(); | ||
|  | 
 | ||
|  | 	public function __construct($name,$values,$server_id,$source=null) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$server = $_SESSION[APPCONFIG]->getServer($server_id); | ||
|  | 
 | ||
|  | 		$sattr = $server->getSchemaAttribute($name); | ||
|  | 		if ($sattr) { | ||
|  | 			$this->name = $sattr->getName(false); | ||
|  | 			$this->setLDAPdetails($sattr); | ||
|  | 
 | ||
|  | 		} else | ||
|  | 			$this->name = $name; | ||
|  | 
 | ||
|  | 		$this->source = $source; | ||
|  | 
 | ||
|  | 		# XML attributes are shown by default
 | ||
|  | 		switch ($source) { | ||
|  | 			case 'XML': $this->show(); | ||
|  | 				$this->setXML($values); | ||
|  | 
 | ||
|  | 				break; | ||
|  | 
 | ||
|  | 			default: | ||
|  | 				if (! isset($values['values'])) | ||
|  | 					debug_dump_backtrace('no index "values"',1); | ||
|  | 
 | ||
|  | 				$this->initValue($values['values']); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		# Should this attribute be hidden
 | ||
|  | 		if ($server->isAttrHidden($this->name)) | ||
|  | 			$this->forcehide = true; | ||
|  | 
 | ||
|  | 		# Should this attribute value be read only
 | ||
|  | 		if ($server->isAttrReadOnly($this->name)) | ||
|  | 			$this->readonly = true; | ||
|  | 
 | ||
|  | 		# Should this attribute value be unique
 | ||
|  | 		if ($server->isAttrUnique($this->name)) | ||
|  | 			$this->unique = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Return the name of the attribute. | ||
|  | 	 * | ||
|  | 	 * @param boolean $lower - Return the attribute in normal or lower case (default lower) | ||
|  | 	 * @param boolean $real - Return the real attribute name (with ;binary, or just the name) | ||
|  | 	 * @return string Attribute name | ||
|  | 	 */ | ||
|  | 	public function getName($lower=true,$real=false) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs,$this->name); | ||
|  | 
 | ||
|  | 		if ($real) | ||
|  | 			return $lower ? strtolower($this->name) : $this->name; | ||
|  | 		else | ||
|  | 			return $lower ? strtolower($this->real_attr_name()) : $this->real_attr_name(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getValues() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->values); | ||
|  | 
 | ||
|  | 		return $this->values; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getOldValues() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->oldvalues); | ||
|  | 
 | ||
|  | 		return $this->oldvalues; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getValueCount() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs,$this->values); | ||
|  | 
 | ||
|  | 		return count($this->values); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getSource() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->source); | ||
|  | 
 | ||
|  | 		return $this->source; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Autovalue is called after the attribute is initialised, and thus the values from the ldap server will be set. | ||
|  | 	 */ | ||
|  | 	public function autoValue($new_val) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->values) | ||
|  | 			return; | ||
|  | 
 | ||
|  | 		$this->values = $new_val; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function initValue($new_val) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->values || $this->oldvalues) { | ||
|  | 			debug_dump(array('new_val'=>$new_val,'this'=>$this)); | ||
|  | 			debug_dump_backtrace('new and/or old values are set',1); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$this->values = $new_val; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function clearValue() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->values = array(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setOldValue($val) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->oldvalues = $val; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setValue($new_val) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->values) { | ||
|  | 			if ($this->values == $new_val) | ||
|  | 				return; | ||
|  | 
 | ||
|  | 			if ($this->oldvalues) { | ||
|  | 				debug_dump($this); | ||
|  | 				debug_dump_backtrace('old values are set',1); | ||
|  | 			} else | ||
|  | 				$this->oldvalues = $this->values; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if ($new_val == $this->values) | ||
|  | 			return; | ||
|  | 
 | ||
|  | 		$this->values = $new_val; | ||
|  | 		$this->justModified(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function addValue($new_val,$i=-1) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($i < 0) | ||
|  | 			$i = $this->getValueCount(); | ||
|  | 
 | ||
|  | 		$old_val = $this->getValue($i); | ||
|  | 		if (is_null($old_val) || ($old_val != $new_val)) | ||
|  | 			$this->justModified(); | ||
|  | 
 | ||
|  | 		$this->values[$i] = $new_val; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function delValue($i=-1) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($i < 0) | ||
|  | 			$this->setValue(array()); | ||
|  | 
 | ||
|  | 		if (! $this->hasBeenModified()) | ||
|  | 			$this->oldvalues = $this->values; | ||
|  | 
 | ||
|  | 		if (isset($this->values[$i])) { | ||
|  | 			unset($this->values[$i]); | ||
|  | 			$this->values = array_values($this->values); | ||
|  | 			$this->justModified(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getValue($i) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if (isset($this->values[$i])) | ||
|  | 			return $this->values[$i]; | ||
|  | 		else | ||
|  | 			return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getOldValue($i) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if (isset($this->oldvalues[$i])) | ||
|  | 			return $this->oldvalues[$i]; | ||
|  | 		else | ||
|  | 			return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getMinValueCount() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->min_value_count); | ||
|  | 
 | ||
|  | 		return $this->min_value_count; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setMinValueCount($min) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->min_value_count = $min; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getMaxValueCount() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->max_value_count); | ||
|  | 
 | ||
|  | 		return $this->max_value_count; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setMaxValueCount($max) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->max_value_count = $max; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function haveMoreValues() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->getMaxValueCount() < 0 || ($this->getValueCount() < $this->getMaxValueCount())) | ||
|  | 			return true; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function justModified() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->modified = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function hasBeenModified() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->modified); | ||
|  | 
 | ||
|  | 		return $this->modified; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isForceDelete() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->forcedelete); | ||
|  | 
 | ||
|  | 		return $this->forcedelete; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setForceDelete() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->forcedelete = true; | ||
|  | 		$this->oldvalues = $this->values; | ||
|  | 		$this->values = array(); | ||
|  | 		$this->justModified(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isInternal() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->internal); | ||
|  | 
 | ||
|  | 		return $this->internal; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInternal() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->internal = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isRequired() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->getMinValueCount() > 0) | ||
|  | 			return true; | ||
|  | 		elseif ($this->ldaptype == 'must') | ||
|  | 			return true; | ||
|  | 		elseif ($this->isRDN()) | ||
|  | 			return true; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isMay() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if (($this->ldaptype == 'may') && ! $this->isRequired()) | ||
|  | 			return true; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setType($type) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->type = strtolower($type); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getType() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->type); | ||
|  | 
 | ||
|  | 		return $this->type; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setLDAPtype($type) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->ldaptype = strtolower($type); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getLDAPtype() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->ldaptype); | ||
|  | 
 | ||
|  | 		return $this->ldaptype; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setProperties($properties) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		foreach ($properties as $index => $value) { | ||
|  | 			if ($index == 'maxvalnb') { | ||
|  | 				$this->setMaxValueCount($value); | ||
|  | 				continue; | ||
|  | 
 | ||
|  | 			} elseif ($index == 'minvalnb') { | ||
|  | 				$this->setMinValueCount($value); | ||
|  | 				continue; | ||
|  | 
 | ||
|  | 			} elseif ($index == 'maxlength') { | ||
|  | 				$this->setMinValueCount($value); | ||
|  | 				continue; | ||
|  | 
 | ||
|  | 			} elseif ($index == 'hidden') { | ||
|  | 				$this->visible = $value; | ||
|  | 				continue; | ||
|  | 
 | ||
|  | 			} elseif (in_array($index,array('cols','rows'))) { | ||
|  | 				# @todo To be implemented
 | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			if (isset($this->$index)) | ||
|  | 				$this->$index = $value; | ||
|  | 			else { | ||
|  | 				debug_dump($this); | ||
|  | 				debug_dump_backtrace(sprintf('Unknown property (%s) with value (%s) for (%s)',$index,$value,$this->getName()),1); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setRequired() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if ($this->getMinValueCount() <= 0) | ||
|  | 			$this->setMinValueCount(1); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setOptional() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->setMinValueCount(0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isReadOnly() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->readonly); | ||
|  | 
 | ||
|  | 		return $this->readonly; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setReadOnly() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->readonly = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isMultiple() { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function isVisible() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		return $this->visible && (! $this->forcehide); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function hide() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->visible = false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function show() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->visible = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function haveFriendlyName() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		return $_SESSION[APPCONFIG]->haveFriendlyName($this); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getFriendlyName() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->display); | ||
|  | 
 | ||
|  | 		if ($this->display) | ||
|  | 			return $this->display; | ||
|  | 		else | ||
|  | 			return $_SESSION[APPCONFIG]->getFriendlyName($this); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setDescription($description) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->description = $description; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getDescription() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->description); | ||
|  | 
 | ||
|  | 		return $this->description; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setIcon($icon) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->icon = $icon; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getIcon() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->icon); | ||
|  | 
 | ||
|  | 		return $this->icon ? sprintf('%s/%s',IMGDIR,$this->icon) : ''; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getHint() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->hint); | ||
|  | 
 | ||
|  | 		return $this->hint; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setHint($hint) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->hint = $hint; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getMaxLength() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->maxlength); | ||
|  | 
 | ||
|  | 		return $this->maxlength; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setMaxLength($maxlength) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->maxlength = $maxlength; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getSize() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->size); | ||
|  | 
 | ||
|  | 		return $this->size; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setSize($size) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->size = $size; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getSpacer() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->spacer); | ||
|  | 
 | ||
|  | 		return $this->spacer; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getPage() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->page); | ||
|  | 
 | ||
|  | 		return $this->page; | ||
|  | 	} | ||
|  | 	public function setPage($page) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->page = $page; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getOnChange() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->onchange); | ||
|  | 
 | ||
|  | 		return $this->onchange; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getHelper() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->helper); | ||
|  | 
 | ||
|  | 		return $this->helper; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getHelperValue() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->helpervalue); | ||
|  | 
 | ||
|  | 		return $this->helpervalue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getVerify() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->verify); | ||
|  | 
 | ||
|  | 		return $this->verify; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setRDN($rdn) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->rdn = $rdn; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Return if this attribute is an RDN attribute | ||
|  | 	 * | ||
|  | 	 * @return boolean | ||
|  | 	 */ | ||
|  | 	public function isRDN() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs,$this->rdn); | ||
|  | 
 | ||
|  | 		return $this->rdn; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Capture all the LDAP details we are interested in | ||
|  | 	 * | ||
|  | 	 * @param sattr Schema Attribute | ||
|  | 	 */ | ||
|  | 	private function setLDAPdetails($sattr) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		# By default, set this as a MAY attribute, later processing should make it a MUST attribute if it is.
 | ||
|  | 		if (! $this->ldaptype) | ||
|  | 			$this->ldaptype = 'may'; | ||
|  | 
 | ||
|  | 		# Store our Aliases
 | ||
|  | 		foreach ($sattr->getAliases() as $alias) | ||
|  | 			array_push($this->aliases,strtolower($alias)); | ||
|  | 
 | ||
|  | 		if ($sattr->getIsSingleValue()) | ||
|  | 			$this->setMaxValueCount(1); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Return a list of aliases for this Attribute (as defined by the schema) | ||
|  | 	 * This list will be lowercase. | ||
|  | 	 */ | ||
|  | 	public function getAliases() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->aliases); | ||
|  | 
 | ||
|  | 		return $this->aliases; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getAutoValue() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->autovalue); | ||
|  | 
 | ||
|  | 		return $this->autovalue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getPostValue() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->postvalue); | ||
|  | 
 | ||
|  | 		return $this->postvalue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setPostValue($postvalue) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		$this->postvalue = $postvalue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setXML($values) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		# Mostly all the time, this should be an array
 | ||
|  | 		if (is_array($values)) | ||
|  | 			foreach ($values as $index => $value) | ||
|  | 				switch ($index) { | ||
|  | 					# Helpers should be accompanied with a <post> attribute.
 | ||
|  | 					case 'helper': | ||
|  | 						if (! isset($values['post']) && ! $_SESSION[APPCONFIG]->getValue('appearance','hide_template_warning')) | ||
|  | 							system_message(array( | ||
|  | 								'title'=>sprintf('%s [<i>%s</i>]',_('Missing [post] setting in XML file'),$index), | ||
|  | 								'body'=>_('[helper] needs an accompanying [post] action.'), | ||
|  | 								'type'=>'warn')); | ||
|  | 
 | ||
|  | 						if (isset($value['value']) && ! is_array($value['value']) && preg_match('/^=php\.(\w+)\((.*)\)$/',$value['value'],$matches)) { | ||
|  | 							$this->helpervalue['function'] = $matches[1]; | ||
|  | 							$this->helpervalue['args'] = $matches[2]; | ||
|  | 
 | ||
|  | 							unset ($value['value']); | ||
|  | 						} | ||
|  | 
 | ||
|  | 						foreach ($value as $i => $detail) { | ||
|  | 							if (! in_array($i,array('default','display','id','value'))) { | ||
|  | 								if (! $_SESSION[APPCONFIG]->getValue('appearance','hide_template_warning')) | ||
|  | 									system_message(array( | ||
|  | 										'title'=>sprintf('%s [<i>%s</i>]',_('Unknown XML setting'),$i), | ||
|  | 										'body'=>sprintf('%s <small>[%s]</small>',_('Unknown XML type setting for helper will be ignored.'),$detail), | ||
|  | 										'type'=>'warn')); | ||
|  | 
 | ||
|  | 								unset($value[$i]); | ||
|  | 							} | ||
|  | 						} | ||
|  | 
 | ||
|  | 						$this->$index = $value; | ||
|  | 
 | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					case 'hidden': $value ? $this->visible = false : $this->visible = true; | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					case 'spacer': $value ? $this->$index = true : $this->$index = false; | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					# Essentially, we ignore type, it is used to select an Attribute type in the Factory. But we'll generated a warning if there is an unknown type.
 | ||
|  | 					case 'type': | ||
|  | 						if (! in_array($value,array('password','multiselect','select','textarea')) && ! $_SESSION[APPCONFIG]->getValue('appearance','hide_template_warning')) | ||
|  | 							system_message(array( | ||
|  | 								'title'=>sprintf('%s [<i>%s</i>]',_('Unknown XML setting'),$index), | ||
|  | 								'body'=>sprintf('%s <small>[%s]</small>',_('Unknown XML type setting will be ignored.'),$value), | ||
|  | 								'type'=>'warn')); | ||
|  | 
 | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					case 'post': | ||
|  | 						if (preg_match('/^=php\.(\w+)\((.*)\)$/',$value,$matches)) { | ||
|  | 							$this->postvalue['function'] = $matches[1]; | ||
|  | 							$this->postvalue['args'] = $matches[2]; | ||
|  | 
 | ||
|  | 						} else | ||
|  | 							if (! $_SESSION[APPCONFIG]->getValue('appearance','hide_template_warning')) | ||
|  | 								system_message(array( | ||
|  | 									'title'=>sprintf('%s [<i>%s</i>]',_('Unknown XML setting'),$index), | ||
|  | 									'body'=>sprintf('%s <small>[%s]</small>',_('Unknown XML type setting will be ignored.'),$value), | ||
|  | 									'type'=>'warn')); | ||
|  | 
 | ||
|  | 					case 'value': | ||
|  | 						if (is_array($value)) | ||
|  | 							foreach ($value as $y) { | ||
|  | 								if (! $this->haveMoreValues()) { | ||
|  | 									system_message(array( | ||
|  | 									'title'=>_('Automatically removed attribute values from template'), | ||
|  | 										'body'=>sprintf('%s <small>[%s]</small>',_('Template defines more values than can be accepted by attribute.'),$this->getName(true)), | ||
|  | 										'type'=>'warn')); | ||
|  | 
 | ||
|  | 									$this->clearValue(); | ||
|  | 
 | ||
|  | 									break; | ||
|  | 
 | ||
|  | 								} else | ||
|  | 									$this->addValue($y); | ||
|  | 							} | ||
|  | 
 | ||
|  | 						else | ||
|  | 							# Check to see if the value is auto generated.
 | ||
|  | 							if (preg_match('/^=php\.(\w+)\((.*)\)$/',$value,$matches)) { | ||
|  | 								$this->autovalue['function'] = $matches[1]; | ||
|  | 								$this->autovalue['args'] = $matches[2]; | ||
|  | 
 | ||
|  | 								# We'll add a hint too
 | ||
|  | 								if (! $this->hint) | ||
|  | 									$this->hint = _('Automatically determined'); | ||
|  | 
 | ||
|  | 							} else | ||
|  | 								$this->addValue($value); | ||
|  | 
 | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					# Queries
 | ||
|  | 					case 'ordersort': | ||
|  | 
 | ||
|  | 					# Creation/Editing Templates
 | ||
|  | 					case 'cols': | ||
|  | 					case 'default': | ||
|  | 					case 'display': | ||
|  | 					case 'hint': | ||
|  | 					case 'icon': | ||
|  | 					case 'maxlength': | ||
|  | 					case 'onchange': | ||
|  | 					case 'order': | ||
|  | 					case 'page': | ||
|  | 					case 'readonly': | ||
|  | 					case 'rows': | ||
|  | 					case 'size': | ||
|  | 					case 'values': | ||
|  | 					case 'verify': $this->$index = $value; | ||
|  | 						break; | ||
|  | 
 | ||
|  | 					case 'max': | ||
|  | 						if ($this->getMaxValueCount() == -1) | ||
|  | 							$this->setMaxValueCount($value); | ||
|  | 
 | ||
|  | 					default: | ||
|  | 						if (! $_SESSION[APPCONFIG]->getValue('appearance','hide_template_warning')) | ||
|  | 							system_message(array( | ||
|  | 								'title'=>sprintf('%s [<i>%s</i>]',_('Unknown XML setting'),$index), | ||
|  | 								'body'=>sprintf('%s <small>[%s]</small>',_('Unknown attribute setting will be ignored.'),serialize($value)), | ||
|  | 								'type'=>'warn')); | ||
|  | 				} | ||
|  | 
 | ||
|  | 		elseif (is_string($values) && (strlen($values) > 0)) | ||
|  | 			$this->values = array($values); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Display the values removed in an attribute. | ||
|  | 	 */ | ||
|  | 	public function getRemovedValues() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		return array_diff($this->getOldValues(),$this->getValues()); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Display the values removed in an attribute. | ||
|  | 	 */ | ||
|  | 	public function getAddedValues() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		return array_diff($this->getValues(),$this->getOldValues()); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Prunes off anything after the ";" in an attr name. This is useful for | ||
|  | 	 * attributes that may have ";binary" appended to their names. With | ||
|  | 	 * real_attr_name(), you can more easily fetch these attributes' schema | ||
|  | 	 * with their "real" attribute name. | ||
|  | 	 * | ||
|  | 	 * @param string $attr_name The name of the attribute to examine. | ||
|  | 	 * @return string | ||
|  | 	 */ | ||
|  | 	private function real_attr_name() { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->name); | ||
|  | 
 | ||
|  | 		return preg_replace('/;.*$/U','',$this->name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Does this attribute need supporting JS | ||
|  | 	 */ | ||
|  | 	public function needJS($type=null) { | ||
|  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | ||
|  | 			debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs); | ||
|  | 
 | ||
|  | 		if (is_null($type)) { | ||
|  | 			foreach (array('focus','blur','validate') as $type) | ||
|  | 				if ($this->needJS($type)) | ||
|  | 					return true; | ||
|  | 
 | ||
|  | 			return false; | ||
|  | 
 | ||
|  | 		} elseif ($type == 'focus') { | ||
|  | 			# We dont have any focus javascript routines.
 | ||
|  | 			return false; | ||
|  | 
 | ||
|  | 		} elseif ($type == 'blur') { | ||
|  | 			if ($this->onchange || $this->isRequired()) | ||
|  | 				return true; | ||
|  | 			else | ||
|  | 				return false; | ||
|  | 
 | ||
|  | 		} elseif ($type == 'validate') { | ||
|  | 			if ($this->isRequired()) | ||
|  | 				return true; | ||
|  | 			else | ||
|  | 				return false; | ||
|  | 
 | ||
|  | 		} else | ||
|  | 			debug_dump_backtrace(sprintf('Unknown JS request %s',$type),1); | ||
|  | 	} | ||
|  | } | ||
|  | ?>
 |