Index: branches/RC/core/units/general/helpers/controls/edit_picker_helper.php =================================================================== diff -u -N -r10780 -r11271 --- branches/RC/core/units/general/helpers/controls/edit_picker_helper.php (.../edit_picker_helper.php) (revision 10780) +++ branches/RC/core/units/general/helpers/controls/edit_picker_helper.php (.../edit_picker_helper.php) (revision 11271) @@ -22,6 +22,10 @@ return ; } + if ($storage_field != $event->getEventParam('link_to_field')) { + return ; + } + $object =& $event->getObject(); /* @var $object kDBList */ @@ -38,6 +42,11 @@ $filter_clause = ($event->Special == 'selected') ? 'FALSE' : 'TRUE'; } + $constrain = $this->_getConstrain($main_object, $storage_field, 'filter'); + if ($constrain) { + $filter_clause .= ' AND (' . $constrain . ')'; + } + $object->addFilter('edit_picker_filter', $filter_clause); } @@ -60,6 +69,12 @@ $sql = 'SELECT '.$sub_prefix_field.' FROM '.$this->getTable($sub_prefix, $object->IsTempTable()).' WHERE '.$foreign_key.' = '.$object->GetID(); + + $constrain = $this->_getConstrain($object, $store_field, 'load'); + if ($constrain) { + $sql .= ' AND (' . $sub_prefix_field . ' IN (' . $constrain . '))'; + } + $selected_items = array_unique($this->Conn->GetCol($sql)); $object->SetDBField($store_field, $selected_items ? '|'.implode('|', $selected_items).'|' : ''); @@ -89,6 +104,12 @@ $sql = 'SELECT ' . $sub_prefix_field . ' FROM ' . $sub_table . ' WHERE '.$foreign_key.' = '.$main_object->GetID(); + + $constrain = $this->_getConstrain($main_object, $store_field, 'save'); + if ($constrain) { + $sql .= ' AND (' . $sub_prefix_field . ' IN (' . $constrain . '))'; + } + $old_values = $this->Conn->GetCol($sql); // 2. get new values from form @@ -126,6 +147,23 @@ } } } + + function _getConstrain(&$object, $store_field, $mode = 'filter') + { + $field_options = $object->GetFieldOptions($store_field); + $constrain = array_key_exists('option_constrain', $field_options) ? $field_options['option_constrain'] : false; + + if ($mode == 'filter') { + // filter on edit form + return $constrain; + } + elseif ($constrain) { + // load or save + return sprintf($field_options['options_sql'], $field_options['option_key_field']); + } + + return false; + } } ?> \ No newline at end of file Index: branches/RC/core/admin_templates/incs/form_blocks.tpl =================================================================== diff -u -N -r11226 -r11271 --- branches/RC/core/admin_templates/incs/form_blocks.tpl (.../form_blocks.tpl) (revision 11226) +++ branches/RC/core/admin_templates/incs/form_blocks.tpl (.../form_blocks.tpl) (revision 11271) @@ -810,17 +810,17 @@ - _selected" style="" size=""> + _move_left_button"/>
_move_right_button"/> - _available" style="" size=""> + Index: branches/RC/core/kernel/kbase.php =================================================================== diff -u -N -r10994 -r11271 --- branches/RC/core/kernel/kbase.php (.../kbase.php) (revision 10994) +++ branches/RC/core/kernel/kbase.php (.../kbase.php) (revision 11271) @@ -573,25 +573,36 @@ return preg_match('/[.(]/', $field_expr) ? $field_expr : '`'.$field_expr.'`'; } + /** + * Replaces current language id in given field options + * + * @param string $field_name + * @param Array $field_option_names + */ + function _replaceLanguageId($field_name, $field_option_names) + { + $language_id = $this->Application->GetVar('m_lang'); + + $field_options =& $this->Fields[$field_name]; + foreach ($field_option_names as $option_name) { + $field_options[$option_name] = str_replace('%2$s', $language_id, $field_options[$option_name]); + } + } + function PrepareFieldOptions($field_name) { $field_options =& $this->Fields[$field_name]; if (array_key_exists('options_sql', $field_options) ) { - // replace with query result - $language_id = $this->Application->GetVar('m_lang'); + // get options based on given sql + $replace_options = Array ('option_title_field', 'option_key_field', 'options_sql'); + $this->_replaceLanguageId($field_name, $replace_options); $select_clause = $this->escapeField($field_options['option_title_field']) . ',' . $this->escapeField($field_options['option_key_field']); - - $sql = sprintf($field_options['options_sql'], $select_clause, $language_id); - $sql = str_replace('%2$s', $language_id, $sql); // replace langauge in field names - - $options_hash = getArrayValue($field_options,'options'); - if($options_hash === false) $options_hash = Array(); - + $sql = sprintf($field_options['options_sql'], $select_clause); $dynamic_options = $this->Conn->GetCol($sql, $field_options['option_key_field']); - $field_options['options'] = array_merge_recursive2($options_hash, $dynamic_options); - unset($field_options['options_sql']); + $options_hash = array_key_exists('options', $field_options) ? $field_options['options'] : Array (); + $field_options['options'] = array_merge_recursive2($options_hash, $dynamic_options); } }