diff --git a/include/class.dynamic_forms.php b/include/class.dynamic_forms.php index af720ee561897314ced793fe9f2821d2aed7f743..5452b71472086a8acc275f9d5414f93a43cefe63 100644 --- a/include/class.dynamic_forms.php +++ b/include/class.dynamic_forms.php @@ -963,16 +963,9 @@ class SelectionField extends FormField { $config = $this->getConfiguration(); $choices = $this->getChoices(); $selection = array(); - if ($config['typeahead']) { - // Entered value - $val = $this->getWidget()->getEnteredValue(); - if (($i=$list->getItem($val)) && $i->getId() == $value) - $selection[$i->getId()] = $i->getValue(); - elseif ($val && isset($choices[$value])) //perhaps old deleted item... - $selection[$value] = $choices[$value]; - } elseif ($value && is_array($value)) { - foreach ($value as $v) { - if (($i=$list->getItem((int) $v))) + if ($value && is_array($value)) { + foreach ($value as $k=>$v) { + if (($i=$list->getItem((int) $k))) $selection[$i->getId()] = $i->getValue(); elseif (isset($choices[$v])) $selection[$v] = $choices[$v]; @@ -995,8 +988,14 @@ class SelectionField extends FormField { } function to_php($value, $id=false) { - return ($value && !is_array($value)) + $value = ($value && !is_array($value)) ? JsonDataParser::parse($value) : $value; + if (!is_array($value)) { + $choices = $this->getChoices(); + if (isset($choices[$value])) + $value = $choices[$value]; + } + return $value; } function hasIdValue() { @@ -1082,6 +1081,18 @@ class SelectionField extends FormField { return $this->_choices; } + function getChoice($value) { + $choices = $this->getChoices(); + if ($value && is_array($value)) { + $selection = $value; + } elseif (isset($choices[$value])) + $selection[] = $choices[$value]; + elseif ($this->get('default')) + $selection[] = $choices[$this->get('default')]; + + return $selection; + } + function export($value) { if ($value && is_numeric($value) && ($item = DynamicListItem::lookup($value))) @@ -1102,18 +1113,14 @@ class SelectionWidget extends ChoicesWidget { function render($mode=false) { $config = $this->field->getConfiguration(); - if (($value=$this->getValue())) - $value = $this->field->parse($value); - elseif ($this->value) - $value = $this->value; + $value = $this->value; if (!$config['typeahead'] || $mode=='search') { - $this->value = $value; return parent::render($mode); } if ($value && is_array($value)) { - $name = current($value); + $name = $this->getEnteredValue() ?: current($value); $value = key($value); } @@ -1127,20 +1134,23 @@ class SelectionWidget extends ChoicesWidget { ); ?> <span style="display:inline-block"> - <input type="text" size="30" name="<?php echo $this->name; ?>" - id="<?php echo $this->name; ?>" value="<?php echo $name; ?>" + <input type="text" size="30" name="<?php echo $this->name; ?>_name" + id="<?php echo $this->name; ?>" value="<?php echo Format::htmlchars($name); ?>" placeholder="<?php echo $config['prompt']; ?>" autocomplete="off" /> <input type="hidden" name="<?php echo $this->name; - ?>_id" id="<?php echo $this->name; ?>_id" value="<?php echo $value; ?>"/> + ?>[<?php echo $value; ?>]" id="<?php echo $this->name; + ?>_id" value="<?php echo Format::htmlchars($name); ?>"/> <script type="text/javascript"> $(function() { $('input#<?php echo $this->name; ?>').typeahead({ source: <?php echo JsonDataEncoder::encode($source); ?>, property: 'info', onselect: function(item) { - $('input#<?php echo $this->name; ?>').val(item['value']) - $('input#<?php echo $this->name; ?>_id').val(item['id']) + $('input#<?php echo $this->name; ?>_name').val(item['value']) + $('input#<?php echo $this->name; ?>_id') + .attr('name', '<?php echo $this->name; ?>[' + item['id'] + ']') + .val(item['value']); } }); }); @@ -1149,16 +1159,11 @@ class SelectionWidget extends ChoicesWidget { <?php } - function getValue() { - $data = $this->field->getSource(); - // Search for HTML form name first - if (isset($data[$this->name.'_id'])) - return (int) $data[$this->name.'_id']; - return parent::getValue(); - } - function getEnteredValue() { // Used to verify typeahead fields + $data = $this->field->getSource(); + if (isset($data[$this->name.'_name'])) + return trim($data[$this->name.'_name']); return parent::getValue(); } }