@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 PhameBlogHeaderPictureController
4 extends PhameBlogController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9
10 $blog = id(new PhameBlogQuery())
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 (!$blog) {
21 return new Aphront404Response();
22 }
23
24 $blog_uri = '/phame/blog/manage/'.$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 blog 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($blog->getPHID());
63 $new_value = $file->getPHID();
64 }
65
66 $xactions = array();
67 $xactions[] = id(new PhameBlogTransaction())
68 ->setTransactionType(PhameBlogHeaderImageTransaction::TRANSACTIONTYPE)
69 ->setNewValue($new_value);
70
71 $editor = id(new PhameBlogEditor())
72 ->setActor($viewer)
73 ->setContentSourceFromRequest($request)
74 ->setContinueOnMissingFields(true)
75 ->setContinueOnNoEffect(true);
76
77 $editor->applyTransactions($blog, $xactions);
78
79 return id(new AphrontRedirectResponse())->setURI($blog_uri);
80 }
81 }
82
83 $title = pht('Edit Blog 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($blog_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 pht('Blogs'),
116 $this->getApplicationURI('blog/'));
117 $crumbs->addTextCrumb(
118 $blog->getName(),
119 $this->getApplicationURI('blog/view/'.$id));
120 $crumbs->addTextCrumb(pht('Blog Header'));
121 $crumbs->setBorder(true);
122
123 $header = id(new PHUIHeaderView())
124 ->setHeader(pht('Edit Blog Header'))
125 ->setHeaderIcon('fa-camera');
126
127 $view = id(new PHUITwoColumnView())
128 ->setHeader($header)
129 ->setFooter(array(
130 $upload_box,
131 ));
132
133 return $this->newPage()
134 ->setTitle($title)
135 ->setCrumbs($crumbs)
136 ->appendChild(
137 array(
138 $view,
139 ));
140
141 }
142}