Path: blob/master/src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php
12242 views
<?php12final class DiffusionRepositoryProfilePictureController3extends DiffusionController {45public function handleRequest(AphrontRequest $request) {6$viewer = $this->getViewer();7$id = $request->getURIData('id');89$repository = id(new PhabricatorRepositoryQuery())10->setViewer($viewer)11->withIDs(array($id))12->needProfileImage(true)13->needURIs(true)14->requireCapabilities(15array(16PhabricatorPolicyCapability::CAN_VIEW,17PhabricatorPolicyCapability::CAN_EDIT,18))19->executeOne();2021if (!$repository) {22return new Aphront404Response();23}2425$supported_formats = PhabricatorFile::getTransformableImageFormats();26$e_file = true;27$errors = array();28$done_uri = $repository->getURI();2930if ($request->isFormPost()) {31$phid = $request->getStr('phid');32$is_default = false;33if ($phid == PhabricatorPHIDConstants::PHID_VOID) {34$phid = null;35$is_default = true;36} else if ($phid) {37$file = id(new PhabricatorFileQuery())38->setViewer($viewer)39->withPHIDs(array($phid))40->executeOne();41} else {42if ($request->getFileExists('picture')) {43$file = PhabricatorFile::newFromPHPUpload(44$_FILES['picture'],45array(46'authorPHID' => $viewer->getPHID(),47'canCDN' => true,48));49} else {50$e_file = pht('Required');51$errors[] = pht(52'You must choose a file when uploading a new profile picture.');53}54}5556if (!$errors && !$is_default) {57if (!$file->isTransformableImage()) {58$e_file = pht('Not Supported');59$errors[] = pht(60'This server only supports these image formats: %s.',61implode(', ', $supported_formats));62} else {63$xform = PhabricatorFileTransform::getTransformByKey(64PhabricatorFileThumbnailTransform::TRANSFORM_PROFILE);65$xformed = $xform->executeTransform($file);66}67}6869if (!$errors) {70if ($is_default) {71$repository->setProfileImagePHID(null);72} else {73$repository->setProfileImagePHID($xformed->getPHID());74$xformed->attachToObject($repository->getPHID());75}76$repository->save();77return id(new AphrontRedirectResponse())->setURI($done_uri);78}79}8081$title = pht('Edit Picture');8283$form = id(new PHUIFormLayoutView())84->setUser($viewer);8586$default_image = PhabricatorFile::loadBuiltin(87$viewer, 'repo/code.png');8889$images = array();9091$current = $repository->getProfileImagePHID();92$has_current = false;93if ($current) {94$files = id(new PhabricatorFileQuery())95->setViewer($viewer)96->withPHIDs(array($current))97->execute();98if ($files) {99$file = head($files);100if ($file->isTransformableImage()) {101$has_current = true;102$images[$current] = array(103'uri' => $file->getBestURI(),104'tip' => pht('Current Picture'),105);106}107}108}109110$builtins = array(111'repo/repo-git.png',112'repo/repo-svn.png',113'repo/repo-hg.png',114'repo/building.png',115'repo/cloud.png',116'repo/commit.png',117'repo/database.png',118'repo/desktop.png',119'repo/gears.png',120'repo/globe.png',121'repo/locked.png',122'repo/microchip.png',123'repo/mobile.png',124'repo/repo.png',125'repo/servers.png',126);127foreach ($builtins as $builtin) {128$file = PhabricatorFile::loadBuiltin($viewer, $builtin);129$images[$file->getPHID()] = array(130'uri' => $file->getBestURI(),131'tip' => pht('Builtin Image'),132);133}134135$images[PhabricatorPHIDConstants::PHID_VOID] = array(136'uri' => $default_image->getBestURI(),137'tip' => pht('Default Picture'),138);139140require_celerity_resource('people-profile-css');141Javelin::initBehavior('phabricator-tooltips', array());142143$buttons = array();144foreach ($images as $phid => $spec) {145$style = null;146if (isset($spec['style'])) {147$style = $spec['style'];148}149$button = javelin_tag(150'button',151array(152'class' => 'button-grey profile-image-button',153'sigil' => 'has-tooltip',154'meta' => array(155'tip' => $spec['tip'],156'size' => 300,157),158),159phutil_tag(160'img',161array(162'height' => 50,163'width' => 50,164'src' => $spec['uri'],165)));166167$button = array(168phutil_tag(169'input',170array(171'type' => 'hidden',172'name' => 'phid',173'value' => $phid,174)),175$button,176);177178$button = phabricator_form(179$viewer,180array(181'class' => 'profile-image-form',182'method' => 'POST',183),184$button);185186$buttons[] = $button;187}188189if ($has_current) {190$form->appendChild(191id(new AphrontFormMarkupControl())192->setLabel(pht('Current Picture'))193->setValue(array_shift($buttons)));194}195196$form->appendChild(197id(new AphrontFormMarkupControl())198->setLabel(pht('Use Picture'))199->setValue($buttons));200201$form_box = id(new PHUIObjectBoxView())202->setHeaderText($title)203->setFormErrors($errors)204->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)205->setForm($form);206207$upload_form = id(new AphrontFormView())208->setUser($viewer)209->setEncType('multipart/form-data')210->appendChild(211id(new AphrontFormFileControl())212->setName('picture')213->setLabel(pht('Upload Picture'))214->setError($e_file)215->setCaption(216pht('Supported formats: %s', implode(', ', $supported_formats))))217->appendChild(218id(new AphrontFormSubmitControl())219->addCancelButton($done_uri)220->setValue(pht('Upload Picture')));221222$header = id(new PHUIHeaderView())223->setHeader(pht('Edit Repository Picture'))224->setHeaderIcon('fa-camera-retro');225226$crumbs = $this->buildApplicationCrumbs();227$crumbs->addTextCrumb($repository->getName(), $repository->getURI());228$crumbs->addTextCrumb(pht('Edit Picture'));229$crumbs->setBorder(true);230231$upload_box = id(new PHUIObjectBoxView())232->setHeaderText(pht('Upload New Picture'))233->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)234->setForm($upload_form);235236$view = id(new PHUITwoColumnView())237->setHeader($header)238->setFooter(array(239$form_box,240$upload_box,241));242243return $this->newPage()244->setTitle($title)245->setCrumbs($crumbs)246->appendChild($view);247}248}249250251