summaryrefslogtreecommitdiffstats
path: root/modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php')
-rw-r--r--modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php134
1 files changed, 128 insertions, 6 deletions
diff --git a/modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php b/modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php
index 2e2e5009..f89031a3 100644
--- a/modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php
+++ b/modules-available/serversetup-bwlp-ipxe/inc/bootentryhook.inc.php
@@ -14,18 +14,24 @@ abstract class BootEntryHook
private $selectedId;
+ private $data = [];
+
+ /**
+ * @return string
+ */
public abstract function name();
/**
- * @return HookEntryGroup[]
+ * @return HookExtraField[]
*/
- protected abstract function groupsInternal();
+ public abstract function extraFields();
+
+ public abstract function isValidId($id);
/**
- * @param $id
- * @return BootEntry|null the actual boot entry instance for given entry, null if invalid id
+ * @return HookEntryGroup[]
*/
- public abstract function getBootEntry($id);
+ protected abstract function groupsInternal();
/**
* @return HookEntryGroup[]
@@ -43,11 +49,40 @@ abstract class BootEntryHook
return $groups;
}
+ /**
+ * @param $id
+ * @return BootEntry|null the actual boot entry instance for given entry, null if invalid id
+ */
+ public abstract function getBootEntryInternal($data);
+
+ public final function getBootEntry($data)
+ {
+ if (!is_array($data)) {
+ $data = json_decode($data, true);
+ }
+ return $this->getBootEntryInternal($data);
+ }
+
public function setSelected($id)
{
+ $json = @json_decode($id, true);
+ if (is_array($json)) {
+ $id = $json['id'];
+ $this->data = $json;
+ }
$this->selectedId = $id;
}
+ public function renderExtraFields()
+ {
+ $list = $this->extraFields();
+ foreach ($list as &$entry) {
+ $entry->currentValue = isset($this->data[$entry->name]) ? $this->data[$entry->name] : $entry->default;
+ $entry->hook = $this;
+ }
+ return $list;
+ }
+
}
class HookEntryGroup
@@ -79,13 +114,100 @@ class HookEntry
*/
public $name;
/**
+ * @var bool
+ */
+ public $valid;
+ /**
+ * @var string if !valid, this will be the string 'disabled', empty otherwise
+ */
+ public $disabled;
+ /**
* @var string internal - to be set by ipxe module
*/
public $selected;
- public function __construct($id, $name)
+ /**
+ * HookEntry constructor.
+ *
+ * @param string $id
+ * @param string $name
+ * @param bool $valid
+ */
+ public function __construct($id, $name, $valid)
{
$this->id = $id;
$this->name = $name;
+ $this->valid = $valid;
+ $this->disabled = $valid ? '' : 'disabled';
}
+}
+
+class HookExtraField
+{
+ /**
+ * @var string ID of extra field, [a-z0-9\-] please. Must not be 'id'
+ */
+ public $name;
+ /**
+ * @var string type of field, use string, bool, or an array of predefined options
+ */
+ public $type;
+ /**
+ * @var mixed default value
+ */
+ public $default;
+
+ public $currentValue;
+
+ /**
+ * @var BootEntryHook
+ */
+ public $hook;
+
+ public function __construct($name, $type, $default)
+ {
+ $this->name = $name;
+ $this->type = $type;
+ $this->default = $default;
+ }
+
+ public function fromPost($typePrefix)
+ {
+ if (is_array($this->type)) {
+ $val = Request::post('extra-' . $typePrefix . '-' . $this->name, '', 'array');
+ if (!in_array($val, $this->type)) {
+ $val = $this->default;
+ }
+ } else {
+ $val = Request::post('extra-' . $typePrefix . '-' . $this->name, '', $this->type);
+ settype($val, $this->type);
+ }
+ return $val;
+ }
+
+ public function html()
+ {
+ $fieldId = 'extra-' . $this->hook->moduleId . '-' . $this->name;
+ $fieldText = htmlspecialchars(Dictionary::translateFileModule($this->hook->moduleId, 'module', 'ipxe-' . $this->name, true));
+ if (is_array($this->type)) {
+ $out = '<label for="' . $fieldId . '">' . $fieldText . '</label><select class="form-control" name="' . $fieldId . '" id="' . $fieldId . '">';
+ foreach ($this->type as $entry) {
+ $selected = ($entry === $this->currentValue) ? 'selected' : '';
+ $out .= '<option ' . $selected . '>' . htmlspecialchars($entry) . '</option>';
+ }
+ $out .= '</select>';
+ return $out;
+ }
+ if ($this->type === 'bool') {
+ $checked = $this->currentValue ? 'checked' : '';
+ return '<div class="checkbox"><input type="checkbox" id="' . $fieldId
+ . '" name="' . $fieldId . '" ' . $checked . '><label for="' . $fieldId . '">'
+ . $fieldText . '</label></div>';
+ }
+ // Default
+ return '<label for="' . $fieldId . '">' . $fieldText . '</label>'
+ . '<input class="form-control" type="text" id="' . $fieldId
+ . '" name="' . $fieldId . '" value="' . htmlspecialchars($this->currentValue) . '">';
+ }
+
} \ No newline at end of file