summaryrefslogtreecommitdiffstats
path: root/modules/monitoring/application/forms/Navigation/ActionForm.php
blob: 81d55883ce0b82320578c6b98a5d9a0a7d349059 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
/* Icinga Web 2 | (c) 2015 Icinga Development Team | GPLv2+ */

namespace Icinga\Module\Monitoring\Forms\Navigation;

use Icinga\Data\Filter\Filter;
use Icinga\Exception\QueryException;
use Icinga\Forms\Navigation\NavigationItemForm;

class ActionForm extends NavigationItemForm
{
    /**
     * {@inheritdoc}
     */
    public function createElements(array $formData)
    {
        parent::createElements($formData);

        $this->addElement(
            'text',
            'filter',
            array(
                'allowEmpty'    => true,
                'label'         => $this->translate('Filter'),
                'description'   => $this->translate(
                    'Display this action only for objects matching this filter. Leave it blank'
                    . ' if you want this action being displayed regardless of the object'
                )
            )
        );
    }

    /**
     * {@inheritdoc}
     */
    public function isValid($formData)
    {
        if (! parent::isValid($formData)) {
            return false;
        }

        if (($filterString = $this->getValue('filter')) !== null) {
            $filter = Filter::matchAll();
            $filter->setAllowedFilterColumns(array(
                'host_name',
                'hostgroup_name',
                'instance_name',
                'service_description',
                'servicegroup_name',
                'contact_name',
                'contactgroup_name',
                function ($c) {
                    return preg_match('/^_(?:host|service)_/', $c);
                }
            ));

            try {
                $filter->addFilter(Filter::fromQueryString($filterString));
            } catch (QueryException $_) {
                $this->getElement('filter')->addError(sprintf(
                    $this->translate('Invalid filter provided. You can only use the following columns: %s'),
                    implode(', ', array(
                        'instance_name',
                        'host_name',
                        'hostgroup_name',
                        'service_description',
                        'servicegroup_name',
                        'contact_name',
                        'contactgroup_name',
                        '_(host|service)_<customvar-name>'
                    ))
                ));
                return false;
            }
        }

        return true;
    }
}