summaryrefslogtreecommitdiffstats
path: root/application/forms/IcingaTemplateChoiceForm.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--application/forms/IcingaTemplateChoiceForm.php140
1 files changed, 140 insertions, 0 deletions
diff --git a/application/forms/IcingaTemplateChoiceForm.php b/application/forms/IcingaTemplateChoiceForm.php
new file mode 100644
index 0000000..31fe610
--- /dev/null
+++ b/application/forms/IcingaTemplateChoiceForm.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\IcingaTemplateChoice;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaTemplateChoiceForm extends DirectorObjectForm
+{
+ private $choiceType;
+
+ public static function create($type, Db $db)
+ {
+ return static::load()->setDb($db)->setChoiceType($type);
+ }
+
+ public function optionallyLoad($name)
+ {
+ if ($name !== null) {
+ /** @var IcingaTemplateChoice $class - cheating IDE */
+ $class = $this->getObjectClassName();
+ $this->setObject($class::load($name, $this->getDb()));
+ }
+
+ return $this;
+ }
+
+ protected function getObjectClassname()
+ {
+ if ($this->className === null) {
+ return 'Icinga\\Module\\Director\\Objects\\IcingaTemplateChoice'
+ . ucfirst($this->choiceType);
+ }
+
+ return $this->className;
+ }
+
+ public function setChoiceType($type)
+ {
+ $this->choiceType = $type;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Choice name'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'This will be shown as a label for the given choice'
+ )
+ ));
+
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'rows' => 4,
+ 'description' => $this->translate(
+ 'A detailled description explaining what this choice is all about'
+ )
+ ));
+
+ $this->addElement('extensibleSet', 'members', array(
+ 'label' => $this->translate('Available choices'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Your users will be allowed to choose among those templates'
+ ),
+ 'multiOptions' => $this->fetchUnboundTemplates()
+ ));
+
+ $this->addElement('text', 'min_required', array(
+ 'label' => $this->translate('Minimum required'),
+ 'description' => $this->translate(
+ 'Choosing this many options will be mandatory for this Choice.'
+ . ' Setting this to zero will leave this Choice optional, setting'
+ . ' it to one results in a "required" Choice. You can use higher'
+ . ' numbers to enforce multiple options, this Choice will then turn'
+ . ' into a multi-selection element.'
+ ),
+ 'value' => 0,
+ ));
+
+ $this->addElement('text', 'max_allowed', array(
+ 'label' => $this->translate('Allowed maximum'),
+ 'description' => $this->translate(
+ 'It will not be allowed to choose more than this many options.'
+ . ' Setting it to one (1) will result in a drop-down box, a'
+ . ' higher number will turn this into a multi-selection element.'
+ ),
+ 'value' => 1,
+ ));
+
+ $this->addElement('select', 'required_template', [
+ 'label' => $this->translate('Associated Template'),
+ 'description' => $this->translate(
+ 'Choose Choice Associated Template'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->fetchUnboundTemplates(),
+ ]);
+
+ $this->setButtons();
+ }
+
+ protected function fetchUnboundTemplates()
+ {
+ /** @var IcingaTemplateChoice $object */
+ $object = $this->object();
+ $db = $this->getDb()->getDbAdapter();
+ $table = $object->getObjectTableName();
+ $query = $db->select()->from(
+ ['o' => $table],
+ [
+ 'k' => 'o.object_name',
+ 'v' => 'o.object_name',
+ ]
+ )->where("o.object_type = 'template'");
+ if ($object->hasBeenLoadedFromDb()) {
+ $query->where(
+ 'o.template_choice_id IS NULL OR o.template_choice_id = ?',
+ $object->get('id')
+ );
+ } else {
+ $query->where('o.template_choice_id IS NULL');
+ }
+
+ return $db->fetchPairs($query);
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ /** @var IcingaTemplateChoice $object */
+ $object = $this->object();
+ $this->setSuccessUrl(
+ 'director/templatechoice/' . $object->getObjectshortTableName(),
+ $object->getUrlParams()
+ );
+ }
+}