Index: branches/5.2.x/core/kernel/kbase.php =================================================================== diff -u -N -r14644 -r14673 --- branches/5.2.x/core/kernel/kbase.php (.../kbase.php) (revision 14644) +++ branches/5.2.x/core/kernel/kbase.php (.../kbase.php) (revision 14673) @@ -1,6 +1,6 @@ initForm($form_name); $this->defineFields(); - $this->ApplyFieldModifiers(); // should be called only after all fields definitions been set + $this->ApplyFieldModifiers(null, true); // should be called only after all fields definitions been set $this->prepareConfigOptions(); // this should go last, but before setDefaultValues, order is significant! // only set on first call of method @@ -639,11 +639,12 @@ * Override field options with ones defined in submit via "field_modfiers" array (common for all prefixes) * * @param Array $field_modifiers + * @param bool $from_submit * @return void * @access public * @author Alex */ - public function ApplyFieldModifiers($field_modifiers = null) + public function ApplyFieldModifiers($field_modifiers = null, $from_submit = false) { $allowed_modifiers = Array ('required', 'multiple'); @@ -654,28 +655,47 @@ if ( !isset($field_modifiers) ) { $field_modifiers = $this->Application->GetVar('field_modifiers'); + if ( !$field_modifiers ) { // no field modifiers - return ; + return; } $field_modifiers = getArrayValue($field_modifiers, $this->getPrefixSpecial()); } if ( !$field_modifiers ) { // no field modifiers for current prefix_special - return ; + return; } + $fields = $this->Application->getUnitOption($this->Prefix, 'Fields', Array ()); + $virtual_fields = $this->Application->getUnitOption($this->Prefix, 'VirtualFields', Array ()); + foreach ($field_modifiers as $field => $field_options) { foreach ($field_options as $option_name => $option_value) { if ( !in_array(strtolower($option_name), $allowed_modifiers) ) { continue; } - $this->Fields[$field][$option_name] = $option_value; + if ( $from_submit ) { + // there are no "lN_FieldName" fields, since ApplyFieldModifiers is + // called before PrepareOptions method, which creates them + $field = preg_replace('/^l[\d]+_(.*)/', '\\1', $field); + } + + if ( $this->isVirtualField($field) ) { + $virtual_fields[$field][$option_name] = $option_value; + $this->SetFieldOption($field, $option_name, $option_value, true); + } + + $fields[$field][$option_name] = $option_value; + $this->SetFieldOption($field, $option_name, $option_value); } } + + $this->Application->setUnitOption($this->Prefix, 'Fields', $fields); + $this->Application->setUnitOption($this->Prefix, 'VirtualFields', $virtual_fields); } /**