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;
}
}
}
|