protected function _initialize() { parent::_setup(self::B2DBNAME, self::ID); parent::_addForeignKeyColumn(self::COMPONENT_ID, TBGComponentsTable::getTable()); parent::_addForeignKeyColumn(self::USER_ID, TBGUsersTable::getTable()); parent::_addForeignKeyColumn(self::ROLE_ID, TBGListTypesTable::getTable()); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable()); }
</span> <?php break; case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: $object = null; $value = null; try { switch ($info['type']) { case TBGCustomDatatype::EDITIONS_CHOICE: $object = TBGEditionsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $object = TBGComponentsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::RELEASES_CHOICE: $object = TBGBuildsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::MILESTONE_CHOICE: $object = TBGMilestonesTable::getTable()->selectById($info['name']); break; } $value = is_object($object) ? $object->getName() : null; } catch (Exception $e) { } ?> <span id="<?php echo $field; ?>
public function findIssues($filters = array(), $results_per_page = 30, $offset = 0, $groupby = null, $grouporder = null, $sortfields = array(self::LAST_UPDATED => 'asc')) { $crit = $this->getCriteria(); $crit->addWhere(self::DELETED, false); $crit->addWhere(self::SCOPE, TBGContext::getScope()->getID()); if (count($filters) > 0) { $crit->addJoin(TBGIssueCustomFieldsTable::getTable(), TBGIssueCustomFieldsTable::ISSUE_ID, TBGIssuesTable::ID); $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $filter_keys = array_keys($filters); foreach ($filters as $filter) { self::parseFilter($crit, $filter, $filter_keys); } } $crit->addSelectionColumn(self::ID); $crit->setDistinct(); if ($offset != 0) { $crit->setOffset($offset); } $crit2 = clone $crit; $count = $this->doCount($crit2); if ($count > 0) { $crit3 = $this->getCriteria(); if ($results_per_page != 0) { $crit->setLimit($results_per_page); } if ($offset != 0) { $crit->setOffset($offset); } if ($groupby !== null) { $grouporder = $grouporder !== null ? $grouporder == 'asc' ? Criteria::SORT_ASC : Criteria::SORT_DESC : Criteria::SORT_ASC; switch ($groupby) { case 'category': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::CATEGORY); $crit->addSelectionColumn(TBGListTypesTable::NAME); $crit->addOrderBy(TBGListTypesTable::NAME, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::CATEGORY); $crit3->addOrderBy(TBGListTypesTable::NAME, $grouporder); break; case 'status': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::STATUS); $crit->addSelectionColumn(self::STATUS); $crit->addOrderBy(TBGListTypesTable::ORDER, Criteria::SORT_DESC); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::STATUS); $crit3->addOrderBy(TBGListTypesTable::ORDER, Criteria::SORT_DESC); break; case 'milestone': $crit->addSelectionColumn(self::MILESTONE); $crit->addSelectionColumn(self::PERCENT_COMPLETE); $crit->addOrderBy(self::MILESTONE, $grouporder); $crit->addOrderBy(self::PERCENT_COMPLETE, 'desc'); $crit3->addOrderBy(self::MILESTONE, $grouporder); $crit3->addOrderBy(self::PERCENT_COMPLETE, 'desc'); break; case 'assignee': $crit->addSelectionColumn(self::ASSIGNEE_TEAM); $crit->addSelectionColumn(self::ASSIGNEE_USER); $crit->addOrderBy(self::ASSIGNEE_TEAM); $crit->addOrderBy(self::ASSIGNEE_USER, $grouporder); $crit3->addOrderBy(self::ASSIGNEE_TEAM); $crit3->addOrderBy(self::ASSIGNEE_USER, $grouporder); break; case 'state': $crit->addSelectionColumn(self::STATE); $crit->addOrderBy(self::STATE, $grouporder); $crit3->addOrderBy(self::STATE, $grouporder); break; case 'severity': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::SEVERITY); $crit->addSelectionColumn(self::SEVERITY); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::SEVERITY); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'user_pain': $crit->addSelectionColumn(self::USER_PAIN); $crit->addOrderBy(self::USER_PAIN, $grouporder); $crit3->addOrderBy(self::USER_PAIN, $grouporder); break; case 'votes': $crit->addSelectionColumn(self::VOTES_TOTAL); $crit->addOrderBy(self::VOTES_TOTAL, $grouporder); $crit3->addOrderBy(self::VOTES_TOTAL, $grouporder); break; case 'resolution': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::RESOLUTION); $crit->addSelectionColumn(self::RESOLUTION); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::RESOLUTION); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'priority': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::PRIORITY); $crit->addSelectionColumn(self::PRIORITY); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::PRIORITY); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'issuetype': $crit->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit->addSelectionColumn(TBGIssueTypesTable::NAME); $crit->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); $crit3->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit3->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); break; case 'edition': $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit->addSelectionColumn(TBGEditionsTable::NAME); $crit->addOrderBy(TBGEditionsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit3->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit3->addOrderBy(TBGEditionsTable::NAME, $grouporder); break; case 'build': $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit->addSelectionColumn(TBGBuildsTable::NAME); $crit->addOrderBy(TBGBuildsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit3->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit3->addOrderBy(TBGBuildsTable::NAME, $grouporder); break; case 'component': $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit->addSelectionColumn(TBGComponentsTable::NAME); $crit->addOrderBy(TBGComponentsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit3->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit3->addOrderBy(TBGComponentsTable::NAME, $grouporder); break; } } foreach ($sortfields as $field => $sortorder) { $crit->addSelectionColumn($field); $crit->addOrderBy($field, $sortorder); } $res = $this->doSelect($crit, 'none'); $ids = array(); if ($res) { while ($row = $res->getNextRow()) { $ids[] = $row->get(self::ID); } $ids = array_reverse($ids); $crit3->addWhere(self::ID, $ids, Criteria::DB_IN); foreach ($sortfields as $field => $sortorder) { $crit3->addOrderBy($field, $sortorder); } $res = $this->doSelect($crit3); $rows = $res->getAllRows(); } else { $rows = array(); } unset($res); return array($rows, $count, $ids); } else { return array(null, 0, array()); } }
public function runFilterGetDynamicChoices(TBGRequest $request) { $subproject_ids = explode(',', $request['subprojects']); $existing_ids = $request['existing_ids']; $results = array(); $projects = $request['project_id'] != '' ? TBGProject::getAllByIDs(explode(',', $request['project_id'])) : TBGProject::getAll(); $items = array('build' => array(), 'edition' => array(), 'component' => array(), 'milestone' => array()); foreach ($projects as $project) { foreach ($project->getBuilds() as $build) { $items['build'][$build->getID()] = $build; } foreach ($project->getEditions() as $edition) { $items['edition'][$edition->getID()] = $edition; } foreach ($project->getComponents() as $component) { $items['component'][$component->getID()] = $component; } foreach ($project->getMilestones() as $milestone) { $items['milestone'][$milestone->getID()] = $milestone; } } $filters = array(); $filters['build'] = TBGSearchFilter::createFilter('build'); $filters['edition'] = TBGSearchFilter::createFilter('edition'); $filters['component'] = TBGSearchFilter::createFilter('component'); $filters['milestone'] = TBGSearchFilter::createFilter('milestone'); if (isset($existing_ids['build'])) { foreach (TBGBuildsTable::getTable()->getByIDs($existing_ids['build']) as $build) { $items['build'][$build->getID()] = $build; } $filters['build']->setValue(join(',', $existing_ids['build'])); } if (isset($existing_ids['edition'])) { foreach (TBGEditionsTable::getTable()->getByIDs($existing_ids['edition']) as $edition) { $items['edition'][$edition->getID()] = $edition; } $filters['edition']->setValue(join(',', $existing_ids['edition'])); } if (isset($existing_ids['component'])) { foreach (TBGComponentsTable::getTable()->getByIDs($existing_ids['component']) as $component) { $items['component'][$component->getID()] = $component; } $filters['component']->setValue(join(',', $existing_ids['component'])); } if (isset($existing_ids['milestone'])) { foreach (TBGMilestonesTable::getTable()->getByIDs($existing_ids['milestone']) as $milestone) { $items['milestone'][$milestone->getID()] = $milestone; } $filters['milestone']->setValue(join(',', $existing_ids['milestone'])); } foreach (array('build', 'edition', 'component', 'milestone') as $k) { $results[$k] = $this->getTemplateHTML('search/interactivefilterdynamicchoicelist', array('filter' => $filters[$k], 'items' => $items[$k])); } return $this->renderJSON(compact('results')); }
/** * Sets an issue field to a specified value * * @param TBGRequest $request */ public function runIssueSetField(TBGRequest $request) { if ($issue_id = $request['issue_id']) { try { $issue = TBGIssuesTable::getTable()->selectById($issue_id); } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderText('fail'); } } else { $this->getResponse()->setHttpStatus(400); return $this->renderText('no issue'); } TBGContext::loadLibrary('common'); if (!$issue instanceof TBGIssue) { return false; } switch ($request['field']) { case 'description': if (!$issue->canEditDescription()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setDescription($request->getRawParameter('value')); $issue->setDescriptionSyntax($request->getParameter('value_syntax')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isDescriptionChanged(), 'field' => array('id' => (int) ($issue->getDescription() != ''), 'name' => $issue->getParsedDescription(array('issue' => $issue))), 'description' => $issue->getParsedDescription(array('issue' => $issue)))); break; case 'reproduction_steps': if (!$issue->canEditReproductionSteps()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setReproductionSteps($request->getRawParameter('value')); $issue->setReproductionStepsSyntax($request->getParameter('value_syntax')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isReproductionStepsChanged(), 'field' => array('id' => (int) ($issue->getReproductionSteps() != ''), 'name' => $issue->getParsedReproductionSteps(array('issue' => $issue))), 'reproduction_steps' => $issue->getParsedReproductionSteps(array('issue' => $issue)))); break; case 'title': if (!$issue->canEditTitle()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request['value'] == '') { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You have to provide a title'))); } else { $issue->setTitle($request->getRawParameter('value')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isTitleChanged(), 'field' => array('id' => 1, 'name' => strip_tags($issue->getTitle())))); } break; case 'percent_complete': if (!$issue->canEditPercentage()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setPercentCompleted($request['percent']); return $this->renderJSON(array('issue_id' => $issue->getID(), 'field' => 'percent_complete', 'changed' => $issue->isPercentCompletedChanged(), 'percent' => $issue->getPercentCompleted())); break; case 'estimated_time': if (!$issue->canEditEstimatedTime()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if (!$issue->isUpdateable()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('This issue cannot be updated'))); } if ($request['estimated_time']) { $issue->setEstimatedTime($request['estimated_time']); } elseif ($request->hasParameter('value')) { $issue->setEstimatedTime($request['value']); } else { $issue->setEstimatedMonths($request['months']); $issue->setEstimatedWeeks($request['weeks']); $issue->setEstimatedDays($request['days']); $issue->setEstimatedHours($request['hours']); $issue->setEstimatedPoints($request['points']); } if ($request['do_save']) { $issue->save(); } return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isEstimatedTimeChanged(), 'field' => $issue->hasEstimatedTime() ? array('id' => 1, 'name' => TBGIssue::getFormattedTime($issue->getEstimatedTime())) : array('id' => 0), 'values' => $issue->getEstimatedTime())); break; case 'posted_by': case 'owned_by': case 'assigned_to': if ($request['field'] == 'posted_by' && !$issue->canEditPostedBy()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'owned_by' && !$issue->canEditOwner()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'assigned_to' && !$issue->canEditAssignee()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->hasParameter('value')) { if ($request->hasParameter('identifiable_type')) { if (in_array($request['identifiable_type'], array('team', 'user')) && $request['value'] != 0) { switch ($request['identifiable_type']) { case 'user': $identified = TBGContext::factory()->TBGUser($request['value']); break; case 'team': $identified = TBGContext::factory()->TBGTeam($request['value']); break; } if ($identified instanceof TBGUser || $identified instanceof TBGTeam) { if ((bool) $request->getParameter('teamup', false)) { $team = new TBGTeam(); $team->setName($identified->getBuddyname() . ' & ' . $this->getUser()->getBuddyname()); $team->setOndemand(true); $team->save(); $team->addMember($identified); $team->addMember($this->getUser()); $identified = $team; } if ($request['field'] == 'owned_by') { $issue->setOwner($identified); } elseif ($request['field'] == 'assigned_to') { $issue->setAssignee($identified); } } } else { if ($request['field'] == 'owned_by') { $issue->clearOwner(); } elseif ($request['field'] == 'assigned_to') { $issue->clearAssignee(); } } } elseif ($request['field'] == 'posted_by') { $identified = TBGContext::factory()->TBGUser($request['value']); if ($identified instanceof TBGUser) { $issue->setPostedBy($identified); } } if ($request['field'] == 'posted_by') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isPostedByChanged(), 'field' => array('id' => $issue->getPostedByID(), 'name' => $this->getComponentHTML('main/userdropdown', array('user' => $issue->getPostedBy()))))); } if ($request['field'] == 'owned_by') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isOwnerChanged(), 'field' => $issue->isOwned() ? array('id' => $issue->getOwner()->getID(), 'name' => $issue->getOwner() instanceof TBGUser ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getOwner())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getOwner()))) : array('id' => 0))); } if ($request['field'] == 'assigned_to') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isAssigneeChanged(), 'field' => $issue->isAssigned() ? array('id' => $issue->getAssignee()->getID(), 'name' => $issue->getAssignee() instanceof TBGUser ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getAssignee())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getAssignee()))) : array('id' => 0))); } } break; case 'spent_time': if (!$issue->canEditSpentTime()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request['spent_time'] != TBGContext::getI18n()->__('Enter time spent here') && $request['spent_time']) { $issue->addSpentTime($request['spent_time']); } elseif ($request->hasParameter('value')) { $issue->addSpentTime($request['value']); } else { $issue->addSpentMonths($request['months']); $issue->addSpentWeeks($request['weeks']); $issue->addSpentDays($request['days']); $issue->addSpentHours($request['hours']); $issue->addSpentPoints($request['points']); } return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isSpentTimeChanged(), 'field' => $issue->hasSpentTime() ? array('id' => 1, 'name' => TBGIssue::getFormattedTime($issue->getSpentTime())) : array('id' => 0), 'values' => $issue->getSpentTime())); break; case 'category': case 'resolution': case 'severity': case 'reproducability': case 'priority': case 'milestone': case 'issuetype': case 'status': case 'pain_bug_type': case 'pain_likelihood': case 'pain_effect': if ($request['field'] == 'category' && !$issue->canEditCategory()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'resolution' && !$issue->canEditResolution()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'severity' && !$issue->canEditSeverity()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'reproducability' && !$issue->canEditReproducability()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'priority' && !$issue->canEditPriority()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'milestone' && !$issue->canEditMilestone()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'issuetype' && !$issue->canEditIssuetype()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'status' && !$issue->canEditStatus()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif (in_array($request['field'], array('pain_bug_type', 'pain_likelihood', 'pain_effect')) && !$issue->canEditUserPain()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } try { $classname = null; $parameter_name = mb_strtolower($request['field']); $parameter_id_name = "{$parameter_name}_id"; $is_pain = in_array($parameter_name, array('pain_bug_type', 'pain_likelihood', 'pain_effect')); if ($is_pain) { switch ($parameter_name) { case 'pain_bug_type': $set_function_name = 'setPainBugType'; $is_changed_function_name = 'isPainBugTypeChanged'; $get_pain_type_label_function = 'getPainBugTypeLabel'; break; case 'pain_likelihood': $set_function_name = 'setPainLikelihood'; $is_changed_function_name = 'isPainLikelihoodChanged'; $get_pain_type_label_function = 'getPainLikelihoodLabel'; break; case 'pain_effect': $set_function_name = 'setPainEffect'; $is_changed_function_name = 'isPainEffectChanged'; $get_pain_type_label_function = 'getPainEffectLabel'; break; } } else { $classname = 'TBG' . ucfirst($parameter_name); $lab_function_name = $classname; $set_function_name = 'set' . ucfirst($parameter_name); $is_changed_function_name = 'is' . ucfirst($parameter_name) . 'Changed'; } if ($request->hasParameter($parameter_id_name)) { $parameter_id = $request->getParameter($parameter_id_name); if ($parameter_id !== 0) { $is_valid = $is_pain ? in_array($parameter_id, array_keys(TBGIssue::getPainTypesOrLabel($parameter_name))) : $parameter_id == 0 || ($parameter = TBGContext::factory()->{$lab_function_name}($parameter_id)) instanceof $classname; } if ($parameter_id == 0 || $parameter_id !== 0 && $is_valid) { if ($classname == 'TBGIssuetype') { $visible_fields = $issue->getIssuetype() instanceof TBGIssuetype ? $issue->getProject()->getVisibleFieldsArray($issue->getIssuetype()->getID()) : array(); } else { $visible_fields = null; } $issue->{$set_function_name}($parameter_id); if ($is_pain) { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } return $parameter_id == 0 ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => $parameter_id, 'name' => $issue->{$get_pain_type_label_function}()), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } else { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } if (isset($parameter)) { $name = $parameter->getName(); } else { $name = null; } $field = array('id' => $parameter_id, 'name' => $name); if ($classname == 'TBGIssuetype') { TBGContext::loadLibrary('ui'); $field['src'] = htmlspecialchars(TBGContext::getTBGPath() . 'iconsets/' . TBGSettings::getThemeName() . '/' . $issue->getIssuetype()->getIcon() . '_small.png'); } if ($parameter_id == 0) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))); } else { $options = array('issue_id' => $issue->getID(), 'changed' => true, 'visible_fields' => $visible_fields, 'field' => $field); if ($request['field'] == 'milestone') { $options['field']['url'] = $this->getRouting()->generate('project_milestone_details', array('project_key' => $issue->getProject()->getKey(), 'milestone_id' => $issue->getMilestone()->getID())); } if ($request['field'] == 'status') { $options['field']['color'] = $issue->getStatus()->getItemdata(); } return $this->renderJSON($options); } } } } } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => $e->getMessage())); } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field value specified'))); break; default: if ($customdatatype = TBGCustomDatatype::getByKey($request['field'])) { $key = $customdatatype->getKey(); $customdatatypeoption_value = $request->getParameter("{$key}_value"); if (!$customdatatype->hasCustomOptions()) { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::STATUS_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: case TBGCustomDatatype::USER_CHOICE: case TBGCustomDatatype::TEAM_CHOICE: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: $temp = TBGEditionsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $temp = TBGComponentsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::RELEASES_CHOICE: $temp = TBGBuildsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::MILESTONE_CHOICE: $temp = TBGMilestonesTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::STATUS_CHOICE: $temp = TBGStatus::getB2DBTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::USER_CHOICE: $temp = TBGUsersTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::TEAM_CHOICE: $temp = TBGTeamsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; } $finalvalue = $temp->getName(); $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } if ($customdatatype->getType() == TBGCustomDatatype::STATUS_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = '<div class="status_badge" style="background-color: ' . $temp->getColor() . ';"><span>' . $finalvalue . '</span></div>'; } elseif ($customdatatype->getType() == TBGCustomDatatype::USER_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = $this->getComponentHTML('main/userdropdown', array('user' => $temp)); } elseif ($customdatatype->getType() == TBGCustomDatatype::TEAM_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = $this->getComponentHTML('main/teamdropdown', array('team' => $temp)); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => $finalvalue))); break; case TBGCustomDatatype::INPUT_TEXTAREA_MAIN: case TBGCustomDatatype::INPUT_TEXTAREA_SMALL: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => tbg_parse_text($request->getRawParameter("{$key}_value"))))); break; case TBGCustomDatatype::DATE_PICKER: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => date('Y-m-d', (int) $request->getRawParameter("{$key}_value"))))); break; default: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => filter_var($customdatatypeoption_value, FILTER_VALIDATE_URL) !== false ? "<a href=\"{$customdatatypeoption_value}\">{$customdatatypeoption_value}</a>" : $customdatatypeoption_value))); break; } } $customdatatypeoption = $customdatatypeoption_value ? TBGCustomDatatypeOption::getB2DBTable()->selectById($customdatatypeoption_value) : null; if ($customdatatypeoption instanceof TBGCustomDatatypeOption) { $issue->setCustomField($key, $customdatatypeoption->getID()); } else { $issue->setCustomField($key, null); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return !$customdatatypeoption instanceof TBGCustomDatatypeOption ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $customdatatypeoption->getID(), 'name' => $customdatatypeoption->getName()))); } break; } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field specified (%field)', array('%field' => $request['field'])))); }
protected function _upgradeFrom3dot1() { // Add classpath for existing old tables used for upgrade TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'installation' . DS . 'classes' . DS . 'upgrade_3.1'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'mailing' . DS . 'classes' . DS . 'B2DB'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'mailing' . DS . 'classes'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'publish' . DS . 'classes' . DS . 'B2DB'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'publish' . DS . 'classes'); // Create new tables TBGDashboardViewsTable::getTable()->create(); TBGOpenIdAccountsTable::getTable()->create(); TBGProjectAssignedUsersTable::getTable()->create(); TBGProjectAssignedTeamsTable::getTable()->create(); TBGEditionAssignedUsersTable::getTable()->create(); TBGEditionAssignedTeamsTable::getTable()->create(); TBGComponentAssignedUsersTable::getTable()->create(); TBGComponentAssignedTeamsTable::getTable()->create(); TBGRolePermissionsTable::getTable()->create(); TBGUserScopesTable::getTable()->create(); // Upgrade existing tables TBGProjectsTable::getTable()->upgrade(TBGProjectsTable3dot1::getTable()); TBGUsersTable::getTable()->upgrade(TBGUsersTable3dot1::getTable()); TBGIssuesTable::getTable()->upgrade(TBGIssuesTable3dot1::getTable()); TBGIssueTypesTable::getTable()->upgrade(TBGIssueTypesTable3dot1::getTable()); TBGListTypesTable::getTable()->upgrade(TBGListTypesTable3dot1::getTable()); TBGEditionsTable::getTable()->upgrade(TBGEditionsTable3dot1::getTable()); TBGBuildsTable::getTable()->upgrade(TBGBuildsTable3dot1::getTable()); TBGCommentsTable::getTable()->upgrade(TBGCommentsTable3dot1::getTable()); TBGComponentsTable::getTable()->upgrade(TBGComponentsTable3dot1::getTable()); TBGCustomFieldsTable::getTable()->upgrade(TBGCustomFieldsTable3dot1::getTable()); TBGCustomFieldOptionsTable::getTable()->upgrade(TBGCustomFieldOptionsTable3dot1::getTable()); TBGIssueCustomFieldsTable::getTable()->upgrade(TBGIssueCustomFieldsTable3dot1::getTable()); // Create new module tables TBGIncomingEmailAccountTable::getTable()->create(); // Add new indexes TBGArticlesTable::getTable()->createIndexes(); TBGCommentsTable::getTable()->createIndexes(); TBGIssueAffectsBuildTable::getTable()->createIndexes(); TBGIssueAffectsComponentTable::getTable()->createIndexes(); TBGIssueAffectsEditionTable::getTable()->createIndexes(); TBGIssueFieldsTable::getTable()->createIndexes(); TBGIssueFilesTable::getTable()->createIndexes(); TBGIssuesTable::getTable()->createIndexes(); TBGIssuetypeSchemesTable::getTable()->createIndexes(); TBGPermissionsTable::getTable()->createIndexes(); TBGProjectsTable::getTable()->createIndexes(); TBGSettingsTable::getTable()->createIndexes(); TBGTeamMembersTable::getTable()->createIndexes(); TBGUserIssuesTable::getTable()->createIndexes(); TBGUsersTable::getTable()->createIndexes(); TBGUserScopesTable::getTable()->createIndexes(); if (TBGContext::getRequest()->getParameter('fix_my_timestamps', false)) { $this->_fixTimestamps(); } foreach (TBGScope::getAll() as $scope) { TBGRole::loadFixtures($scope); foreach (TBGDatatype::getTypes() as $type => $class) { TBGContext::setPermission('set_datatype_' . $type, 0, 'core', 0, 0, 0, true, $scope->getID()); } TBGContext::setPermission('page_confirm_scope_access', 0, 'core', 0, 0, 0, true, $scope->getID()); if (!TBGSettings::get(TBGSettings::SETTING_DEFAULT_WORKFLOW, 'core', $scope->getID())) { $workflow_id = TBGWorkflowsTable::getTable()->getFirstIdByScope($scope->getID()); if ($workflow_id) { TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_WORKFLOW, $workflow_id, 'core', $scope->getID()); } else { TBGWorkflow::loadFixtures($scope); } } if (!TBGSettings::get(TBGSettings::SETTING_DEFAULT_WORKFLOWSCHEME, 'core', $scope->getID())) { $workflow_scheme_id = TBGWorkflowSchemesTable::getTable()->getFirstIdByScope($scope->getID()); if ($workflow_scheme_id) { TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_WORKFLOWSCHEME, $workflow_scheme_id, 'core', $scope->getID()); } else { TBGWorkflowScheme::loadFixtures($scope); } } if (!TBGSettings::get(TBGSettings::SETTING_DEFAULT_ISSUETYPESCHEME, 'core', $scope->getID())) { $issuetype_scheme_id = TBGIssuetypeSchemesTable::getTable()->getFirstIdByScope($scope->getID()); if ($issuetype_scheme_id) { TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_ISSUETYPESCHEME, $issuetype_scheme_id, 'core', $scope->getID()); } else { TBGIssuetypeScheme::loadFixtures($scope); } } TBGSettings::saveSetting(TBGSettings::SETTING_FAVICON_ID, 0, 'core', $scope->getID()); TBGSettings::saveSetting(TBGSettings::SETTING_FAVICON_TYPE, 0, 'core', $scope->getID()); TBGSettings::saveSetting(TBGSettings::SETTING_HEADER_ICON_ID, 0, 'core', $scope->getID()); TBGSettings::saveSetting(TBGSettings::SETTING_HEADER_ICON_TYPE, 0, 'core', $scope->getID()); } $linkstable = TBGLinksTable::getTable(); $crit = $linkstable->getCriteria(); $crit->addUpdate(TBGLinksTable::URL, 'http://issues.thebuggenie.com'); $crit->addWhere(TBGLinksTable::URL, 'http://thebuggenie.com/thebuggenie'); $crit->addOr(TBGLinksTable::URL, 'http://www.thebuggenie.com/thebuggenie'); $linkstable->doUpdate($crit); $listtypestable = TBGListTypesTable::getTable(); $crit = $listtypestable->getCriteria(); $crit->addUpdate(TBGListTypesTable::ITEMTYPE, 'role'); $crit->addWhere(TBGListTypesTable::ITEMTYPE, 'projectrole'); $listtypestable->doUpdate($crit); $crit = $listtypestable->getCriteria(); $crit->addUpdate(TBGListTypesTable::ITEMTYPE, 'priority'); $crit->addWhere(TBGListTypesTable::ITEMTYPE, 'b2_prioritytypes'); $listtypestable->doUpdate($crit); TBGWorkflowTransitionsTable::getTable()->upgradeFrom3dot1(); TBGSettings::saveSetting(TBGSettings::SETTING_ICONSET, TBGSettings::get(TBGSettings::SETTING_THEME_NAME)); TBGContext::setPermission('readarticle', 0, 'publish', 0, 0, 0, true); foreach (TBGProject::getAll() as $project) { TBGDashboardViewsTable::getTable()->setDefaultViews($project->getID(), TBGDashboardViewsTable::TYPE_PROJECT); if (!$project->getKey()) { $project->setName($project->getName()); } } $this->upgrade_complete = true; }
protected function _saveCustomFieldValues() { foreach (TBGCustomDatatype::getAll() as $key => $customdatatype) { switch ($customdatatype->getType()) { case TBGCustomDatatype::INPUT_TEXT: case TBGCustomDatatype::INPUT_TEXTAREA_SMALL: case TBGCustomDatatype::INPUT_TEXTAREA_MAIN: case TBGCustomDatatype::DATE_PICKER: $option_id = $this->getCustomField($key); TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldValue($option_id, $customdatatype->getID(), $this->getID()); break; case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: case TBGCustomDatatype::STATUS_CHOICE: case TBGCustomDatatype::USER_CHOICE: case TBGCustomDatatype::TEAM_CHOICE: $option_object = null; try { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: $option_object = TBGEditionsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $option_object = TBGComponentsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::RELEASES_CHOICE: $option_object = TBGBuildsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::MILESTONE_CHOICE: $option_object = TBGMilestonesTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::STATUS_CHOICE: $option_object = TBGListTypesTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::USER_CHOICE: $option_object = TBGUsersTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::TEAM_CHOICE: $option_object = TBGTeamsTable::getTable()->selectById($this->getCustomField($key)); break; } } catch (Exception $e) { } $option_id = is_object($option_object) ? $option_object->getID() : null; TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldOption($option_id, $customdatatype->getID(), $this->getID()); break; default: $option_id = $this->getCustomField($key) instanceof TBGCustomDatatypeOption ? $this->getCustomField($key)->getID() : null; TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldOption($option_id, $customdatatype->getID(), $this->getID()); break; } } }
public function findIssues($filters = array(), $results_per_page = 30, $offset = 0, $groupby = null, $grouporder = null) { $crit = $this->getCriteria(); $crit->addWhere(self::DELETED, false); if (count($filters) > 0) { $crit->addJoin(TBGIssueCustomFieldsTable::getTable(), TBGIssueCustomFieldsTable::ISSUE_ID, TBGIssuesTable::ID); foreach ($filters as $filter => $filter_info) { if (array_key_exists('value', $filter_info) && in_array($filter_info['operator'], array('=', '!=', '<=', '>=', '<', '>'))) { if ($filter == 'text') { if ($filter_info['value'] != '') { $searchterm = strpos($filter_info['value'], '%') !== false ? $filter_info['value'] : "%{$filter_info['value']}%"; if ($filter_info['operator'] == '=') { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $searchterm, B2DBCriteria::DB_LIKE); } else { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $searchterm, B2DBCriteria::DB_NOT_LIKE); } $crit->addWhere($ctn); } } elseif (in_array($filter, self::getValidSearchFilters())) { $crit->addWhere($this->getB2DBName() . '.' . $filter, $filter_info['value'], $filter_info['operator']); } elseif (TBGCustomDatatype::doesKeyExist($filter)) { $customdatatype = TBGCustomDatatype::getByKey($filter); $ctn = $crit->returnCriterion(TBGIssueCustomFieldsTable::CUSTOMFIELDS_ID, $customdatatype->getID()); $ctn->addWhere(TBGIssueCustomFieldsTable::OPTION_VALUE, $filter_info['value'], $filter_info['operator']); $crit->addWhere($ctn); } } else { if (in_array($filter, self::getValidSearchFilters())) { $first_val = array_shift($filter_info); if ($filter == 'text') { $filter_info = $first_val; if ($filter_info['value'] != '') { $searchterm = strpos($filter_info['value'], '%') !== false ? $filter_info['value'] : "%{$filter_info['value']}%"; if ($filter_info['operator'] == '=') { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_LIKE); } else { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_NOT_LIKE); } $crit->addWhere($ctn); } } else { $ctn = $crit->returnCriterion($this->getB2DBName() . '.' . $filter, $first_val['value'], $first_val['operator']); if (count($filter_info) > 0) { foreach ($filter_info as $single_filter) { if (in_array($single_filter['operator'], array('=', '<=', '>=', '<', '>'))) { $ctn->addOr($this->getB2DBName() . '.' . $filter, $single_filter['value'], $single_filter['operator']); } elseif ($single_filter['operator'] == '!=') { $ctn->addWhere($this->getB2DBName() . '.' . $filter, $single_filter['value'], $single_filter['operator']); } } } $crit->addWhere($ctn); } } elseif (TBGCustomDatatype::doesKeyExist($filter)) { $customdatatype = TBGCustomDatatype::getByKey($filter); $first_val = array_shift($filter_info); $ctn = $crit->returnCriterion(TBGIssueCustomFieldsTable::CUSTOMFIELDS_ID, $customdatatype->getID()); $ctn->addWhere(TBGIssueCustomFieldsTable::OPTION_VALUE, $first_val['value'], $first_val['operator']); if (count($filter_info) > 0) { foreach ($filter_info as $single_filter) { if (in_array($single_filter['operator'], array('=', '!=', '<=', '>=', '<', '>'))) { $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $single_filter['value'], $single_filter['operator']); } } } $crit->addWhere($ctn); } } } } $crit->addSelectionColumn(self::ID); $crit->setDistinct(); if ($offset != 0) { $crit->setOffset($offset); } $crit2 = clone $crit; $count = $this->doCount($crit2); if ($count > 0) { if ($results_per_page != 0) { $crit->setLimit($results_per_page); } if ($offset != 0) { $crit->setOffset($offset); } if ($groupby !== null) { $grouporder = $grouporder !== null ? $grouporder == 'asc' ? B2DBCriteria::SORT_ASC : B2DBCriteria::SORT_DESC : B2DBCriteria::SORT_ASC; switch ($groupby) { case 'category': $crit->addSelectionColumn(TBGListTypesTable::NAME); $crit->addOrderBy(TBGListTypesTable::NAME, $grouporder); break; case 'status': $crit->addSelectionColumn(self::STATUS); $crit->addOrderBy(self::STATUS, $grouporder); break; case 'milestone': $crit->addSelectionColumn(self::MILESTONE); $crit->addSelectionColumn(self::PERCENT_COMPLETE); $crit->addOrderBy(self::MILESTONE, $grouporder); $crit->addOrderBy(self::PERCENT_COMPLETE, 'desc'); break; case 'assignee': $crit->addSelectionColumn(self::ASSIGNED_TYPE); $crit->addSelectionColumn(self::ASSIGNED_TO); $crit->addOrderBy(self::ASSIGNED_TYPE); $crit->addOrderBy(self::ASSIGNED_TO, $grouporder); break; case 'state': $crit->addSelectionColumn(self::STATE); $crit->addOrderBy(self::STATE, $grouporder); break; case 'severity': $crit->addSelectionColumn(self::SEVERITY); $crit->addOrderBy(self::SEVERITY, $grouporder); break; case 'user_pain': $crit->addSelectionColumn(self::USER_PAIN); $crit->addOrderBy(self::USER_PAIN, $grouporder); break; case 'votes': $crit->addSelectionColumn(self::VOTES_TOTAL); $crit->addOrderBy(self::VOTES_TOTAL, $grouporder); break; case 'resolution': $crit->addSelectionColumn(self::RESOLUTION); $crit->addOrderBy(self::RESOLUTION, $grouporder); break; case 'priority': $crit->addSelectionColumn(self::PRIORITY); $crit->addOrderBy(self::PRIORITY, $grouporder); break; case 'issuetype': $crit->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit->addSelectionColumn(TBGIssueTypesTable::NAME); $crit->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); break; case 'edition': $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit->addSelectionColumn(TBGEditionsTable::NAME); $crit->addOrderBy(TBGEditionsTable::NAME, $grouporder); break; case 'build': $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit->addSelectionColumn(TBGBuildsTable::NAME); $crit->addOrderBy(TBGBuildsTable::NAME, $grouporder); break; case 'component': $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit->addSelectionColumn(TBGComponentsTable::NAME); $crit->addOrderBy(TBGComponentsTable::NAME, $grouporder); break; } } $crit->addSelectionColumn(self::LAST_UPDATED); $crit->addOrderBy(self::LAST_UPDATED, 'asc'); $res = $this->doSelect($crit, 'none'); $ids = array(); while ($row = $res->getNextRow()) { $ids[] = $row->get(self::ID); } $ids = array_reverse($ids); $crit2 = $this->getCriteria(); $crit2->addWhere(self::ID, $ids, B2DBCriteria::DB_IN); $crit2->addOrderBy(self::ID, $ids); $res = $this->doSelect($crit2); return array($res, $count); } else { return array(null, 0); } }