2011-02-21 03:41:23 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
abstract class PhabricatorProjectController extends PhabricatorController {
|
|
|
|
|
2015-02-23 20:27:19 +01:00
|
|
|
private $project;
|
|
|
|
|
|
|
|
protected function setProject(PhabricatorProject $project) {
|
|
|
|
$this->project = $project;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getProject() {
|
|
|
|
return $this->project;
|
|
|
|
}
|
|
|
|
|
2015-12-27 11:04:37 +01:00
|
|
|
protected function loadProject() {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
$request = $this->getRequest();
|
|
|
|
|
|
|
|
$id = $request->getURIData('id');
|
|
|
|
$slug = $request->getURIData('slug');
|
|
|
|
|
|
|
|
if ($slug) {
|
|
|
|
$normal_slug = PhabricatorSlug::normalizeProjectSlug($slug);
|
|
|
|
$is_abnormal = ($slug !== $normal_slug);
|
|
|
|
$normal_uri = "/tag/{$normal_slug}/";
|
|
|
|
} else {
|
|
|
|
$is_abnormal = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$query = id(new PhabricatorProjectQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->needMembers(true)
|
|
|
|
->needWatchers(true)
|
|
|
|
->needImages(true)
|
|
|
|
->needSlugs(true);
|
|
|
|
|
|
|
|
if ($slug) {
|
|
|
|
$query->withSlugs(array($slug));
|
|
|
|
} else {
|
|
|
|
$query->withIDs(array($id));
|
|
|
|
}
|
|
|
|
|
|
|
|
$policy_exception = null;
|
|
|
|
try {
|
|
|
|
$project = $query->executeOne();
|
|
|
|
} catch (PhabricatorPolicyException $ex) {
|
|
|
|
$policy_exception = $ex;
|
|
|
|
$project = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$project) {
|
|
|
|
// This project legitimately does not exist, so just 404 the user.
|
|
|
|
if (!$policy_exception) {
|
|
|
|
return new Aphront404Response();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Here, the project exists but the user can't see it. If they are
|
|
|
|
// using a non-canonical slug to view the project, redirect to the
|
|
|
|
// canonical slug. If they're already using the canonical slug, rethrow
|
|
|
|
// the exception to give them the policy error.
|
|
|
|
if ($is_abnormal) {
|
|
|
|
return id(new AphrontRedirectResponse())->setURI($normal_uri);
|
|
|
|
} else {
|
|
|
|
throw $policy_exception;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// The user can view the project, but is using a noncanonical slug.
|
|
|
|
// Redirect to the canonical slug.
|
|
|
|
$primary_slug = $project->getPrimarySlug();
|
|
|
|
if ($slug && ($slug !== $primary_slug)) {
|
|
|
|
$primary_uri = "/tag/{$primary_slug}/";
|
|
|
|
return id(new AphrontRedirectResponse())->setURI($primary_uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->setProject($project);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-01-12 19:04:01 +01:00
|
|
|
public function buildApplicationMenu() {
|
|
|
|
return $this->buildSideNavView(true)->getMenu();
|
|
|
|
}
|
|
|
|
|
2013-07-22 17:34:35 +02:00
|
|
|
public function buildSideNavView($for_app = false) {
|
2015-02-23 20:27:19 +01:00
|
|
|
$project = $this->getProject();
|
2013-02-13 18:22:14 +01:00
|
|
|
|
2016-01-12 19:27:39 +01:00
|
|
|
|
|
|
|
|
2013-02-13 18:22:14 +01:00
|
|
|
$nav = new AphrontSideNavFilterView();
|
2013-07-22 17:34:35 +02:00
|
|
|
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
|
2013-02-13 18:22:14 +01:00
|
|
|
|
2015-02-23 20:27:19 +01:00
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
2015-02-23 21:45:59 +01:00
|
|
|
$id = null;
|
2013-02-13 18:22:14 +01:00
|
|
|
if ($for_app) {
|
2015-02-23 20:27:19 +01:00
|
|
|
if ($project) {
|
|
|
|
$id = $project->getID();
|
2015-01-12 19:04:01 +01:00
|
|
|
$nav->addFilter("profile/{$id}/", pht('Profile'));
|
|
|
|
$nav->addFilter("board/{$id}/", pht('Workboard'));
|
|
|
|
$nav->addFilter("members/{$id}/", pht('Members'));
|
|
|
|
$nav->addFilter("feed/{$id}/", pht('Feed'));
|
|
|
|
}
|
2013-07-22 17:34:35 +02:00
|
|
|
$nav->addFilter('create', pht('Create Project'));
|
2013-02-13 18:22:14 +01:00
|
|
|
}
|
|
|
|
|
2015-01-12 19:04:01 +01:00
|
|
|
if (!$id) {
|
|
|
|
id(new PhabricatorProjectSearchEngine())
|
2015-01-19 19:14:27 +01:00
|
|
|
->setViewer($viewer)
|
2015-01-12 19:04:01 +01:00
|
|
|
->addNavigationItems($nav->getMenu());
|
|
|
|
}
|
2013-07-22 17:34:35 +02:00
|
|
|
|
|
|
|
$nav->selectFilter(null);
|
|
|
|
|
2013-02-13 18:22:14 +01:00
|
|
|
return $nav;
|
|
|
|
}
|
|
|
|
|
2015-01-12 19:04:01 +01:00
|
|
|
public function buildIconNavView(PhabricatorProject $project) {
|
2015-01-19 19:14:27 +01:00
|
|
|
$viewer = $this->getViewer();
|
2015-01-12 19:04:01 +01:00
|
|
|
|
2016-01-12 19:27:39 +01:00
|
|
|
$engine = id(new PhabricatorProfilePanelEngine())
|
2015-01-19 19:14:27 +01:00
|
|
|
->setViewer($viewer)
|
2016-01-12 19:27:39 +01:00
|
|
|
->setProfileObject($project);
|
2015-01-12 19:04:01 +01:00
|
|
|
|
2016-01-12 19:27:39 +01:00
|
|
|
return $engine->buildNavigation();
|
2015-01-12 19:04:01 +01:00
|
|
|
}
|
|
|
|
|
2015-12-27 13:10:59 +01:00
|
|
|
protected function buildApplicationCrumbs() {
|
|
|
|
$crumbs = parent::buildApplicationCrumbs();
|
|
|
|
|
|
|
|
$project = $this->getProject();
|
|
|
|
if ($project) {
|
|
|
|
$ancestors = $project->getAncestorProjects();
|
|
|
|
$ancestors = array_reverse($ancestors);
|
|
|
|
$ancestors[] = $project;
|
|
|
|
foreach ($ancestors as $ancestor) {
|
|
|
|
$crumbs->addTextCrumb(
|
2015-12-27 14:16:36 +01:00
|
|
|
$ancestor->getName(),
|
|
|
|
$ancestor->getURI());
|
2015-12-27 13:10:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $crumbs;
|
|
|
|
}
|
|
|
|
|
2011-02-21 03:41:23 +01:00
|
|
|
}
|