summaryrefslogtreecommitdiffstats
path: root/application/forms/IcingaAddServiceForm.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/forms/IcingaAddServiceForm.php')
-rw-r--r--application/forms/IcingaAddServiceForm.php183
1 files changed, 183 insertions, 0 deletions
diff --git a/application/forms/IcingaAddServiceForm.php b/application/forms/IcingaAddServiceForm.php
new file mode 100644
index 0000000..df2302e
--- /dev/null
+++ b/application/forms/IcingaAddServiceForm.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+
+class IcingaAddServiceForm extends DirectorObjectForm
+{
+ /** @var IcingaHost[] */
+ private $hosts;
+
+ /** @var IcingaHost */
+ private $host;
+
+ /** @var IcingaService */
+ protected $object;
+
+ protected $objectName = 'service';
+
+ public function setup()
+ {
+ if ($this->object === null) {
+ $this->object = IcingaService::create(
+ ['object_type' => 'object'],
+ $this->db
+ );
+ }
+
+ $this->addSingleImportElement();
+
+ if (! ($imports = $this->getSentOrObjectValue('imports'))) {
+ $this->setSubmitLabel($this->translate('Next'));
+ $this->groupMainProperties();
+ return;
+ }
+
+ $this->removeElement('imports');
+ $this->addHidden('imports', $imports);
+ $this->setElementValue('imports', $imports);
+ $this->addNameElement();
+ $name = $this->getSentOrObjectValue('object_name');
+ if (empty($name)) {
+ $this->setElementValue('object_name', $imports);
+ }
+ $this->groupMainProperties()
+ ->setButtons();
+ }
+
+ protected function groupMainProperties($importsFirst = false)
+ {
+ $elements = [
+ 'object_type',
+ 'imports',
+ 'object_name',
+ ];
+
+ $this->addDisplayGroup($elements, 'object_definition', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'Fieldset',
+ ],
+ 'order' => self::GROUP_ORDER_OBJECT_DEFINITION,
+ 'legend' => $this->translate('Main properties')
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @param bool $required
+ * @return $this
+ */
+ protected function addSingleImportElement($required = null)
+ {
+ $enum = $this->enumServiceTemplates();
+ if (empty($enum)) {
+ if ($required) {
+ if ($this->hasBeenSent()) {
+ $this->addError($this->translate('No service has been chosen'));
+ } else {
+ if ($this->hasPermission('director/admin')) {
+ $html = sprintf(
+ $this->translate('Please define a %s first'),
+ Link::create(
+ $this->translate('Service Template'),
+ 'director/service/add',
+ ['type' => 'template']
+ )
+ );
+ } else {
+ $html = $this->translate('No Service Templates have been provided yet');
+ }
+ $this->addHtml('<p class="warning">' . $html . '</p>');
+ }
+ }
+
+ return $this;
+ }
+ $this->addElement('text', 'imports', [
+ 'label' => $this->translate('Service'),
+ 'description' => $this->translate('Choose a service template'),
+ 'required' => true,
+ 'data-suggestion-context' => 'servicetemplates',
+ 'class' => 'autosubmit director-suggest'
+ ]);
+
+ return $this;
+ }
+
+ protected function enumServiceTemplates()
+ {
+ $tpl = $this->getDb()->enumIcingaTemplates('service');
+ return array_combine($tpl, $tpl);
+ }
+
+ /**
+ * @param IcingaHost[] $hosts
+ * @return $this
+ */
+ public function setHosts(array $hosts)
+ {
+ $this->hosts = $hosts;
+ return $this;
+ }
+
+ /**
+ * @param IcingaHost $host
+ * @return $this
+ */
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ protected function addNameElement()
+ {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Name'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Name for the Icinga service you are going to create'
+ )
+ ]);
+
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ if ($this->host !== null) {
+ if ($id = $this->host->get('id')) {
+ $this->object->set('host_id', $id);
+ } else {
+ $this->object->set('host', $this->host->getObjectName());
+ }
+ parent::onSuccess();
+ return;
+ }
+
+ $plain = $this->object->toPlainObject();
+ $db = $this->object->getConnection();
+
+ // TODO: Test this:
+ foreach ($this->hosts as $host) {
+ $service = IcingaService::fromPlainObject($plain, $db)
+ ->set('host_id', $host->get('id'));
+ $this->getDbObjectStore()->store($service);
+ }
+
+ $msg = sprintf(
+ $this->translate('The service "%s" has been added to %d hosts'),
+ $this->object->getObjectName(),
+ count($this->hosts)
+ );
+
+ $this->redirectOnSuccess($msg);
+ }
+}