Index: branches/RC/core/units/general/helpers/controls/edit_picker_helper.php =================================================================== diff -u -N -r10022 -r10528 --- branches/RC/core/units/general/helpers/controls/edit_picker_helper.php (.../edit_picker_helper.php) (revision 10022) +++ branches/RC/core/units/general/helpers/controls/edit_picker_helper.php (.../edit_picker_helper.php) (revision 10528) @@ -64,6 +64,66 @@ $object->SetDBField($store_field, $selected_items ? '|'.implode('|', $selected_items).'|' : ''); } + + /** + * Saves value to subitem's table + * + * @param kEvent $sub_event + * @param string $store_field main item's field name, to get values from + * @param string $sub_prefix_field check already existing records by this field + */ + function SaveValues(&$sub_event, $store_field, $sub_prefix_field) + { + $main_object =& $sub_event->MasterEvent->getObject(); + $affected_field = $main_object->GetDBField($store_field); + + $object =& $this->Application->recallObject($sub_event->getPrefixSpecial(), null, Array('skip_autoload' => true)); + /* @var $object kDBItem */ + + $sub_table = $object->TableName; + $foreign_key = $this->Application->getUnitOption($sub_event->Prefix, 'ForeignKey'); + + // 1. get previous values from db + $sql = 'SELECT ' . $sub_prefix_field . ' + FROM ' . $sub_table . ' + WHERE '.$foreign_key.' = '.$main_object->GetID(); + $old_values = $this->Conn->GetCol($sql); + + // 2. get new values from form + $new_values = $affected_field ? explode('|', substr($affected_field, 1, -1)) : Array (); + + $records_to_add = array_diff($new_values, $old_values); + $records_to_delete = array_diff($old_values, $new_values); + + if ($records_to_delete) { + $where_clause = Array ( + $foreign_key . ' = ' . $main_object->GetID(), + $sub_prefix_field . ' IN (' . implode(',', $records_to_delete) . ')', + ); + $sql = 'SELECT ' . $object->IDField . ' + FROM ' . $sub_table . ' + WHERE (' . implode(') AND (', $where_clause) . ')'; + $delete_ids = $this->Conn->GetCol($sql); + + foreach ($delete_ids as $delete_id) { + $object->Delete($delete_id); + } + } + + if ($records_to_add) { + $main_id = $main_object->GetID(); + foreach ($records_to_add as $add_id) { + $object->Clear(); + $object->SetDBField($foreign_key, $main_id); + $object->SetDBField($sub_prefix_field, $add_id); + $object->Create(); + + if ($object->IsTempTable()) { + $object->setTempID(); + } + } + } + } } ?> \ No newline at end of file