summaryrefslogtreecommitdiffstats
path: root/library/Director/Web/Form/Filter/QueryColumnsFromSql.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Web/Form/Filter/QueryColumnsFromSql.php')
-rw-r--r--library/Director/Web/Form/Filter/QueryColumnsFromSql.php48
1 files changed, 48 insertions, 0 deletions
diff --git a/library/Director/Web/Form/Filter/QueryColumnsFromSql.php b/library/Director/Web/Form/Filter/QueryColumnsFromSql.php
new file mode 100644
index 0000000..6f6d475
--- /dev/null
+++ b/library/Director/Web/Form/Filter/QueryColumnsFromSql.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Icinga\Module\Director\Web\Form\Filter;
+
+use Exception;
+use Icinga\Data\Db\DbConnection;
+use Icinga\Module\Director\Forms\ImportSourceForm;
+use Zend_Filter_Interface;
+
+class QueryColumnsFromSql implements Zend_Filter_Interface
+{
+ /** @var ImportSourceForm */
+ private $form;
+
+ public function __construct(ImportSourceForm $form)
+ {
+ $this->form = $form;
+ }
+
+ public function filter($value)
+ {
+ $form = $this->form;
+ if (empty($value) || $form->hasChangedSetting('query')) {
+ try {
+ return implode(
+ ', ',
+ $this->getQueryColumns($form->getSentOrObjectSetting('query'))
+ );
+ } catch (Exception $e) {
+ $this->form->addUniqueException($e);
+ return '';
+ }
+ } else {
+ return $value;
+ }
+ }
+
+ protected function getQueryColumns($query)
+ {
+ $resourceName = $this->form->getSentOrObjectSetting('resource');
+ if (! $resourceName) {
+ return [];
+ }
+ $db = DbConnection::fromResourceName($resourceName)->getDbAdapter();
+
+ return array_keys((array) current($db->fetchAll($query)));
+ }
+}