diff options
Diffstat (limited to 'application/forms/Config')
-rw-r--r-- | application/forms/Config/TtsIntegrationConfigForm.php | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/application/forms/Config/TtsIntegrationConfigForm.php b/application/forms/Config/TtsIntegrationConfigForm.php new file mode 100644 index 0000000..2bdb562 --- /dev/null +++ b/application/forms/Config/TtsIntegrationConfigForm.php @@ -0,0 +1,249 @@ +<?php + +/* Icinga Web 2 | (c) 2016 Icinga Development Team | GPLv2+ */ + +namespace Icinga\Module\Generictts\Forms\Config; + +use Zend_Validate_Callback; +use Icinga\Exception\AlreadyExistsException; +use Icinga\Exception\IcingaException; +use Icinga\Exception\NotFoundError; +use Icinga\Forms\ConfigForm; +use Icinga\Web\Form\Validator\UrlValidator; +use Icinga\Web\Notification; + +/** + * Form for managing trouble ticket system integrations + */ +class TtsIntegrationConfigForm extends ConfigForm +{ + /** + * Name of the integration if the form is bound to one + * + * @var string + */ + protected $boundIntegration; + + /** + * {@inheritdoc} + */ + public function init() + { + $this->setName('form_config_generictts_tts_integrations'); + } + + /** + * {@inheritdoc} + */ + public function createElements(array $formData) + { + $this->addElement( + 'text', + 'name', + array( + 'description' => $this->translate('The name of the TTS integration'), + 'label' => $this->translate('Name'), + 'required' => true + ) + ); + + $patternValidator = new Zend_Validate_Callback(function ($value) { + return @preg_match($value, '') !== false; + }); + $patternValidator->setMessage( + $this->translate('"%value%" is not a valid regular expression.'), + Zend_Validate_Callback::INVALID_VALUE + ); + $this->addElement( + 'text', + 'pattern', + array( + 'value' => '/this-will-not-match(\d{3-6})/', + 'label' => $this->translate('Ticket Pattern'), + 'description' => $this->translate( + 'The pattern to extract ticket IDs from comments.' + . ' The ticket pattern must be a valid regular expression' + ), + 'required' => true, + 'validators' => array($patternValidator) + ) + ); + + $urlValidator = new Zend_Validate_Callback(function ($value) { + return strpos($value, '$1') !== false; + }); + $urlValidator->setMessage( + $this->translate('The URL must contain the placeholder $1 to be substituted with a ticket ID.'), + Zend_Validate_Callback::INVALID_VALUE + ); + $this->addElement( + 'text', + 'url', + array( + 'value' => 'http://no-such-domain.example.com/ticket?id=$1', + 'label' => $this->translate('TTS Ticket URL'), + 'description' => $this->translate( + 'The URL pointing to the TTS with $1 as the placeholder for the ticket ID' + ), + 'required' => true, + 'validators' => array($urlValidator, new UrlValidator()) + ) + ); + } + + /** + * {@inheritdoc} + */ + public function getSubmitLabel() + { + if (($submitLabel = parent::getSubmitLabel()) === null) { + if ($this->boundIntegration === null) { + $submitLabel = $this->translate('Integrate'); + } else { + $submitLabel = $this->translate('Update Integration'); + } + } + return $submitLabel; + } + + /** + * {@inheritdoc} + */ + public function onRequest() + { + // The base class implementation does not make sense here. We're not populating the whole configuration but + // only a section + return; + } + + /** + * {@inheritdoc} + */ + public function onSuccess() + { + $name = $this->getElement('name')->getValue(); + $values = array( + 'pattern' => $this->getElement('pattern')->getValue(), + 'url' => $this->getElement('url')->getValue() + ); + if ($this->boundIntegration === null) { + $successNotification = $this->translate('TTS integrated'); + try { + $this->add($name, $values); + } catch (AlreadyExistsException $e) { + $this->addError($e->getMessage()); + return false; + } + } else { + $successNotification = $this->translate('TTS integration updated'); + try { + $this->update($name, $values, $this->boundIntegration); + } catch (IcingaException $e) { + // Exception may be AlreadyExistsException or NotFoundError + $this->addError($e->getMessage()); + return false; + } + } + if ($this->save()) { + Notification::success($successNotification); + return true; + } + return false; + } + + /** + * Add a TTS integration + * + * @param string $name The name of the integration + * @param array $values + * + * @return $this + * + * @throws AlreadyExistsException If the integration to add already exists + */ + public function add($name, array $values) + { + if ($this->config->hasSection($name)) { + throw new AlreadyExistsException( + $this->translate('Can\'t add integration \'%s\'. Integration already exists'), + $name + ); + } + $this->config->setSection($name, $values); + return $this; + } + + /** + * Bind integration to this form + * + * @param string $name The name of the integration + * + * @return $this + * + * @throws NotFoundError If the given integration does not exist + */ + public function bind($name) + { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t load integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->boundIntegration = $name; + $integration = $this->config->getSection($name)->toArray(); + $integration['name'] = $name; + $this->populate($integration); + return $this; + } + + /** + * Remove a TTS integration + * + * @param string $name The name of the integration + * + * @return $this + * + * @throws NotFoundError If the role does not exist + */ + public function remove($name) + { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t remove integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->config->removeSection($name); + return $this; + } + + /** + * Update a TTS integration + * + * @param string $name The possibly new name of the integration + * @param array $values + * @param string $oldName The name of the integration to update + * + * @return $this + * + * @throws NotFoundError If the integration to update does not exist + */ + public function update($name, array $values, $oldName) + { + if ($name !== $oldName) { + // The integration got a new name + $this->remove($oldName); + $this->add($name, $values); + } else { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t update integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->config->setSection($name, $values); + } + return $this; + } +} |