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. * @param $new_val */ 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) { $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 attribute. case 'helper': if ( ! isset($values['post']) && ! $_SESSION[APPCONFIG]->getValue('appearance', 'hide_template_warning')) { system_message(array( 'title' => sprintf('%s [%s]', _('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 [%s]', _('Unknown XML setting'), $i), 'body' => sprintf('%s [%s]', _('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 [%s]', _('Unknown XML setting'), $index), 'body' => sprintf('%s [%s]', _('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 [%s]', _('Unknown XML setting'), $index), 'body' => sprintf('%s [%s]', _('Unknown XML type setting will be ignored.'), $value), 'type' => 'warn')); } case 'value': if (is_array($value)) { foreach ($value as $x => $y) { if ( ! $this->haveMoreValues()) { system_message(array( 'title' => _('Automatically removed attribute values from template'), 'body' => sprintf('%s [%s]', _('Template defines more values than can be accepted by attribute.'), $this->getName(TRUE)), 'type' => 'warn')); $this->clearValue(); break; } else { $this->addValue($x, $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 [%s]', _('Unknown XML setting'), $index), 'body' => sprintf('%s [%s]', _('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. * * @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 * @param null $type * @return bool */ 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); } } }