diff --git a/public_html/deployment/act_accept.php b/public_html/deployment/act_accept.php index 2778e853380fcb9eede1053a30c110092e3e699c..01f4f0902e1eb214dc1764018758157b17eccaea 100644 --- a/public_html/deployment/act_accept.php +++ b/public_html/deployment/act_accept.php @@ -1,4 +1,13 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - accept a phase to rollout it to the next phase + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); diff --git a/public_html/deployment/act_build.php b/public_html/deployment/act_build.php index caece7b4b87cb80a5bb4abf885d11239a4283e3e..676dc269e3df90ef003c0604e46bfc1772c5797e 100644 --- a/public_html/deployment/act_build.php +++ b/public_html/deployment/act_build.php @@ -1,64 +1,72 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - build a package + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ + require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); require_once("./classes/formgen.class.php"); // --- Checks -$oPrj=new project($aParams["prj"]); - - -$sOut=''; +$oPrj = new project($aParams["prj"]); + + +$sOut = ''; if (array_key_exists("confirm", $aParams)) { - $sOut.=$oPrj->build(); + $sOut.=$oPrj->build(); } else { - $sNext=$oPrj->getNextPhase(); - $aPhaseData2=$oPrj->getPhaseInfos($sNext); - $sOut.=' + $sNext = $oPrj->getNextPhase(); + $aPhaseData2 = $oPrj->getPhaseInfos($sNext); + $sOut.=' <p> - Es wird ein neues Paket erstellt und für die Phase <em class="'.$sNext.'">'.$sNext.'</em> bereitgestellt.<br> + Es wird ein neues Paket erstellt und für die Phase <em class="' . $sNext . '">' . $sNext . '</em> bereitgestellt.<br> </p>'; - $sRevison=$oPrj->getRepoRevision(); - if ( - array_key_exists("revision", $aPhaseData2["onhold"]) - && $aPhaseData2["onhold"]["revision"]==$sRevison - ){ - $sOut.=getBox("warning", "In der Queue von [$sNext] ist die Version bereits $sRevison vorhanden!"); - } - if ( - array_key_exists("revision", $aPhaseData2["ready4deployment"]) - && $aPhaseData2["ready4deployment"]["revision"]==$sRevison - ){ - $sOut.=getBox("warning", "Im Repo von [$sNext] ist die Version $sRevison bereits vorhanden!"); - } - $sOut.=' + $sRevison = $oPrj->getRepoRevision(); + if ( + array_key_exists("revision", $aPhaseData2["onhold"]) && $aPhaseData2["onhold"]["revision"] == $sRevison + ) { + $sOut.=getBox("warning", "In der Queue von [$sNext] ist die Version bereits $sRevison vorhanden!"); + } + if ( + array_key_exists("revision", $aPhaseData2["ready4deployment"]) && $aPhaseData2["ready4deployment"]["revision"] == $sRevison + ) { + $sOut.=getBox("warning", "Im Repo von [$sNext] ist die Version $sRevison bereits vorhanden!"); + } + $sOut.=' <table> <thead> <tr> <th class="versioncontrol">Versionskontrolle</th> <th> </th> - <th class="'.$sNext.'" colspan="2">'.$sNext.'</th> + <th class="' . $sNext . '" colspan="2">' . $sNext . '</th> </tr> </thead> <tbody> <tr> <td class=""> HEAD ist:<br> - '.$oPrj->renderRepoInfo().' + ' . $oPrj->renderRepoInfo() . ' </td> <td style="vertical-align: middle;"> <img src="/deployment/images/nuvola64x64/apps/noatun.png"> </td> - <td class="'.$sNext.'"> + <td class="' . $sNext . '"> in der Queue:<br> - '.$oPrj->renderPhaseDetail($sNext, "onhold", false).' + ' . $oPrj->renderPhaseDetail($sNext, "onhold", false) . ' </td> - <td class="'.$sNext.'"> + <td class="' . $sNext . '"> im Repo:<br> - '.$oPrj->renderPhaseDetail($sNext, "ready4deployment", false).' + ' . $oPrj->renderPhaseDetail($sNext, "ready4deployment", false) . ' </td> </tr> </tbody> @@ -66,25 +74,25 @@ if (array_key_exists("confirm", $aParams)) { <br> '; - - // Eingabe Kommentare zum Deployment - $sOut.=' + + // Eingabe Kommentare zum Deployment + $sOut.=' <form action="?" method="post" enctype="multipart/form-data"> <input type="hidden" name="confirm" value="1"> <!-- ' . enterDeployinfos() . ' <hr> --> <fieldset> - <button type="submit" class="btn btn-primary btn-large" >Paket für ['.$sNext.'] erstellen</button> + <button type="submit" class="btn btn-primary btn-large" >Paket für [' . $sNext . '] erstellen</button> </fieldset> </form> '; } - -$sOut.='<hr>'.aPrjHome(); + +$sOut.='<hr>' . aPrjHome(); // -- Ausgabe -$sPhpOut=$sOut; +$sPhpOut = $sOut; ?> diff --git a/public_html/deployment/act_cleanup.php b/public_html/deployment/act_cleanup.php index 3e031bbfecb36873f02adaaee6d0b2905f4e6900..77a75781ab292e52347ed0d72080cfdd8ee111f3 100644 --- a/public_html/deployment/act_cleanup.php +++ b/public_html/deployment/act_cleanup.php @@ -1,20 +1,31 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - cleanup + + Maybe we can delete file (see inc_functions.php there is the menu). + Cleanup will be done in build method. + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); -$oPrj=new project($sPrj); +$oPrj = new project($sPrj); -$sPhpOut=' +$sPhpOut = ' - <h3>Archive Dir: '.$aConfig['archiveDir'].'</h3> + <h3>Archive Dir: ' . $aConfig['archiveDir'] . '</h3> deleted:<br> <pre>' . print_r($oPrj->cleanupArchive(), true) . '</pre> versions left in the archive and which are currently in use:<br> - <pre>' . print_r($oPrj->getVersions(), true). '</pre> + <pre>' . print_r($oPrj->getVersions(), true) . '</pre> - <h3>Builds Dir: '.$aConfig['buildDir'].'/[project]/</h3> - <pre>' . print_r($oPrj->cleanupBuilds(), true). '</pre> - <hr>'.aPrjHome(); - + <h3>Builds Dir: ' . $aConfig['buildDir'] . '/[project]/</h3> + <pre>' . print_r($oPrj->cleanupBuilds(), true) . '</pre> + <hr>' . aPrjHome(); ?> diff --git a/public_html/deployment/act_deploy.php b/public_html/deployment/act_deploy.php index 221c39f65ffae177653443947ddbcb7d7b1e1e77..319238f63c7b4b7e38639e84108372f9814bbaab 100644 --- a/public_html/deployment/act_deploy.php +++ b/public_html/deployment/act_deploy.php @@ -1,4 +1,13 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - deploy th package of the queue to repo + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); diff --git a/public_html/deployment/act_doc.php b/public_html/deployment/act_doc.php index 08c451d83713bcdd232c52b5919cd12f46396d49..b449e3f42cb1798fa9d12b8b0ef045e62988fbaf 100644 --- a/public_html/deployment/act_doc.php +++ b/public_html/deployment/act_doc.php @@ -1,4 +1,13 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - doc ... UNUSED so far + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once("./classes/classinfos.class.php"); $aClasses=array( diff --git a/public_html/deployment/act_overview.php b/public_html/deployment/act_overview.php index 83e7b28355741e834408fc502812ddeb9242f075..daf7d8a2c896ddd1233096d878285adbb20ab44d 100644 --- a/public_html/deployment/act_overview.php +++ b/public_html/deployment/act_overview.php @@ -1,4 +1,15 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - overview + * for all projects + * for a single project + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once("./config/inc_projects_config.php"); @@ -6,8 +17,7 @@ if (!array_key_exists("prj", $aParams)) { // overview over all projects require_once("./classes/projectlist.class.php"); - $oPrjList = new projectlist($aProjects); - // $oPrjList->setConfig($aProjects); + $oPrjList = new projectlist(); $sPhpOut = $oPrjList->renderOverview(); } else { @@ -25,16 +35,16 @@ if (!array_key_exists("prj", $aParams)) { <p> Für das Projekt sind folgende Phasen konfiguriert: </p> - ' . $oPrj->renderPhaseInfo() .'<br> - ' . $oPrj->renderLink("build").'<br><br> + ' . $oPrj->renderPhaseInfo() . '<br> + ' . $oPrj->renderLink("build") . '<br><br> <h3>Build-Versionen</h3> ' . $oPrj->renderVersionUsage(); } else { - $sPhpOut.=getBox("info", "Es wurde noch keine URL in keiner der Phasen definiert"). + $sPhpOut.=getBox("info", "Es wurde noch keine URL in keiner der Phasen definiert") . $oPrj->renderLink("setup"); } + $sPhpOut .= '<div style="clear: both"></div>'; } - ?> diff --git a/public_html/deployment/act_phase.php b/public_html/deployment/act_phase.php index a22d7086821818d59962af36d8b8f346e89cefdd..3b45ed8c87f13e5f1d7df4668ea79c3a7c5273d9 100644 --- a/public_html/deployment/act_phase.php +++ b/public_html/deployment/act_phase.php @@ -1,52 +1,61 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - deploy th package of the queue to repo + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ + require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); require_once("./inc_functions.php"); // --- Checks -$oPrj=new project($aParams["prj"]); +$oPrj = new project($aParams["prj"]); - -$sOut=''; -if (array_key_exists("par3", $aParams)){ - $sPhase=$aParams["par3"]; + +$sOut = ''; +if (array_key_exists("par3", $aParams)) { + $sPhase = $aParams["par3"]; } -if ($sPhase){ - $sPhase=$aParams["par3"]; - $sFirst=$oPrj->getNextPhase(); - +if ($sPhase) { + $sPhase = $aParams["par3"]; + $sFirst = $oPrj->getNextPhase(); + $sOut.=' <h3>Versionen</h3> <table> <thead> <tr> - <th class="'.$sPhase.'" colspan="3">'.$sPhase.'</th> + <th class="' . $sPhase . '" colspan="3">' . $sPhase . '</th> </tr> </thead> <tbody> - <tr>'.$oPrj->renderPlacesAsTd($sPhase).'</tr> + <tr>' . $oPrj->renderPlacesAsTd($sPhase) . '</tr> <tr> - '.$oPrj->renderAllPhaseDetails($sPhase, true).' + ' . $oPrj->renderAllPhaseDetails($sPhase, true) . ' </tr> </tbody> </table> '; - if ($sFirst==$sPhase){ - $sOut.='<br><h3>weitere Aktionen</h3>'.$oPrj->renderLink("build"); + if ($sFirst == $sPhase) { + $sOut.='<br><h3>weitere Aktionen</h3>' . $oPrj->renderLink("build"); } - } else { $sOut.=getBox("error", 'ERROR: missing name of the phase.'); } - -$sOut.='<hr>'.aPrjHome(); + +$sOut.='<hr>' . aPrjHome(); // -- Ausgabe -$sPhpOut=$sOut; +$sPhpOut = $sOut; ?> diff --git a/public_html/deployment/act_setup.php b/public_html/deployment/act_setup.php index 8050b0f955a3af8d22edbb876a6a8d0618f39d4b..072207c4f95c72d2ab65806e1975ed27f319e475 100644 --- a/public_html/deployment/act_setup.php +++ b/public_html/deployment/act_setup.php @@ -1,5 +1,17 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - setup + * for a new project + * settings of the current project + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ + require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); require_once("./inc_functions.php"); diff --git a/public_html/deployment/classes/formgen.class.php b/public_html/deployment/classes/formgen.class.php index fbc7bce60240503a67e49c8b424fe66641b1277f..bff94d48b9fc6efd3f726caff1da08daa6ec9d0f 100644 --- a/public_html/deployment/classes/formgen.class.php +++ b/public_html/deployment/classes/formgen.class.php @@ -1,56 +1,69 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + class formgen - (copied and improved from simap prototype project) + It generates Form elements. This class does what I need it is not + feature complete. + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ class formgen { - var $aForm=array(); - var $sRequired=' <span title="Eingabe ist erforderlich"><span style="color:#c00;">*</span></span>'; - + + var $aForm = array(); + var $sRequired = ' <span title="Eingabe ist erforderlich"><span style="color:#c00;">*</span></span>'; + /** * constructor * @param array $aNewFormData * @return boolean */ - public function __construct($aNewFormData=array()) { - if (count($aNewFormData)) return $this->setFormarray($aNewFormData); + public function __construct($aNewFormData = array()) { + if (count($aNewFormData)) + return $this->setFormarray($aNewFormData); return true; } - + /** * set a new array * @param array $aNewFormData * @return boolean */ - public function setFormarray($aNewFormData=array()){ - if (!is_array($aNewFormData) || !count($aNewFormData)){ + public function setFormarray($aNewFormData = array()) { + if (!is_array($aNewFormData) || !count($aNewFormData)) { return false; - } - return $this->aForm=$aNewFormData; + } + return $this->aForm = $aNewFormData; } - + /** * render a complete form * @param string $sFormId * @return string html output */ - public function renderHtml($sFormId){ - $sReturn=false; + public function renderHtml($sFormId) { + $sReturn = false; if (!array_key_exists($sFormId, $this->aForm)) { - die("ERROR: " . __CLASS__ . ":".__FUNCTION__ . " - form id " . $sFormId . " does not exist."); + die("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - form id " . $sFormId . " does not exist."); } $sReturn.='<form '; - if (array_key_exists("meta", $this->aForm[$sFormId])){ - foreach (array("method","action","target","accept-charset") as $sAttr){ - if (array_key_exists($sAttr, $this->aForm[$sFormId]["meta"])){ - $sReturn.=$sAttr.'="'.$this->aForm[$sFormId]["meta"][$sAttr].'" '; + if (array_key_exists("meta", $this->aForm[$sFormId])) { + foreach (array("method", "action", "target", "accept-charset") as $sAttr) { + if (array_key_exists($sAttr, $this->aForm[$sFormId]["meta"])) { + $sReturn.=$sAttr . '="' . $this->aForm[$sFormId]["meta"][$sAttr] . '" '; } } } $sReturn.='>'; - foreach ($this->aForm[$sFormId]["form"] as $elementKey=>$elementData){ + foreach ($this->aForm[$sFormId]["form"] as $elementKey => $elementData) { $sReturn.=$this->renderHtmlElement($elementKey, $elementData); } $sReturn.='</form>'; - + return $sReturn; } @@ -60,226 +73,225 @@ class formgen { * @param array $elementData array of form element * @return string */ - private function _addHtmlAtrributes($aAttributes,$elementData){ - $sReturn=false; - foreach($aAttributes as $sAtrr){ - if (array_key_exists($sAtrr, $elementData) && $elementData[$sAtrr]){ - if ($sReturn) $sReturn.=' '; - $sReturn.=$sAtrr.'="'.$elementData[$sAtrr].'"'; + private function _addHtmlAtrributes($aAttributes, $elementData) { + $sReturn = false; + foreach ($aAttributes as $sAtrr) { + if (array_key_exists($sAtrr, $elementData) && $elementData[$sAtrr]) { + if ($sReturn) + $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>'; + + 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; } - - private function _checkReqiredKeys($aArray, $aRequiredKeys, $sLabel=false){ - $bReturn=true; - foreach ($aRequiredKeys as $sKey){ - if (!array_key_exists($sKey, $aArray)){ + + private function _checkReqiredKeys($aArray, $aRequiredKeys, $sLabel = false) { + $bReturn = true; + foreach ($aRequiredKeys as $sKey) { + if (!array_key_exists($sKey, $aArray)) { die("ERROR: $sLabel<br>Missing key \"$sKey\" in the array of a form element:<pre>" . print_r($aArray, true) . "</pre>"); - $bReturn=false; + $bReturn = false; } } return $bReturn; } - + /** * 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){ - $sReturn=false; - $aAllowedHtmlAttributes=array(); - $sDefaultAttributes="class,onclick,onmouseover,onmouseout,title"; - + public function renderHtmlElement($sId, $elementData) { + $sReturn = false; + $aAllowedHtmlAttributes = array(); + $sDefaultAttributes = "class,onclick,onmouseover,onmouseout,title"; + if (!array_key_exists("type", $elementData)) { print_r($elementData); - die("ERROR: " . __CLASS__ . ":".__FUNCTION__ . " - key "type" does not exist."); + die("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - key "type" does not exist."); } - - $sFormElement=false; - $sLabelText=''; - $sLabelElement=false; - - $sHtmlDefault=''; - $sHtmlTable=''; - - if (array_key_exists("label", $elementData)){ - $sLabelText=$elementData["label"]; - $sLabelText.=(array_key_exists("required", $elementData) && $elementData["required"])?$this->sRequired:''; + + $sFormElement = false; + $sLabelText = ''; + $sLabelElement = false; + + $sHtmlDefault = ''; + $sHtmlTable = ''; + + if (array_key_exists("label", $elementData)) { + $sLabelText = $elementData["label"]; + $sLabelText.=(array_key_exists("required", $elementData) && $elementData["required"]) ? $this->sRequired : ''; } - + switch ($elementData["type"]) { case "button": $this->_checkReqiredKeys($elementData, array("value")); - $sFormElement.=' <button id="'.$sId.'" '; + $sFormElement.=' <button id="' . $sId . '" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked,name"), $elementData); - $sFormElement.='>'.$elementData["value"].'</button>'; + $sFormElement.='>' . $elementData["value"] . '</button>'; $sFormElement.="\n"; - - $sHtmlDefault=$sFormElement; + + $sHtmlDefault = $sFormElement; break; - + case "checkbox": $this->_checkReqiredKeys($elementData, array("name")); - foreach ($elementData["options"] as $idOption=>$aOptionData) { + foreach ($elementData["options"] as $idOption => $aOptionData) { $sFormElement.="\n"; - $s=preg_replace('/\W/iu', '', $sId.$idOption); - $sOptionId=preg_replace('/[äöüß]/i', '', $s); - $sFormElement.=' <input type="checkbox" id="'.$sOptionId.'" value="'.$idOption.'" '; + $s = preg_replace('/\W/iu', '', $sId . $idOption); + $sOptionId = preg_replace('/[äöüß]/i', '', $s); + $sFormElement.=' <input type="checkbox" id="' . $sOptionId . '" value="' . $idOption . '" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked"), $aOptionData); - $sFormElement.=' name="'.$elementData["name"].'[]"'; - $sFormElement.='/><label for="'.$sOptionId.'">' . $aOptionData["label"] . '</label>'; - + $sFormElement.=' name="' . $elementData["name"] . '[]"'; + $sFormElement.='/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label>'; } $sFormElement.="\n"; - $sLabelElement.='<span class="help-block">'.$sLabelText.'</span>'; + $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>'; $sLabelElement.="\n"; - - $sHtmlDefault=$sLabelElement.$sFormElement; - $sHtmlTable='<td>'.$sLabelText.'</td><td>'.$sFormElement.'</td>'; + + $sHtmlDefault = $sLabelElement . $sFormElement; + $sHtmlTable = '<td>' . $sLabelText . '</td><td>' . $sFormElement . '</td>'; break; - + case "hidden": $this->_checkReqiredKeys($elementData, array("value")); - $sFormElement.=' <input type="hidden" id="'.$sId.'" '; + $sFormElement.=' <input type="hidden" id="' . $sId . '" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "name,value"), $elementData); $sFormElement.=" />"; $sFormElement.="\n"; - - $sHtmlDefault=$sFormElement."\n"; + + $sHtmlDefault = $sFormElement . "\n"; break; - + case "markup": if (array_key_exists("value", $elementData)) - $sHtmlDefault=$elementData["value"]."\n"; + $sHtmlDefault = $elementData["value"] . "\n"; break; case "radio": $this->_checkReqiredKeys($elementData, array("name")); - foreach ($elementData["options"] as $idOption=>$aOptionData) { + foreach ($elementData["options"] as $idOption => $aOptionData) { $sFormElement.="\n"; - $s=preg_replace('/\W/iu', '', $sId.$idOption); - $sOptionId=preg_replace('/[äöüß]/i', '', $s); - $sFormElement.=' <input type="radio" id="'.$sOptionId.'" value="'.$idOption.'" '; + $s = preg_replace('/\W/iu', '', $sId . $idOption); + $sOptionId = preg_replace('/[äöüß]/i', '', $s); + $sFormElement.=' <input type="radio" id="' . $sOptionId . '" value="' . $idOption . '" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,checked"), $aOptionData); - $sFormElement.=" ".$this->_addHtmlAtrributes(explode(",", "name"), $elementData); - $sFormElement.='/><label for="'.$sOptionId.'">' . $aOptionData["label"] . '</label>'; - + $sFormElement.=" " . $this->_addHtmlAtrributes(explode(",", "name"), $elementData); + $sFormElement.='/><label for="' . $sOptionId . '">' . $aOptionData["label"] . '</label>'; } $sFormElement.="\n"; - + if ($sLabelText) { - $sLabelElement.='<span class="help-block">'.$sLabelText.'</span>'."\n"; + $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>' . "\n"; } - - $sHtmlTable='<td>'.$sLabelText.'</td><td>'.$sFormElement.'</td>'; - $sHtmlDefault=$sLabelElement.$sFormElement; - + + $sHtmlTable = '<td>' . $sLabelText . '</td><td>' . $sFormElement . '</td>'; + $sHtmlDefault = $sLabelElement . $sFormElement; + // $sReturn.=$this->_addLabel($sFormElement,$sId,"checkbox"); break; - + case "select": // HINWEIS optgroups werden nicht unterstuezt - nur einfache Listen $this->_checkReqiredKeys($elementData, array("name")); - $sFormElement.='<select id="'.$sId.'" ';; + $sFormElement.='<select id="' . $sId . '" '; + ; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name"), $elementData); $sFormElement.=">\n"; - foreach ($elementData["options"] as $idOption=>$aOptionData) { - $s=preg_replace('/\W/iu', '', $sId.$idOption); - $sOptionId=preg_replace('/[äöüß]/i', '', $s); - $sFormElement.=' <option value="'.$idOption.'" '; + foreach ($elementData["options"] as $idOption => $aOptionData) { + $s = preg_replace('/\W/iu', '', $sId . $idOption); + $sOptionId = preg_replace('/[äöüß]/i', '', $s); + $sFormElement.=' <option value="' . $idOption . '" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes"), $aOptionData); - $sFormElement.='>'.$aOptionData["label"].'</option>'."\n"; + $sFormElement.='>' . $aOptionData["label"] . '</option>' . "\n"; } $sFormElement.="</select>\n"; - + if ($sLabelText) { - $sLabelElement.='<span class="help-block">'.$sLabelText.'</span>'."\n"; + $sLabelElement.='<span class="help-block">' . $sLabelText . '</span>' . "\n"; } - - $sHtmlTable='<td>'.$sLabelText.'</td><td>'.$sFormElement.'</td>'; - $sHtmlDefault=$sLabelElement.$sFormElement; - + + $sHtmlTable = '<td>' . $sLabelText . '</td><td>' . $sFormElement . '</td>'; + $sHtmlDefault = $sLabelElement . $sFormElement; + // $sReturn.=$this->_addLabel($sFormElement,$sId,"checkbox"); break; - + case "submit": $this->_checkReqiredKeys($elementData, array("value")); - $sFormElement.=' <button id="'.$sId.'" class="btn btn-large btn-primary" type="submit" '; + $sFormElement.=' <button id="' . $sId . '" class="btn btn-large btn-primary" type="submit" '; $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes"), $elementData); - $sFormElement.='>'.$elementData["value"].'</button>'; + $sFormElement.='>' . $elementData["value"] . '</button>'; $sFormElement.="\n"; - - $sHtmlDefault=$sFormElement; + + $sHtmlDefault = $sFormElement; break; - + case "text": $this->_checkReqiredKeys($elementData, array("name")); - $sFormElement.=' <input type="text" id="'.$sId.'" '; - $aAllowedHtmlAttributes["text"]=explode(",", ""); + $sFormElement.=' <input type="text" id="' . $sId . '" '; + $aAllowedHtmlAttributes["text"] = explode(",", ""); $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,disabled,onkeyup,onkeydown,onchange,pattern,placeholder,required,size,value"), $elementData); // $sFormElement.=$this->_addHtmlAtrributes(array("name", "value", "size", "placeholder", "required"), $elementData); - // IE: Return abfangen lassen $sFormElement.=' onkeypress="return checkKey(event);"'; $sFormElement.=' />'; $sFormElement.="\n"; - $sLabelElement=$this->_addLabel($sLabelText,$sId, "control-label" ); - - $sHtmlDefault=$sLabelElement.'<div class="controls">'."\n".$sFormElement.'</div>'."\n"; - $sHtmlTable='<td>'.$sLabelText.'</td><td>'.$sFormElement.'</td>'; - + $sLabelElement = $this->_addLabel($sLabelText, $sId, "control-label"); + + $sHtmlDefault = $sLabelElement . '<div class="controls">' . "\n" . $sFormElement . '</div>' . "\n"; + $sHtmlTable = '<td>' . $sLabelText . '</td><td>' . $sFormElement . '</td>'; + break; - + case "textarea": $this->_checkReqiredKeys($elementData, array("name")); - $sFormElement.=' <textarea id="'.$sId.'" '; - $aAllowedHtmlAttributes["text"]=explode(",", ""); + $sFormElement.=' <textarea id="' . $sId . '" '; + $aAllowedHtmlAttributes["text"] = explode(",", ""); $sFormElement.=$this->_addHtmlAtrributes(explode(",", "$sDefaultAttributes,name,onkeyup,onkeydown,onchange,placeholder,required,cols,rows"), $elementData); // $sFormElement.=$this->_addHtmlAtrributes(array("name", "value", "size", "placeholder", "required"), $elementData); $sFormElement.='></textarea>'; $sFormElement.="\n"; - - $sLabelElement=$this->_addLabel($sLabelText,$sId, "control-label" ); - - $sHtmlDefault=$sLabelElement.'<div class="controls">'."\n".$sFormElement.'</div>'."\n"; - $sHtmlTable='<td>'.$sLabelElement.'</td><td>'.$sFormElement.'</td>'; + + $sLabelElement = $this->_addLabel($sLabelText, $sId, "control-label"); + + $sHtmlDefault = $sLabelElement . '<div class="controls">' . "\n" . $sFormElement . '</div>' . "\n"; + $sHtmlTable = '<td>' . $sLabelElement . '</td><td>' . $sFormElement . '</td>'; break; default: - die("ERROR: " . __CLASS__ . ":".__FUNCTION__ . " - formelement type ".$elementData["type"]." ist not supported (yet)."); + die("ERROR: " . __CLASS__ . ":" . __FUNCTION__ . " - formelement type " . $elementData["type"] . " ist not supported (yet)."); break; } - + // Default or table mode? - if (array_key_exists("mode", $elementData) && $elementData["mode"]=='table' && $sHtmlTable) { - $sHtmlDefault=$sHtmlTable; + if (array_key_exists("mode", $elementData) && $elementData["mode"] == 'table' && $sHtmlTable) { + $sHtmlDefault = $sHtmlTable; } else { - if ($elementData["type"]!="button" && $elementData["type"]!="fieldset" && $elementData["type"]!="markup"){ - $sHtmlDefault="<fieldset>". $sHtmlDefault."</fieldset>\n"; + if ($elementData["type"] != "button" && $elementData["type"] != "fieldset" && $elementData["type"] != "markup") { + $sHtmlDefault = "<fieldset>" . $sHtmlDefault . "</fieldset>\n"; } } - - $sReturn.="<!-- " . $elementData["type"] ." -->\n"; - $sReturn.=$sHtmlDefault."\n"; - + + $sReturn.="<!-- " . $elementData["type"] . " -->\n"; + $sReturn.=$sHtmlDefault . "\n"; + return $sReturn; } - + } ?> \ No newline at end of file diff --git a/public_html/deployment/classes/html.tpl.php b/public_html/deployment/classes/html.tpl.php index fbd09f9bf801b106efe601290e68d6884c511cdc..af3d61f28a83de10794d494e6ba6cf2bd1f4160b 100644 --- a/public_html/deployment/classes/html.tpl.php +++ b/public_html/deployment/classes/html.tpl.php @@ -1,216 +1,216 @@ <!doctype html> <html> - <head> - <meta name="robots" content="noindex,nofollow" /> - - <meta charset="utf-8"> - <!-- Mobile viewport optimized --> - <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" /> - <!-- Mobile Internet Explorer allows us to activate ClearType technology for smoothing fonts for easy reading --> - <!-- - not html5 valid: - <meta http-equiv="cleartype" content="on"> - --> - - <!-- Le styles --> - <link href="/deployment/bootstrap/css/bootstrap.css" rel="stylesheet"> - <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/black-tie/jquery-ui.css" rel="stylesheet"> - <link href="/deployment/bootstrap/css/jquery.tocify.css" rel="stylesheet"> - <link href="/deployment/bootstrap/css/prettify.css" type="text/css" rel="stylesheet" /> - <link href="/deployment/bootstrap/css/styles.css" type="text/css" rel="stylesheet" /> - - <style> - - @media (max-width: 767px) { - #toc { - position: relative; - width: 100%; - margin: 0px 0px 20px 0px; + <head> + <meta name="robots" content="noindex,nofollow" /> + + <meta charset="utf-8"> + <!-- Mobile viewport optimized --> + <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" /> + <!-- Mobile Internet Explorer allows us to activate ClearType technology for smoothing fonts for easy reading --> + <!-- + not html5 valid: + <meta http-equiv="cleartype" content="on"> + --> + + <!-- Le styles --> + <link href="/deployment/bootstrap/css/bootstrap.css" rel="stylesheet"> + <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/black-tie/jquery-ui.css" rel="stylesheet"> + <link href="/deployment/bootstrap/css/jquery.tocify.css" rel="stylesheet"> + <link href="/deployment/bootstrap/css/prettify.css" type="text/css" rel="stylesheet" /> + <link href="/deployment/bootstrap/css/styles.css" type="text/css" rel="stylesheet" /> + + <style> + + @media (max-width: 767px) { + #toc { + position: relative; + width: 100%; + margin: 0px 0px 20px 0px; + } } - } - - body{padding-top: 0;} - body, label, input, button, select, textarea, p, .btn { - font-size: 12px; - } - - #header,#footer{ - background:#eee; background: linear-gradient(#fff,#eee); - padding: 1em; font-size: 300%; - color:#a33; - text-shadow: 1px 1px 0 #fff, 10px 10px 10px #aaa; - border-bottom: 2px solid #ccc; - } - #footer{ - background: none; - /* background: linear-gradient(#fff,#eee,#fff); */ - font-size: 100%; - color:#a33; - text-align: right; - text-shadow: 1px 1px 0 #fff, 3px 3px 3px #aaa; - border: 0px solid #ccc; - border-top: 1px solid #ddd; - margin-top: 5em; - } - #header2{ - background: none; - padding: 0.5em; margin-bottom: 2em; - } - .description{font-weight:bold; color:#ccc; font-size: 150%; font-style: italic;} - .navbar .brand {color:#a33;} - #content{ - margin-top: 2em; - border-left: 0px solid #ccc; - padding: 1em; - box-shadow: 0 0 50px #ddd; - } - - h1{font-size: 250%; margin: 0;} - h2{font-size: 16px; margin: 0;} - - /* actions */ - h2.action{ - background: #e8f0f8 url("/deployment/images/nuvola64x64/apps/aktion.png") 10px 10px no-repeat; - background-repeat: no-repeat; - box-shadow: 0 30px 50px #fff inset; - padding: 20px 0 0 90px; - height: 70px; - margin: 0 0 1em 0; - font-size: 250%; color: #abc; text-shadow: -1px -1px 0 #789, 1px 1px 1px #fff; - border-bottom: 2px solid; - } - h2.accept{background-image: url("/deployment/images/nuvola64x64/apps/korganizer.png");} - h2.build{background-image: url("/deployment/images/nuvola64x64/apps/kthememgr.png");} - h2.cleanup{background-image: url("/deployment/images/nuvola64x64/apps/kasteroids.png");} - h2.deploy{background-image: url("/deployment/images/nuvola64x64/apps/iconthemes.png");} - h2.prjhome{background-image: url("/deployment/images/nuvola64x64/apps/kdict.png");} - h2.phase{background-image: url("/deployment/images/nuvola64x64/apps/kreversi.png");} - h2.setup{background-image: url("/deployment/images/nuvola64x64/apps/kcmsystem.png");} - - - h3{font-size: 14px; margin: 0;} - #imgtop{float:left; margin: 0 20px 40px 0;} - pre{line-height: 1.2em; padding: 5px;} - pre.cli{ color:#555;} - pre.clistrong{color: #000;} - td{vertical-align: top; border-left: 1px solid #fff;} - ul {} - ul li { - margin-bottom: 3px; - } - - thead{font-size: 130%;} - - #tbloverview th{} - #tbloverview td{} - th.prj{background:#f8f8f8;} - th.versioncontrol{background: #ccc;} - th.preview{background:#358; color:#eee;} - th.stage{background:#388; color:#eee;} - th.live{background:#3a3; color: #eee; } - tr{background: linear-gradient(#fff,#fff,#fff,#fff,#eee);} - tr:hover{background:#ddd; background: linear-gradient(#ddd,#eee,#ddd);} - - td.preview{background:#f4f8ff; color:#333; background: rgba(210,220,255, 0.4);} - td.stage{background:#f4ffff; color:#333; background: rgba(180,230,230, 0.4);} - td.live{background:#f0fff0; color:#333; background: rgba(180,255,180, 0.4);} - .preview{background:#ccf;} - .stage{background:#cff;} - .live{background:#cfc;} - - .preview, .stage, .live{ - padding: 4px; - } - - a.info { border-bottom: 1px dotted; padding-bottom: 2px;} - a.info:hover { text-decoration: none; background: #fff;} - a.info span{ display: none; position: absolute; margin-top: -1em; background: #fff; padding: 0.5em; box-shadow: 0 0 10px #888;} - a.info:hover span{ display: block; text-decoration: none;} - a.info span span.title{ background: #888; color:#f8f8f8; padding: 0.5em 0.5em; display: block; box-shadow: 0 0 5px #ccc; border: 2px solid #fff;} - - .infobox{ - background:#fea; background: linear-gradient(#fea,#fff8f0,#fea); - padding: 1em; border: 2px solid #fff; box-shadow: 0 0 10px #ccc; - } - .warning{background: #fe8;} - .error{background: #fcc;} - .center{text-align: center;} - .inactive{color:#999; font-style: italic;} - .versioninfo{ - border: 0px solid #ccc; - padding: 0px; - border-radius: 0px; - margin-bottom: 0px; - } - - ul.nav li.dropdown:hover ul.dropdown-menu{ - display: block; - margin-top:0px - } - label.control-label{width: 300px; float: left; text-align: right; padding-right: 2em;} - input, textarea { - width: 400px; - height: none !important; - padding: 1px 2px !important; - } - - </style> - <title>IML Deployment</title> - <!-- - - - <style type="text/css" title="currentStyle"> - @import "/shared/js/datatables/media/css/demo_page.css"; - @import "/shared/js/datatables/media/css/demo_table.css"; - </style> - - <script type="text/javascript" src="/shared/js/jquery.js"></script> - <script type="text/javascript" src="/shared/js/datatables/media/js/jquery.dataTables.min.js"></script> - --> - + + body{padding-top: 0;} + body, label, input, button, select, textarea, p, .btn { + font-size: 12px; + } + + #header,#footer{ + background:#eee; background: linear-gradient(#fff,#eee); + padding: 1em; font-size: 300%; + color:#a33; + text-shadow: 1px 1px 0 #fff, 10px 10px 10px #aaa; + border-bottom: 2px solid #ccc; + } + #footer{ + background: none; + /* background: linear-gradient(#fff,#eee,#fff); */ + font-size: 100%; + color:#a33; + text-align: right; + text-shadow: 1px 1px 0 #fff, 3px 3px 3px #aaa; + border: 0px solid #ccc; + border-top: 0px solid #ddd; + margin-top: 5em; + } + #header2{ + background: none; + padding: 0.5em; margin-bottom: 2em; + } + .description{font-weight:bold; color:#ccc; font-size: 150%; font-style: italic;} + .navbar .brand {color:#a33;} + #content{ + margin-top: 2em; + border-left: 0px solid #ccc; + padding: 1em; + box-shadow: 0 0 50px #ddd; + } + + h1{font-size: 250%; margin: 0;} + h2{font-size: 16px; margin: 0;} + + /* actions */ + h2.action{ + background: #e8f0f8 url("/deployment/images/nuvola64x64/apps/aktion.png") 10px 10px no-repeat; + background-repeat: no-repeat; + box-shadow: 0 30px 50px #fff inset; + padding: 20px 0 0 90px; + height: 70px; + margin: 0 0 1em 0; + font-size: 250%; color: #abc; text-shadow: -1px -1px 0 #789, 1px 1px 1px #fff; + border-bottom: 2px solid; + } + h2.accept{background-image: url("/deployment/images/nuvola64x64/apps/korganizer.png");} + h2.build{background-image: url("/deployment/images/nuvola64x64/apps/kthememgr.png");} + h2.cleanup{background-image: url("/deployment/images/nuvola64x64/apps/kasteroids.png");} + h2.deploy{background-image: url("/deployment/images/nuvola64x64/apps/iconthemes.png");} + h2.prjhome{background-image: url("/deployment/images/nuvola64x64/apps/kdict.png");} + h2.phase{background-image: url("/deployment/images/nuvola64x64/apps/kreversi.png");} + h2.setup{background-image: url("/deployment/images/nuvola64x64/apps/kcmsystem.png");} + + + h3{font-size: 14px; margin: 0;} + #imgtop{float:left; margin: 0 20px 40px 0;} + pre{line-height: 1.2em; padding: 5px;} + pre.cli{ color:#555;} + pre.clistrong{color: #000;} + td{vertical-align: top; border-left: 1px solid #fff;} + ul {} + ul li { + margin-bottom: 3px; + } + + thead{font-size: 130%;} + + #tbloverview th{} + #tbloverview td{} + th.prj{background:#f8f8f8;} + th.versioncontrol{background: #ccc;} + th.preview{background:#358; color:#eee;} + th.stage{background:#388; color:#eee;} + th.live{background:#3a3; color: #eee; } + tr{background: linear-gradient(#fff,#fff,#fff,#fff,#eee);} + tr:hover{background:#ddd; background: linear-gradient(#ddd,#eee,#ddd);} + + td.preview{background:#f4f8ff; color:#333; background: rgba(210,220,255, 0.4);} + td.stage{background:#f4ffff; color:#333; background: rgba(180,230,230, 0.4);} + td.live{background:#f0fff0; color:#333; background: rgba(180,255,180, 0.4);} + .preview{background:#ccf;} + .stage{background:#cff;} + .live{background:#cfc;} + + .preview, .stage, .live{ + padding: 4px; + } + + a.info { border-bottom: 1px dotted; padding-bottom: 2px;} + a.info:hover { text-decoration: none; background: #fff;} + a.info span{ display: none; position: absolute; margin-top: -1em; background: #fff; padding: 0.5em; box-shadow: 0 0 10px #888;} + a.info:hover span{ display: block; text-decoration: none;} + a.info span span.title{ background: #888; color:#f8f8f8; padding: 0.5em 0.5em; display: block; box-shadow: 0 0 5px #ccc; border: 2px solid #fff;} + + .infobox{ + background:#fea; background: linear-gradient(#fea,#fff8f0,#fea); + padding: 1em; border: 2px solid #fff; box-shadow: 0 0 10px #ccc; + } + .warning{background: #fe8;} + .error{background: #fcc;} + .center{text-align: center;} + .inactive{color:#999; font-style: italic;} + .versioninfo{ + border: 0px solid #ccc; + padding: 0px; + border-radius: 0px; + margin-bottom: 0px; + } + + ul.nav li.dropdown:hover ul.dropdown-menu{ + display: block; + margin-top:0px + } + label.control-label{width: 300px; float: left; text-align: right; padding-right: 2em;} + input, textarea { + width: 400px; + height: none !important; + padding: 1px 2px !important; + } + + </style> + <title>IML Deployment</title> + <!-- + + + <style type="text/css" title="currentStyle"> + @import "/shared/js/datatables/media/css/demo_page.css"; + @import "/shared/js/datatables/media/css/demo_table.css"; + </style> + + <script type="text/javascript" src="/shared/js/jquery.js"></script> + <script type="text/javascript" src="/shared/js/datatables/media/js/jquery.dataTables.min.js"></script> + --> + <link rel="stylesheet" type="text/css" href="main.css" media="screen"> - <script type="text/javascript" src="main.js"></script> + <script type="text/javascript" src="main.js"></script> {{HEADER}} - </head> - <body> - <div id="divcontent"> + </head> + <body> + <div id="divcontent"> - {{CONTENT}} + {{CONTENT}} - </div> + </div> {{FOOTER}}{{JSONREADY}} - - <!-- Placed at the end of the document so the pages load faster --> - <script src="/deployment/bootstrap/js/jquery-1.8.0.min.js"></script> - <script src="/deployment/bootstrap/js/jquery-ui-1.8.23.custom.min.js"></script> - <script src="/deployment/bootstrap/js/bootstrap.min.js"></script> - <script src="/deployment/bootstrap/js/history.js"></script> - <script src="/deployment/bootstrap/js/jquery.tocify.min.js"></script> - <script src="/deployment/bootstrap/js/prettify.js"></script> - <!-- <script src="js/githubrepo.js"></script> --> - <script> - $(function() { - $("#toc").tocify({ selectors: "h2, h3, h4", scrollTo: 60, highlightOffset: 60, extendPage: false }); + <!-- Placed at the end of the document so the pages load faster --> + <script src="/deployment/bootstrap/js/jquery-1.8.0.min.js"></script> + <script src="/deployment/bootstrap/js/jquery-ui-1.8.23.custom.min.js"></script> + <script src="/deployment/bootstrap/js/bootstrap.min.js"></script> + <script src="/deployment/bootstrap/js/history.js"></script> + <script src="/deployment/bootstrap/js/jquery.tocify.min.js"></script> + <script src="/deployment/bootstrap/js/prettify.js"></script> + <!-- <script src="js/githubrepo.js"></script> --> + <script> +$(function() { + + $("#toc").tocify({selectors: "h2, h3, h4", scrollTo: 60, highlightOffset: 60, extendPage: false}); + + prettyPrint(); + + $(".optionName").popover({trigger: "hover"}); + + $("a[href='#']").click(function(event) { + + event.preventDefault(); - prettyPrint(); + }); - $(".optionName").popover({ trigger: "hover" }); +}); - $("a[href='#']").click(function(event) { - - event.preventDefault(); - }); + </script> - }); - - </script> - - - </body> + </body> </html> diff --git a/public_html/deployment/classes/project.class.php b/public_html/deployment/classes/project.class.php index 7dc799de610572b726788123e430af51ec5ef4b0..882359f0e764707bd0cf76c4c877b3da9f5eddca 100644 --- a/public_html/deployment/classes/project.class.php +++ b/public_html/deployment/classes/project.class.php @@ -1,4 +1,15 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + class project for all actions for single project + * actions + * rendering html + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ /** * class for single project diff --git a/public_html/deployment/classes/projectlist.class.php b/public_html/deployment/classes/projectlist.class.php index 18237d924d72d01f42a4f516ea9d72f2fcf7ee7b..774d370d5c9278ec8eaa9df1cc9d57d76a069ede 100644 --- a/public_html/deployment/classes/projectlist.class.php +++ b/public_html/deployment/classes/projectlist.class.php @@ -1,4 +1,13 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + class projectlist to render overview page + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ require_once 'project.class.php'; @@ -91,8 +100,7 @@ class projectlist { $sRowHead1=''; $sRowHead2=''; - // $oPrj existiert noch ... - foreach (array_keys($oPrj->getPhases()) as $sPhase){ + foreach (array_keys($oPrj1->getPhases()) as $sPhase){ // Anzahl colspan ist hartcodiert :-/ $sRowHead1.='<th class="'.$sPhase.' '.$sColClass.'" colspan="3">'.$sPhase.'</th>'; $sRowHead2.=$oPrj->renderPlacesAsTd($sPhase); @@ -105,6 +113,18 @@ class projectlist { $(\'.'.$sTrClass.'\').hide(); $(\'.\' + sPrj).show(); $(\'.'.$sColClass.'\').hide(); $(\'.\' + sPhase).show(); } + + function filterTable(){ + sSearch=$("#efilter").val(); + $(".trproject").each(function() { + sVisible="none"; + if (this.innerHTML.search(sSearch)>=0){ + sVisible=""; + } + $(this).css("display", sVisible); + }); + + } </script> Projekt-Filter: <select id="prjfilter" onchange="filterOverviewTable(); return false;"> @@ -115,6 +135,14 @@ class projectlist { <select id="phasefilter" onchange="filterOverviewTable(); return false;"> '.$sPhaseFilter.' </select> + + + Freitext: + <input type="text" id="efilter" name="efilter" + onchange="filterTable();" + onKeypress="filterTable(); " + onKeyup="filterTable(); " + > <table class="table" id="tbloverview"> <thead> diff --git a/public_html/deployment/config/inc_projects_config.php b/public_html/deployment/config/inc_projects_config.php index bf1ff865557bc260cef4b773b9c75485009cca36..488c36ac39900820cd48cc5a82fd1a47d2845129 100644 --- a/public_html/deployment/config/inc_projects_config.php +++ b/public_html/deployment/config/inc_projects_config.php @@ -43,121 +43,6 @@ $aConfig=array( ), ); - -// ---------------------------------------------------------------------- -// Projekte -// ---------------------------------------------------------------------- -$aProjects=array( - "ci"=>array( - "label"=>"CI Webgui", - "fileprefix"=>"ci-webgui", - "description" => 'Webgui zum Deployen von Web-Projekten', - "contact" => 'Axel Hahn', - "build"=>array( - "type"=>"git", // one of git, svn, ... - "ssh"=>"git@gitlab.iml.unibe.ch:admins/imldeployment.git", - - // der public Key muss beim Git-Repo hinterlegt sein - "keyfile"=>"config/sshkeys/git@gitlab.iml.unibe.ch", - "webaccess"=>"http://gitlab.iml.unibe.ch/admins/imldeployment/tree/master", - ), - - "phases"=>array( - "preview"=>array( - "url"=>"http://aum-cba02.unibe.ch/", - ), - "stage"=>array( - ), - "live"=>array( - ), - ), - ), - "mmmu-sf2"=>array( - "label"=>"Morphomed Maintenance Utility", - "fileprefix"=>"mmmu", - "description" => 'E-Learning, Morphomed Backend mit Symfony 2', - "contact" => 'Rafael Beck', - "build"=>array( - "type"=>"git", // one of git, svn, ... - // for github: - // generate ssh keypair - // https://help.github.com/articles/generating-ssh-keys - "ssh"=>"git@github.com:iml-it/mmmu-sf2.git", - // der public Key muss beim Git-Repo hinterlegt sein - "keyfile"=>"config/sshkeys/git@gitlab.iml.unibe.ch", - "webaccess"=>"https://github.com/iml-it/mmmu-sf2", - ), - - "phases"=>array( - "preview"=>array( - "url"=>"http://preview.mmmu.iml.unibe.ch/", - ), - "stage"=>array( - "url"=>"http://stage.mmmu.iml.unibe.ch/", - ), - "live"=>array( - // "url"=>"http://www.scrudu.iml.unibe.ch/" - ), - ), - ), - /* - "scrudu"=>array( - "label"=>"Scrudu", - "fileprefix"=>"scrudu", - "description" => 'Das sagenumwogene Scrudu Dings', - "contact" => 'Entwickler, Verantwortliche etc.', - "build"=>array( - "type"=>"git", // one of git, svn, ... - // for github: - // generate ssh keypair - // https://help.github.com/articles/generating-ssh-keys - "ssh"=>"git@github.com:iml-it/scrudu.git", - // der public Key muss beim Git-Repo hinterlegt sein - "keyfile"=>"config/sshkeys/git@gitlab.iml.unibe.ch", - "webaccess"=>"https://github.com/iml-it/scrudu", - ), - - "phases"=>array( - "preview"=>array( - "url"=>"http://preview.scrudu.iml.unibe.ch/", - ), - "stage"=>array( - "url"=>"http://stage.scrudu.iml.unibe.ch/" - ), - "live"=>array( - // "url"=>"http://www.scrudu.iml.unibe.ch/" - ), - ), - ), - * - */ -); - -// ---------------------------------------------------------------------- -// Checkout-Informationen fuer versch. Sourcen -// ---------------------------------------------------------------------- -$aTypeAbstraction=array( - - "git"=>array( - "checkout"=>"git pull [url]", - "getrevision"=>"", - "built"=>"[workdir]/buildpackage.sh", - "deleteDirs"=>array( - ".git", - "buildpackage.sh" - ), - ), - /* - "svn"=>array( - "checkout"=>"svn co [url]", - "getrevision"=>"svn info | grep '^Revision' | cut -f 2 -d ':' ", - "built"=>false, - "deleteDirs"=>".svn", - ), - */ - -); - // ---------------------------------------------------------------------- // override for local development // ---------------------------------------------------------------------- diff --git a/public_html/deployment/inc_functions.php b/public_html/deployment/inc_functions.php index ee733d69fdfb6e7a739affe666a69f03ed97bc01..5ebb708c56d15209602ddc71faedf4d6fa9b9f9f 100644 --- a/public_html/deployment/inc_functions.php +++ b/public_html/deployment/inc_functions.php @@ -1,64 +1,85 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + included functions for the act_*.php files + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ + global $aParams; -$aParams=array(); +$aParams = array(); /* -print_r($_GET); -print_r($_POST); -print_r($aParams); -print_r($_SERVER); -echo $_SERVER["REQUEST_URI"]; -*/ + print_r($_GET); + print_r($_POST); + print_r($aParams); + print_r($_SERVER); + echo $_SERVER["REQUEST_URI"]; + */ -$aTmp=preg_split("#/#", $_SERVER["REQUEST_URI"]); -if (count($aTmp)>1 && $aTmp[1]=="deployment" && $aTmp[2]!="?"){ +$aTmp = preg_split("#/#", $_SERVER["REQUEST_URI"]); +if (count($aTmp) > 1 && $aTmp[1] == "deployment" && $aTmp[2] != "?") { array_shift($aTmp); array_shift($aTmp); - if ($aTmp[count($aTmp)-1]=="?"){ + if ($aTmp[count($aTmp) - 1] == "?") { array_pop($aTmp); } - if ($aTmp[0]) $aParams["prj"]=$aTmp[0]; - if (count($aTmp)>1 && $aTmp[1]) $aParams["action"]=$aTmp[1]; - if (count($aTmp)>2 && $aTmp[2]) $aParams["par3"]=$aTmp[2]; - if (count($aTmp)>3 && $aTmp[3]) $aParams["par4"]=$aTmp[3]; + if ($aTmp[0]) + $aParams["prj"] = $aTmp[0]; + if (count($aTmp) > 1 && $aTmp[1]) + $aParams["action"] = $aTmp[1]; + if (count($aTmp) > 2 && $aTmp[2]) + $aParams["par3"] = $aTmp[2]; + if (count($aTmp) > 3 && $aTmp[3]) + $aParams["par4"] = $aTmp[3]; } -if (count($_GET)) foreach($_GET as $key=>$value) $aParams[$key]=$value; -if (count($_POST)) foreach($_POST as $key=>$value) $aParams[$key]=$value; +if (count($_GET)) + foreach ($_GET as $key => $value) + $aParams[$key] = $value; +if (count($_POST)) + foreach ($_POST as $key => $value) + $aParams[$key] = $value; -$sImageBase="/deployment/images/nuvola64x64/"; -$aImages=array( - 'overview'=>'apps/fsview.png', - 'project'=>'filesystems/desktop.png', - 'action'=>'apps/aktion.png', - 'build'=>'apps/kthememgr.png', +$sImageBase = "/deployment/images/nuvola64x64/"; +$aImages = array( + 'overview' => 'apps/fsview.png', + 'project' => 'filesystems/desktop.png', + 'action' => 'apps/aktion.png', + 'build' => 'apps/kthememgr.png', ); /** * get home link as button * @return string */ -function aHome($sClass="btn"){ +function aHome($sClass = "btn") { global $aParams; // if (!array_key_exists("prj", $aParams)) return false; - return '<a href="/deployment/?" class="'.$sClass.'"><i class="icon-home"></i> zur Übersicht</a>'; + return '<a href="/deployment/?" class="' . $sClass . '"><i class="icon-home"></i> zur Übersicht</a>'; } + /** * get project Home link as button * @return string */ -function aPrjHome($sClass="btn"){ +function aPrjHome($sClass = "btn") { global $aParams; - if (!array_key_exists("prj", $aParams)) return false; - if ($aParams["prj"]=="all") return false; + if (!array_key_exists("prj", $aParams)) + return false; + if ($aParams["prj"] == "all") + return false; // if (!array_key_exists("action", $aParams)) return false; - + require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); - $oPrj=new project($aParams["prj"]); - return '<a href="/deployment/'.$aParams["prj"].'/" class="'.$sClass.'"><i class="icon-book"></i> Projekt-Home <strong>'.$oPrj->getLabel().'</strong></a>'; + $oPrj = new project($aParams["prj"]); + return '<a href="/deployment/' . $aParams["prj"] . '/" class="' . $sClass . '"><i class="icon-book"></i> Projekt-Home <strong>' . $oPrj->getLabel() . '</strong></a>'; } /** @@ -66,82 +87,82 @@ function aPrjHome($sClass="btn"){ * @global type $aParams * @return type */ -function getTopArea(){ +function getTopArea() { global $aParams, $sImageBase, $aImages; - $sReturn=''; + $sReturn = ''; require_once("./config/inc_projects_config.php"); require_once("./classes/project.class.php"); require_once("./classes/projectlist.class.php"); - $oPrjList=new projectlist(); + $oPrjList = new projectlist(); /* - $sMyPhase="[phase]"; - $sMyRev="..."; - $sJsonfile=$_SERVER["DOCUMENT_ROOT"]."ci-webgui.json"; - if (file_exists($sJsonfile)){ - $aJson = json_decode(file_get_contents($sJsonfile), true); - if (array_key_exists("revision", $aJson)) $sMyRev=$aJson["revision"]; - } + $sMyPhase="[phase]"; + $sMyRev="..."; + $sJsonfile=$_SERVER["DOCUMENT_ROOT"]."ci-webgui.json"; + if (file_exists($sJsonfile)){ + $aJson = json_decode(file_get_contents($sJsonfile), true); + if (array_key_exists("revision", $aJson)) $sMyRev=$aJson["revision"]; + } * */ - $sBaseUrl='/deployment/'; - $sWikiBaseUrl='https://secure.iml.unibe.ch/wiki/doku.php'; - $sReturn=' + $sBaseUrl = '/deployment/'; + $sWikiBaseUrl = 'https://secure.iml.unibe.ch/wiki/doku.php'; + $sReturn = ' <div class="navbar"> <div class="navbar-inner"> <a class="brand" href="#">IML Deployment GUI</a> <ul class="nav"> - <li>'.aHome("").'</li> + <li>' . aHome("") . '</li> <!-- list of projects --> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Projekte<b class="caret"></b></a> <ul class="dropdown-menu"> '; - $oPrj1 = new project(); - foreach ($oPrj1->getProjects() as $sPrj){ - $oPrj = new project($sPrj); - $sReturn.='<li><a href="'.$sBaseUrl.$sPrj.'/">'.$oPrj->getLabel().'</a></li>'; - } - $sReturn.=' + $oPrj1 = new project(); + foreach ($oPrj1->getProjects() as $sPrj) { + $oPrj = new project($sPrj); + $sReturn.='<li><a href="' . $sBaseUrl . $sPrj . '/">' . $oPrj->getLabel() . '</a></li>'; + } + $sReturn.=' <li class="divider"></li> - <li><a href="'.$sBaseUrl.'all/setup/">Neues Projekt</a></li> + <li><a href="' . $sBaseUrl . 'all/setup/">Neues Projekt</a></li> </ul> </li>'; - if (array_key_exists("prj", $aParams) && $aParams["prj"]<>"all"){ - $oPrj=new project($aParams["prj"]); - $sReturn.=' - <li style="border-left: 1px solid #ccc;">'.aPrjHome(" ").'</li> + if (array_key_exists("prj", $aParams) && $aParams["prj"] <> "all") { + $oPrj = new project($aParams["prj"]); + $sReturn.=' + <li style="border-left: 1px solid #ccc;">' . aPrjHome(" ") . '</li> '; - if (array_key_exists("action", $aParams) and FALSE){ - $sReturn.='<li><a href="#">Aktion: '.$aParams["action"].'</a></li>'; - } else { - $sReturn.=' + if (array_key_exists("action", $aParams) and FALSE) { + $sReturn.='<li><a href="#">Aktion: ' . $aParams["action"] . '</a></li>'; + } else { + $sReturn.=' <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Aktionen<b class="caret"></b></a> <ul class="dropdown-menu"> - <li><a href="'.$sBaseUrl.$aParams["prj"].'/build/">Build</a></li> - <li><a href="'.$sBaseUrl.$aParams["prj"].'/cleanup/">Cleanup</a></li> - <li><a href="'.$sBaseUrl.$aParams["prj"].'/setup/">Projekteinstellungen</a></li> - '; - $sReturn.='</ul></li>'; + <li><a href="' . $sBaseUrl . $aParams["prj"] . '/build/">Build</a></li> + <li><a href="' . $sBaseUrl . $aParams["prj"] . '/cleanup/">Cleanup</a></li> + <li><a href="' . $sBaseUrl . $aParams["prj"] . '/setup/">Projekteinstellungen</a></li> + '; + $sReturn.='</ul></li>'; - $aPhases=$oPrj->getActivePhases(); - if (count($aPhases)) { - $sReturn.='<li class="dropdown"> + $aPhases = $oPrj->getActivePhases(); + if (count($aPhases)) { + $sReturn.='<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Phasen<b class="caret"></b></a> <ul class="dropdown-menu">'; - foreach ($aPhases as $sPhase){ - - $sReturn.='<li><a href="'.$sBaseUrl.$aParams["prj"].'/phase/'.$sPhase.'/">'.$sPhase.'</a></li>'; - } - $sReturn.='</ul></li>'; - } - } + foreach ($aPhases as $sPhase) { + + $sReturn.='<li><a href="' . $sBaseUrl . $aParams["prj"] . '/phase/' . $sPhase . '/">' . $sPhase . '</a></li>'; } - - $sReturn.=' + $sReturn.='</ul></li>'; + } + } + } + + $sReturn.=' <!-- <li> <a href="#" >Irgend...</a> @@ -152,31 +173,31 @@ function getTopArea(){ <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class=" icon-question-sign"></i> Hilfe<b class="caret"></b></a> <ul class="dropdown-menu"> - <li><a href="'.$sWikiBaseUrl.'/it/entwicklung/continuous_deployment">WIKI: Übersicht Continous Deployment</a></li> - <li><a href="'.$sWikiBaseUrl.'/it/entwicklung/continuous_deployment#konventionen">WIKI: Konventionen für Entwickler</a></li> - <li><a href="'.$sWikiBaseUrl.'/it/infrastruktur/dienste/puppet/snippets#iml-deployment">WIKI (Admin): Puppet-Snippets für den Sysadmin</a></li> - <li><a href="'.$sWikiBaseUrl.'/it/infrastruktur/dienste/imldeployment">WIKI (Admin): Verzeichnisse und Dateien</a></li> + <li><a href="' . $sWikiBaseUrl . '/it/entwicklung/continuous_deployment">WIKI: Übersicht Continous Deployment</a></li> + <li><a href="' . $sWikiBaseUrl . '/it/entwicklung/continuous_deployment#konventionen">WIKI: Konventionen für Entwickler</a></li> + <li><a href="' . $sWikiBaseUrl . '/it/infrastruktur/dienste/puppet/snippets#iml-deployment">WIKI (Admin): Puppet-Snippets für den Sysadmin</a></li> + <li><a href="' . $sWikiBaseUrl . '/it/infrastruktur/dienste/imldeployment">WIKI (Admin): Verzeichnisse und Dateien</a></li> </ul> </li> </ul> </div> </div><div id="header2">'; - - if (!array_key_exists("prj", $aParams)){ - $sReturn.='<img src="'.$sImageBase.$aImages['overview'].'" id="imgtop" alt="">' + + if (!array_key_exists("prj", $aParams)) { + $sReturn.='<img src="' . $sImageBase . $aImages['overview'] . '" id="imgtop" alt="">' . '<h1>Übersicht</h1><span class="description">Alle Projekte und Versionen in den einzelnen Phasen</span>'; } else { - if ($aParams["prj"]<>"all") { - $oPrj=new project($aParams["prj"]); - $sReturn.='<img src="'.$sImageBase.$aImages['project'].'" id="imgtop" alt=""> - <h1>'.$oPrj->getLabel().'</h1><span class="description">'.$oPrj->getDescription().'</span>'; - if (array_key_exists("action", $aParams)){ - // $sReturn.='<h2>Aktion: '.$aParams["action"].'</h2>'; - } + if ($aParams["prj"] <> "all") { + $oPrj = new project($aParams["prj"]); + $sReturn.='<img src="' . $sImageBase . $aImages['project'] . '" id="imgtop" alt=""> + <h1>' . $oPrj->getLabel() . '</h1><span class="description">' . $oPrj->getDescription() . '</span>'; + if (array_key_exists("action", $aParams)) { + // $sReturn.='<h2>Aktion: '.$aParams["action"].'</h2>'; + } } } $sReturn.='</div>'; - + return $sReturn; } @@ -187,79 +208,79 @@ function getTopArea(){ * @global array $aImages * @return string */ -function getAction(){ +function getAction() { global $aParams, $sImageBase, $aImages; - $sReturn=''; - if (array_key_exists("action", $aParams)){ - $sLabel=$aParams["action"]; - if (array_key_exists("par3", $aParams)){ + $sReturn = ''; + if (array_key_exists("action", $aParams)) { + $sLabel = $aParams["action"]; + if (array_key_exists("par3", $aParams)) { $sLabel.=' :: ' . $aParams["par3"]; } - $sReturn.='<h2 class="action '.$aParams["action"].'">'.$sLabel.'</h2>'; - } else if (array_key_exists("prj", $aParams)){ - $sReturn.='<h2 class="action prjhome"> Projekt-Home</h2>'; + $sReturn.='<h2 class="action ' . $aParams["action"] . '">' . $sLabel . '</h2>'; + } else if (array_key_exists("prj", $aParams)) { + $sReturn.='<h2 class="action prjhome"> Projekt-Home</h2>'; } return $sReturn; } + /** * get html code of a div around a message * @param string $sWarnlevel one of error|success|info|warning to get a colored box * @param string $sMessage message txt * @return string */ -function getBox($sWarnlevel, $sMessage){ - $aCfg=array( - "error"=>array("class"=>"alert alert-error", "prefix"=>"ERROR :-("), - "success"=>array("class"=>"alert alert-success", "prefix"=>"SUCCESS :-)"), - "info"=>array("class"=>"alert alert-info", "prefix"=>"INFO"), - "warning"=>array("class"=>"alert alert-block", "prefix"=>"WARNUNG"), +function getBox($sWarnlevel, $sMessage) { + $aCfg = array( + "error" => array("class" => "alert alert-error", "prefix" => "ERROR :-("), + "success" => array("class" => "alert alert-success", "prefix" => "SUCCESS :-)"), + "info" => array("class" => "alert alert-info", "prefix" => "INFO"), + "warning" => array("class" => "alert alert-block", "prefix" => "WARNUNG"), ); - $sClass=""; - $sPrefix=""; - if (array_key_exists($sWarnlevel, $aCfg)){ - $sClass=$aCfg[$sWarnlevel]["class"]; - $sPrefix=$aCfg[$sWarnlevel]["prefix"]; - $sMessage='<strong>'.$aCfg[$sWarnlevel]["prefix"].'</strong> ' . $sMessage; + $sClass = ""; + $sPrefix = ""; + if (array_key_exists($sWarnlevel, $aCfg)) { + $sClass = $aCfg[$sWarnlevel]["class"]; + $sPrefix = $aCfg[$sWarnlevel]["prefix"]; + $sMessage = '<strong>' . $aCfg[$sWarnlevel]["prefix"] . '</strong> ' . $sMessage; } return ' - <div class="'.$sClass.'"> - '.$sMessage.' + <div class="' . $sClass . '"> + ' . $sMessage . ' </div>'; - } -function enterDeployinfos(){ +function enterDeployinfos() { global $aParams; - $sIdUser="inputUser"; - $sIdComment="inputComment"; - $sUser=(array_key_exists($sIdUser, $aParams))?$aParams[$sIdUser]:""; - $sComment=(array_key_exists($sIdComment, $aParams))?$aParams[$sIdComment]:""; - - $sOut=' + $sIdUser = "inputUser"; + $sIdComment = "inputComment"; + $sUser = (array_key_exists($sIdUser, $aParams)) ? $aParams[$sIdUser] : ""; + $sComment = (array_key_exists($sIdComment, $aParams)) ? $aParams[$sIdComment] : ""; + + $sOut = ' <div class="control-group"> <label class="control-label" for="inputUser">Benutzername</label> <div class="controls"> - <input type="text" id="inputUser" name="inputUser" placeholder="Benutzername" value="'.$sUser.'"> + <input type="text" id="inputUser" name="inputUser" placeholder="Benutzername" value="' . $sUser . '"> </div> </div> <div class="control-group"> <label class="control-label" for="inputComment">Kommentar zum Deployment</label> <div class="controls"> - <textarea id= rows="3" id="inputComment" name="inputComment" placeholder="Kommentar">'.$sComment.'</textarea> + <textarea id= rows="3" id="inputComment" name="inputComment" placeholder="Kommentar">' . $sComment . '</textarea> </div> </div> '; - + return $sOut; } -function getChecksumDiv($sText){ - return '<div style="background: '.getChecksumColor($sText). '; width: 20px; height: 20px;"> </div>'; +function getChecksumDiv($sText) { + return '<div style="background: ' . getChecksumColor($sText) . '; width: 20px; height: 20px;"> </div>'; } -function getChecksumColor($sText){ - $sReturn=''; - $s=md5($sText); +function getChecksumColor($sText) { + $sReturn = ''; + $s = md5($sText); return "#" . substr($s, 0, 2) . substr($s, 2, 2) . substr($s, 4, 2); } diff --git a/public_html/deployment/index.php b/public_html/deployment/index.php index 14cc4d8b3e6c075f45ccc062e1abb54f3751323f..a7e249ad0ce4eb735d23b41005fbd37697c8decf 100644 --- a/public_html/deployment/index.php +++ b/public_html/deployment/index.php @@ -1,40 +1,56 @@ <?php +/* ###################################################################### + + IML DEPLOYMENT + + webgui - index file - controller like + ensure that you activated the rewrite rules + + RewriteEngine on + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_URI} !^/server-status$ + RewriteRule ^(.*)$ index.php [QSA,L] + + --------------------------------------------------------------------- + 2013-11-08 Axel <axel.hahn@iml.unibe.ch> + ###################################################################### */ + require_once("./inc_functions.php"); require_once("./classes/page.class.php"); -$sPrj=""; -$sAction="overview"; +$sPrj = ""; +$sAction = "overview"; // ------ check parameters if (array_key_exists("prj", $aParams)) { - $sPrj=$aParams["prj"]; + $sPrj = $aParams["prj"]; } if (array_key_exists("action", $aParams)) { - if (file_exists(__DIR__ . '/act_' . $aParams["action"] . ".php")){ - $sAction=$aParams["action"]; + if (file_exists(__DIR__ . '/act_' . $aParams["action"] . ".php")) { + $sAction = $aParams["action"]; } } // ------ action -$sActionFile=__DIR__ . '/act_' . $sAction . ".php"; +$sActionFile = __DIR__ . '/act_' . $sAction . ".php"; include($sActionFile); - + // ------ Ausgabe -$sPhpOut=' +$sPhpOut = ' <div id="header" style="display: none;"> IML DEPLOYMENT GUI </div> <br> - '. getTopArea() .' + ' . getTopArea() . ' <div id="content"> - '.getAction().' - '.$sPhpOut.' + ' . getAction() . ' + ' . $sPhpOut . ' </div> <div id="footer"> - IML Deployment © '.date("Y").' <a href="http://www.iml.unibe.ch/">Institut für medizinische Lehre; Universität Bern</a> + IML Deployment © ' . date("Y") . ' <a href="http://www.iml.unibe.ch/">Institut für medizinische Lehre; Universität Bern</a> </div> '; @@ -50,5 +66,4 @@ $oPage->addJsOnReady(' $oPage->setContent($sPhpOut); echo $oPage->render(); - ?>