icingaweb2-module-director/library/Director/Import/ImportSourceSql.php

74 lines
2.1 KiB
PHP

<?php
namespace Icinga\Module\Director\Import;
use Icinga\Data\Db\DbConnection;
use Icinga\Module\Director\Forms\ImportSourceForm;
use Icinga\Module\Director\Hook\ImportSourceHook;
use Icinga\Module\Director\Objects\ImportSource;
use Icinga\Module\Director\Util;
use Icinga\Module\Director\Web\Form\Filter\QueryColumnsFromSql;
use Icinga\Module\Director\Web\Form\QuickForm;
use dipl\Html\Html;
class ImportSourceSql extends ImportSourceHook
{
protected $db;
public function fetchData()
{
return $this->db()->fetchAll($this->settings['query']);
}
public function listColumns()
{
if ($columns = $this->getSetting('column_cache')) {
return explode(', ', $columns);
} else {
return array_keys((array) current($this->fetchData()));
}
}
public static function addSettingsFormFields(QuickForm $form)
{
/** @var ImportSourceForm $form */
Util::addDbResourceFormElement($form, 'resource');
/** @var ImportSource $current */
$current = $form->getObject();
$form->addElement('textarea', 'query', [
'label' => $form->translate('DB Query'),
'required' => true,
'rows' => 15,
]);
$form->addElement('hidden', 'column_cache', [
'value' => '',
'filters' => [new QueryColumnsFromSql($form)],
'required' => true
]);
if ($current) {
if ($columns = $current->getSetting('column_cache')) {
$form->addHtmlHint('Columns: ' . $columns);
} else {
$form->addHtmlHint(Html::tag(
'p',
['class' => 'warning'],
$form->translate(
'Please click "Store" once again to determine query columns'
)
));
}
}
return $form;
}
protected function db()
{
if ($this->db === null) {
$this->db = DbConnection::fromResourceName($this->settings['resource'])->getDbAdapter();
}
return $this->db;
}
}