public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addForeignKeyColumn(self::UID, TBGUsersTable::getTable(), TBGUsersTable::ID); parent::_addForeignKeyColumn(self::TID, B2DB::getTable('TBGTeamsTable'), TBGTeamsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addForeignKeyColumn(self::EDITION, B2DB::getTable('TBGEditionsTable'), TBGEditionsTable::ID); parent::_addForeignKeyColumn(self::COMPONENT, B2DB::getTable('TBGComponentsTable'), TBGComponentsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public static function setUserViews($uid, $views) { B2DB::getTable('TBGUserDashboardViewsTable')->clearViews($uid); foreach ($views as $key => $view) { B2DB::getTable('TBGUserDashboardViewsTable')->addView($uid, $view); } }
/** * Return a custom data type option by value and key * * @param string|integer $value * @param string $key * * @return TBGCustomDatatypeOption */ public static function getByValueAndKey($value, $key) { $row = B2DB::getTable('TBGCustomFieldOptionsTable')->getByValueAndKey($value, $key); if ($row) { return TBGContext::factory()->TBGCustomDatatypeOption($row->get(TBGCustomFieldOptionsTable::ID), $row); } return null; }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addForeignKeyColumn(self::ISSUE_ID, TBGIssuesTable::getTable(), TBGIssuesTable::ID); parent::_addForeignKeyColumn(self::CUSTOMFIELDS_ID, B2DB::getTable('TBGCustomFieldsTable'), TBGCustomFieldsTable::ID); parent::_addText(self::OPTION_VALUE, false); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addInteger(self::TARGET_TYPE, 5); parent::_addForeignKeyColumn(self::EDITION_ID, B2DB::getTable('TBGEditionsTable'), TBGEditionsTable::ID); parent::_addForeignKeyColumn(self::UID, TBGUsersTable::getTable(), TBGUsersTable::ID); parent::_addForeignKeyColumn(self::TID, B2DB::getTable('TBGTeamsTable'), TBGTeamsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addVarchar(self::VALUE, 200); parent::_addVarchar(self::OPERATOR, 40); parent::_addVarchar(self::FILTER_KEY, 100); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); parent::_addForeignKeyColumn(self::SEARCH_ID, B2DB::getTable('TBGSavedSearchesTable'), TBGSavedSearchesTable::ID); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addBoolean(self::CONFIRMED); parent::_addForeignKeyColumn(self::COMPONENT, B2DB::getTable('TBGComponentsTable'), TBGComponentsTable::ID); parent::_addForeignKeyColumn(self::ISSUE, TBGIssuesTable::getTable(), TBGIssuesTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); parent::_addForeignKeyColumn(self::STATUS, TBGListTypesTable::getTable(), TBGListTypesTable::ID); }
protected function _getColumnProperty($column_name) { if (!($property_name = B2DB::getCachedColumnClassProperty($column_name, get_class($this)))) { $property = explode('.', $column_name); $property_name = "_" . strtolower($property[1]); B2DB::addCachedColumnClassProperty($column_name, get_class($this), $property_name); } return $property_name; }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addVarchar(self::MODULE_NAME, 50); parent::_addBoolean(self::ALLOWED); parent::_addForeignKeyColumn(self::UID, TBGUsersTable::getTable(), TBGUsersTable::ID); parent::_addForeignKeyColumn(self::GID, TBGGroupsTable::getTable(), TBGGroupsTable::ID); parent::_addForeignKeyColumn(self::TID, B2DB::getTable('TBGTeamsTable'), TBGTeamsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function rollback() { if ($this->state == self::DB_TRANSACTION_STARTED) { if (B2DB::getDBLink()->rollback()) { $this->state = self::DB_TRANSACTION_ROLLEDBACK; B2DB::setTransaction(false); } else { throw new B2DBException('Error rolling back transaction: ' . B2DB::getDBLink()->error); } } else { throw new B2DBException('There is no active transaction'); } }
public function _preDelete() { $crit = new B2DBCriteria(); $crit->addWhere(TBGIssueAffectsComponentTable::COMPONENT, $this->getID()); B2DB::getTable('TBGIssueAffectsComponentTable')->doDelete($crit); $crit = new B2DBCriteria(); $crit->addWhere(TBGEditionComponentsTable::COMPONENT, $this->getID()); B2DB::getTable('TBGEditionComponentsTable')->doDelete($crit); $crit = new B2DBCriteria(); $crit->addWhere(TBGComponentAssigneesTable::COMPONENT_ID, $this->getID()); $crit->addWhere(TBGComponentAssigneesTable::SCOPE, TBGContext::getScope()->getID()); B2DB::getTable('TBGComponentAssigneesTable')->doDelete($crit); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addVarchar(self::MODULE_NAME, 50); parent::_addInteger(self::NOTIFY_TYPE, 5); parent::_addInteger(self::TARGET_ID, 10); parent::_addVarchar(self::TITLE, 100); parent::_addText(self::CONTENTS, false); parent::_addInteger(self::STATUS, 5); parent::_addForeignKeyColumn(self::UID, TBGUsersTable::getTable(), TBGUsersTable::ID); parent::_addForeignKeyColumn(self::GID, TBGGroupsTable::getTable(), TBGGroupsTable::ID); parent::_addForeignKeyColumn(self::TID, B2DB::getTable('TBGTeamsTable'), TBGTeamsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addVarchar(self::NAME, 100); parent::_addInteger(self::VERSION_MAJOR, 3); parent::_addInteger(self::VERSION_MINOR, 3); parent::_addInteger(self::VERSION_REVISION, 5); parent::_addInteger(self::RELEASE_DATE, 10); parent::_addBoolean(self::RELEASED); parent::_addBoolean(self::LOCKED); parent::_addForeignKeyColumn(self::EDITION, B2DB::getTable('TBGEditionsTable'), TBGEditionsTable::ID); parent::_addForeignKeyColumn(self::PROJECT, TBGProjectsTable::getTable(), TBGProjectsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function getSpentTimesByDateAndIssueIDs($startdate, $enddate, $issue_ids) { $points_retarr = array(); $hours_retarr = array(); $sd = $startdate; while ($sd <= $enddate) { $points_retarr[date('md', $sd)] = array(); $hours_retarr[date('md', $sd)] = array(); $sd += 86400; } if (count($issue_ids)) { $crit = $this->getCriteria(); $crit->addWhere(self::EDITED_AT, $enddate, B2DBCriteria::DB_LESS_THAN_EQUAL); $crit->addWhere(self::ISSUE_ID, $issue_ids, B2DBCriteria::DB_IN); $crit->addOrderBy(self::EDITED_AT, B2DBCriteria::SORT_ASC); if ($res = $this->doSelect($crit)) { while ($row = $res->getNextRow()) { $date = date('md', $row->get(self::EDITED_AT) >= $startdate ? $row->get(self::EDITED_AT) : $startdate); foreach ($points_retarr as $key => &$details) { if ($key >= $date) { $details[$row->get(self::ISSUE_ID)] = $row->get(self::SPENT_POINTS); } } } } $crit = $this->getCriteria(); $crit->addWhere(self::EDITED_AT, $enddate, B2DBCriteria::DB_LESS_THAN_EQUAL); $crit->addJoin(B2DB::getTable('TBGIssueRelationsTable'), TBGIssueRelationsTable::PARENT_ID, self::ISSUE_ID); $crit->addWhere(TBGIssueRelationsTable::PARENT_ID, $issue_ids, B2DBCriteria::DB_IN); $crit->addOrderBy(self::EDITED_AT, B2DBCriteria::SORT_ASC); $res = $this->doSelect($crit); if ($res = $this->doSelect($crit)) { while ($row = $res->getNextRow()) { $date = date('md', $row->get(self::EDITED_AT) >= $startdate ? $row->get(self::EDITED_AT) : $startdate); foreach ($hours_retarr as $key => &$details) { if ($key >= $date) { $details[$row->get(self::ISSUE_ID)] = $row->get(self::SPENT_HOURS); } } } } } foreach ($points_retarr as $key => $vals) { $points_retarr[$key] = count($vals) ? array_sum($vals) : 0; } foreach ($hours_retarr as $key => $vals) { $hours_retarr[$key] = count($vals) ? array_sum($vals) : 0; } return array('points' => $points_retarr, 'hours' => $hours_retarr); }
public function createNew($key, $name, $value, $itemdata = null, $scope = null) { $scope = $scope === null ? TBGContext::getScope()->getID() : $scope; $trans = B2DB::startTransaction(); $crit = $this->getCriteria(); $crit->addWhere(self::CUSTOMFIELDS_KEY, $key); $crit->addSelectionColumn(self::SORT_ORDER, 'sortorder', B2DBCriteria::DB_MAX, '', '+1'); $row = $this->doSelectOne($crit, 'none'); $sort_order = (int) $row->get('sortorder'); $sort_order = $sort_order > 0 ? $sort_order : 1; $crit = $this->getCriteria(); $crit->addInsert(self::NAME, $name); $crit->addInsert(self::OPTION_VALUE, $value); $crit->addInsert(self::CUSTOMFIELDS_KEY, $key); $crit->addInsert(self::SORT_ORDER, $sort_order); if ($itemdata !== null) { $crit->addInsert(self::ITEMDATA, $itemdata); } $crit->addInsert(self::SCOPE, $scope); $trans->commitAndEnd(); return $this->doInsert($crit); }
public function addArticleHistory($article_name, $old_content, $new_content, $user_id, $reason = null) { $transaction = B2DB::startTransaction(); $crit = $this->getCriteria(); $crit->addInsert(self::ARTICLE_NAME, $article_name); $crit->addInsert(self::AUTHOR, $user_id); $revision_number = $this->_getNextRevisionNumberForArticle($article_name); $crit->addInsert(self::REVISION, $revision_number); if (!($revision_number == 1 && $old_content == $new_content)) { $crit->addInsert(self::OLD_CONTENT, $old_content); } else { $crit->addInsert(self::OLD_CONTENT, ''); } $crit->addInsert(self::NEW_CONTENT, $new_content); if ($reason !== null) { $crit->addInsert(self::REASON, $reason); } $crit->addInsert(self::SCOPE, TBGContext::getScope()->getID()); $crit->addInsert(self::DATE, time()); $res = $this->doInsert($crit); $transaction->commitAndEnd(); return $res->getInsertID(); }
public function __construct() { parent::__construct(self::B2DBNAME, self::ID); parent::_addVarchar(self::UNAME, 50); parent::_addVarchar(self::PASSWORD, 50); parent::_addVarchar(self::BUDDYNAME, 50); parent::_addVarchar(self::REALNAME, 100); parent::_addVarchar(self::EMAIL, 200); parent::_addForeignKeyColumn(self::USERSTATE, B2DB::getTable('TBGUserStateTable'), TBGUserStateTable::ID); parent::_addBoolean(self::CUSTOMSTATE); parent::_addVarchar(self::HOMEPAGE, 250, ''); parent::_addVarchar(self::LANGUAGE, 100, ''); parent::_addInteger(self::LASTSEEN, 10); parent::_addInteger(self::QUOTA); parent::_addBoolean(self::ACTIVATED); parent::_addBoolean(self::ENABLED); parent::_addBoolean(self::DELETED); parent::_addVarchar(self::AVATAR, 30, ''); parent::_addBoolean(self::USE_GRAVATAR, true); parent::_addBoolean(self::PRIVATE_EMAIL); parent::_addInteger(self::JOINED, 10); parent::_addForeignKeyColumn(self::GROUP_ID, TBGGroupsTable::getTable(), TBGGroupsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
public function getViews() { $crit = new B2DBCriteria(); $crit->addWhere(TBGArticleViewsTable::ARTICLE_ID, $this->getID()); return B2DB::getTable('TBGArticleViewsTable')->doCount($crit); }
/** * Add or delete an issue field option * * @param TBGRequest $request */ public function runConfigureIssuefieldsAction(TBGRequest $request) { $i18n = TBGContext::getI18n(); $this->forward403unless($this->access_level == TBGSettings::ACCESS_FULL); $types = TBGDatatype::getTypes(); switch ($request->getParameter('mode')) { case 'add': if ($request->getParameter('name')) { if (array_key_exists($request->getParameter('type'), $types)) { $type_name = $types[$request->getParameter('type')]; $item = new $type_name(); $item->setName($request->getParameter('name')); $item->setItemdata($request->getParameter('itemdata')); $item->save(); } else { $customtype = TBGCustomDatatype::getByKey($request->getParameter('type')); $item = $customtype->createNewOption($request->getParameter('name'), $request->getParameter('value'), $request->getParameter('itemdata')); } return $this->renderJSON(array('failed' => false, 'title' => TBGContext::getI18n()->__('The option was added'), 'content' => $this->getTemplateHTML('issuefield', array('item' => $item, 'access_level' => $this->access_level, 'type' => $request->getParameter('type'))))); } return $this->renderJSON(array('failed' => true, 'error' => TBGContext::getI18n()->__('Please provide a valid name'))); case 'edit': if ($request->getParameter('name')) { if (array_key_exists($request->getParameter('type'), $types)) { $labname = $types[$request->getParameter('type')]; $item = TBGContext::factory()->{$labname}($request->getParameter('id')); } else { $customtype = TBGCustomDatatype::getByKey($request->getParameter('type')); $item = TBGContext::factory()->TBGCustomDatatypeOption($request->getParameter('id')); } if ($item instanceof TBGDatatypeBase && $item->getItemtype() == $item->getType()) { $item->setName($request->getParameter('name')); $item->setItemdata($request->getParameter('itemdata')); if (!$item->isBuiltin()) { $item->setValue($request->getParameter('value')); } $item->save(); return $this->renderJSON(array('failed' => false, 'title' => TBGContext::getI18n()->__('The option was updated'))); } else { return $this->renderJSON(array('failed' => true, 'error' => TBGContext::getI18n()->__('Please provide a valid id'))); } } return $this->renderJSON(array('failed' => true, 'error' => TBGContext::getI18n()->__('Please provide a valid name'))); case 'delete': if ($request->hasParameter('id')) { if (array_key_exists($request->getParameter('type'), $types)) { $classname = 'TBG' . ucfirst($request->getParameter('type')); $item = TBGContext::factory()->{$classname}($request->getParameter('id'))->delete(); return $this->renderJSON(array('failed' => false, 'title' => $i18n->__('The option was deleted'))); } else { B2DB::getTable('TBGCustomFieldOptionsTable')->doDeleteById($request->getParameter('id')); return $this->renderJSON(array('failed' => false, 'title' => $i18n->__('The option was deleted'))); } } return $this->renderJSON(array('failed' => true, 'error' => $i18n->__('Invalid id or type'))); break; } }
/** * Return an array specifying visibility, requirement and choices for fields in issues * * @param integer $issue_type * @param boolean $reportable[optional] Whether to only include fields that can be reported * * @return array */ protected function _getFieldsArray($issue_type, $reportable = true) { $issue_type = is_object($issue_type) ? $issue_type->getID() : $issue_type; if (!isset($this->_fieldsarrays[$issue_type][(int) $reportable])) { $retval = array(); $res = B2DB::getTable('TBGIssueFieldsTable')->getBySchemeIDandIssuetypeID($this->getIssuetypeScheme()->getID(), $issue_type); if ($res) { $builtin_types = TBGDatatype::getAvailableFields(true); while ($row = $res->getNextRow()) { if (!$reportable || (bool) $row->get(TBGIssueFieldsTable::REPORTABLE) == true) { if ($reportable) { if (in_array($row->get(TBGIssueFieldsTable::FIELD_KEY), $builtin_types) && (!$this->fieldPermissionCheck($row->get(TBGIssueFieldsTable::FIELD_KEY), $reportable) && !($row->get(TBGIssueFieldsTable::REQUIRED) && $reportable))) { continue; } elseif (!in_array($row->get(TBGIssueFieldsTable::FIELD_KEY), $builtin_types) && (!$this->fieldPermissionCheck($row->get(TBGIssueFieldsTable::FIELD_KEY), $reportable, true) && !($row->get(TBGIssueFieldsTable::REQUIRED) && $reportable))) { continue; } } $field_key = $row->get(TBGIssueFieldsTable::FIELD_KEY); $retval[$field_key] = array('required' => (bool) $row->get(TBGIssueFieldsTable::REQUIRED), 'additional' => (bool) $row->get(TBGIssueFieldsTable::ADDITIONAL)); if (!in_array($field_key, $builtin_types)) { $retval[$field_key]['custom'] = true; $custom_type = TBGCustomDatatype::getByKey($field_key); if ($custom_type instanceof TBGCustomDatatype) { $retval[$field_key]['custom_type'] = $custom_type->getType(); } else { unset($retval[$field_key]); } } } } if (array_key_exists('user_pain', $retval)) { $retval['pain_bug_type'] = array('required' => $retval['user_pain']['required']); $retval['pain_likelihood'] = array('required' => $retval['user_pain']['required']); $retval['pain_effect'] = array('required' => $retval['user_pain']['required']); } if ($reportable) { foreach ($retval as $key => $return_details) { if ($key == 'edition' || array_key_exists('custom', $return_details) && $return_details['custom'] && in_array($return_details['custom_type'], array(TBGCustomDatatype::EDITIONS_LIST, TBGCustomDatatype::EDITIONS_CHOICE))) { $retval[$key]['values'] = array(); $retval[$key]['values'][''] = TBGContext::getI18n()->__('None'); foreach ($this->getEditions() as $edition) { $retval[$key]['values'][$edition->getID()] = $edition->getName(); } if (!$this->isEditionsEnabled() || empty($retval[$key]['values'])) { if (!$retval[$key]['required']) { unset($retval[$key]); } else { unset($retval[$key]['values']); } } if (array_key_exists($key, $retval) && array_key_exists('values', $retval[$key])) { asort($retval[$key]['values'], SORT_STRING); } } elseif ($key == 'status' || array_key_exists('custom', $return_details) && $return_details['custom'] && in_array($return_details['custom_type'], array(TBGCustomDatatype::EDITIONS_LIST, TBGCustomDatatype::STATUS_CHOICE))) { $retval[$key]['values'] = array(); foreach (TBGStatus::getAll() as $status) { $retval[$key]['values'][$status->getID()] = $status->getName(); } if (empty($retval[$key]['values'])) { if (!$retval[$key]['required']) { unset($retval[$key]); } else { unset($retval[$key]['values']); } } if (array_key_exists($key, $retval) && array_key_exists('values', $retval[$key])) { asort($retval[$key]['values'], SORT_STRING); } } elseif ($key == 'component' || array_key_exists('custom', $return_details) && $return_details['custom'] && in_array($return_details['custom_type'], array(TBGCustomDatatype::COMPONENTS_LIST, TBGCustomDatatype::COMPONENTS_CHOICE))) { $retval[$key]['values'] = array(); $retval[$key]['values'][''] = TBGContext::getI18n()->__('None'); foreach ($this->getComponents() as $component) { $retval[$key]['values'][$component->getID()] = $component->getName(); } if (!$this->isComponentsEnabled() || empty($retval[$key]['values'])) { if (!$retval[$key]['required']) { unset($retval[$key]); } else { unset($retval[$key]['values']); } } if (array_key_exists($key, $retval) && array_key_exists('values', $retval[$key])) { asort($retval[$key]['values'], SORT_STRING); } } elseif ($key == 'build' || array_key_exists('custom', $return_details) && $return_details['custom'] && in_array($return_details['custom_type'], array(TBGCustomDatatype::RELEASES_LIST, TBGCustomDatatype::RELEASES_CHOICE))) { $retval[$key]['values'] = array(); $retval[$key]['values'][''] = TBGContext::getI18n()->__('None'); foreach ($this->getBuilds() as $build) { $retval[$key]['values'][$build->getID()] = $build->getName() . ' (' . $build->getVersion() . ')'; } if (!$this->isBuildsEnabled() || empty($retval[$key]['values'])) { if (!$retval[$key]['required']) { unset($retval[$key]); } else { unset($retval[$key]['values']); } } } } } } $this->_fieldsarrays[$issue_type][(int) $reportable] = $retval; } return $this->_fieldsarrays[$issue_type][(int) $reportable]; }
/** * Return an instance of TBGModulesTable * * @return TBGModulesTable */ public static function getTable() { return B2DB::getTable('TBGModulesTable'); }
/** * Return an instance of this table * * @return TBGCustomFieldsTable */ public static function getTable() { return B2DB::getTable('TBGCustomFieldsTable'); }
/** * Return an instance of this table * * @return TBGArticleLinksTable */ public static function getTable() { return B2DB::getTable('TBGArticleLinksTable'); }
public static function findClients($details) { $crit = new B2DBCriteria(); $crit->addWhere(TBGClientsTable::NAME, "%{$details}%", B2DBCriteria::DB_LIKE); $clients = array(); if ($res = B2DB::getTable('TBGClientsTable')->doSelect($crit)) { while ($row = $res->getNextRow()) { $clients[$row->get(TBGClientsTable::ID)] = TBGContext::factory()->TBGClient($row->get(TBGClientsTable::ID), $row); } } return $clients; }
/** * Prepare the statement */ protected function _prepare() { try { if (!B2DB::getDBLink() instanceof PDO) { throw new B2DBException('Connection not up, can\'t prepare the statement'); } if ($this->crit instanceof B2DBCriteria) { $this->statement = B2DB::getDBLink()->prepare($this->crit->getSQL()); } else { $this->statement = B2DB::getDBLink()->prepare($this->custom_sql); } } catch (Exception $e) { throw $e; } }
public function getBillboardPosts($target_board = 0, $posts = 5) { $crit = new B2DBCriteria(); $crit->addWhere(TBGBillboardPostsTable::SCOPE, TBGContext::getScope()->getID()); $crit->addWhere(TBGBillboardPostsTable::IS_DELETED, 0); $crit->setLimit($posts); $crit->addOrderBy(TBGBillboardPostsTable::DATE, 'desc'); if (is_array($target_board)) { $crit->addWhere(TBGBillboardPostsTable::TARGET_BOARD, $target_board, B2DBCriteria::DB_IN); } else { $crit->addWhere(TBGBillboardPostsTable::TARGET_BOARD, $target_board); } $posts = array(); $res = B2DB::getTable('TBGBillboardPostsTable')->doSelect($crit); while ($row = $res->getNextRow()) { $posts[] = new PublishBillboardPost($row); } return $posts; }
/** * Return an instance of this table * * @return TBGIssueFilesTable */ public static function getTable() { return B2DB::getTable('TBGIssueFilesTable'); }
/** * Return an instance of this table * * @return TBGSettingsTable */ public static function getTable() { return B2DB::getTable('TBGSettingsTable'); }
/** * Get all the projects a team is associated with * * @return array */ public function getAssociatedProjects() { if ($this->_associated_projects === null) { $this->_associated_projects = array(); $projects = B2DB::getTable('TBGProjectAssigneesTable')->getProjectsByTeamID($this->getID()); $edition_projects = B2DB::getTable('TBGEditionAssigneesTable')->getProjectsByTeamID($this->getID()); $component_projects = B2DB::getTable('TBGComponentAssigneesTable')->getProjectsByTeamID($this->getID()); $project_ids = array_merge(array_keys($projects), array_keys($edition_projects), array_keys($component_projects)); foreach ($project_ids as $project_id) { $this->_associated_projects[$project_id] = TBGContext::factory()->TBGProject($project_id); } } return $this->_associated_projects; }