addHtml(sprintf('
%s
', $this->getView()->escape($this->rule->rule_name)));
$this->addHidden('rule_id', $this->rule_id);
$this->addElement('select', 'source_id', array(
'label' => $this->translate('Source Name'),
'multiOptions' => $this->enumImportSource(),
'required' => true,
'class' => 'autosubmit',
));
if (! $this->hasObject() && ! $this->getSentValue('source_id')) {
return;
}
$this->addElement('select', 'destination_field', array(
'label' => $this->translate('Destination Field'),
'multiOptions' => $this->optionalEnum($this->listDestinationFields()),
'required' => true,
'class' => 'autosubmit',
));
if ($this->getSentValue('destination_field')) {
$destination = $this->getSentValue('destination_field');
} elseif ($this->hasObject()) {
$destination = $this->getObject()->destination_field;
} else {
return;
}
$isCustomvar = substr($destination, 0, 5) === 'vars.';
if ($isCustomvar) {
$varname = substr($destination, 5);
$this->addElement('text', 'customvar', array(
'label' => $this->translate('Custom variable'),
'required' => true,
'ignore' => true,
));
if ($varname !== '*') {
$this->setElementValue('destination_field', 'vars.*');
$this->setElementValue('customvar', $varname);
if ($this->hasObject()) {
$this->getObject()->destination_field = 'vars.*';
}
}
}
if ($destination === 'import') {
$templates = $this->db->enumHostTemplates(); // ERR. type!
$templates = array_combine($templates, $templates);
$this->addElement('select', 'source_expression', array(
'label' => $this->translate('Template'), // Objecttype?
'multiOptions' => $this->optionalEnum($templates),
'required' => true,
'class' => 'autosubmit',
));
} else {
$this->addSourceColumnElement();
}
if ($this->hasObject()) {
if (($col = $this->getObject()->getSourceColumn()) === null) {
$this->setElementValue('source_column', self::EXPRESSION);
$this->addElement('text', 'source_expression', array(
'label' => $this->translate('Source Expression'),
'required' => true,
));
if ($this->getSentValue('source_column') === '${' . self::EXPRESSION . '}') {
unset($this->source_column);
}
} else {
$this->setElementValue('source_column', $col);
}
}
if ($this->getSentValue('source_column') === self::EXPRESSION) {
$this->addElement('text', 'source_expression', array(
'label' => $this->translate('Source Expression'),
'required' => true,
));
if ($this->getSentValue('source_column') === '${' . self::EXPRESSION . '}') {
unset($this->source_column);
}
}
/*
if ($this->hasObject()) {
// TODO: Add up/down links to table
$this->addElement('text', 'priority', array(
'label' => $this->translate('Priority'),
'description' => $this->translate('Priority for the specified source expression'),
'required' => true,
));
}
*/
/*
TODO: Filter should be a modifier
$this->addElement('select', 'use_filter', array(
'label' => $this->translate('Filter values'),
'description' => $this->translate('Whether you want to merge or replace the destination field. Makes no difference for strings'),
'required' => true,
'multiOptions' => $this->optionalEnum(array(
'y' => 'merge',
'n' => 'replace'
))
));
$this->addElement('text', 'filter_expression', array(
'label' => $this->translate('Filter Expression'),
'description' => $this->translate('This allows to filter for specific parts within the given source expression'),
'required' => false,
// TODO: validate filter
));
*/
if ($isCustomvar) {
$this->addElement('select', 'merge_policy', array(
'label' => $this->translate('Merge Policy'),
'description' => $this->translate('Whether you want to merge or replace the destination field. Makes no difference for strings'),
'required' => true,
'multiOptions' => $this->optionalEnum(array(
'merge' => 'merge',
'override' => 'replace'
))
));
} else {
$this->addHidden('merge_policy', 'override');
}
$this->setButtons();
}
protected function addSourceColumnElement()
{
$error = false;
try {
$data = $this->listSourceColumns();
} catch (Exception $e) {
$data = array();
$error = sprintf(
$this->translate('Unable to fetch data: %s'),
$e->getMessage()
);
}
$this->addElement('select', 'source_column', array(
'label' => $this->translate('Source Column'),
// TODO: List them as ${} ?
'multiOptions' => $this->optionalEnum($data),
'required' => true,
'class' => 'autosubmit',
));
if ($error) {
$this->getElement('source_column')->addError($error);
}
return $this;
}
protected function enumImportSource()
{
$sources = $this->db->enumImportSource();
$usedIds = $this->rule->listInvolvedSourceIds();
if (empty($usedIds)) {
return $this->optionalEnum($sources);
}
$usedSources = array();
foreach ($usedIds as $id) {
$usedSources[$id] = $sources[$id];
unset($sources[$id]);
}
if (empty($sources)) {
return $this->optionalEnum($usedSources);
}
return $this->optionalEnum(
array(
$this->translate('Used sources') => $usedSources,
$this->translate('Other sources') => $sources
)
);
}
protected function listSourceColumns()
{
$columns = $this->getImportSource()->listColumns();
$columns = array_combine($columns, $columns);
$columns[self::EXPRESSION] = $this->translate('Custom expression');
return $columns;
}
protected function listDestinationFields()
{
$fields = array();
$dummy = $this->dummyObject();
if ($dummy instanceof IcingaObject) {
if ($dummy->supportsCustomvars()) {
$fields['vars.*'] = $this->translate('Custom variable (vars.)');
}
if ($dummy->supportsImports()) {
$fields['import'] = $this->translate('Inheritance (import)');
}
}
foreach ($dummy->listProperties() as $prop) {
if ($prop === 'id') continue;
// TODO: allow those fields, but munge them (store ids)
//if (preg_match('~_id$~', $prop)) continue;
$fields[$prop] = $prop;
}
return $fields;
}
protected function getImportSource()
{
if ($this->importSource === null) {
if ($this->hasObject()) {
$src = ImportSource::load($this->object->source_id, $this->db);
} else {
$src = ImportSource::load($this->getSentValue('source_id'), $this->db);
}
$this->importSource = ImportSourceHook::loadByName($src->source_name, $this->db);
}
return $this->importSource;
}
public function onSuccess()
{
$sourceColumn = $this->getValue('source_column');
if ($sourceColumn === self::EXPRESSION) {
unset($this->source_column);
$this->removeElement('source_column');
} else {
if (! $this->getElement('source_expression')) {
$this->addHidden('source_expression', '${' . $sourceColumn . '}');
}
}
$object = $this->getObject();
$object->rule_id = $this->rule->id; // ?!
$destination = $this->getValue('destination_field');
if ($destination === 'vars.*') {
$destination = $this->getValue('customvar');
$object->destination_field = 'vars.' . $destination;
}
if ($object->hasBeenModified()) {
if (! $object->hasBeenLoadedFromDb()) {
$object->priority = $this->rule->getPriorityForNextProperty();
}
}
return parent::onSuccess();
}
protected function dummyObject()
{
if ($this->dummyObject === null) {
$this->dummyObject = IcingaObject::createByType(
$this->rule->object_type,
array(),
$this->db
);
}
return $this->dummyObject;
}
public function setRule(SyncRule $rule)
{
$this->rule = $rule;
return $this;
}
}