Index: branches/5.1.x/core/kernel/utility/formatters/multilang_formatter.php =================================================================== diff -u -N -r13168 -r13545 --- branches/5.1.x/core/kernel/utility/formatters/multilang_formatter.php (.../multilang_formatter.php) (revision 13168) +++ branches/5.1.x/core/kernel/utility/formatters/multilang_formatter.php (.../multilang_formatter.php) (revision 13545) @@ -1,6 +1,6 @@ helper =& $this->Application->recallObject('kMultiLanguageHelper'); + } + + /** * Returns ML field equivalent to field name specifed * * @param string $field_name @@ -43,9 +57,20 @@ return 'l' . $lang . '_' . $field_name; } + /** + * The method is supposed to alter config options or cofigure object in some way based on its usage of formatters + * The methods is called for every field with formatter defined when configuring item. + * Could be used for adding additional VirtualFields to an object required by some special Formatter + * + * @param string $field_name + * @param array $field_options + * @param kDBBase $object + */ function PrepareOptions($field_name, &$field_options, &$object) { - if (getArrayValue($object->Fields, $field_name, 'master_field')) return; + if (getArrayValue($field_options, 'master_field') || getArrayValue($field_options, 'options_processed')) { + return ; + } $lang_field_name = $this->LangFieldName($field_name); @@ -55,30 +80,100 @@ $this->Application->setUnitOption($object->Prefix, 'TitleField', $lang_field_name); } - //substitude fields - $fields = $this->Application->getUnitOption($object->Prefix, 'Fields'); - if ( isset($fields[$field_name]) ) { + $primary_language_id = $this->Application->GetDefaultLanguageId(); + $fields = $this->Application->getUnitOption($object->Prefix, 'Fields', Array ()); + $virtual_fields = $this->Application->getUnitOption($object->Prefix, 'VirtualFields', Array ()); - $fields[$lang_field_name] = $fields[$field_name]; - $fields[$lang_field_name]['master_field'] = $field_name; - $fields[$lang_field_name]['error_field'] = $field_name; - $object->Fields[$lang_field_name] = $fields[$lang_field_name]; - $fields[$field_name]['required'] = false; - $object->Fields[$field_name]['required'] = false; + // substitude real field + if (array_key_exists($field_name, $fields)) { + $tmp_field_options = $fields[$field_name]; + $tmp_field_options['master_field'] = $field_name; + $tmp_field_options['error_field'] = $field_name; + $field_required = array_key_exists('required', $tmp_field_options) && $tmp_field_options['required']; + + for ($language_id = 1; $language_id <= $this->helper->languageCount; $language_id++) { + if (!$this->helper->LanguageFound($language_id)) { + continue; + } + + // make all non-primary language fields not required + if ($language_id != $primary_language_id) { + unset($tmp_field_options['required']); + } + elseif ($field_required) { + $tmp_field_options['required'] = $field_required; + } + + $translated_field = 'l' . $language_id . '_' . $field_name; + $fields[$translated_field] = $tmp_field_options; + $object->Fields[$translated_field] = $tmp_field_options; + } + + // makes original field non-required + unset($fields[$field_name]['required'], $object->Fields[$field_name]['required']); + + // prevents real field with formatter set to be saved in db + $virtual_fields[$field_name] = $object->Fields[$field_name]; $object->VirtualFields[$field_name] = $object->Fields[$field_name]; } - $this->Application->setUnitOption($object->Prefix, 'Fields', $fields); + elseif (array_key_exists($field_name, $virtual_fields)) { + // substitude virtual field + $calculated_fields = $this->Application->getUnitOption($object->Prefix, 'CalculatedFields'); + $calculated_field_special = array_key_exists($object->Special, $calculated_fields) ? $object->Special : (array_key_exists('', $calculated_fields) ? '' : false); - //substitude virtual fields - $virtual_fields = $this->Application->getUnitOption($object->Prefix, 'VirtualFields'); - if ( isset($virtual_fields[$field_name]) ) { - $virtual_fields[$lang_field_name] = $virtual_fields[$field_name]; - $virtual_fields[$lang_field_name]['master_field'] = $field_name; - $object->VirtualFields[$lang_field_name] = $virtual_fields[$lang_field_name]; - $virtual_fields[$field_name]['required'] = false; - $object->VirtualFields[$field_name]['required'] = false; + $tmp_field_options = $virtual_fields[$field_name]; + $tmp_field_options['master_field'] = $field_name; + $tmp_field_options['error_field'] = $field_name; + $field_required = array_key_exists('required', $tmp_field_options) && $tmp_field_options['required']; + + for ($language_id = 1; $language_id <= $this->helper->languageCount; $language_id++) { + if (!$this->helper->LanguageFound($language_id)) { + continue; + } + + // make all non-primary language fields not required + if ($language_id != $primary_language_id) { + unset($tmp_field_options['required']); + } + elseif ($field_required) { + $tmp_field_options['required'] = $field_required; + } + + $translated_field = 'l' . $language_id . '_' . $field_name; + $virtual_fields[$translated_field] = $tmp_field_options; + $object->VirtualFields[$translated_field] = $tmp_field_options; + + // substitude calculated fields associated with given virtual field + foreach ($calculated_fields as $special => $special_fields) { + if (!array_key_exists($field_name, $special_fields)) { + continue; + } + + $calculated_fields[$special][$translated_field] = str_replace('%2$s', $language_id, $special_fields[$field_name]); + + if ($special === $calculated_field_special) { + $object->CalculatedFields[$translated_field] = $calculated_fields[$special][$translated_field]; + } + } + + // manually copy virtual field back to fields (see kDBBase::setVirtualFields about that) + $fields[$translated_field] = $tmp_field_options; + $object->Fields[$translated_field] = $tmp_field_options; + } + + // remove original calculated field + foreach ($calculated_fields as $special => $special_fields) { + unset($calculated_fields[$special][$field_name]); + } + + unset($object->CalculatedFields[$field_name]); + + // save back calculated fields + $this->Application->setUnitOption($object->Prefix, 'CalculatedFields', $calculated_fields); + + // makes original field non-required + unset($virtual_fields[$field_name]['required'], $object->VirtualFields[$field_name]['required']); } - $this->Application->setUnitOption($object->Prefix, 'VirtualFields', $virtual_fields); //substitude grid fields $grids = $this->Application->getUnitOption($object->Prefix, 'Grids', Array()); @@ -117,6 +212,9 @@ $this->Application->setUnitOption($object->Prefix, 'ListSortings', $sortings); //TODO: substitude possible language-fields sortings after changing language + $fields[$field_name]['options_processed'] = $field_options['options_processed'] = true; + $this->Application->setUnitOption($object->Prefix, 'Fields', $fields); + $this->Application->setUnitOption($object->Prefix, 'VirtualFields', $virtual_fields); } /*function UpdateSubFields($field, $value, &$options, &$object)