@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
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}