@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 PhamePostHeaderPictureController
4 extends PhamePostController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9
10 $post = id(new PhamePostQuery())
11 ->setViewer($viewer)
12 ->withIDs(array($id))
13 ->needHeaderImage(true)
14 ->requireCapabilities(
15 array(
16 PhabricatorPolicyCapability::CAN_VIEW,
17 PhabricatorPolicyCapability::CAN_EDIT,
18 ))
19 ->executeOne();
20 if (!$post) {
21 return new Aphront404Response();
22 }
23
24 $post_uri = '/phame/post/view/'.$id;
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 $delete_header = ($request->getInt('delete') == 1);
36
37 if ($request->isFormPost()) {
38 if ($request->getFileExists('header')) {
39 $file = PhabricatorFile::newFromPHPUpload(
40 $_FILES['header'],
41 array(
42 'authorPHID' => $viewer->getPHID(),
43 'canCDN' => true,
44 ));
45 } else if (!$delete_header) {
46 $e_file = pht('Required');
47 $errors[] = pht(
48 'You must choose a file when uploading a new post header.');
49 }
50
51 if (!$errors && !$delete_header) {
52 if (!$file->isTransformableImage()) {
53 $e_file = pht('Not Supported');
54 $errors[] = $supported_formats_message;
55 }
56 }
57
58 if (!$errors) {
59 if ($delete_header) {
60 $new_value = null;
61 } else {
62 $file->attachToObject($post->getPHID());
63 $new_value = $file->getPHID();
64 }
65
66 $xactions = array();
67 $xactions[] = id(new PhamePostTransaction())
68 ->setTransactionType(PhamePostHeaderImageTransaction::TRANSACTIONTYPE)
69 ->setNewValue($new_value);
70
71 $editor = id(new PhamePostEditor())
72 ->setActor($viewer)
73 ->setContentSourceFromRequest($request)
74 ->setContinueOnMissingFields(true)
75 ->setContinueOnNoEffect(true);
76
77 $editor->applyTransactions($post, $xactions);
78
79 return id(new AphrontRedirectResponse())->setURI($post_uri);
80 }
81 }
82
83 $title = pht('Edit Post Header');
84
85 $upload_form = id(new AphrontFormView())
86 ->setUser($viewer)
87 ->setEncType('multipart/form-data')
88 ->appendChild(
89 id(new AphrontFormFileControl())
90 ->setName('header')
91 ->setLabel(pht('Upload Header'))
92 ->setError($e_file)
93 ->setCaption($supported_formats_message))
94 ->appendChild(
95 id(new AphrontFormCheckboxControl())
96 ->setName('delete')
97 ->setLabel(pht('Delete Header'))
98 ->addCheckbox(
99 'delete',
100 1,
101 null,
102 null))
103 ->appendChild(
104 id(new AphrontFormSubmitControl())
105 ->addCancelButton($post_uri)
106 ->setValue(pht('Upload Header')));
107
108 $upload_box = id(new PHUIObjectBoxView())
109 ->setHeaderText(pht('Upload New Header'))
110 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
111 ->setForm($upload_form);
112
113 $crumbs = $this->buildApplicationCrumbs();
114 $crumbs->addTextCrumb(
115 $post->getTitle(),
116 $this->getApplicationURI('post/view/'.$id));
117 $crumbs->addTextCrumb(pht('Post Header'));
118 $crumbs->setBorder(true);
119
120 $header = id(new PHUIHeaderView())
121 ->setHeader(pht('Edit Post Header'))
122 ->setHeaderIcon('fa-camera');
123
124 $view = id(new PHUITwoColumnView())
125 ->setHeader($header)
126 ->setFooter(array(
127 $upload_box,
128 ));
129
130 return $this->newPage()
131 ->setTitle($title)
132 ->setCrumbs($crumbs)
133 ->appendChild(
134 array(
135 $view,
136 ));
137
138 }
139}