Skip to content
Snippets Groups Projects

php8 only; added variable types; short array syntax; remove glyphicons

Merged Hahn Axel (hahn) requested to merge 7359-update-php83 into master
1 file
+ 141
122
Compare changes
  • Side-by-side
  • Inline
@@ -9,130 +9,150 @@
feature complete.
---------------------------------------------------------------------
2013-11-08 Axel <axel.hahn@iml.unibe.ch>
Axel <axel.hahn@iml.unibe.ch>
2013-11-08 Axel
2024-08-23 v1.1 Axel php8 only; added variable types; short array syntax
###################################################################### */
class formgen {
class formgen
{
var $aForm = array();
var $aForm = [];
var $sRequired = ' <span title="Eingabe ist erforderlich"><span style="color:#c00;">*</span></span>';
/**
* constructor
* Constructor
* @param array $aNewFormData
* @return boolean
*/
public function __construct($aNewFormData = array()) {
if (is_array($aNewFormData) && count($aNewFormData)){
return $this->setFormarray($aNewFormData);
public function __construct($aNewFormData = [])
{
if (is_array($aNewFormData) && count($aNewFormData)) {
$this->setFormarray($aNewFormData);
}
return true;
}
/**
* set a new array
* Set a new array for a new form
* @param array $aNewFormData
* @return boolean
*/
public function setFormarray($aNewFormData = array()) {
public function setFormarray($aNewFormData = [])
{
if (!is_array($aNewFormData) || !count($aNewFormData)) {
return false;
}
return $this->aForm = $aNewFormData;
$this->aForm = $aNewFormData;
return true;
}
/**
* get html code for a completely rendered form
* @param string $sFormId
* Get html code for a completely rendered form
* @param string $sFormId
* @return string html output
*/
public function renderHtml($sFormId) {
public function renderHtml(string $sFormId): string
{
$sReturn = false;
if (!isset($this->aForm[$sFormId])) {
die("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - form id " . $sFormId . " does not exist.");
throw new Exception("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - form id " . $sFormId . " does not exist.");
}
// FORM tag
$sReturn.='<form ';
$sReturn .= '<form ';
if (isset($this->aForm[$sFormId]["meta"])) {
foreach (array("method", "action", "target", "accept-charset", "class", "id", "name") as $sAttr) {
foreach (["method", "action", "target", "accept-charset", "class", "id", "name"] as $sAttr) {
if (isset($this->aForm[$sFormId]["meta"][$sAttr])) {
$sReturn.=$sAttr . '="' . $this->aForm[$sFormId]["meta"][$sAttr] . '" ';
$sReturn .= $sAttr . '="' . $this->aForm[$sFormId]["meta"][$sAttr] . '" ';
}
}
}
$sReturn.='>';
$sReturn .= '>';
// ... and all its elements
foreach ($this->aForm[$sFormId]["form"] as $elementKey => $elementData) {
$sReturn.=$this->renderHtmlElement($elementKey, $elementData);
$sReturn .= $this->renderHtmlElement($elementKey, $elementData);
}
$sReturn.='</form>';
$sReturn .= '</form>';
return $sReturn;
}
/**
* add html attributes if they exist
* Add html attributes if they exist
* @param array $aAttributes list of attributes to search for
* @param array $elementData array of form element
* @return string
*/
private function _addHtmlAtrributes($aAttributes, $elementData) {
private function _addHtmlAtrributes(array $aAttributes, array $elementData): string
{
$sReturn = false;
foreach ($aAttributes as $sAtrr) {
if (isset($elementData[$sAtrr]) && $elementData[$sAtrr]) {
$sReturn.=($sReturn ? ' ' : '')
.$sAtrr . '="' . $elementData[$sAtrr] . '"'
$sReturn .= ($sReturn ? ' ' : '')
. $sAtrr . '="' . $elementData[$sAtrr] . '"'
;
}
}
return $sReturn;
}
private function _addLabel($sLabel, $sFor, $sClass = false) {
$sReturn = false;
$sReturn = '<label for="' . $sFor . '"';
if ($sClass)
$sReturn.=' class="' . $sClass . '"';
$sReturn.='>' . $sLabel . '</label>';
$sReturn.="\n";
return $sReturn;
/**
* Add a label next to a form element
* @param string $sLabel Labeltext to show
* @param string $sFor for attribute to ad (points to the id of the form element)
* @param string $sClass css class
* @return string
*/
private function _addLabel(string $sLabel, string $sFor, string $sClass = ''): string
{
return "<label for=\"$sFor\""
. ($sClass ? " class=\"$sClass\"" : '')
. ">$sLabel</label>"
. "\n"
;
}
private function _checkReqiredKeys($aArray, $aRequiredKeys, $sLabel = false) {
/**
* Ensure that all required keys are set
* @param array $aArray given array
* @param array $aRequiredKeys set of required keys
* @param string $sLabel form label - will be shown in error message
* @throws \Exception
* @return bool
*/
private function _checkReqiredKeys(array $aArray, array $aRequiredKeys, string $sLabel = ''): bool
{
$bReturn = true;
foreach ($aRequiredKeys as $sKey) {
if (!isset($aArray[$sKey])) {
die("ERROR: $sLabel<br>Missing key \"$sKey\" in the array of a form element:<pre>" . print_r($aArray, true) . "</pre>");
$bReturn = false;
throw new Exception("ERROR: $sLabel<br>Missing key \"$sKey\" in the array of a form element:<pre>" . print_r($aArray, true) . "</pre>");
}
}
return $bReturn;
}
/**
* render a single form element
* Render a single form element
* @param string $sId id of a form element
* @param array $elementData array of form element
* @return string html output
*/
public function renderHtmlElement($sId, $elementData) {
public function renderHtmlElement(string $sId, array $elementData): string
{
$sReturn = false;
$aAllowedHtmlAttributes = array();
$sDefaultAttributes = ""
. "class,"
// events ... see https://developer.mozilla.org/en-US/docs/Web/API/Element
. "onauxclick,onclick,ondblclick,oncontextmenu,onfocusin,onfocusout,"
. "onkeydown,onkeypress,onkeyup,"
. "onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,"
//
. "title"
;
. "class,"
// events ... see https://developer.mozilla.org/en-US/docs/Web/API/Element
. "onauxclick,onclick,ondblclick,oncontextmenu,onfocusin,onfocusout,"
. "onkeydown,onkeypress,onkeyup,"
. "onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,"
//
. "title"
;
if (!isset($elementData["type"])) {
print_r($elementData);
die("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - key &quot;type&quot; does not exist.");
throw new Exception("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - key &quot;type&quot; does not exist.");
}
$sFormElement = false;
@@ -144,36 +164,36 @@ class formgen {
if (isset($elementData["label"])) {
$sLabelText = $elementData["label"];
$sLabelText.=(isset($elementData["required"]) && $elementData["required"]) ? $this->sRequired : '';
$sLabelText .= (isset($elementData["required"]) && $elementData["required"]) ? $this->sRequired : '';
}
switch ($elementData["type"]) {
case "button":
$this->_checkReqiredKeys($elementData, array("value"));
$elementData["class"]=$elementData["class"] ? $elementData["class"] : "btn btn-default";
$sFormElement.=' <button id="' . $sId . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked,name"), $elementData);
$sFormElement.='>' . $elementData["value"] . '</button>';
$sFormElement.="\n";
$this->_checkReqiredKeys($elementData, ["value"]);
$elementData["class"] = $elementData["class"] ? $elementData["class"] : "btn btn-default";
$sFormElement .= ' <button id="' . $sId . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked,name"), $elementData);
$sFormElement .= '>' . $elementData["value"] . '</button>';
$sFormElement .= "\n";
$sHtmlDefault = $sFormElement;
break;
case "checkbox":
$this->_checkReqiredKeys($elementData, array("name"));
$this->_checkReqiredKeys($elementData, ["name"]);
foreach ($elementData["options"] as $idOption => $aOptionData) {
$sFormElement.="\n".'<div class="checkbox">';
$sFormElement .= "\n" . '<div class="checkbox">';
$s = preg_replace('/\W/iu', '', $sId . $idOption);
$sOptionId = preg_replace('/[äöüß]/i', '', $s);
$sFormElement.=' <input type="checkbox" id="' . $sOptionId . '" value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked"), $aOptionData);
$sFormElement.=' name="' . $elementData["name"] . '[]"';
$sFormElement.='/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label></div>';
$sFormElement .= ' <input type="checkbox" id="' . $sOptionId . '" value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked"), $aOptionData);
$sFormElement .= ' name="' . $elementData["name"] . '[]"';
$sFormElement .= '/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label></div>';
}
$sFormElement.="\n";
$sFormElement .= "\n";
// $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>';
$sLabelElement.='<div class="col-sm-2">' . $sLabelText . '</div>';
$sLabelElement.="\n";
$sLabelElement .= '<div class="col-sm-2">' . $sLabelText . '</div>';
$sLabelElement .= "\n";
// $sHtmlDefault = $sLabelElement . $sFormElement;
$sHtmlDefault = $sLabelElement . '<div class="col-sm-10">' . "\n" . $sFormElement . '</div>' . "\n";
@@ -181,11 +201,11 @@ class formgen {
break;
case "hidden":
$this->_checkReqiredKeys($elementData, array("value"));
$sFormElement.=' <input type="hidden" id="' . $sId . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "name,value"), $elementData);
$sFormElement.=" />";
$sFormElement.="\n";
$this->_checkReqiredKeys($elementData, ["value"]);
$sFormElement .= ' <input type="hidden" id="' . $sId . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "name,value"), $elementData);
$sFormElement .= " />";
$sFormElement .= "\n";
$sHtmlDefault = $sFormElement . "\n";
break;
@@ -196,17 +216,17 @@ class formgen {
break;
case "radio":
$this->_checkReqiredKeys($elementData, array("name"));
$this->_checkReqiredKeys($elementData, ["name"]);
foreach ($elementData["options"] as $idOption => $aOptionData) {
$sFormElement.="\n".'<div class="radio">';
$sFormElement .= "\n" . '<div class="radio">';
$s = preg_replace('/\W/iu', '', $sId . $idOption);
$sOptionId = preg_replace('/[äöüß]/i', '', $s);
$sFormElement.=' <input type="radio" id="' . $sOptionId . '" value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked,disabled"), $aOptionData);
$sFormElement.=" " . $this->_addHtmlAtrributes(explode(",", "name"), $elementData);
$sFormElement.='/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label></div>';
$sFormElement .= ' <input type="radio" id="' . $sOptionId . '" value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked,disabled"), $aOptionData);
$sFormElement .= " " . $this->_addHtmlAtrributes(explode(",", "name"), $elementData);
$sFormElement .= '/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label></div>';
}
$sFormElement.="\n";
$sFormElement .= "\n";
if ($sLabelText) {
// $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>' . "\n";
@@ -224,24 +244,24 @@ class formgen {
case "select":
// HINWEIS optgroups werden nicht unterstuezt - nur einfache Listen
$this->_checkReqiredKeys($elementData, array("name"));
$sDivClass=(isset($elementData["inline"]) && $elementData["inline"])?"form-group":"col-sm-10";
$elementData['class'].=" form-control";
$sFormElement.='<div class="'.$sDivClass.'">'."\n".'<select id="' . $sId . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,onchange"), $elementData);
$sFormElement.=">\n";
$this->_checkReqiredKeys($elementData, ["name"]);
$sDivClass = (isset($elementData["inline"]) && $elementData["inline"]) ? "form-group" : "col-sm-10";
$elementData['class'] .= " form-control";
$sFormElement .= '<div class="' . $sDivClass . '">' . "\n" . '<select id="' . $sId . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,onchange"), $elementData);
$sFormElement .= ">\n";
foreach ($elementData["options"] as $idOption => $aOptionData) {
$s = preg_replace('/\W/iu', '', $sId . $idOption);
$sOptionId = preg_replace('/[äöüß]/i', '', $s);
$sFormElement.=' <option value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,selected"), $aOptionData);
$sFormElement.='>' . $aOptionData["label"] . '</option>' . "\n";
$sFormElement .= ' <option value="' . (isset($aOptionData["value"]) ? $aOptionData["value"] : $idOption) . '" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,selected"), $aOptionData);
$sFormElement .= '>' . $aOptionData["label"] . '</option>' . "\n";
}
$sFormElement.="</select></div>\n";
$sFormElement .= "</select></div>\n";
if ($sLabelText) {
// $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>' . "\n";
$sLabelClass=(isset($elementData["inline"]) && $elementData["inline"])?"":"col-sm-2";
$sLabelClass = (isset($elementData["inline"]) && $elementData["inline"]) ? "" : "col-sm-2";
$sLabelElement = $this->_addLabel($sLabelText, $sId, $sLabelClass);
}
@@ -252,40 +272,40 @@ class formgen {
break;
case "submit":
$this->_checkReqiredKeys($elementData, array("value"));
$sClass="btn btn-primary ";
if (isset($elementData["class"])){
$sClass.=$elementData["class"];
$this->_checkReqiredKeys($elementData, ["value"]);
$sClass = "btn btn-primary ";
if (isset($elementData["class"])) {
$sClass .= $elementData["class"];
}
$elementData["class"]=$sClass;
$sFormElement.=' <button id="' . $sId . '" type="submit" ';
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes"), $elementData);
$sFormElement.='>' . $elementData["value"] . '</button>';
$sFormElement.="\n";
$elementData["class"] = $sClass;
$sFormElement .= ' <button id="' . $sId . '" type="submit" ';
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes"), $elementData);
$sFormElement .= '>' . $elementData["value"] . '</button>';
$sFormElement .= "\n";
$sHtmlDefault = $sFormElement;
break;
case "text":
case "password":
$this->_checkReqiredKeys($elementData, array("name"));
$sFormElement.=' <input type="'.$elementData["type"].'" id="' . $sId . '" class="form-control col-sm-10" ';
$this->_checkReqiredKeys($elementData, ["name"]);
$sFormElement .= ' <input type="' . $elementData["type"] . '" id="' . $sId . '" class="form-control col-sm-10" ';
$aAllowedHtmlAttributes["text"] = explode(",", "");
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,autocomplete,autofocus,list,disabled,onchange,pattern,placeholder,required,size,value"), $elementData);
// $sFormElement.=$this->_addHtmlAtrributes(array("name", "value", "size", "placeholder", "required"), $elementData);
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,autocomplete,autofocus,list,disabled,onchange,pattern,placeholder,required,size,value"), $elementData);
// $sFormElement.=$this->_addHtmlAtrributes(["name", "value", "size", "placeholder", "required"], $elementData);
// IE: Return abfangen lassen
// $sFormElement.=' onkeypress="return checkKey(event);"';
$sFormElement.=' />';
$sFormElement.="\n";
$sFormElement .= ' />';
$sFormElement .= "\n";
if (isset($elementData["class"]) && $elementData["inline"]){
if (isset($elementData["class"]) && $elementData["inline"]) {
$sLabelElement = $this->_addLabel($sLabelText, $sId, "col-sm-2");
// $sHtmlDefault = $sLabelElement . "\n" . $sFormElement . "\n";
$sHtmlDefault = $sLabelElement . '<div class="col-sm-3">' . "\n" . $sFormElement . '</div>' . "\n";
$sHtmlDefault = $sLabelElement . '<div class="col-sm-3">' . "\n" . $sFormElement . '</div>' . "\n";
} else {
$sLabelElement = $this->_addLabel($sLabelText, $sId, "col-sm-2");
// $sHtmlDefault = $sLabelElement . '<div class="controls">' . "\n" . $sFormElement . '</div>' . "\n";
$sHtmlDefault = $sLabelElement . '<div class="col-sm-10">' . "\n" . $sFormElement . '</div>' . "\n";
$sHtmlDefault = $sLabelElement . '<div class="col-sm-10">' . "\n" . $sFormElement . '</div>' . "\n";
}
$sHtmlTable = '<td>' . $sLabelText . '</td><td>' . $sFormElement . '</td>';
@@ -293,13 +313,13 @@ class formgen {
break;
case "textarea":
$this->_checkReqiredKeys($elementData, array("name"));
$sFormElement.=' <textarea id="' . $sId . '" class="form-control col-sm-10" ';
$this->_checkReqiredKeys($elementData, ["name"]);
$sFormElement .= ' <textarea id="' . $sId . '" class="form-control col-sm-10" ';
$aAllowedHtmlAttributes["text"] = explode(",", "");
$sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,onchange,placeholder,required,cols,rows"), $elementData);
// $sFormElement.=$this->_addHtmlAtrributes(array("name", "value", "size", "placeholder", "required"), $elementData);
$sFormElement.='>'.$elementData['value'].'</textarea>';
$sFormElement.="\n";
$sFormElement .= $this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,onchange,placeholder,required,cols,rows"), $elementData);
// $sFormElement.=$this->_addHtmlAtrributes(["name", "value", "size", "placeholder", "required"], $elementData);
$sFormElement .= '>' . $elementData['value'] . '</textarea>';
$sFormElement .= "\n";
$sLabelElement = $this->_addLabel($sLabelText, $sId, "control-label col-sm-2");
@@ -318,24 +338,23 @@ class formgen {
if (isset($elementData["mode"]) && $elementData["mode"] == 'table' && $sHtmlTable) {
$sHtmlDefault = $sHtmlTable;
} else {
if ($elementData["type"] != "button"
&& $elementData["type"] != "fieldset"
if (
$elementData["type"] != "button"
&& $elementData["type"] != "fieldset"
&& $elementData["type"] != "markup"
&& $elementData["type"] != "hidden"
) {
if (!isset($elementData["inline"]) || !$elementData["inline"]){
if (!isset($elementData["inline"]) || !$elementData["inline"]) {
// $sHtmlDefault = "<fieldset>" . $sHtmlDefault . "</fieldset>\n";
$sHtmlDefault = '<div class="form-group row">' . $sHtmlDefault . '</div>'."\n";
$sHtmlDefault = '<div class="form-group row">' . $sHtmlDefault . '</div>' . "\n";
}
}
}
$sReturn.="<!-- " . $elementData["type"] . " -->\n";
$sReturn.=$sHtmlDefault . "\n";
$sReturn .= "<!-- " . $elementData["type"] . " -->\n";
$sReturn .= $sHtmlDefault . "\n";
return $sReturn;
}
}
?>
\ No newline at end of file
Loading