DirectorObjectForm: reorganize, simplify, improve

This commit is contained in:
Thomas Gelf 2015-07-31 14:51:41 +02:00
parent f5bf209a8a
commit 591d933929
1 changed files with 229 additions and 155 deletions

View File

@ -41,22 +41,62 @@ abstract class DirectorObjectForm extends QuickForm
return; return;
} }
if ($object->supportsCustomVars()) {
$this->addElement('note', '_newvar_hint', array('label' => 'New custom variable'));
$this->addElement('text', '_newvar_name', array(
'label' => 'Name'
));
$this->addElement('text', '_newvar_value', array(
'label' => 'Value'
));
$this->addElement('select', '_newvar_format', array(
'label' => 'Type',
'multiOptions' => array('string' => $this->translate('String'))
));
} }
if (false && $object->supportsRanges()) { protected function isTemplate()
/* TODO implement when new logic is there {
return $this->objectType === 'template';
}
protected function handleImports($object, & $values)
{
if (! $object->supportsImports()) {
return;
}
if (array_key_exists('imports', $values)) {
$value = $values['imports'];
unset($values['imports']);
$object->clearImportedObjects();
$object->imports()->set($value);
}
$el = $this->getElement('imports');
if ($el) {
$el->setMultiOptions($this->enumAllowedTemplates());
$el->setValue($object->imports()->listImportNames());
}
}
protected function handleRanges($object, & $values)
{
if (! $object->supportsRanges()) {
return;
}
$key = 'ranges';
$object = $this->object();
/* Sample:
array(
'monday' => 'eins',
'tuesday' => '00:00-24:00',
'sunday' => 'zwei',
);
*/
if (array_key_exists($key, $values)) {
$object->ranges()->set($values[$key]);
unset($values[$key]);
}
foreach ($object->ranges()->getRanges() as $key => $value) {
$this->addRange($key, $value);
}
/*
// TODO implement when new logic is there
$this->addElement('note', '_newrange_hint', array('label' => 'New range')); $this->addElement('note', '_newrange_hint', array('label' => 'New range'));
$this->addElement('text', '_newrange_name', array( $this->addElement('text', '_newrange_name', array(
'label' => 'Name' 'label' => 'Name'
@ -66,30 +106,59 @@ abstract class DirectorObjectForm extends QuickForm
)); ));
*/ */
} }
protected function handleGroups($object, & $values)
{
if (! $object->supportsGroups()) {
return;
} }
protected function isTemplate()
{
return $this->objectType === 'template';
}
protected function handleIcingaObject(& $values)
{
$object = $this->object();
$handled = array();
if ($object->supportsGroups()) {
if (array_key_exists('groups', $values)) { if (array_key_exists('groups', $values)) {
$object->groups()->set( $value = $values['groups'];
preg_split('/\s*,\s*/', $values['groups'], -1, PREG_SPLIT_NO_EMPTY) unset($values['groups']);
);
$handled['groups'] = true; // TODO: Drop this once we have arrays everwhere
if (is_string($value)) {
$value = preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
}
$object->groups()->set($value);
} }
} }
if ($object->supportsCustomVars()) { protected function handleProperties($object, & $values)
{
if ($this->hasBeenSent()) {
$object->setProperties($values);
}
$props = $object->getProperties();
if (! $object instanceof IcingaObject) {
$this->setDefaults($props);
return $this;
}
$inherited = $object->getInheritedProperties();
$origins = $object->getOriginsProperties();
foreach ($props as $k => $v) {
if (property_exists($inherited, $k)) {
$this->setElementValue($k, $v, $inherited->$k, $origins->$k);
} else {
$this->setElementValue($k, $v);
}
}
}
protected function handleCustomVars($object, & $values)
{
if (! $object->supportsCustomVars()) {
return;
}
if ($this->hasBeenSent()) {
$vars = array(); $vars = array();
$handled = array();
$newvar = array( $newvar = array(
'type' => 'string', 'type' => 'string',
'name' => null, 'name' => null,
@ -109,67 +178,93 @@ abstract class DirectorObjectForm extends QuickForm
} }
foreach ($vars as $k => $v) { foreach ($vars as $k => $v) {
$this->object->vars()->$k = $v; if ($v === '' || $v === null) {
unset($object->vars()->$k);
} else {
$object->vars()->$k = $v;
}
} }
if ($newvar['name'] && $newvar['value']) { if ($newvar['name'] && $newvar['value']) {
$this->object->vars()->{$newvar['name']} = $newvar['value']; $object->vars()->{$newvar['name']} = $newvar['value'];
}
} }
if ($object->supportsImports()) { foreach ($handled as $key) {
if (array_key_exists('imports', $values)) {
$value = $values['imports'];
// TODO: Compat for comma separated string, check if still needed
if (! is_array($value)) {
$value = preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
}
$object->imports()->set($value);
$handled['imports'] = true;
$object->clearImportedObjects();
}
}
if ($object->supportsRanges()) {
$object->ranges()->set(array(
'monday' => 'eins',
'tuesday' => '00:00-24:00',
'sunday' => 'zwei',
));
}
foreach ($handled as $key => $value) {
unset($values[$key]); unset($values[$key]);
} }
} }
$vars = $object->getVars();
$fields = $object->getResolvedFields();
$inherits = $object->getInheritedVars();
$origins = $object->getOriginsVars();
foreach ($fields as $field) {
$varname = $field->varname;
// Get value from the related varname if set:
if (property_exists($vars, $varname)) {
$value = $vars->$varname;
} else {
$value = null;
}
if (property_exists($inherits, $varname)) {
$inheritedValue = $inherits->$varname;
$inheritFrom = $origins->$varname;
if ($inheritFrom === $object->object_name) {
$inherited = false;
} else {
$inherited = true;
}
} else {
$inheritedValue = null;
$inheritFrom = false;
$inherited = false;
}
$this->addField($field, $value, $inheritedValue, $inheritFrom);
}
// Additional vars
foreach ($vars as $key => $value) {
// Did we already create a field for this var? Then skip it:
if (array_key_exists($key, $fields)) {
continue;
}
// Show inheritance information in case we inherited this var:
if (isset($inherited->$key)) {
$this->addCustomVar($key, $value, $inherited->$key, $origins->$key);
} else {
$this->addCustomVar($key, $value);
}
}
if ($object->isTemplate()) {
$this->addHtml('<h3>Add a custom variable</h3>');
$this->addElement('text', '_newvar_name', array(
'label' => 'Name'
));
$this->addElement('text', '_newvar_value', array(
'label' => 'Value'
));
$this->addElement('select', '_newvar_format', array(
'label' => 'Type',
'multiOptions' => array('string' => $this->translate('String'))
));
}
}
public function setObjectType($type) public function setObjectType($type)
{ {
$this->objectType = $type; $this->objectType = $type;
return $this; return $this;
} }
public function addFields() protected function addField($field, $value = null, $inherited = null, $inheritedFrom = null)
{
$object = $this->object();
$fields = $object->getResolvedFields();
$vars = $object->vars();
foreach ($fields as $field) {
$varname = $field->varname;
if (isset($vars->$varname)) {
$value = $vars->{$varname}->getValue();
} else {
$value = null;
}
$inherited = null; // Just testing
$this->addField($field, $value, $inherited);
}
}
protected function addField($field, $value = null, $inherited = null)
{ {
$datafield = DirectorDatafield::load($field->datafield_id, $this->getDb()); $datafield = DirectorDatafield::load($field->datafield_id, $this->getDb());
$datatype = new $datafield->datatype; $datatype = new $datafield->datatype;
@ -181,15 +276,17 @@ $inherited = null; // Just testing
$el->setLabel($datafield->caption); $el->setLabel($datafield->caption);
$el->setDescription($datafield->description); $el->setDescription($datafield->description);
if ($field->is_required === 'y') { if ($field->is_required === 'y' && ! $this->isTemplate()) {
$el->setRequired(true); $el->setRequired(true);
} }
$this->addElement($el); $this->addElement($el);
$this->setElementValue($name, $value, $inherited); $this->setElementValue($name, $value, $inherited, $inheritedFrom);
return $el;
} }
protected function setElementValue($name, $value = null, $inherited = null) protected function setElementValue($name, $value = null, $inherited = null, $inheritedFrom = null)
{ {
$el = $this->getElement($name); $el = $this->getElement($name);
if (! $el) { if (! $el) {
@ -200,44 +297,38 @@ $inherited = null; // Just testing
$el->setValue($value); $el->setValue($value);
} }
if ($inherited === null) { if ($inherited === null || empty($inherited)) {
return; return;
} }
$strInherited = $this->translate('(inherited)');
if ($el instanceof Zf_Select) { if ($el instanceof Zf_Select) {
$multi = $el->getMultiOptions(); $multi = $el->getMultiOptions();
if (array_key_exists($inherited, $multi)) { if (array_key_exists($inherited, $multi)) {
$multi[null] = $multi[$inherited] . ' ' . $strInherited; $multi[null] = $multi[$inherited] . sprintf(' (%s)', $inheritedFrom);
} else { } else {
$multi[null] = $strInherited; $multi[null] = $this->translate('- inherited -');
} }
$el->setMultiOptions($multi); $el->setMultiOptions($multi);
} else { } else {
$el->setAttrib('placeholder', $inherited . ' ' . $strInherited); $el->setAttrib('placeholder', $inherited . sprintf(' (%s)', $inheritedFrom));
} }
} }
public function onSuccess() public function onSuccess()
{ {
$object = $this->object; $object = $this->object();
$values = $this->getValues(); if ($object->hasBeenModified()) {
if ($object instanceof IcingaObject) {
$this->handleIcingaObject($values);
if (! array_key_exists('object_type', $values)) {
$object->object_type = $this->objectType;
}
}
$object->setProperties($values);
$msg = sprintf( $msg = sprintf(
$object->hasBeenLoadedFromDb() $object->hasBeenLoadedFromDb()
? 'The Icinga %s has successfully been stored' ? $this->translate('The Icinga %s has successfully been stored')
: 'A new Icinga %s has successfully been created', : $this->translate('A new Icinga %s has successfully been created'),
$this->translate($this->getObjectName()) $this->translate($this->getObjectName())
); );
$object->store($this->db); $object->store($this->db);
} else {
$msg = $this->translate('No action taken, object has not been modified');
}
$this->redirectOnSuccess($msg); $this->redirectOnSuccess($msg);
} }
@ -288,71 +379,54 @@ $inherited = null; // Just testing
return $this->objectName; return $this->objectName;
} }
protected function onRequest()
{
$object = $this->object();
$values = array();
if ($this->hasBeenSent()) {
$post = $this->getRequest()->getPost();
foreach ($post as $key => $value) {
$el = $this->getElement($key);
if ($el && ! $el->getIgnore()) {
$values[$key] = $value;
}
}
}
if ($object instanceof IcingaObject) {
if (! $object->hasBeenLoadedFromDb()) {
$object->object_type = $this->objectType;
}
$this->handleImports($object, $values);
$this->handleCustomVars($object, $values);
$this->handleGroups($object, $values);
$this->handleRanges($object, $values);
}
$this->handleProperties($object, $values);
$this->moveSubmitToBottom();
}
public function loadObject($id) public function loadObject($id)
{ {
$class = $this->getObjectClassname(); $class = $this->getObjectClassname();
$object = $this->object = $class::load($id, $this->db); $this->object = $class::load($id, $this->db);
if ($object instanceof IcingaObject) {
$this->objectType = $object->object_type;
}
// TODO: hmmmm...
if (! is_array($id)) { if (! is_array($id)) {
$this->addHidden('id'); $this->addHidden('id');
} }
$this->prepareElements();
$props = $object->getProperties();
if (! $object instanceof IcingaObject) {
$this->setDefaults($props);
return $this;
}
$inherited = $this->object->getInheritedProperties();
foreach ($props as $k => $v) {
$i = property_exists($inherited, $k) ? $inherited->$k : null;
$this->setElementValue($k, $v, $i);
}
if ($object->supportsGroups()) {
$this->getElement('groups')->setValue(
implode(', ', $object->groups()->listGroupNames())
);
}
if ($object->supportsImports()) {
$el = $this->getElement('imports');
if ($el) {
$el->setMultiOptions($this->enumAllowedTemplates());
$el->setValue($object->imports()->listImportNames());
}
}
if ($object->supportsFields() && ! $object->isTemplate()) {
foreach ($this->object->vars() as $key => $value) {
$this->addCustomVar($key, $value);
}
}
if ($object->supportsRanges()) {
/* TODO implement when new logic for customvars is there
foreach ($this->object->ranges()->getRanges() as $key => $value) {
$this->addRange($key, $value);
}
*/
}
$this->moveSubmitToBottom();
return $this; return $this;
} }
protected function addCustomVar($key, $range) protected function addCustomVar($key, $value, $inherited = null, $inheritedFrom = null)
{ {
$this->addElement('text', 'var_' . $key, array( $label = 'vars.' . $key;
'label' => 'vars.' . $key, $key = 'var_' . $key;
'value' => $range->getValue() $this->addElement('text', $key, array('label' => $label));
)); $this->setElementValue($key, $value, $inherited, $inheritedFrom);
} }
protected function addRange($key, $range) protected function addRange($key, $range)