/** * Method used to update the values stored in the database. * * @return integer 1 if the update worked properly, any other value otherwise */ public static function updateValues() { $prj_id = Auth::getCurrentProject(); $issue_id = $_POST['issue_id']; $old_values = self::getValuesByIssue($prj_id, $issue_id); if (isset($_POST['custom_fields']) && count($_POST['custom_fields']) > 0) { $custom_fields = $_POST['custom_fields']; // get the types for all of the custom fields being submitted $cf = array_keys($custom_fields); $cf_list = DB_Helper::buildList($cf); $stmt = "SELECT\n fld_id,\n fld_type\n FROM\n {{%custom_field}}\n WHERE\n fld_id IN ({$cf_list})"; $field_types = DB_Helper::getInstance()->getPair($stmt, $cf); // get the titles for all of the custom fields being submitted $stmt = "SELECT\n fld_id,\n fld_title\n FROM\n {{%custom_field}}\n WHERE\n fld_id IN ({$cf_list})"; $field_titles = DB_Helper::getInstance()->getPair($stmt, $cf); $updated_fields = array(); foreach ($custom_fields as $fld_id => $value) { // security check $sql = 'SELECT fld_min_role FROM {{%custom_field}} WHERE fld_id = ?'; $min_role = DB_Helper::getInstance()->getOne($sql, array($fld_id)); if ($min_role > Auth::getCurrentRole()) { continue; } $option_types = array('multiple', 'combo', 'checkbox'); if (!in_array($field_types[$fld_id], $option_types)) { // check if this is a date field $fld_db_name = self::getDBValueFieldNameByType($field_types[$fld_id]); // first check if there is actually a record for this field for the issue $stmt = "SELECT\n icf_id,\n {$fld_db_name} as value\n FROM\n {{%issue_custom_field}}\n WHERE\n icf_iss_id=? AND\n icf_fld_id=?"; try { $res = DB_Helper::getInstance()->getRow($stmt, array($issue_id, $fld_id)); } catch (DbException $e) { return -1; } $icf_id = $res['icf_id']; $old_value = $res['value']; if ($old_value == $value) { continue; } if (empty($icf_id)) { // record doesn't exist, insert new record $stmt = "INSERT INTO\n {{%issue_custom_field}}\n (\n icf_iss_id,\n icf_fld_id,\n {$fld_db_name}\n ) VALUES (\n ?, ?, ?\n )"; $params = array($issue_id, $fld_id, $value); try { DB_Helper::getInstance()->query($stmt, $params); } catch (DbException $e) { return -1; } } else { // record exists, update it $stmt = "UPDATE\n {{%issue_custom_field}}\n SET\n {$fld_db_name}=?\n WHERE\n icf_id=?"; $params = array($value, $icf_id); try { DB_Helper::getInstance()->query($stmt, $params); } catch (DbException $e) { return -1; } } if ($field_types[$fld_id] == 'textarea') { $updated_fields[$field_titles[$fld_id]] = ''; } else { $updated_fields[$field_titles[$fld_id]] = History::formatChanges($old_value, $value); } } else { $old_value = self::getDisplayValue($issue_id, $fld_id, true); if (!is_array($old_value)) { $old_value = array($old_value); } if (!is_array($value)) { $value = array($value); } if (count(array_diff($old_value, $value)) > 0 || count(array_diff($value, $old_value)) > 0) { $old_display_value = self::getDisplayValue($issue_id, $fld_id); // need to remove all associated options from issue_custom_field and then // add the selected options coming from the form self::removeIssueAssociation($fld_id, $issue_id); if (@count($value) > 0) { self::associateIssue($issue_id, $fld_id, $value); } $new_display_value = self::getDisplayValue($issue_id, $fld_id); $updated_fields[$field_titles[$fld_id]] = History::formatChanges($old_display_value, $new_display_value); } } } Workflow::handleCustomFieldsUpdated($prj_id, $issue_id, $old_values, self::getValuesByIssue($prj_id, $issue_id)); Issue::markAsUpdated($issue_id); // need to save a history entry for this if (count($updated_fields) > 0) { // log the changes $changes = ''; $i = 0; foreach ($updated_fields as $key => $value) { if ($i > 0) { $changes .= '; '; } if (!empty($value)) { $changes .= "{$key}: {$value}"; } else { $changes .= "{$key}"; } $i++; } $usr_id = Auth::getUserID(); History::add($issue_id, $usr_id, 'custom_field_updated', 'Custom field updated ({changes}) by {user}', array('changes' => $changes, 'user' => User::getFullName($usr_id))); } } return 1; }
/** * Sets the assignees for the issue * * @param integer $issue_id * @param array $assignees * @return int 1 if success, -1 if error, 0 if no change was needed. */ public static function setAssignees($issue_id, $assignees) { if (!is_array($assignees)) { $assignees = array(); } // see if there is anything to change $old_assignees = self::getAssignedUserIDs($issue_id); if (count(array_diff($old_assignees, $assignees)) == 0 && count(array_diff($assignees, $old_assignees)) == 0) { return 0; } $old_assignee_names = self::getAssignedUsers($issue_id); Workflow::handleAssignmentChange(self::getProjectID($issue_id), $issue_id, Auth::getUserID(), self::getDetails($issue_id), $assignees, true); // clear up the assignments for this issue, and then assign it to the current user self::deleteUserAssociations($issue_id); $assignee_names = array(); foreach ($assignees as $assignee) { $res = self::addUserAssociation(Auth::getUserID(), $issue_id, $assignee, false); if ($res == -1) { return -1; } $assignee_names[] = User::getFullName($assignee); Notification::subscribeUser(Auth::getUserID(), $issue_id, $assignee, Notification::getDefaultActions($issue_id, User::getEmail($assignee), 'set_assignees'), false); } Notification::notifyNewAssignment($assignees, $issue_id); $usr_id = Auth::getUserID(); History::add($issue_id, $usr_id, 'user_associated', 'Issue assignment to changed ({changes}) by {user}', array('changes' => History::formatChanges(implode(', ', $old_assignee_names), implode(', ', $assignee_names)), 'user' => User::getFullName($usr_id))); return 1; }
/** * Method used to update the values stored in the database. * * @param $issue_id * @param $custom_fields * @return array|int -1 if there is an error, otherwise an array of the updated fields */ public static function updateValues($issue_id, $custom_fields) { $prj_id = Auth::getCurrentProject(); $old_values = self::getValuesByIssue($prj_id, $issue_id); if (count($custom_fields) > 0) { // get the types for all of the custom fields being submitted $cf = array_keys($custom_fields); $cf_list = DB_Helper::buildList($cf); $stmt = "SELECT\n fld_id,\n fld_type\n FROM\n {{%custom_field}}\n WHERE\n fld_id IN ({$cf_list})"; $field_types = DB_Helper::getInstance()->getPair($stmt, $cf); // get the titles for all of the custom fields being submitted $stmt = "SELECT\n fld_id,\n fld_title\n FROM\n {{%custom_field}}\n WHERE\n fld_id IN ({$cf_list})"; $field_titles = DB_Helper::getInstance()->getPair($stmt, $cf); $updated_fields = array(); foreach ($custom_fields as $fld_id => $value) { // security check $sql = 'SELECT fld_min_role FROM {{%custom_field}} WHERE fld_id = ?'; $min_role = DB_Helper::getInstance()->getOne($sql, array($fld_id)); if ($min_role > Auth::getCurrentRole()) { continue; } $updated_fields[$fld_id] = array('title' => $field_titles[$fld_id], 'type' => $field_types[$fld_id], 'min_role' => $min_role, 'changes' => '', 'old_display' => '', 'new_display' => ''); if (!in_array($field_types[$fld_id], self::$option_types)) { // check if this is a date field $fld_db_name = self::getDBValueFieldNameByType($field_types[$fld_id]); // first check if there is actually a record for this field for the issue $stmt = "SELECT\n icf_id,\n {$fld_db_name} as value\n FROM\n {{%issue_custom_field}}\n WHERE\n icf_iss_id=? AND\n icf_fld_id=?"; try { $res = DB_Helper::getInstance()->getRow($stmt, array($issue_id, $fld_id)); } catch (DbException $e) { return -1; } $icf_id = $res['icf_id']; $old_value = $res['value']; if ($old_value == $value) { unset($updated_fields[$fld_id]); continue; } if (empty($icf_id)) { // record doesn't exist, insert new record $stmt = "INSERT INTO\n {{%issue_custom_field}}\n (\n icf_iss_id,\n icf_fld_id,\n {$fld_db_name}\n ) VALUES (\n ?, ?, ?\n )"; $params = array($issue_id, $fld_id, $value); try { DB_Helper::getInstance()->query($stmt, $params); } catch (DbException $e) { return -1; } } else { // record exists, update it $stmt = "UPDATE\n {{%issue_custom_field}}\n SET\n {$fld_db_name}=?\n WHERE\n icf_id=?"; $params = array($value, $icf_id); try { DB_Helper::getInstance()->query($stmt, $params); } catch (DbException $e) { return -1; } } $updated_fields[$fld_id]['old_display'] = $old_value; $updated_fields[$fld_id]['new_display'] = $value; if ($field_types[$fld_id] == 'textarea') { $updated_fields[$fld_id]['changes'] = ''; } else { $updated_fields[$fld_id]['changes'] = History::formatChanges($old_value, $value); } } else { $old_value = self::getDisplayValue($issue_id, $fld_id, true); // remove dummy value from checkboxes. This dummy value is required so all real values can be unchecked. if ($field_types[$fld_id] == 'checkbox') { $value = array_filter($value); } if (!is_array($old_value)) { $old_value = array($old_value); } if (!is_array($value)) { $value = array($value); } if (count(array_diff($old_value, $value)) > 0 || count(array_diff($value, $old_value)) > 0) { $old_display_value = self::getDisplayValue($issue_id, $fld_id); // need to remove all associated options from issue_custom_field and then // add the selected options coming from the form self::removeIssueAssociation($fld_id, $issue_id); if (@count($value) > 0) { self::associateIssue($issue_id, $fld_id, $value); } $new_display_value = self::getDisplayValue($issue_id, $fld_id); $updated_fields[$fld_id]['changes'] = History::formatChanges($old_display_value, $new_display_value); $updated_fields[$fld_id]['old_display'] = $old_display_value; $updated_fields[$fld_id]['new_display'] = $new_display_value; } else { unset($updated_fields[$fld_id]); } } } Workflow::handleCustomFieldsUpdated($prj_id, $issue_id, $old_values, self::getValuesByIssue($prj_id, $issue_id), $updated_fields); Issue::markAsUpdated($issue_id); if (count($updated_fields) > 0) { // log the changes $changes = array(); foreach ($updated_fields as $fld_id => $updated_field) { if (!isset($changes[$updated_field['min_role']])) { $changes[$updated_field['min_role']] = array(); } $title = $updated_field['title']; $value = $updated_field['changes']; if (!empty($value)) { $changes[$updated_field['min_role']][] = "{$title}: {$value}"; } else { $changes[$updated_field['min_role']][] = $title; } } $usr_id = Auth::getUserID(); $usr_full_name = User::getFullName($usr_id); foreach ($changes as $min_role => $role_changes) { History::add($issue_id, $usr_id, 'custom_field_updated', 'Custom field updated ({changes}) by {user}', array('changes' => implode('; ', $role_changes), 'user' => $usr_full_name), $min_role); } } return $updated_fields; } return array(); }
/** * Method used to update the values stored in the database. * * @access public * @return integer 1 if the update worked properly, any other value otherwise */ function updateValues() { global $HTTP_POST_VARS; $prj_id = Auth::getCurrentProject(); $issue_id = Misc::escapeInteger($HTTP_POST_VARS["issue_id"]); $old_values = Custom_Field::getValuesByIssue($prj_id, $issue_id); // get the types for all of the custom fields being submitted $stmt = "SELECT\n fld_id,\n fld_type\n FROM\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "custom_field\n WHERE\n fld_id IN (" . implode(", ", Misc::escapeInteger(@array_keys($HTTP_POST_VARS['custom_fields']))) . ")"; $field_types = $GLOBALS["db_api"]->dbh->getAssoc($stmt); // get the titles for all of the custom fields being submitted $stmt = "SELECT\n fld_id,\n fld_title\n FROM\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "custom_field\n WHERE\n fld_id IN (" . implode(", ", Misc::escapeInteger(@array_keys($HTTP_POST_VARS['custom_fields']))) . ")"; $field_titles = $GLOBALS["db_api"]->dbh->getAssoc($stmt); $updated_fields = array(); foreach ($HTTP_POST_VARS["custom_fields"] as $fld_id => $value) { $fld_id = Misc::escapeInteger($fld_id); // security check $sql = "SELECT\n fld_min_role\n FROM\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "custom_field\n WHERE\n fld_id = {$fld_id}"; $min_role = $GLOBALS["db_api"]->dbh->getOne($sql); if ($min_role > Auth::getCurrentRole()) { continue; } $option_types = array('multiple', 'combo'); if (!in_array($field_types[$fld_id], $option_types)) { // check if this is a date field if ($field_types[$fld_id] == 'date') { $value = $value['Year'] . "-" . $value['Month'] . "-" . $value['Day']; if ($value == '--') { $value = ''; } } // first check if there is actually a record for this field for the issue $stmt = "SELECT\n icf_id,\n icf_value\n FROM\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field\n WHERE\n icf_iss_id=" . $issue_id . " AND\n icf_fld_id={$fld_id}"; $res = $GLOBALS["db_api"]->dbh->getRow($stmt, DB_FETCHMODE_ASSOC); if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return -1; } $icf_id = $res['icf_id']; $icf_value = $res['icf_value']; if ($icf_value == $value) { continue; } if (empty($icf_id)) { // record doesn't exist, insert new record $stmt = "INSERT IGNORE INTO\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field\n (\n icf_iss_id,\n icf_fld_id,\n icf_value\n ) VALUES (\n " . $issue_id . ",\n {$fld_id},\n '" . Misc::escapeString($value) . "'\n )"; $res = $GLOBALS["db_api"]->dbh->query($stmt); if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return -1; } } else { // record exists, update it $stmt = "UPDATE\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field\n SET\n icf_value='" . Misc::escapeString($value) . "'\n WHERE\n icf_id={$icf_id}"; $res = $GLOBALS["db_api"]->dbh->query($stmt); if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return -1; } } if ($field_types[$fld_id] == 'textarea') { $updated_fields[$field_titles[$fld_id]] = ''; } else { $updated_fields[$field_titles[$fld_id]] = History::formatChanges($icf_value, $value); } } else { $old_value = Custom_Field::getDisplayValue($HTTP_POST_VARS['issue_id'], $fld_id, true); if (!is_array($old_value)) { $old_value = array($old_value); } if (!is_array($value)) { $value = array($value); } if (count(array_diff($old_value, $value)) > 0 || count(array_diff($value, $old_value)) > 0) { $old_display_value = Custom_Field::getDisplayValue($HTTP_POST_VARS['issue_id'], $fld_id); // need to remove all associated options from issue_custom_field and then // add the selected options coming from the form Custom_Field::removeIssueAssociation($fld_id, $HTTP_POST_VARS["issue_id"]); if (@count($value) > 0) { Custom_Field::associateIssue($HTTP_POST_VARS["issue_id"], $fld_id, $value); } $new_display_value = Custom_Field::getDisplayValue($HTTP_POST_VARS['issue_id'], $fld_id); $updated_fields[$field_titles[$fld_id]] = History::formatChanges($old_display_value, $new_display_value); } } } Workflow::handleCustomFieldsUpdated($prj_id, $issue_id, $old_values, Custom_Field::getValuesByIssue($prj_id, $issue_id)); Issue::markAsUpdated($HTTP_POST_VARS["issue_id"]); // need to save a history entry for this if (count($updated_fields) > 0) { // log the changes $changes = ''; $i = 0; foreach ($updated_fields as $key => $value) { if ($i > 0) { $changes .= "; "; } if (!empty($value)) { $changes .= "{$key}: {$value}"; } else { $changes .= "{$key}"; } $i++; } History::add($HTTP_POST_VARS["issue_id"], Auth::getUserID(), History::getTypeID('custom_field_updated'), "Custom field updated ({$changes}) by " . User::getFullName(Auth::getUserID())); } return 1; }
/** * Sets the group of the issue. * * @access public * @param integer $issue_id The ID of the issue * @param integer $group_id The ID of the group * @return integer 1 if successful, -1 or -2 otherwise */ function setGroup($issue_id, $group_id) { $issue_id = Misc::escapeInteger($issue_id); $group_id = Misc::escapeInteger($group_id); $current = Issue::getDetails($issue_id); if ($current["iss_grp_id"] == $group_id) { return -2; } $stmt = "UPDATE\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue\n SET\n iss_grp_id = {$group_id}\n WHERE\n iss_id = {$issue_id}"; $res = $GLOBALS["db_api"]->dbh->query($stmt); if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return -1; } $current_user = Auth::getUserID(); if (empty($current_user)) { $current_user = APP_SYSTEM_USER_ID; } History::add($issue_id, $current_user, History::getTypeID('group_changed'), "Group changed (" . History::formatChanges(Group::getName($current["iss_grp_id"]), Group::getName($group_id)) . ") by " . User::getFullName($current_user)); return 1; }