diff options
Diffstat (limited to 'library/Director/Web/Form/Filter/QueryColumnsFromSql.php')
-rw-r--r-- | library/Director/Web/Form/Filter/QueryColumnsFromSql.php | 48 |
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))); + } +} |