Commit 7b63bf0e authored by Ad Schellevis's avatar Ad Schellevis

(mvc) extend InterfaceField type to support multiple interface selection

parent 5bf6420b
......@@ -29,8 +29,9 @@
*/
namespace OPNsense\Base\FieldTypes;
use OPNsense\Core\Config;
use Phalcon\Validation\Validator\InclusionIn;
use OPNsense\Core\Config;
use OPNsense\Base\Validators\CsvListValidator;
/**
* Class InterfaceField field type to select usable interfaces, currently this is kind of a backward compatibility
......@@ -59,6 +60,11 @@ class InterfaceField extends BaseField
*/
private $internalCacheKey = '*';
/**
* @var bool field may contain multiple interfaces at once
*/
private $internalMultiSelect = false;
/**
* generate validation data (list of interfaces and well know ports)
*/
......@@ -113,6 +119,19 @@ class InterfaceField extends BaseField
}
}
/**
* select if multiple interfaces may be selected at once
* @param $value boolean value 0/1
*/
public function setmultiple($value)
{
if ($value == 1) {
$this->internalMultiSelect = true;
} else {
$this->internalMultiSelect = false;
}
}
/**
* get valid options, descriptions and selected value
* @return array
......@@ -125,8 +144,10 @@ class InterfaceField extends BaseField
$result[""] = array("value"=>"none", "selected" => 0);
}
// explode interfaces
$interfaces = explode(',', $this->internalValue);
foreach (self::$internalOptionList[$this->internalCacheKey] as $optKey => $optValue) {
if ($optKey == $this->internalValue) {
if (in_array($optKey, $interfaces)) {
$selected = 1;
} else {
$selected = 0;
......@@ -134,8 +155,6 @@ class InterfaceField extends BaseField
$result[$optKey] = array("value"=>$optValue, "selected" => $selected);
}
return $result;
}
......@@ -152,8 +171,15 @@ class InterfaceField extends BaseField
}
if (($this->internalIsRequired == true || $this->internalValue != null)) {
return array(new InclusionIn(array('message' => $msg,
'domain'=>array_keys(self::$internalOptionList[$this->internalCacheKey]))));
if ($this->internalMultiSelect) {
// field may contain more than one interface
return array(new CsvListValidator(array('message' => $msg,
'domain'=>array_keys(self::$internalOptionList[$this->internalCacheKey]))));
} else {
// single interface selection
return array(new InclusionIn(array('message' => $msg,
'domain'=>array_keys(self::$internalOptionList[$this->internalCacheKey]))));
}
} else {
// empty field and not required, skip this validation.
return array();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment