diff options
Diffstat (limited to 'library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php')
-rw-r--r-- | library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php b/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php new file mode 100644 index 0000000..1485d5d --- /dev/null +++ b/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php @@ -0,0 +1,147 @@ +<?php + +namespace Icinga\Module\Director\PropertyModifier; + +use Icinga\Data\Filter\FilterExpression; +use Icinga\Exception\ConfigurationError; +use Icinga\Module\Director\Hook\PropertyModifierHook; +use Icinga\Module\Director\Web\Form\QuickForm; + +class PropertyModifierRejectOrSelect extends PropertyModifierHook +{ + /** @var FilterExpression */ + private $filterExpression; + + public function getName() + { + return mt('director', 'Reject or keep rows based on property value'); + } + + /** + * @inheritdoc + * @throws \Zend_Form_Exception + */ + public static function addSettingsFormFields(QuickForm $form) + { + $form->addElement('select', 'filter_method', [ + 'label' => $form->translate('Filter method'), + 'required' => true, + 'value' => 'wildcard', + 'multiOptions' => $form->optionalEnum([ + 'wildcard' => $form->translate('Simple match with wildcards (*)'), + 'regex' => $form->translate('Regular Expression'), + 'is_true' => $form->translate('Match boolean TRUE'), + 'is_false' => $form->translate('Match boolean FALSE'), + 'is_null' => $form->translate('Match NULL value columns'), + ]), + 'class' => 'autosubmit', + ]); + + $method = $form->getSetting('filter_method'); + switch ($method) { + case 'wildcard': + $form->addElement('text', 'filter_string', [ + 'label' => $form->translate('Filter'), + 'description' => $form->translate( + 'The string/pattern you want to search for, use wildcard' + . ' matches like www.* or *linux*' + ), + 'required' => true, + ]); + break; + case 'regex': + $form->addElement('text', 'filter_string', [ + 'label' => $form->translate('Filter'), + 'description' => $form->translate( + 'The string/pattern you want to search for, use regular' + . ' expression like /^www\d+\./' + ), + 'required' => true, + ]); + break; + } + + $form->addElement('select', 'policy', [ + 'label' => $form->translate('Policy'), + 'required' => true, + 'description' => $form->translate( + 'What should happen with the row, when this property matches the given expression?' + ), + 'value' => 'reject', + 'multiOptions' => [ + 'reject' => $form->translate('Reject the whole row'), + 'keep' => $form->translate('Keep only matching rows'), + ], + ]); + } + + public function matchesRegexp($string, $expression) + { + return preg_match($expression, $string); + } + + public function isNull($string, $expression) + { + return $string === null; + } + + public function isTrue($string, $expression) + { + return $string === true; + } + + public function isFalse($string, $expression) + { + return $string === false; + } + + public function matchesWildcard($string, $expression) + { + return $this->filterExpression->matches( + (object) ['value' => $string] + ); + } + + public function transform($value) + { + $method = $this->getSetting('filter_method'); + $filter = $this->getSetting('filter_string'); + $policy = $this->getSetting('policy'); + + switch ($method) { + case 'wildcard': + $func = 'matchesWildcard'; + $this->filterExpression = new FilterExpression('value', '=', $filter); + break; + case 'regex': + $func = 'matchesRegexp'; + break; + case 'is_null': + $func = 'isNull'; + break; + case 'is_true': + $func = 'isTrue'; + break; + case 'is_false': + $func = 'isFalse'; + break; + default: + throw new ConfigurationError( + '%s is not a valid value for an ArrayFilter filter_method', + var_export($method, 1) + ); + } + + if ($this->$func($value, $filter)) { + if ($policy === 'reject') { + $this->rejectRow(); + } + } else { + if ($policy === 'keep') { + $this->rejectRow(); + } + } + + return $value; + } +} |