@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 248 lines 7.0 kB view raw
1<?php 2 3final class DiffusionRepositoryProfilePictureController 4 extends DiffusionController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $this->getViewer(); 8 $id = $request->getURIData('id'); 9 10 $repository = id(new PhabricatorRepositoryQuery()) 11 ->setViewer($viewer) 12 ->withIDs(array($id)) 13 ->needProfileImage(true) 14 ->needURIs(true) 15 ->requireCapabilities( 16 array( 17 PhabricatorPolicyCapability::CAN_VIEW, 18 PhabricatorPolicyCapability::CAN_EDIT, 19 )) 20 ->executeOne(); 21 22 if (!$repository) { 23 return new Aphront404Response(); 24 } 25 26 $supported_formats = PhabricatorFile::getTransformableImageFormats(); 27 if ($supported_formats) { 28 $supported_formats_message = pht('Supported image formats: %s.', 29 implode(', ', $supported_formats)); 30 } else { 31 $supported_formats_message = pht('Server supports no image formats.'); 32 } 33 $e_file = true; 34 $errors = array(); 35 $done_uri = $repository->getURI(); 36 37 if ($request->isFormPost()) { 38 $phid = $request->getStr('phid'); 39 $is_default = false; 40 if ($phid == PhabricatorPHIDConstants::PHID_VOID) { 41 $phid = null; 42 $is_default = true; 43 } else if ($phid) { 44 $file = id(new PhabricatorFileQuery()) 45 ->setViewer($viewer) 46 ->withPHIDs(array($phid)) 47 ->executeOne(); 48 } else { 49 if ($request->getFileExists('picture')) { 50 $file = PhabricatorFile::newFromPHPUpload( 51 $_FILES['picture'], 52 array( 53 'authorPHID' => $viewer->getPHID(), 54 'canCDN' => true, 55 )); 56 } else { 57 $e_file = pht('Required'); 58 $errors[] = pht( 59 'You must choose a file when uploading a new profile picture.'); 60 } 61 } 62 63 if (!$errors && !$is_default) { 64 if (!$file->isTransformableImage()) { 65 $e_file = pht('Not Supported'); 66 $errors[] = $supported_formats_message; 67 } else { 68 $xform = PhabricatorFileTransform::getTransformByKey( 69 PhabricatorFileThumbnailTransform::TRANSFORM_PROFILE); 70 $xformed = $xform->executeTransformExplicit($file); 71 } 72 } 73 74 if (!$errors) { 75 if ($is_default) { 76 $repository->setProfileImagePHID(null); 77 } else { 78 $repository->setProfileImagePHID($xformed->getPHID()); 79 $xformed->attachToObject($repository->getPHID()); 80 } 81 $repository->save(); 82 return id(new AphrontRedirectResponse())->setURI($done_uri); 83 } 84 } 85 86 $title = pht('Edit Picture'); 87 88 $form = id(new PHUIFormLayoutView()) 89 ->setUser($viewer); 90 91 $default_image = PhabricatorFile::loadBuiltin( 92 $viewer, 'repo/code.png'); 93 94 $images = array(); 95 96 $current = $repository->getProfileImagePHID(); 97 $has_current = false; 98 if ($current) { 99 $files = id(new PhabricatorFileQuery()) 100 ->setViewer($viewer) 101 ->withPHIDs(array($current)) 102 ->execute(); 103 if ($files) { 104 $file = head($files); 105 if ($file->isTransformableImage()) { 106 $has_current = true; 107 $images[$current] = array( 108 'uri' => $file->getBestURI(), 109 'tip' => pht('Current Picture'), 110 ); 111 } 112 } 113 } 114 115 $builtins = array( 116 'repo/repo-git.png', 117 'repo/repo-svn.png', 118 'repo/repo-hg.png', 119 'repo/building.png', 120 'repo/cloud.png', 121 'repo/commit.png', 122 'repo/database.png', 123 'repo/desktop.png', 124 'repo/gears.png', 125 'repo/globe.png', 126 'repo/locked.png', 127 'repo/microchip.png', 128 'repo/mobile.png', 129 'repo/repo.png', 130 'repo/servers.png', 131 ); 132 foreach ($builtins as $builtin) { 133 $file = PhabricatorFile::loadBuiltin($viewer, $builtin); 134 $images[$file->getPHID()] = array( 135 'uri' => $file->getBestURI(), 136 'tip' => pht('Builtin Image'), 137 ); 138 } 139 140 $images[PhabricatorPHIDConstants::PHID_VOID] = array( 141 'uri' => $default_image->getBestURI(), 142 'tip' => pht('Default Picture'), 143 ); 144 145 require_celerity_resource('people-profile-css'); 146 Javelin::initBehavior('phabricator-tooltips', array()); 147 148 $buttons = array(); 149 foreach ($images as $phid => $spec) { 150 $button = javelin_tag( 151 'button', 152 array( 153 'class' => 'button-grey profile-image-button', 154 'sigil' => 'has-tooltip', 155 'meta' => array( 156 'tip' => $spec['tip'], 157 'size' => 300, 158 ), 159 ), 160 phutil_tag( 161 'img', 162 array( 163 'height' => 50, 164 'width' => 50, 165 'src' => $spec['uri'], 166 ))); 167 168 $button = array( 169 phutil_tag( 170 'input', 171 array( 172 'type' => 'hidden', 173 'name' => 'phid', 174 'value' => $phid, 175 )), 176 $button, 177 ); 178 179 $button = phabricator_form( 180 $viewer, 181 array( 182 'class' => 'profile-image-form', 183 'method' => 'POST', 184 ), 185 $button); 186 187 $buttons[] = $button; 188 } 189 190 if ($has_current) { 191 $form->appendChild( 192 id(new AphrontFormMarkupControl()) 193 ->setLabel(pht('Current Picture')) 194 ->setValue(array_shift($buttons))); 195 } 196 197 $form->appendChild( 198 id(new AphrontFormMarkupControl()) 199 ->setLabel(pht('Use Picture')) 200 ->setValue($buttons)); 201 202 $form_box = id(new PHUIObjectBoxView()) 203 ->setHeaderText($title) 204 ->setFormErrors($errors) 205 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 206 ->setForm($form); 207 208 $upload_form = id(new AphrontFormView()) 209 ->setUser($viewer) 210 ->setEncType('multipart/form-data') 211 ->appendChild( 212 id(new AphrontFormFileControl()) 213 ->setName('picture') 214 ->setLabel(pht('Upload Picture')) 215 ->setError($e_file) 216 ->setCaption($supported_formats_message)) 217 ->appendChild( 218 id(new AphrontFormSubmitControl()) 219 ->addCancelButton($done_uri) 220 ->setValue(pht('Upload Picture'))); 221 222 $header = id(new PHUIHeaderView()) 223 ->setHeader(pht('Edit Repository Picture')) 224 ->setHeaderIcon('fa-camera-retro'); 225 226 $crumbs = $this->buildApplicationCrumbs(); 227 $crumbs->addTextCrumb($repository->getName(), $repository->getURI()); 228 $crumbs->addTextCrumb(pht('Edit Picture')); 229 $crumbs->setBorder(true); 230 231 $upload_box = id(new PHUIObjectBoxView()) 232 ->setHeaderText(pht('Upload New Picture')) 233 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 234 ->setForm($upload_form); 235 236 $view = id(new PHUITwoColumnView()) 237 ->setHeader($header) 238 ->setFooter(array( 239 $form_box, 240 $upload_box, 241 )); 242 243 return $this->newPage() 244 ->setTitle($title) 245 ->setCrumbs($crumbs) 246 ->appendChild($view); 247 } 248}