username = idx($data, 'username'); $this->page = idx($data, 'page'); } public function getProfileUser() { return $this->profileUser; } private function getMainFilters($username) { return array( array( 'key' => 'feed', 'name' => pht('Feed'), 'href' => '/p/'.$username.'/feed/' ), array( 'key' => 'about', 'name' => pht('About'), 'href' => '/p/'.$username.'/about/' ) ); } public function processRequest() { $viewer = $this->getRequest()->getUser(); $user = id(new PhabricatorUser())->loadOneWhere( 'userName = %s', $this->username); if (!$user) { return new Aphront404Response(); } $this->profileUser = $user; require_celerity_resource('phabricator-profile-css'); $profile = id(new PhabricatorUserProfile())->loadOneWhere( 'userPHID = %s', $user->getPHID()); if (!$profile) { $profile = new PhabricatorUserProfile(); } $username = phutil_escape_uri($user->getUserName()); $menu = new PhabricatorMenuView(); foreach ($this->getMainFilters($username) as $filter) { $menu->newLink($filter['name'], $filter['href'], $filter['key']); } $menu->newLabel(pht('Activity'), 'activity'); // NOTE: applications install the various links through PhabricatorEvent // listeners $oauths = id(new PhabricatorUserOAuthInfo())->loadAllWhere( 'userID = %d', $user->getID()); $oauths = mpull($oauths, null, 'getOAuthProvider'); $providers = PhabricatorOAuthProvider::getAllProviders(); $added_label = false; foreach ($providers as $provider) { if (!$provider->isProviderEnabled()) { continue; } $provider_key = $provider->getProviderKey(); if (!isset($oauths[$provider_key])) { continue; } $name = pht('%s Profile', $provider->getProviderName()); $href = $oauths[$provider_key]->getAccountURI(); if ($href) { if (!$added_label) { $menu->newLabel(pht('Linked Accounts'), 'linked_accounts'); $added_label = true; } $menu->addMenuItem( id(new PhabricatorMenuItemView()) ->setIsExternal(true) ->setName($name) ->setHref($href) ->setType(PhabricatorMenuItemView::TYPE_LINK) ); } } $event = new PhabricatorEvent( PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU, array( 'menu' => $menu, 'person' => $user, )); $event->setUser($viewer); PhutilEventEngine::dispatchEvent($event); $nav = AphrontSideNavFilterView::newFromMenu($event->getValue('menu')); $this->page = $nav->selectFilter($this->page, 'feed'); switch ($this->page) { case 'feed': $content = $this->renderUserFeed($user); break; case 'about': $content = $this->renderBasicInformation($user, $profile); break; default: throw new Exception("Unknown page '{$this->page}'!"); } $picture = $user->loadProfileImageURI(); $header = new PhabricatorProfileHeaderView(); $header ->setProfilePicture($picture) ->setName($user->getUserName().' ('.$user->getRealName().')') ->setDescription($profile->getTitle()); if ($user->getIsDisabled()) { $header->setStatus('Disabled'); } else { $statuses = id(new PhabricatorUserStatus())->loadCurrentStatuses( array($user->getPHID())); if ($statuses) { $header->setStatus(reset($statuses)->getTerseSummary($viewer)); } } $nav->appendChild($header); $content = '
'.$content.'
'; $header->appendChild($content); if ($user->getPHID() == $viewer->getPHID()) { $nav->addFilter( null, pht('Edit Profile...'), '/settings/panel/profile/' ); } if ($viewer->getIsAdmin()) { $nav->addFilter( null, pht('Administrate User...'), '/people/edit/'.$user->getID().'/' ); } return $this->buildApplicationPage( $nav, array( 'title' => $user->getUsername(), )); } private function renderBasicInformation($user, $profile) { $blurb = nonempty( $profile->getBlurb(), '//'.pht('Nothing is known about this rare specimen.').'//' ); $engine = PhabricatorMarkupEngine::newProfileMarkupEngine(); $blurb = $engine->markupText($blurb); $viewer = $this->getRequest()->getUser(); $content = hsprintf( '

Basic Information

PHID %s
User Since %s
'. '

Flavor Text

Blurb %s
', $user->getPHID(), phabricator_datetime($user->getDateCreated(), $viewer), $blurb); return $content; } private function renderUserFeed(PhabricatorUser $user) { $viewer = $this->getRequest()->getUser(); $query = new PhabricatorFeedQuery(); $query->setFilterPHIDs( array( $user->getPHID(), )); $query->setLimit(100); $query->setViewer($viewer); $stories = $query->execute(); $builder = new PhabricatorFeedBuilder($stories); $builder->setUser($viewer); $view = $builder->buildView(); return '

Activity Feed

'.$view->render().'
'; } }