diff --git a/public_html/deployment/classes/build_base.class.php b/public_html/deployment/classes/build_base.class.php index 84a93a041f70daf60b53278d252d3b03de09b0d1..29945461c3ac0c2949fd3ba6f688890cc28320a8 100644 --- a/public_html/deployment/classes/build_base.class.php +++ b/public_html/deployment/classes/build_base.class.php @@ -54,6 +54,7 @@ class build_base implements iBuildplugin // --------------------------------------------------------------- /** + * Constructor * Initialize build plugin * @param array $aParams hash with those possible keys * lang string language, i.e. 'de' @@ -154,7 +155,9 @@ class build_base implements iBuildplugin // --------------------------------------------------------------- /** - * Check requirements if the plugin could work + * Get an array with shell commands to check requirements if the plugin + * can work + * * @return array */ public function checkRequirements(): array diff --git a/public_html/deployment/classes/rollout_base.class.php b/public_html/deployment/classes/rollout_base.class.php index 76dadb54081aa944f1645e673549848b0a2a2d8e..fde105372f91d0e34784af8476cfecc1d769b5dd 100644 --- a/public_html/deployment/classes/rollout_base.class.php +++ b/public_html/deployment/classes/rollout_base.class.php @@ -7,6 +7,9 @@ require_once __DIR__ . '/../../vendor/axelhahn/ahcache/cache.class.php'; * see deployment/plugins/rollout/* * * @author axel + * + * Axel <axel.hahn@unibe.ch> + * 2024-08-29 Axel php8 only; added variable types; short array syntax */ class rollout_base implements iRolloutplugin { @@ -19,58 +22,64 @@ class rollout_base implements iRolloutplugin * settings in the config structore for global and project based config * @var string */ - protected $_sPluginId = 'UNSET'; + protected string $_sPluginId = 'UNSET'; + /** - * data with plugin infos (read from info.json) + * Data with plugin infos (read from info.json) * @var array */ - protected $_aPlugininfos = false; + protected array $_aPlugininfos = []; /** - * array with translation texts + * Array with translation texts * @var array */ - protected $_aLang = []; + protected array $_aLang = []; /** * set language; 2 letter code, i.e. "de"; default language is "en" ; a * file "lang_en.json" is required in the plugin dir * @var string */ - protected $_sFallbackLang = 'en-en'; + protected string $_sFallbackLang = 'en-en'; /** * set language; 2 letter code, i.e. "de"; default language is "en" ; a * file "lang_en.json" is required in the plugin dir * @var string */ - protected $_sLang = 'en-en'; + protected string $_sLang = 'en-en'; /** * string with phase of project; one of preview|stage|live * @var string */ - protected $_sPhase = false; + protected string $_sPhase = ''; /** * global configuration of the rollout plugin * @var array */ - protected $_aCfgGlobal = false; + protected array $_aCfgGlobal = []; + /** * configuration of the project * @var array */ - protected $_aCfgProject = false; + protected array $_aCfgProject = []; - protected $_sNamePrefix4Project = false; // set in constructor - protected $_sNamePrefix4Phase = false; // set in constructor + /* + UNUSED + protected string $_sNamePrefix4Project = ''; // set in constructor + protected string $_sNamePrefix4Phase = ''; // set in constructor + */ // --------------------------------------------------------------- // CONSTRUCTOR // --------------------------------------------------------------- /** + * Constructor * initialize rollout plugin * @param array $aParams hash with those possible keys * lang string language, i.e. 'de' @@ -114,13 +123,13 @@ class rollout_base implements iRolloutplugin // --------------------------------------------------------------- /** - * get a string for a prefix for name attribute in form vars. + * Get a string for a prefix for name attribute in form vars. * It is important to store the value in the wanted structure. * * @param string $sPhase * @return string */ - protected function _getNamePrefix($sPhase = false) + protected function _getNamePrefix(string $sPhase = ''): string { return ($sPhase ? 'phases[' . $sPhase . '][plugins][rollout][' . $this->getId() . ']' @@ -129,7 +138,7 @@ class rollout_base implements iRolloutplugin } /** - * get Data from a callback function and store it in a cache + * Get Data from a callback function and store it in a cache * The response type depends on the callback function * * @param string $sFunctionname name of the callback function @@ -138,11 +147,11 @@ class rollout_base implements iRolloutplugin * @param integer $iTtlOnError ttl value = how many seconds to use cache if there was no response * @return mixed */ - protected function _getCallback($sFunctionname, $sKey, $iTtl = 15, $iTtlOnError = 10) + protected function _getCallback(string $sFunctionname, string $sKey, int $iTtl = 15, int $iTtlOnError = 10): mixed { $oCache = new AhCache('rollout-' . $this->getId(), 'callback-' . $sFunctionname . '-' . $sKey); if ($oCache->isExpired()) { - $aMydata = call_user_func(array($this, $sFunctionname)); + $aMydata = call_user_func([$this, $sFunctionname]); // echo "$sFunctionname fresh ".($aMydata ? "OK": "false")." - storing for $iTtl sec<br>"; $oCache->write($aMydata, ($aMydata ? $iTtl : $iTtlOnError)); } else { @@ -152,13 +161,15 @@ class rollout_base implements iRolloutplugin // echo '<pre>'.print_r($aMydata, 1).'</pre>'; die(__METHOD__); return $aMydata; } + /** - * render a form by given form elementes + * Get Html code for a form by given form elementes + * * @param array $aFormdata array of form elements * @param string $sKey part of the identifier used in id of the input field * @return string */ - protected function _renderForm($aFormdata, $sKey) + protected function _renderForm(array $aFormdata, string $sKey): string { static $i; if (!isset($i)) { @@ -177,12 +188,13 @@ class rollout_base implements iRolloutplugin } /** - * render form fields for global plugin variables + * Get Html code for form fields for global plugin variables + * * @param string $sScope scope of vars ... one of global|project|phase * @param string $sPhase optional: render global vars in a phase; if no phase was set it renders form fields for project based settings * @return string */ - protected function _renderForm4Vars($sScope, $sPhase = false) + protected function _renderForm4Vars(string $sScope, string $sPhase = ''): string { $sReturn = ''; @@ -209,8 +221,8 @@ class rollout_base implements iRolloutplugin // create form fields - // $aFormdata[]=array('type' => 'markup','value' => '<br>'.$this->_t('section-override-'.$sScope.'-vars').':'); - $aFormdata[] = array('type' => 'markup', 'value' => '<div style="style: clear: left;"></div><h4>' . $this->getId() . ' :: ' . $sScope . '</h4>'); + // $aFormdata[]=['type' => 'markup','value' => '<br>'.$this->_t('section-override-'.$sScope.'-vars').':']; + $aFormdata[] = ['type' => 'markup', 'value' => '<div style="style: clear: left;"></div><h4>' . $this->getId() . ' :: ' . $sScope . '</h4>']; $sMiss = ''; foreach ($aInfos['vars'][$sScope] as $sVarname => $aVarinfos) { @@ -243,7 +255,7 @@ class rollout_base implements iRolloutplugin $aCallbackData[$aEffectiveConfig[$sVarname]]['checked'] = 'checked'; $aCallbackData[$aEffectiveConfig[$sVarname]]['label'] .= ' ««'; } elseif ($aVarinfos['type'] === 'select') { - $aCallbackData = array_merge(array('NO_SELECTED_ITEM_YET' => array('value' => '', 'label' => '...')), $aCallbackData); + $aCallbackData = array_merge(['NO_SELECTED_ITEM_YET' => ['value' => '', 'label' => '...']], $aCallbackData); } // wenn value = defaultvalue, dann value auf '' setzen (damit bei Default vom Scope @@ -262,7 +274,7 @@ class rollout_base implements iRolloutplugin ? '******************************' : $sMyPlaceholder ); - $aFormdata[] = array( + $aFormdata[] = [ 'type' => $aVarinfos['type'], 'name' => $sPrefixName . '[' . $sVarname . ']', 'label' => $this->_t($sVarname . '-label'), @@ -273,12 +285,12 @@ class rollout_base implements iRolloutplugin // 'size' => 25, 'placeholder' => $sMyPlaceholder, 'autocomplete' => 'off', - ); + ]; break; case "select": case "radio": $aOptions = $aCallbackData; - $aFormdata[] = array( + $aFormdata[] = [ 'type' => $aVarinfos['type'], 'name' => $sPrefixName . '[' . $sVarname . ']', 'label' => $this->_t($sVarname . '-label'), @@ -288,10 +300,10 @@ class rollout_base implements iRolloutplugin 'options' => $aOptions, // 'placeholder' => $sMyPlaceholder - ); + ]; break; case "text": - $aFormdata[] = array( + $aFormdata[] = [ 'type' => $aVarinfos['type'], 'name' => $sPrefixName . '[' . $sVarname . ']', 'label' => $this->_t($sVarname . '-label'), @@ -309,7 +321,7 @@ class rollout_base implements iRolloutplugin // 'size' => 25, 'placeholder' => $sMyPlaceholder, 'autocomplete' => 'off', - ); + ]; break; default: @@ -317,7 +329,7 @@ class rollout_base implements iRolloutplugin break; } } - // $aFormdata[]=array('type' => 'markup','value' => '<div style="style: clear: left;"></div><br><br>'); + // $aFormdata[]=['type' => 'markup','value' => '<div style="style: clear: left;"></div><br><br>']; return $this->_renderForm($aFormdata, $sKey) . ($sMiss ? '<pre>WARNINGS:<br>' . $sMiss . '</pre>' . ($sScope === 'global' ? $this->renderCfgExample() : '') @@ -327,14 +339,15 @@ class rollout_base implements iRolloutplugin } /** - * get a translated text from lang_XX.json in plugin dir; + * Get a translated text from lang_XX.json in plugin dir; * If the key is missed it returns "[KEY :: LANG]" * * @see setLang() + * * @param string $sKey key to find in lang file * @return string */ - protected function _t($sKey) + protected function _t(string $sKey): string { return (isset($this->_aLang[$sKey]) && $this->_aLang[$sKey]) ? $this->_aLang[$sKey] @@ -352,10 +365,11 @@ class rollout_base implements iRolloutplugin * translated texts can be done with $this->_t("your_key") * * @see _t() + * * @param string $sLang language code, i.e. "de-de" * @return boolean */ - public function setLang($sLang = false) + public function setLang(string $sLang = ''): bool { $this->_sLang = $sLang ? $sLang : $this->_sLang; @@ -371,8 +385,11 @@ class rollout_base implements iRolloutplugin /** * set a phase for automatic use GETTER methods + * + * @param string $sPhase name of the phase; one of preview|stage|live + * @return boolean */ - public function setPhase($sPhase) + public function setPhase(string $sPhase): bool { $this->_sPhase = $sPhase; return true; @@ -384,7 +401,9 @@ class rollout_base implements iRolloutplugin // ---------------------------------------------------------------------- /** - * check requirements if the plugin could work + * Get an array with shell commands to check requirements if the plugin + * can work + * * @return array */ public function checkRequirements(): array @@ -394,34 +413,39 @@ class rollout_base implements iRolloutplugin } /** - * check access to a deploy target + * Get an array with shell commands to check access to a deploy target + * + * @return array */ - public function checkConnectionToTarget() + public function checkConnectionToTarget(): array { // do nothing ... always true - return true; + return []; } // ---------------------------------------------------------------------- // INTERFACE :: SETTER // ---------------------------------------------------------------------- - /** - * set Config ... by given global config of the current plugin - * @param array $aConfigArray + * Set Config ... by given global config of the current plugin + * + * @param array $aConfigArray complete array of all config data + * @return boolean */ - public function setGlobalConfig($aConfigArray) + public function setGlobalConfig(array $aConfigArray): bool { - return $this->_aCfgGlobal = $aConfigArray; + $this->_aCfgGlobal = $aConfigArray; + return true; } - - /** - * set Config ... by given project config + * Set Config ... by given project config + * + * @param array $aProjectConfigArray complete array of project config + * @return array */ - public function setProjectConfig($aProjectConfigArray) + public function setProjectConfig(array $aProjectConfigArray): array { $this->_aCfgProject = $aProjectConfigArray; // echo '<pre>'.print_r($aProjectConfigArray, 1).'</pre>'; @@ -431,13 +455,13 @@ class rollout_base implements iRolloutplugin /* if (!isset($this->_aCfgProject['plugins']['rollout'])){ if (!isset($this->_aCfgProject['plugins'])){ - $this->_aCfgProject['plugins']=array(); + $this->_aCfgProject['plugins']=[]; } - $this->_aCfgProject['plugins']['rollout']=array(); + $this->_aCfgProject['plugins']['rollout']=[]; } * */ - $this->_aCfgProject['plugins']['rollout'][$this->_sPluginId] = array('INFO' => 'created'); + $this->_aCfgProject['plugins']['rollout'][$this->_sPluginId] = ['INFO' => 'created']; } // unset empty project values to get global values @@ -456,7 +480,7 @@ class rollout_base implements iRolloutplugin } } } - // TODO: + return $this->_aCfgProject; } @@ -465,12 +489,13 @@ class rollout_base implements iRolloutplugin // ---------------------------------------------------------------------- /** - * get configuration for the project .. or more specifi for a given phase + * Get configuration array for the project .. or more specific for a given phase + * * @param string $sPhase * @param boolean $bMask Flag for public output; if true then mask your secrets * @return array */ - public function getConfig($sPhase = false, $bMask = false) + public function getConfig(string $sPhase = '', bool $bMask = false): array { $aReturn = array_merge($this->_aCfgGlobal, $this->_aCfgProject['plugins']['rollout'][$this->getId()]); @@ -490,12 +515,13 @@ class rollout_base implements iRolloutplugin } /** - * get an array with shell commands to execute + * Get an array with shell commands to execute for deployment of built file + * * @param string $sPhase * @param boolean $bMask Flag for public output; if true then mask your secrets * @return array */ - public function getDeployCommands($sPhase, $bMask = false) + public function getDeployCommands(string $sPhase, bool $bMask = false): array { return [ 'echo "ERROR: The method getDeployCommamds($sPhase) was not implemented in the rollout plugin [' . $this->getId() . ']"', @@ -504,36 +530,39 @@ class rollout_base implements iRolloutplugin } /** - * get string with current ID + * Get string with current plugin ID + * * @return string */ - public function getId() + public function getId(): string { return $this->_sPluginId; } /** - * get string with plugin name (taken from plugin language file) + * Get name of plugin as string ... language specific + * * @return string */ - public function getName() + public function getName(): string { return $this->_t('plugin_name'); } /** - * get string with plugin description (taken from plugin language file) + * Get description of plugin as string ... language specific * @return string */ - public function getDescription() + public function getDescription(): string { return $this->_t('description'); } + /** - * get array read from info.json + * Get array of data in info.js * @return array */ - public function getPluginInfos() + public function getPluginInfos(): array { if ($this->_aPlugininfos) { @@ -544,7 +573,7 @@ class rollout_base implements iRolloutplugin $sFile = dirname($oReflection->getFileName()) . '/info.json'; $this->_aPlugininfos = (file_exists($sFile)) ? json_decode(file_get_contents($sFile), 1) - : array('error' => 'unable to read info file [' . $sFile . '].') + : ['error' => 'unable to read info file [' . $sFile . '].'] ; return $this->_aPlugininfos; } @@ -552,21 +581,26 @@ class rollout_base implements iRolloutplugin // ---------------------------------------------------------------------- // INTERFACE :: RENDERER // ---------------------------------------------------------------------- + + /** + * Get HTML code for example configuration + * @return string + */ public function renderCfgExample() { $sReturn = ''; $sPre = ' '; $aInfos = $this->getPluginInfos(); - $sReturn .= '<pre>$aConfig = array( + $sReturn .= '<pre>$aConfig = [ ... - \'plugins\'=>array( + \'plugins\'=>[ ... // enabled rollout plugins - \'rollout\'=>array( + \'rollout\'=>[ ... <strong> - \'' . $this->getId() . '\'=>array( + \'' . $this->getId() . '\'=>[ // ' . $this->getName() . ' // ' . $this->getDescription() . ' ' . PHP_EOL; @@ -583,16 +617,23 @@ class rollout_base implements iRolloutplugin } $sReturn .= ' - ), + ], </strong> ... - ), + ], ... - ), -);</pre>'; + ], +];</pre>'; return $sReturn; } - protected function _renderMoreToggler($sContent) + + /** + * Get html code for button [...] that shows and hides more information + * + * @param string $sContent + * @return string + */ + protected function _renderMoreToggler(string $sContent) { $sDivId = 'rollout-more-toggler-' . $this->getId() . '-' . md5($sContent); return '' @@ -603,7 +644,14 @@ class rollout_base implements iRolloutplugin ; } - public function renderFormdata4Project() + + /** + * Override general form renderer: show + * - formvars for project + * + * @return string + */ + public function renderFormdata4Project(): string { return '' . $this->_renderForm4Vars('project', false) @@ -614,7 +662,14 @@ class rollout_base implements iRolloutplugin // .'<pre>DEBUG: $this->_aCfgProject ... plugin = '.print_r($this->_aCfgProject, 1).'</pre>' ; } - public function renderFormdata4Phase($sPhase) + + /** + * override of form renderer: show configuration for a given phase + + * @param string $sPhase phaese; one of preview|stage|live + * @return string + */ + public function renderFormdata4Phase(string $sPhase): string { static $iCounter; if (!isset($iCounter)) {