Ich weis: es ist kein Bug, es ist auch nichts schlimmes, aber es nervt auf die Dauer doch
ein wenig: Websitebaker und die Versionsnummern der AddOns, Module oder Code-Schnipsel.
Bei WB werden die Versionen als Floats angegeben: 1.2, oder 1.74, und nicht (wie eigentlich
üblich) mit drei Stellen, wie 1.2.0 und/oder 1.7.4.
Der Grund dafür liegt in der Installationsroutine an der Stelle (Zeile 84 ... o.g.)
PHP-Code:
if ($module_version>=$new_module_version) {
werden einfach die Versionen als Floats miteinander verglichen. Einfach "ist größer oder gleich".
Das Problem: wenn nun ein Autor aus Gewohnheit oder Vorsicht, warum auch immer, in der Versionsangabe
"1.2.0 Alpha" oder "1.2b" hereinschreibt - kommen wir zu unerwarteten Ergebnissen.
Daher die Überlegung, was man tun könnte, damit sowohl "1.23" (im Sinne von 1.2.3) als auch "1.2.3"
verwendet werden können. Die bisherigen Module/Codes könnten bleiben wie sie sind, und wenn
ein neueres Modul käme könnte man auch mit der anderen Schreibweise anfangen: "0.1.0".
Und weil man das nicht nur in WB gebrauchen kann: halt als Klasse (class):
PHP-Code:
<?php
/**
* @version 0.2.0 - dev
* @date 2008-08-12
* @author Dietrich Roland Pehlke
* @state @dev, private - none public
* @package black hawk
*
* @notice Supported forms are:
* 2 single (main) values
* 1.0 main and subversion
* 1.2.3 main, subversion and bugfixes
*
* @todo more supported types like "1.2.3 RC1" and/or "1.2.3 alpha 6"
*
*
* 0.2.0 2008-08-12 Additional function to "clean" a given string
*
* 0.1.0 2008-06-13 First alpha private run
*
*/
class c_version
{
public $types = Array ("dev", "alpha", "rc");
public function __construct() {
}
public function __destruct () {
}
public function test_version ($oldVersion = "0.0.0", $newVersion = "0.0.0") {
$ov = explode(".", $oldVersion);
$nv = explode(".", $newVersion);
$this->__fill($ov, 3);
$this->__fill($nv, 3);
$a = $this->__compare ($ov[0], $nv[0]);
$b = $this->__compare ($ov[1], $nv[1]);
$c = $this->__compare ($ov[2], $nv[2]);
return ($a AND $b AND $c);
}
private function __compare ($a=0, $b=0) {
return (integer) $a >= (integer) $b;
}
private function __fill ( &$aArray= array(), $aNum=3, $aValue=0) {
while (count($aArray) < $aNum) $aArray[] = $aValue;
}
/**
* @since 0.2.0
*/
private function __cleanUp ( &$aString) {
$pattern = Array("*[\t|\n]{1,}]*", "*[ ]{2,}*");
$replace = Array("", " ");
$aString = preg_replace($pattern, $replace, $aString);
}
}
?>
Es ist eigentlich ganz einfach: mit "explode" die Versionsangabe in ein Array umwandeln, ggf. auf drei Stellen mit 0 auffüllen, und dann alle drei Stellen vergleichen.
Und in der Modul-Installation dann an der entsprechenden Stelle die Anpassungen:
PHP-Code:
/**
* Check if this module is already installed
* and compare versions if so
*/
$new_module_version=$module_version;
$action="install";
if ( is_dir(WB_PATH.'/modules/'.$module_directory) ) {
if ( file_exists(WB_PATH.'/modules/'.$module_directory.'/info.php' ) ) {
require ( WB_PATH.'/modules/'.$module_directory.'/info.php' );
/**
* Version to be installed is older than currently installed version
*
* Note: you will have to modify the path to the class-file
* as you need it!
*/
require ("../../engines/black_hawk/classes/c_version.php");
$test = new c_version();
if ( $test->test_version( $modul_version, $new_module_version ) ) {
/**
* Remove temp file
*/
if ( file_exists($temp_file) ) unlink($temp_file);
$admin->print_error($MESSAGE['GENERIC']['ALREADY_INSTALLED']);
}
/**
* Modul exists - so we try to upgrade it.
*/
$action="upgrade";
}
}
Und fertig.
Gruß
Aldus