summaryrefslogtreecommitdiffstats
path: root/application/forms/AddToBasketForm.php
blob: 44b53576dc3969aad9c3cc5dc23f85a97f8b3013 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php

namespace Icinga\Module\Director\Forms;

use gipfl\Web\Widget\Hint;
use ipl\Html\Html;
use ipl\Html\HtmlDocument;
use gipfl\IcingaWeb2\Link;
use Icinga\Module\Director\DirectorObject\Automation\Basket;
use Icinga\Module\Director\Web\Form\DirectorForm;

class AddToBasketForm extends DirectorForm
{
    /** @var Basket */
    private $basket;

    private $type = '(has not been set)';

    private $names = [];

    /**
     * @throws \Zend_Form_Exception
     * @throws \Icinga\Exception\NotFoundError
     */
    public function setup()
    {
        $db = $this->getDb()->getDbAdapter();
        $enum = $db->fetchPairs($db->select()->from('director_basket', [
            'a' => 'basket_name',
            'b' => 'basket_name',
        ])->order('basket_name'));

        $names = [];
        $basket = null;
        if ($this->hasBeenSent()) {
            $basketName = $this->getSentValue('basket');
            if ($basketName) {
                $basket = Basket::load($basketName, $this->getDb());
            }
        }
        $count = 0;
        $type = $this->type;
        foreach ($this->names as $name) {
            if (! empty($names)) {
                $names[] = ', ';
            }
            if ($basket && $basket->hasObject($type, $name)) {
                $names[] = Html::tag('span', [
                    'style' => 'text-decoration: line-through'
                ], $name);
            } else {
                $count++;
                $names[] = $name;
            }
        }
        $this->addHtmlHint((new HtmlDocument())->add([
            'The following objects will be added: ',
            $names
        ]));
        $this->addElement('select', 'basket', [
            'label'        => $this->translate('Basket'),
            'multiOptions' => $this->optionalEnum($enum),
            'required'     => true,
            'class'        => 'autosubmit',
        ]);

        if ($count > 0) {
            $this->setSubmitLabel(sprintf(
                $this->translate('Add %s objects'),
                $count
            ));
        } else {
            $this->setSubmitLabel($this->translate('Add'));
            $this->addSubmitButtonIfSet();
            $this->getElement($this->submitButtonName)->setAttrib('disabled', true);
        }
    }

    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    public function setNames($names)
    {
        $this->names = $names;

        return $this;
    }

    /**
     * @throws \Icinga\Exception\NotFoundError
     * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
     */
    public function onSuccess()
    {
        $type = $this->type;
        $basket = Basket::load($this->getValue('basket'), $this->getDb());
        $basketName = $basket->get('basket_name');

        if (empty($this->names)) {
            $this->getElement('basket')->addErrorMessage($this->translate(
                'No object has been chosen'
            ));
        }
        if ($basket->supportsCustomSelectionFor($type)) {
            $basket->addObjects($type, $this->names);
            $basket->store();
            $this->setSuccessMessage(sprintf($this->translate(
                'Configuration objects have been added to the chosen basket "%s"'
            ), $basketName));
            return parent::onSuccess();
        } else {
            $this->addHtmlHint(Hint::error(Html::sprintf($this->translate(
                'Please check your Basket configuration, %s does not support'
                . ' single "%s" configuration objects'
            ), Link::create(
                $basketName,
                'director/basket',
                ['name' => $basketName],
                ['data-base-target' => '_next']
            ), $type)));

            return false;
        }
    }
}