@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 PhabricatorBadgesAwardController
4 extends PhabricatorBadgesController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9 $errors = array();
10 $e_badge = true;
11
12 $user = id(new PhabricatorPeopleQuery())
13 ->setViewer($viewer)
14 ->withIDs(array($id))
15 ->executeOne();
16 if (!$user) {
17 return new Aphront404Response();
18 }
19
20 $view_uri = '/people/badges/'.$user->getID().'/';
21
22 if ($request->isFormPost()) {
23 $badge_phids = $request->getArr('badgePHIDs');
24
25 if (empty($badge_phids)) {
26 $errors[] = pht('Badge name is required.');
27 $e_badge = pht('Required');
28 }
29 if (!$errors) {
30 $badges = id(new PhabricatorBadgesQuery())
31 ->setViewer($viewer)
32 ->withPHIDs($badge_phids)
33 ->requireCapabilities(
34 array(
35 PhabricatorPolicyCapability::CAN_EDIT,
36 PhabricatorPolicyCapability::CAN_VIEW,
37 ))
38 ->execute();
39 $award_phids = array($user->getPHID());
40
41 foreach ($badges as $badge) {
42 $xactions = array();
43 $xactions[] = id(new PhabricatorBadgesTransaction())
44 ->setTransactionType(
45 PhabricatorBadgesBadgeAwardTransaction::TRANSACTIONTYPE)
46 ->setNewValue($award_phids);
47
48 $editor = id(new PhabricatorBadgesEditor())
49 ->setActor($viewer)
50 ->setContentSourceFromRequest($request)
51 ->setContinueOnNoEffect(true)
52 ->setContinueOnMissingFields(true)
53 ->applyTransactions($badge, $xactions);
54 }
55
56 return id(new AphrontRedirectResponse())
57 ->setURI($view_uri);
58 }
59 }
60
61 $form = id(new AphrontFormView())
62 ->setUser($viewer)
63 ->appendControl(
64 id(new AphrontFormTokenizerControl())
65 ->setLabel(pht('Badge'))
66 ->setName('badgePHIDs')
67 ->setError($e_badge)
68 ->setDatasource(
69 id(new PhabricatorBadgesDatasource())
70 ->setParameters(
71 array(
72 'recipientPHID' => $user->getPHID(),
73 ))));
74
75 $dialog = $this->newDialog()
76 ->setTitle(pht('Award Badge'))
77 ->appendForm($form)
78 ->addCancelButton($view_uri)
79 ->addSubmitButton(pht('Award'));
80
81 return $dialog;
82 }
83
84}