summaryrefslogtreecommitdiffstats
path: root/application/forms/ImportRowModifierForm.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/forms/ImportRowModifierForm.php')
-rw-r--r--application/forms/ImportRowModifierForm.php182
1 files changed, 182 insertions, 0 deletions
diff --git a/application/forms/ImportRowModifierForm.php b/application/forms/ImportRowModifierForm.php
new file mode 100644
index 0000000..9e53bd9
--- /dev/null
+++ b/application/forms/ImportRowModifierForm.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Application\Hook;
+use Icinga\Exception\ConfigurationError;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Hook\PropertyModifierHook;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use RuntimeException;
+
+class ImportRowModifierForm extends DirectorObjectForm
+{
+ /** @var ImportSource */
+ protected $source;
+
+ /** @var ImportSourceHook */
+ protected $importSource;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('source_id', $this->source->id);
+
+ $this->addElement('text', 'property_name', array(
+ 'label' => $this->translate('Property'),
+ 'description' => $this->translate(
+ 'Please start typing for a list of suggestions. Dots allow you to access nested'
+ . ' properties: column.some.key. Such nested properties cannot be modified in-place,'
+ . ' but you can store the modified value to a new "target property"'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit director-suggest',
+ 'data-suggestion-context' => 'importsourceproperties!' . $this->source->id,
+ ));
+
+ $this->addElement('text', 'target_property', [
+ 'label' => $this->translate('Target property'),
+ 'description' => $this->translate(
+ 'You might want to write the modified value to another (new) property.'
+ . ' This property name can be defined here, the original property would'
+ . ' remain unmodified. Please leave this blank in case you just want to'
+ . ' modify the value of a specific property'
+ ),
+ ]);
+
+ $this->addElement('textarea', 'description', [
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'An extended description for this Import Row Modifier. This should explain'
+ . " it's purpose and why it has been put in place at all."
+ ),
+ 'rows' => '3',
+ ]);
+
+ $error = false;
+ try {
+ $mods = $this->enumModifiers();
+ } catch (Exception $e) {
+ $error = $e->getMessage();
+ $mods = $this->optionalEnum([]);
+ }
+
+ $this->addElement('select', 'provider_class', [
+ 'label' => $this->translate('Modifier'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'A property modifier allows you to modify a specific property at import time'
+ ),
+ 'multiOptions' => $this->optionalEnum($mods),
+ 'class' => 'autosubmit',
+ ]);
+ if ($error) {
+ $this->getElement('provider_class')->addError($error);
+ }
+
+ try {
+ if ($class = $this->getSentValue('provider_class')) {
+ if ($class && array_key_exists($class, $mods)) {
+ $this->addSettings($class);
+ }
+ } elseif ($class = $this->object()->get('provider_class')) {
+ $this->addSettings($class);
+ }
+
+ // TODO: next line looks like obsolete duplicate code to me
+ $this->addSettings();
+ } catch (Exception $e) {
+ $this->getElement('provider_class')->addError($e->getMessage());
+ }
+
+ foreach ($this->object()->getSettings() as $key => $val) {
+ if ($el = $this->getElement($key)) {
+ $el->setValue($val);
+ }
+ }
+
+ $this->setButtons();
+ }
+
+ public function getSetting($name, $default = null)
+ {
+ if ($this->hasBeenSent()) {
+ $value = $this->getSentValue($name);
+ if ($value !== null) {
+ return $value;
+ }
+ }
+ if ($this->isNew()) {
+ $value = $this->getElement($name)->getValue();
+ if ($value === null) {
+ return $default;
+ }
+
+ return $value;
+ }
+
+ return $this->object()->getSetting($name, $default);
+ }
+
+ /**
+ * @return ImportSourceHook
+ * @throws ConfigurationError
+ */
+ protected function getImportSource()
+ {
+ if ($this->importSource === null) {
+ $this->importSource = ImportSourceHook::loadByName(
+ $this->source->get('source_name'),
+ $this->db
+ );
+ }
+
+ return $this->importSource;
+ }
+
+ protected function enumModifiers()
+ {
+ /** @var PropertyModifierHook[] $hooks */
+ $hooks = Hook::all('Director\\PropertyModifier');
+ $enum = [];
+ foreach ($hooks as $hook) {
+ $enum[get_class($hook)] = $hook->getName();
+ }
+
+ asort($enum);
+
+ return $enum;
+ }
+
+ /**
+ * @param null $class
+ */
+ protected function addSettings($class = null)
+ {
+ if ($class === null) {
+ $class = $this->getValue('provider_class');
+ }
+
+ if ($class !== null) {
+ if (! class_exists($class)) {
+ throw new RuntimeException(sprintf(
+ 'The hooked class "%s" for this property modifier does no longer exist',
+ $class
+ ));
+ }
+
+ $class::addSettingsFormFields($this);
+ }
+ }
+
+ public function setSource(ImportSource $source)
+ {
+ $this->source = $source;
+
+ return $this;
+ }
+}