Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
FeedbackController
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 3
272
0.00% covered (danger)
0.00%
0 / 1
 homeAction
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 formAction
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
182
 prefillUserInfo
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3/**
4 * Controller for configurable forms (feedback etc).
5 *
6 * PHP version 8
7 *
8 * @category VuFind
9 * @package  Controller
10 * @author   Josiah Knoll <jk1135@ship.edu>
11 * @author   Samuli Sillanpää <samuli.sillanpaa@helsinki.fi>
12 * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
13 * @link     https://vufind.org Main Site
14 */
15
16namespace VuFind\Controller;
17
18use Laminas\Log\LoggerAwareInterface;
19use Laminas\View\Model\ViewModel;
20use VuFind\Db\Entity\UserEntityInterface;
21use VuFind\Form\Form;
22use VuFind\Log\LoggerAwareTrait;
23
24/**
25 * Controller for configurable forms (feedback etc).
26 *
27 * @category VuFind
28 * @package  Controller
29 * @author   Josiah Knoll <jk1135@ship.edu>
30 * @author   Samuli Sillanpää <samuli.sillanpaa@helsinki.fi>
31 * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
32 * @link     https://vufind.org/wiki/development Wiki
33 */
34class FeedbackController extends AbstractBase implements LoggerAwareInterface
35{
36    use LoggerAwareTrait;
37
38    /**
39     * Feedback form class
40     *
41     * @var string
42     */
43    protected $formClass = \VuFind\Form\Form::class;
44
45    /**
46     * Display Feedback home form.
47     *
48     * @return ViewModel
49     */
50    public function homeAction()
51    {
52        return $this->forwardTo('Feedback', 'Form');
53    }
54
55    /**
56     * Handles rendering and submit of dynamic forms.
57     * Form configurations are specified in FeedbackForms.yaml.
58     *
59     * @return mixed
60     */
61    public function formAction()
62    {
63        $formId = $this->params()->fromRoute('id', $this->params()->fromQuery('id'));
64        if (!$formId) {
65            $formId = 'FeedbackSite';
66        }
67
68        $user = $this->getUser();
69
70        $form = $this->serviceLocator->get($this->formClass);
71        $prefill = $this->params()->fromQuery();
72        $params = [];
73        if ($refererHeader = $this->getRequest()->getHeader('Referer')) {
74            $params['referrer'] = $refererHeader->getFieldValue();
75        }
76        if ($userAgentHeader = $this->getRequest()->getHeader('User-Agent')) {
77            $params['userAgent'] = $userAgentHeader->getFieldValue();
78        }
79        $form->setFormId($formId, $params, $prefill);
80
81        if (!$form->isEnabled()) {
82            throw new \VuFind\Exception\Forbidden("Form '$formId' is disabled");
83        }
84
85        if (!$user && $form->showOnlyForLoggedUsers()) {
86            return $this->forceLogin();
87        }
88
89        $view = $this->createViewModel(compact('form', 'formId', 'user'));
90        $view->useCaptcha
91            = $this->captcha()->active('feedback') && $form->useCaptcha();
92
93        $params = $this->params();
94        $form->setData($params->fromPost());
95
96        if (!$this->formWasSubmitted(useCaptcha: $view->useCaptcha)) {
97            $form = $this->prefillUserInfo($form, $user);
98            return $view;
99        }
100
101        if (!$form->isValid()) {
102            return $view;
103        }
104
105        $primaryHandler = $form->getPrimaryHandler();
106        $success = $primaryHandler->handle($form, $params, $user);
107        if ($success) {
108            $view->setVariable('successMessage', $form->getSubmitResponse());
109            $view->setTemplate('feedback/response');
110        } else {
111            $this->flashMessenger()->addErrorMessage(
112                $this->translate('could_not_process_feedback')
113            );
114        }
115
116        $handlers = $form->getSecondaryHandlers();
117        foreach ($handlers as $handler) {
118            try {
119                $handler->handle($form, $params, $user);
120            } catch (\Exception $e) {
121                $this->logError($e->getMessage());
122            }
123        }
124
125        return $view;
126    }
127
128    /**
129     * Prefill form sender fields for logged in users.
130     *
131     * @param Form                 $form Form
132     * @param ?UserEntityInterface $user User
133     *
134     * @return Form
135     */
136    protected function prefillUserInfo(Form $form, ?UserEntityInterface $user)
137    {
138        if ($user) {
139            $form->setData(
140                [
141                 'name' => $user->getFirstname() . ' ' . $user->getLastname(),
142                 'email' => $user->getEmail(),
143                ]
144            );
145        }
146        return $form;
147    }
148}