**/ abstract class twIf_Object_Access { // These are keept for compability const TYPE_BOOL = twIf_Widget_Control::TYPE_BOOL; const TYPE_ENUM = twIf_Widget_Control::TYPE_ENUM; const TYPE_TEXT = twIf_Widget_Control::TYPE_TEXT; const TYPE_FLOAT = twIf_Widget_Control::TYPE_FLOAT; const TYPE_NUMBER = twIf_Widget_Control::TYPE_NUMBER; const TYPE_UPLOAD = twIf_Widget_Control::TYPE_UPLOAD; const TYPE_STATIC = twIf_Widget_Control::TYPE_STATIC; const TYPE_PASSWORD = twIf_Widget_Control::TYPE_PASSWORD; const TYPE_TEXTAREA = twIf_Widget_Control::TYPE_TEXTAREA; const TYPE_CUSTOM = twIf_Widget_Control::TYPE_CUSTOM; const TYPE_DATE = twIf_Widget_Control::TYPE_DATE; const OUTPUT_BOOL = twIf_Widget_Control::TYPE_BOOL; const OUTPUT_CURRENCY_CENT = twIf_Widget_Control::TYPE_CURRENCY_CENT; const OUTPUT_CURRENCY_EURO = twIf_Widget_Control::TYPE_CURRENCY_EURO; const OUTPUT_DATE = twIf_Widget_Control::TYPE_DATE; const OUTPUT_TIME = 'time'; const OUTPUT_DATETIME = twIf_Widget_Control::TYPE_DATETIME; const OUTPUT_PERCENT = 'percent'; const OUTPUT_BYTES = 'BYTES'; // {{{ byteToHuman /** * Convert bytes to a human readable value * * @param int $Value * * @access private * @return string **/ private function byteToHuman ($n) { $E = array ('Byte', 'KiB', 'MiB', 'GiB', 'TiB'); $c = 0; while ($n > 1) { $n = $n / 1024; $c++; } $n *= 1024; $c--; if ($c < 0) $c = 0; $Locale = localeconv (); return number_format ($n, 2, $Locale ['decimal_point'], $Locale ['thousands_sep']) . ' ' . $E [$c]; } // }}} // {{{ currencyToHuman /** * Convert a currency value to a humane readable value * * @param float $Value * * @access private * @return string **/ private function currencyToHuman ($Value) { $i = round ($Value * 100) / 100; $s = number_format ($i, 2, '.', ''); if ((($p = strpos ($s, '.')) !== false)) { $b = substr ($s, 0, $p); $e = substr ($s, $p + 1); while (strlen ($e) < 2) $e .= '0'; return $b . ',' . $e; } return $s . ',00'; } // }}} function getClassVars ($Class) { // Generate first data $myFields = get_class_vars ($pClass = $Class); $Fields = array (); $Inherit = defined ($pClass . '::INHERIT_PARAMS'); // Strip fields from parent class while ($pClass = get_parent_class ($pClass)) { if (!$Inherit) { $pFields = get_class_vars ($pClass); foreach ($pFields as $pKey=>$Nirvana) unset ($myFields [$pKey]); } $Inherit = defined ($pClass . '::INHERIT_PARAMS'); } if (is_array ($myFields)) foreach ($myFields as $Key=>$Default) $Fields [strtolower ($Key)] = $Key; return $Fields; } // {{{ parseFieldDef /** * Parse a Field-Description and handle defaults etc. * * @access protected * @return array */ protected function parseFieldDef ($Key, $Definition, $Object, $Level = 0, $insertOverride = false) { // Create empty structure $Result = array ( 'Name' => $Key, 'Read' => false, 'ReadParams' => array (), 'ReadStrip' => '', 'Write' => false, 'WriteParams' => array (), 'Value' => '', 'Default' => (isset ($Definition ['Default']) ? $Definition ['Default'] : ''), 'Type' => (isset ($Definition ['Type']) ? $Definition ['Type'] : twIf_Widget_Control::TYPE_TEXT), 'Enum' => (isset ($Definition ['Enum']) ? $Definition ['Enum'] : array ()), 'ByVal' => (isset ($Definition ['ByVal']) ? $Definition ['ByVal'] : false), 'Caption' => (isset ($Definition ['Caption']) ? $Definition ['Caption'] : $Key), 'Class' => (isset ($Definition ['Class']) ? $Definition ['Class'] : ''), 'Filter' => (isset ($Definition ['Filter']) ? $Definition ['Filter'] : null), 'PrintF' => (isset ($Definition ['PrintF']) ? $Definition ['PrintF'] : null), 'Override' => null, // twIf_Widget_Table 'OrderKey' => (isset ($Definition ['OrderKey']) ? $Definition ['OrderKey'] : null), 'Multiplier' => (isset ($Definition ['Multiplier']) ? min (1, intval ($Definition ['Multiplier'])) : null), 'Total' => (isset ($Definition ['Total']) ? ($Definition ['Total'] == true) : false), 'Wrap' => (isset ($Definition ['Wrap']) ? ($Definition ['Wrap'] == true) : false), // twIf_Widget_Object 'Level' => (isset ($Definition ['Level']) ? intval ($Definition ['Level']) : $Level), 'Column' => (isset ($Definition ['Column']) ? intval ($Definition ['Column']) : 1), 'Rows' => (isset ($Definition ['Rows']) ? intval ($Definition ['Rows']) : 1), 'Hidden' => (isset ($Definition ['Hidden']) ? $Definition ['Hidden'] : false), 'Focus' => (isset ($Definition ['Focus']) ? $Definition ['Focus'] : false), 'Extended' => (array_key_exists ('Extended', $Definition) ? $Definition ['Extended'] : false), 'Prefix' => (isset ($Definition ['Prefix']) ? $Definition ['Prefix'] : ''), 'Suffix' => (isset ($Definition ['Suffix']) ? $Definition ['Suffix'] : ''), ); // Read-/Write-Access on object $ReadFunc = null; $WriteFunc = null; $ReadParams = array ('%s'); $WriteParams = array ('%s'); // Try to get old-style property-pointer from definition if (isset ($Definition ['Field'])) { $ReadFunc = $WriteFunc = $Definition ['Field']; if (isset ($Definition ['Params']) && is_array ($Definition ['Params'])) $ReadParams = $WriteParams = $Definition ['Params']; } // Get new-stlye read/write-pointer from definition if (isset ($Definition ['Read'])) $ReadFunc = $Definition ['Read']; if (isset ($Definition ['ReadParams']) && is_array ($Definition ['ReadParams'])) $ReadParams = $Definition ['ReadParams']; if (isset ($Definition ['Write'])) $WriteFunc = $Definition ['Write']; if (isset ($Definition ['WriteParams']) && is_array ($Definition ['WriteParams'])) $WriteParams = $Definition ['WriteParams']; if (!is_object ($Object) && !class_exists ($Object)) { # trigger_error (twIf_i18n::getText ('Invalid Object-Type %s', $Object)); } else { // Determine which class to handle if (is_object ($Object)) $Class = get_class ($Object); else $Class = $Object; // Load properties of class $Vars = self::getClassVars ($Class); // Validate the new pointers $ReadFunc = self::getPointer ($ReadFunc, $Object, $Vars, $Key); $WriteFunc = self::getPointer ($WriteFunc, $Object, $Vars, $Key); if ($Result ['Filter'] !== null) $Result ['Filter'] = self::getPointer ($Result ['Filter'], $Object, $Vars, $Key); if ($Result ['OrderKey'] !== null) $Result ['OrderKey'] = self::getPointer ($Result ['OrderKey'], $Object, $Vars, $Key, false); } if (($ReadFunc === null) && ($WriteFunc === null)) { if ($Object !== null) trigger_error (twIf_i18n::getText ('No read nor write function for %s found', $Key), E_USER_WARNING); return false; } $Result ['Read'] = $ReadFunc; $Result ['ReadParams'] = $ReadParams; $Result ['Write'] = $WriteFunc; $Result ['WriteParams'] = $WriteParams; if ((!is_object ($Object) && class_exists ($Object)) || ($insertOverride && is_array ($Result ['Read']) && ($Result ['Read'][0] == $Object))) $Result ['Override'] = true; elseif ($insertOverride) $Result ['Override'] = false; // Handle some other crap ;-) if (isset ($Definition ['Description']) && ($Definition ['Description'] != '')) $Result ['Description'] = $Definition ['Description']; if (isset ($Definition ['Strip'])) $Result ['ReadStrip'] = $Definition ['Strip']; if (isset ($Definition ['Multiplier']) && ($Definition ['Multiplier'] !== null)) { if (is_array ($Vars) && (($p = self::getPointer ($Definition ['Multiplier'], $Object, $Vars, false)) !== null)) $Result ['Multiplier'] = $p; else $Result ['Multiplier'] = (($v = intval ($Definition ['Multiplier'])) > 0 ? $v : null); } // Pre-generate control $Result ['__Control'] = twIf_Widget_Control::generateControl ($Result ['Type'], md5 (self::getFieldName ($Result))); return $Result; } // }}} // {{{ getControl /** * Retrive objective-representation of a control * * @param array $FieldData * * @access protected * @return object **/ protected function getControl (&$FieldData) { # TODO: Maybe create the control here on-demand return $FieldData ['__Control']; } // }}} // {{{ isReadFunction /** * Check wheter a specified definition contains a read-function * * @param array $Definition * * @access protected * @return bool **/ protected function isReadFunction ($Definition) { return is_array ($Definition ['Read']); } // }}} // {{{ getStatic /** * Small hack to store static values inside definitions * * @param mixed $Value * * @accress public * @return mixed **/ public function getStatic ($Value) { return $Value; } // }}} // {{{ getPointer /** * Retrive pointer to an object-method or -property * * @param string $Pointer * @param object $Object * @param array $Vars (optional) Cached variables on object * @param string $Default (optional) * @param bool $AllowCallback (optional) Allow the use of callbacks/function-calls (default) * * @access protected * @return mixed */ protected function getPointer ($Pointer, $Object, $Vars = null, $Default = false, $AllowCallback = true) { // Check for a null value and directly forward default if ($Pointer === null) { if ($Default !== null) return self::getPointer ($Default, $Object, $Vars, null, $AllowCallback); return $Pointer; } // Determine which class to handle if (is_object ($Object)) $Class = get_class ($Object); else $Class = $Object; // Check if this is a callback (and let them pass directly) if (is_array ($Pointer) && (count ($Pointer) == 2) && is_callable ($Pointer)) return $Pointer; // Check wheter this might be a function call if (($p = strpos ($Pointer, '(')) > 0) { if (!$AllowCallback) return null; $Function = substr ($Pointer, 0, $p); $Pointer = array ($Object, $Function); # TODO: Check if the function is really callable // We are accessing a property } else { // Load properties of class if (!is_array ($Vars)) $Vars = self::getClassVars ($Class); // Check if property really exists if (!isset ($Vars [strtolower ($Pointer)])) { // Check for magic function if (defined ($Class . '::TWIF_LAZY_VARIABLES') && (constant ($Class . '::TWIF_LAZY_VARIABLES') == 1)) return $Pointer; // Try to fall back to default elseif ($Default !== null) $Pointer = self::getPointer ($Default, $Object, $Vars, null, $AllowCallback); else $Pointer = null; } } return $Pointer; } // }}} // {{{ getPostValue /** * Get contents of a field as posted by the client * * @param array $FieldData * * @access protected * @return mixed */ protected function getPostValue ($FieldData, $forWrite = false) { // Generate POST-Name $Name = md5 (self::getFieldName ($FieldData)); // Handle static fields if ($FieldData ['Type'] == twIf_Widget_Control::TYPE_STATIC) return $FieldData ['Default']; $Control = self::getControl ($FieldData); if (isset ($FieldData ['Enum'])) $Control->setItems ($FieldData ['Enum']); if (($Value = $Control->getPostValue ()) === null) return null; if (($FieldData ['Type'] == twIf_Widget_Control::TYPE_ENUM) && ($Value === null) && $FieldData ['ByVal'] && isset ($_POST [$Name])) $Value = stripslashes ($_POST [$Name]); // Process any filter if ($FieldData ['Filter'] !== null) return call_user_func ($FieldData ['Filter'], $Value, $forWrite, null); return $Value; } // }}} // {{{ processValue /** * Process a given value to match the given field * * @see twIf_Object_Access::getPostValue() * @access protected * @return mixed **/ protected function processValue ($FieldData, $Value) { // Retrive handle of control $Control = self::getControl ($FieldData); // Setup the control (just to be sure if (isset ($FieldData ['Enum'])) $Control->setItems ($FieldData ['Enum']); // Forward the call $orgValue = $Value; $Value = $Control->processValue ($Value); if (($FieldData ['Type'] == twIf_Widget_Control::TYPE_ENUM) && ($Value === null) && $FieldData ['ByVal']) return $orgValue; return $Value; } // }}} // {{{ getFieldValue /** * Retrive the value of an object-property * * @param object $Object * @param array $Definition * * @access protected * @return mixed */ protected function getFieldValue ($Object, $Definition, $overrideCallbacks = false) { // Don't try to access anything if we haven't an object if (!is_object ($Object)) $Value = $Definition ['Default']; else { $Field = $Definition ['Read']; // Load the value from object if (is_array ($Field) && is_callable ($Field)) { if ($Definition ['Override'] !== null) $overrideCallbacks = $Definition ['Override']; if ($overrideCallbacks && (is_object ($Field [0]) || ($Object instanceof $Field [0]))) $Field [0] = $Object; $Params = $Definition ['ReadParams']; foreach ($Params as $i=>$Param) if ($Param == '%s') $Params [$i] = $Object; $Value = call_user_func_array ($Field, $Params); } elseif ($Field) $Value = $Object->$Field; else $Value = $Definition ['Default']; } // Optinally strip first bytes from value if ((($l = strlen ($Definition ['ReadStrip'])) > 0) && (substr ($Value, 0, $l) == $Definition ['ReadStrip'])) $Value = substr ($Value, $l); if ($Definition ['Filter'] !== null) $Value = call_user_func ($Definition ['Filter'], $Value, false, $Object); if ($Definition ['PrintF'] !== null) $Value = sprintf ($Definition ['PrintF'], $Value); return $Value; } // }}} protected function getFieldValueSimple ($Object, $FieldName) { $Definition = array ( 'Read' => self::getPointer ($FieldName, $Object, null, false), 'ReadParams' => array (), 'Default' => null, 'ReadStrip' => false, ); return self::getFieldValue ($Object, $Definition); } // {{{ getFieldName /** * Get the name of a field * * @param array $FieldDef * * @access protected * @return string */ protected function getFieldName ($FieldDef) { $Arr = null; if (is_array ($FieldDef ['Write'])) $Arr = $FieldDef ['Write']; elseif ($FieldDef ['Write'] !== null) return $FieldDef ['Name'] . '/' . $FieldDef ['Write']; elseif (is_array ($FieldDef ['Read'])) $Arr = $FieldDef ['Read']; elseif ($FieldDef ['Read'] !== null) return $FieldDef ['Name'] . '/' . $FieldDef ['Read']; if (!is_array ($Arr)) return false; if (is_object ($Arr [0])) return $FieldDef ['Name'] . '/' . strtolower (get_class ($Arr [0]) . '::' . $Arr [1]); else return $FieldDef ['Name'] . '/' . strtolower ($Arr [0] . '::' . $Arr [1]); } // }}} // {{{ formatOutput /** * Try to put an input-value into the right output-format * * @param mixed $Value Input-Value to format * @param string $Format Output-Format * @param mixed $Default (optional) Unused * @param bool $Table (optional) Output as table-cell * @param bool $Wrap (optional) Allow Word-Wrapping * @param string $Style (optional) Add these Style-Flags * * @access private * @return string */ protected function formatOutput ($Value, $Format, $Default = '', $Prefix = '', $Suffix = '') { // Check wheter to output an array of items if (is_array ($Value)) { # TODO: Remove Style-Tag $buf = str_replace (' __CLASS__', '', $Prefix) . '' . $Suffix; return $buf; } // Perform normal output $Class = ''; switch ($Format) { case twIf_Widget_Control::TYPE_PERCENT_HUNDREDS: $Value /= 100; case twIf_Widget_Control::TYPE_PERCENT: if (strlen ($s = strval ($Value)) > 0) $Value = $s . ' %'; else $Value = ''; break; case self::OUTPUT_BYTES: $Value = self::byteToHuman ($Value); $Class = 'price'; break; case self::OUTPUT_BOOL: $Value = twIf_i18n::getText ($Value == 1 ? 'Yes' : 'No'); break; case self::OUTPUT_CURRENCY_CENT: $Class = 'price'; $Value = self::currencyToHuman ($Value / 100) . ' €'; break; case self::OUTPUT_CURRENCY_EURO: $Class = 'price'; $Value = self::currencyToHuman ($Value) . ' €'; break; case self::OUTPUT_DATE: if ($Value != 0) $Value = date ('d.m.Y', $Value); else $Value = twIf_i18n::getText ('N/A'); break; case self::OUTPUT_DATETIME: if ($Value != 0) { $Date = date ('d.m.Y', $Value); if ($Date == date ('d.m.Y')) $Date = twIf_i18n::getText ('Today'); $Value = twIf_i18n::getText ('%s at %s', $Date, date ('H:i', $Value)); } else $Value = 'N/A'; break; case self::OUTPUT_PERCENT: $Value = ($Value / 100) . '%'; break; case self::OUTPUT_TIME: } return str_replace (' __CLASS__', ($Class != '' ? ' class="' . $Class . '"' : ''), $Prefix) . twIf_i18n::getText ($Value) . $Suffix; } // }}} // {{{ formatNative /** * Try to convert a given field to our native value * * @param object $Value * @param array $Definition * * @access public * @return mixed **/ public static function formatNative ($Handle, $Definition) { return self::formatNativeType (self::getFieldValue ($Handle, $Definition), $Definition ['Type']); } // }}} // {{{ formatHuman /** * Try to generate a human-readable representation from a given field * * @param object $Value * @param array $Definition * * @access public * @return string **/ public static function formatHuman ($Handle, $Definition) { return self::formatHumanType (self::getFieldValue ($Handle, $Definition), $Definition ['Type']); } // }}} // {{{ formatNativeType /** * Convert a given value to our native type * * @param mixed $Value * @param enum $Type * * @access public * @return mixed **/ public static function formatNativeType ($Value, $Type) { switch ($Type) { case twIf_Widget_Control::TYPE_DATE: case twIf_Widget_Control::TYPE_DATE_FUTURE: case twIf_Widget_Control::TYPE_DATE_YEARMONTH: case twIf_Widget_Control::TYPE_DATE_YEARMONTH_FUTURE: // Check if this might be a unix-timestamp if (is_numeric ($Value)) return $Value; // Split into its pieces $Chunks = explode (' ', $Value); $dateOffset = 0; $timeOffset = 0; foreach ($Chunks as $Chunk) // American date (YYYY-MM-DD) if (strpos ($Chunk, '-') !== false) { $Date = explode ('-', $Chunk); $Year = intval (array_shift ($Date)); $Month = (count ($Date) > 0 ? intval (array_shift ($Date)) : 1); $Day = (count ($Date) > 0 ? intval (array_shift ($Date)) : 1); if ($Year < 100) { if (intval (substr (date ('Y'), -2)) < $Year) $Year += (intval (substr (date ('Y'), 0, -2)) - 1) * 100; else $Year += intval (substr (date ('Y'), 0, -2)) * 100; } $dateOffset = mktime (0, 0, 0, $Month, $Day, $Year); // Time (dd:hh:ii:ss) } elseif (strpos ($Chunk, ':') !== false) { $Time = explode (':', $Chunk); $Multiply = array (86400, 3600, 60 ,0); $timeOffset = 0; while (count ($Time) > 0) { if (count ($Multiply) == 0) break; $timeOffset += array_pop ($Time) * array_pop ($Multiply); } // German date (DD.MM.YYYY) } elseif (strpos ($Chunk, '.') !== false) { $Date = explode ('.', $Chunk); $Year = intval (array_pop ($Date)); $Month = (count ($Date) > 0 ? intval (array_pop ($Date)) : 1); $Day = (count ($Date) > 0 ? intval (array_pop ($Date)) : 1); if ($Year < 100) { if (intval (substr (date ('Y'), -2)) < $Year) $Year += (intval (substr (date ('Y'), 0, -2)) - 1) * 100; else $Year += intval (substr (date ('Y'), 0, -2)) * 100; } $dateOffset = mktime (0, 0, 0, $Month, $Day, $Year); } return $dateOffset + $timeOffset; case twIf_Widget_Control::TYPE_CURRENCY_EURO: case twIf_Widget_Control::TYPE_FLOAT: // Check wheter to skip any conversion if (is_float ($Value)) return $Value; $Locale = localeconv (); if ($Locale ['decimal_point'] != '.') { // Remove the thousands-seperator $Value = str_replace ($Locale ['thousands_sep'], '', $Value); // Convert the decimal-point $Value = str_replace ($Locale ['decimal_point'], '.', $Value); } return floatval ($Value); case twIf_Widget_Control::TYPE_CURRENCY_CENT: case twIf_Widget_Control::TYPE_NUMBER: return intval ($Value); case twIf_Widget_Control::TYPE_BOOL_CHECKBOX: case twIf_Widget_Control::TYPE_BOOL: return intval ($Value) % 2; } // Just let the value pass return $Value; } // }}} // {{{ formatHumanType /** * Try to generate a human-readable representation from an native value * * @param mixed $Value * @param enum $Type * * @access public * @return string **/ public function formatHumanType ($Value, $Type) { // Just to be sure $Value = self::formatNativeType ($Value, $Type); switch ($Type) { case twIf_Widget_Control::TYPE_DATE: case twIf_Widget_Control::TYPE_DATE_FUTURE: case twIf_Widget_Control::TYPE_DATE_YEARMONTH: case twIf_Widget_Control::TYPE_DATE_YEARMONTH_FUTURE: return date ('d.m.Y', $Value); case twIf_Widget_Control::TYPE_CURRENCY_CENT: return $Value . ' €/cent'; case twIf_Widget_Control::TYPE_CURRENCY_EURO: return $Value . ' €'; } // Fallback return strval ($Value); } // }}} // {{{ parseExpression /** * Parse and fill an expression * * @param string $Expression * @param object $Object * @param bool $Linkify (optional) * * @access public * @return string * @todo Rework this **/ public function parseExpression ($Expression, $Object, $Linkify = false) { while (($p = strpos ($Expression, '%{')) !== false) { $p2 = strpos ($Expression, '}', $p); $Property = substr ($Expression, $p + 2, $p2 - $p - 2); $Func = ''; if (($p3 = strpos ($Property, '::')) > 0) { $Func = strtolower (substr ($Property, 0, $p3)); $Property = substr ($Property, $p3 + 2); } if (($p3 = strpos ($Property, '(')) > 1) { $Params = array (); if (($p4 = strpos ($Property, ')', $p3)) > $p3) $Params = explode (',', substr ($Property, $p3 + 1, $p4 - $p3 - 1)); $P = array ($Object, substr ($Property, 0, $p3)); if (is_callable ($P)) $Value = call_user_func_array ($P, $Params); else $Value = 'nul'; } elseif (isset ($Object->$Property)) $Value = $Object->$Property; else $Value = 'nul'; switch ($Func) { case 'md5': $Value = md5 ($Value); break; } $Expression = substr ($Expression, 0, $p) . ($Linkify ? (strpos (substr ($Expression, 0, $p), '?') > 0 ? urlencode ($Value) : rawurlencode ($Value)) : $Value) . substr ($Expression, $p2 + 1); } return $Expression; } // }}} protected function handleEnum ($Definition, $Value) { if ($Definition ['Type'] != twIf_Widget_Control::TYPE_ENUM) return $Value; if (is_array ($Value)) { foreach ($Value as $i=>$Val) if (isset ($Definition ['Enum'][$Val])) $Value [$i] = $Definition ['Enum'][$Val]; } elseif (isset ($Definition ['Enum'][$Value])) $Value = $Definition ['Enum'][$Value]; return $Value; } protected function handleMultiplier ($Definition, $Object, $Value) { if (($Definition ['Multiplier'] === null) || ($Definition ['Multiplier'] == 1)) return $Value; if (is_numeric ($Definition ['Multiplier']) && is_numeric ($Value)) return $Value * $Definition ['Multiplier']; if (is_array ($Definition ['Multiplier'])) $Definition ['Multiplier'][0] = $Object; if (is_numeric ($Value) && is_numeric ($Val = self::getFieldValueSimple ($Object, $Definition ['Multiplier']))) return $Value * $Val; return $Value; } // {{{ setFieldValue /** * Set the value of a given object-property * * @param object $Object * @param array $Definition * @param mixed $Value * * * @access protected * @return void */ protected function setFieldValue ($Object, $Definition, $Value, $overrideCallbacks = false) { // Check if there is a valid handle if (!is_object ($Object)) { trigger_error (twIf_i18n::getText ('Missing object as parameter')); return false; } // Do not set empty passwords if (($Definition ['Type'] == twIf_Widget_Control::TYPE_PASSWORD) && ($Value == '')) return true; // Check if there was something changed if (strlen ($Definition ['ReadStrip']) > 0) { $Def2 = $Definition; $Def2 ['ReadStrip'] = ''; $Def2 ['Filter'] = null; $Def2 ['PrintF'] = null; $V2 = self::getFieldValue ($Object, $Def2, $overrideCallbacks); $L = strlen ($Definition ['ReadStrip']); if ((substr ($V2, 0, $L) == $Definition ['ReadStrip']) && (substr ($Value, 0, $L) != $Definition ['ReadStrip'])) { $Value = $Definition ['ReadStrip'] . $Value; } } // Get destination $Field = $Definition ['Write']; // Handle function-calls if (is_array ($Field) && is_callable ($Field)) { if ($Definition ['Override'] !== null) $overrideCallbacks = $Definition ['Override']; if ($overrideCallbacks && (is_object ($Field [0]) || ($Object instanceof $Field [0]))) $Field [0] = $Object; $Params = $Definition ['WriteParams']; if (!is_array ($Params) || (count ($Params) == 0)) $Params = array ('%s'); foreach ($Params as $i=>$Param) $Params [$i] = sprintf ($Param, $Value); $rc = call_user_func_array ($Field, $Params); // Retrive just a property } elseif ($Field && (isset ($Object->$Field) || empty ($Object->$Field))) $rc = $Object->update ($Field, $Value); else $rc = false; if ($FieldData ['Filter'] !== null) return call_user_func ($FieldData ['Filter'], $Value, true, $Object); return $rc; } // }}} } ?>