. // }}} namespace Plugin\Reply; use App\Core\DB\DB; use App\Core\Event; use App\Core\Form; use function App\Core\I18n\_m; use App\Core\Modules\Module; use App\Entity\Note; use App\Util\Common; use App\Util\Exceptiion\InvalidFormException; use App\Util\Exception\RedirectException; use Component\Posting\Posting; use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\HttpFoundation\Request; class Reply extends Module { public function onAddRoute($r) { $r->connect('note_reply', '/note/reply/{reply_to<\\d*>}', [self::class, 'replyController']); return Event::next; } /** * HTML rendering event that adds the reply form as a note action, * if a user is logged in */ public function onAddNoteActions(Request $request, Note $note, array &$actions) { if (($user = Common::user()) == null) { return Event::next; } $form = Form::create([ ['content', HiddenType::class, ['label' => ' ', 'required' => false]], ['attachments', HiddenType::class, ['label' => ' ', 'required' => false]], ['note_id', HiddenType::class, ['data' => $note->getId()]], ['reply', SubmitType::class, ['label' => ' ']], ]); // Handle form $ret = self::noteActionHandle($request, $form, $note, 'reply', function ($note, $data) { if ($data['content'] !== null) { // JS submitted // TODO Implement in JS $actor_id = $user->getId(); Posting::storeNote( $actor_id, $data['content'], $data['attachments'], $is_local = true, $data['reply_to'], $repeat_of = null ); } else { // JS disabled, redirect throw new RedirectException('note_reply', ['reply_to' => $note->getId()]); } }); if ($ret != null) { return $ret; } $actions[] = $form->createView(); return Event::next; } /** * Controller for the note reply non-JS page */ public function replyController(Request $request, string $reply_to) { $user = Common::ensureLoggedIn(); $actor_id = $user->getId(); $note = DB::find('note', ['id' => (int) $reply_to]); if ($note == null || !$note->isVisibleTo($user)) { throw new NoSuchNoteException(); } $form = Form::create([ ['content', TextareaType::class, ['label' => ' ']], ['attachments', FileType::class, ['label' => ' ', 'multiple' => true, 'required' => false]], ['replyform', SubmitType::class, ['label' => _m('Submit')]], ]); $form->handleRequest($request); if ($form->isSubmitted()) { $data = $form->getData(); if ($form->isValid()) { Posting::storeNote( $actor_id, $data['content'], $data['attachments'], $is_local = true, $reply_to, $repeat_of = null ); } else { throw new InvalidFormException(); } } return [ '_template' => 'note/reply.html.twig', 'note' => $note, 'reply' => $form->createView(), ]; } }