Changeset 8
- Timestamp:
- Jun 1, 2023, 12:18:18 AM (19 months ago)
- Location:
- trunk
- Files:
-
- 59 added
- 4 deleted
- 19 edited
- 1 copied
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Application/BaseView.php
r7 r8 26 26 $Output .= $Content; 27 27 $Output .= '<br/><div style="text-align: center; font-size: small;">Verze: '.$Revision.' ('.HumanDate($ReleaseTime).')'. 28 ' <a href="http ://svn.zdechov.net/trac/open2ride/browser/trunk">Zdrojový kód</a> '.29 '<a href="http ://svn.zdechov.net/trac/open2ride/log/trunk?verbose=on">Historie změn</a></div>';28 ' <a href="https://svn.zdechov.net/trac/open2ride/browser/trunk">Zdrojový kód</a> '. 29 '<a href="https://svn.zdechov.net/trac/open2ride/log/trunk?verbose=on">Historie změn</a></div>'; 30 30 $Output .= '</body></html>'; 31 31 echo($Output); -
trunk/Application/Core.php
r7 r8 4 4 if (file_exists($ConfigFileName)) include_once($ConfigFileName); 5 5 6 include_once(dirname(__FILE__).'/../Packages/Common/Common.php'); 6 include_once(dirname(__FILE__).'/../Packages/Common/PackageCommon.php'); 7 include_once(dirname(__FILE__).'/../Packages/FormManager/PackageFormManager.php'); 7 8 include_once(dirname(__FILE__).'/Version.php'); 8 include_once(dirname(__FILE__).'/View.php'); 9 include_once(dirname(__FILE__).'/BaseView.php'); 10 include_once(dirname(__FILE__).'/PageMissing.php'); 9 11 include_once(dirname(__FILE__).'/UpdateTrace.php'); 10 12 include_once(dirname(__FILE__).'/DefaultConfig.php'); 11 13 include_once(dirname(__FILE__).'/../Global.php'); 12 14 13 class Core extends Application15 class Core extends System 14 16 { 15 var $Pages;16 var $ShowPage;17 var $BaseURL;18 var $Config;19 var $HeadItems;20 var $Bars;21 /** @var FormManager */22 var $FormManager;17 public bool $ShowPage; 18 public string $BaseURL; 19 public array $Config; 20 public array $HeadItems; 21 public array $Bars; 22 public array $PathItems; 23 public FormManager $FormManager; 24 public BaseView $BaseView; 23 25 24 26 function __construct() … … 65 67 $this->RegisterPageBar('TopLeft'); 66 68 67 // Register and start existing modules 68 $this->Setup = new Setup($this); 69 $this->Setup->Start(); 70 if ($this->Setup->CheckState()) 69 $this->StartModules(); 70 } 71 72 function StartModules(): void 73 { 74 $ModuleSetup = $this->ModuleManager->LoadModule(dirname(__FILE__).'/../Packages/Common/Modules/ModuleSetup.php'); 75 $ModuleSetup->Install(); 76 $ModuleSetup->Start(); 77 $this->ModuleManager->LoadModules(); 78 $this->ModuleManager->LoadModule(dirname(__FILE__).'/../Packages/Common/Modules/ModuleAdmin.php'); 79 if (file_exists($this->ModuleManager->FileName)) $this->ModuleManager->LoadState(); 80 if (ModuleSetup::Cast($ModuleSetup)->CheckState()) 71 81 { 72 $this->ModuleManager->Start ();82 $this->ModuleManager->StartAll(array(ModuleCondition::Enabled)); 73 83 } 74 84 } 75 85 76 function Run() 86 function Run(): void 77 87 { 78 88 $this->RunCommon(); … … 98 108 echo($this->BaseView->GetOutput($Page)); 99 109 } 100 101 function RegisterPage($Path, $Handler) 102 { 103 if (is_array($Path)) 104 { 105 $Page = &$this->Pages; 106 $LastKey = array_pop($Path); 107 foreach ($Path as $PathItem) 108 { 109 $Page = &$Page[$PathItem]; 110 } 111 if (!is_array($Page)) $Page = array('' => $Page); 112 $Page[$LastKey] = $Handler; 113 } else $this->Pages[$Path] = $Handler; 114 } 115 116 function UnregisterPage($Path) 117 { 118 unset($this->Pages[$Path]); 119 } 120 110 121 111 function RegisterPageBar($Name) 122 112 { … … 148 138 } 149 139 150 function Link($Target) 140 function Link($Target): string 151 141 { 152 142 return $this->BaseURL.$Target; 153 143 } 154 }155 144 156 class PageMissing extends Page 157 { 158 function __construct($System) 145 static function Cast(System $System): Core 159 146 { 160 parent::__construct($System); 161 $this->ParentClass = ''; 162 $this->Title = T('Page not found'); 163 } 164 165 function Show() 166 { 167 Header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 168 return '<h3 align="center">'.T('Required page not found').'</h3>'; 147 if ($System instanceof Core) 148 { 149 return $System; 150 } 151 throw new Exception('Expected Core type but '.gettype($System)); 169 152 } 170 153 } -
trunk/Application/Version.php
r6 r8 6 6 // and system will need database update. 7 7 8 $Revision = 6;9 $DatabaseRevision = 6;10 $ReleaseTime = strtotime('202 0-04-14');8 $Revision = 8; 9 $DatabaseRevision = 8; 10 $ReleaseTime = strtotime('2023-06-01'); -
trunk/Modules/Map/Map.php
r7 r8 1 1 <?php 2 3 class ModuleMap extends AppModule4 {5 function __construct($System)6 {7 parent::__construct($System);8 $this->Name = 'Map';9 $this->Version = '1.0';10 $this->Creator = 'Chronos';11 $this->License = 'GNU/GPL';12 $this->Description = 'Map';13 $this->Dependencies = array();14 }15 16 function DoStart()17 {18 }19 20 function DoInstall()21 {22 }23 24 function DoUninstall()25 {26 }27 28 function DoUpgrade()29 {30 31 }32 }33 2 34 3 class Map extends Model … … 41 10 var $Key; 42 11 43 function __construct( Application$System)12 function __construct(Core $System) 44 13 { 45 14 parent::__construct($System); … … 70 39 } 71 40 72 class MapSeznam extends Map73 {74 function Geolocate($Text)75 {76 //new SMap.Geocoder(query, odpoved);77 }78 41 79 function Show()80 {81 $Output .= '<div id="m" style="height:380px"></div>';82 $Output .= '<script type="text/javascript">83 var centerMap = SMap.Coords.fromWGS84(14.40, 50.08);84 var m = new SMap(JAK.gel("m"), centerMap, 16);85 var l = m.addDefaultLayer(SMap.DEF_BASE).enable();86 m.addDefaultControls();87 88 89 var nalezeno = function(route) {90 var vrstva = new SMap.Layer.Geometry();91 m.addLayer(vrstva).enable();92 93 var coords = route.getResults().geometry;94 var cz = m.computeCenterZoom(coords);95 m.setCenterZoom(cz[0], cz[1]);96 var g = new SMap.Geometry(SMap.GEOMETRY_POLYLINE, null, coords);97 vrstva.addGeometry(g);98 }99 100 var coords = [101 SMap.Coords.fromWGS84(14.434, 50.084),102 SMap.Coords.fromWGS84(16.600, 49.195)103 ];104 var route = new SMap.Route(coords, nalezeno);105 </script>';106 $this->System->HeadItems[] = '<script src="//api.mapy.cz/loader.js"></script>107 <script>Loader.load()</script>';108 109 return $Output;110 }111 }112 113 class MapGoogle extends Map114 {115 function Route()116 {117 $Origins = array();118 $Destinations = array();119 foreach ($this->Path as $Index => $PathItem)120 if ($Index > 0)121 {122 if ($Index == 1) $Origins[] = $this->Path[$Index - 1];123 $Destinations[] = $this->Path[$Index];124 }125 $URL = 'https://maps.googleapis.com/maps/api/distancematrix/json'.126 '?origins='.implode('|', $Origins).'&destinations='.implode('|', $Destinations).'&key='.$this->Key;127 $Result = file_get_contents($URL);128 $Points = array(array('Destination' => $this->Path[0], 'Distance' => 0, 'Duration' => 0));129 $I = 1;130 while (strpos($Result, '"distance"') !== false) {131 $Distance = trim($this->Parse($Result, '"value" :', '}'));132 $Duration = trim($this->Parse($Result, '"value" :', '}'));133 $Points[] = array('Destination' => $this->Path[$I], 'Distance' => $Distance, 'Duration' => $Duration);134 $I++;135 }136 return $Points;137 }138 139 function Show()140 {141 $WayPoints = $this->Path;142 array_shift($WayPoints);143 array_pop($WayPoints);144 if (count($WayPoints) > 0)145 $WaypointsQuery = '&waypoints='.implode('|', $WayPoints);146 else $WaypointsQuery = '';147 148 $Output = '<iframe width="'.$this->Width.'" height="'.$this->Height.'" frameborder="0" scrolling="no" '.149 'marginheight="0" marginwidth="0" src="'.'https://www.google.com/maps/embed/v1/directions'.150 '?key='.$this->Key.'&origin='.$this->Path[0].$WaypointsQuery.151 '&destination='.$this->Path[count($this->Path) - 1].''.152 '" style="border: 1px solid black"></iframe>';153 return $Output;154 }155 }156 157 class MapOSM extends Map158 {159 function Geolocate($Text)160 {161 // http://wiki.openstreetmap.org/wiki/Nominatim162 $URL = 'http://nominatim.openstreetmap.org/search.php?q='.urlencode($Text).'&viewbox=&format=xml&limit=1';163 $Result = file_get_contents($URL);164 $Result = substr($Result, strpos($Result, 'boundingbox="') + 13);165 $BoundingBox = substr($Result, 0, strpos($Result, '"') - 1);166 $Parts = explode(',', $BoundingBox);167 $Zoom = 1 / ($Parts[1] - $Parts[0]) * 2;168 $Result = substr($Result, strpos($Result, 'lat=\'') + 5);169 $Latitude = substr($Result, 0, strpos($Result, '\'') - 1);170 $Result = substr($Result, strpos($Result, 'lon=\'') + 5);171 $Longitude = substr($Result, 0, strpos($Result, '\'') - 1);172 return array('Latitude' => $Latitude, 'Longitude' => $Longitude, 'BoundingBox' => $BoundingBox, 'Zoom' => $Zoom);173 }174 175 function Route($TextPathItems)176 {177 $this->Points = array();178 foreach ($TextPathItems as $TextPathItem)179 {180 $Result = $this->Geolocate($TextPathItem);181 $this->Points[] = array('Longitude' => $Result['Longitude'],182 'Latitude' => $Result['Latitude']);183 }184 185 $WayPoints = array();186 foreach ($this->Points as $Point)187 {188 $WayPoints[] = $Point['Longitude'];189 $WayPoints[] = $Point['Latitude'];190 }191 192 // http://wiki.openstreetmap.org/wiki/OpenRouteService#OpenRouteService_API193 $this->Key = 'ee0b8233adff52ce9fd6afc2a2859a28';194 $URL = 'http://openls.geog.uni-heidelberg.de/route?api_key='.195 $this->Key.'&start='.implode(',', $this->Points[0]).'&end='.implode(',', $this->Points[count($this->Points) - 1]).196 '&via='.implode(',', $WayPoints).'&lang=en&distunit=M&routepref=Car&weighting=Fastest&avoidAreas='.197 '&useTMC=false&noMotorways=false&noTollways=false&noUnpavedroads=false&noSteps=false'.198 '&noFerries=false&elevation=false&surface=false&instructions=false';199 $Result = file_get_contents($URL);200 echo($Result);201 $Separator = '<xls:TotalDistance uom="M" value="';202 $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));203 $TotalDistance = substr($Result, 0, strpos($Result, '"/>') - 1);204 $Separator = '<xls:TotalTime>PT2H3M48S';205 $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));206 $TotalTime = substr($Result, 0, strpos($Result, '"/>') - 1);207 208 $Points = array();209 $Separator = '<gml:pos>';210 while (strpos($Result, $Separator) !== false)211 {212 $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));213 $Pos = substr($Result, 0, strpos($Result, '</gml:pos>') - 1);214 $PosParts = explode(' ', $Pos);215 $Points[] = array('Longitude' => $PosParts[0], 'Latitude' => $PosParts[1]);216 }217 return array('TotalDistance' => $TotalDistance, 'TotalTime' => $TotalTime,218 'Points' => $Points);219 }220 221 function Show()222 {223 $WayPoints = array();224 foreach ($this->Points as $Point)225 {226 $WayPoints[] = $Point['Longitude'];227 $WayPoints[] = $Point['Latitude'];228 }229 230 $Output = '<iframe width="'.$this->Width.'" height="'.$this->Height.'" frameborder="0" scrolling="no" '.231 'marginheight="0" marginwidth="0" src="'.232 'http://www.openrouteservice.org/?pos=8.925670599999979,52.28150333376007&zoom='.233 $this->Zoom.'&layer=0B00&routeOpt=Car&wp='.implode(',', $WayPoints).234 '&lang=en&routeLang=en&distUnit=m&routeWeight=Fastest'.235 'style="border: 1px solid black"></iframe>';236 /* $Latitude = $this->Pos['Latitude'];237 $Longitude = $this->Pos['Longitude'];238 $Zoom = $this->Zoom;239 $BoundingBox = array($Longitude - 1 / $Zoom, $Latitude - 1 / $Zoom, $Longitude + 1 / $Zoom, $Latitude + 1 / $Zoom);240 $Output = '<iframe width="'.$this->Width.'" height="'.$this->Height.'" frameborder="0" scrolling="no" '.241 'marginheight="0" marginwidth="0" src="http://www.openstreetmap.org/export/embed.html'.242 '?bbox='.implode(',', $BoundingBox).'&layer=mapnik&marker='.$Latitude.','.$Longitude.'" '.243 'style="border: 1px solid black"></iframe>'.244 '<p><small><a href="http://www.openstreetmap.org/'.245 '?lat='.$Latitude.'&lon='.$Longitude.';zoom='.$Zoom.'&layers=M&mlat='.$Latitude.'&mlon='.$Longitude.'">View Larger Map</a></small></p>';246 */247 return $Output;248 }249 } -
trunk/Modules/Ride/Ride.php
r7 r8 1 1 <?php 2 2 3 include_once(dirname(__FILE__).'/RideModel.php'); 3 class Ride extends Model 4 { 5 function Add($Track, $SeatCount, $Car, $Details) 6 { 7 $this->Database->insert('Ride', array('SeatCount' => $SeatCount, 'Details' => $Details, 8 'Car' => $Car, 'Driver' => $this->System->ModuleManager->Modules['User']->User['Id'])); 9 $RideId = $this->Database->insert_id; 4 10 5 class ModuleRide extends AppModule 6 { 7 function __construct($System) 8 { 9 parent::__construct($System); 10 $this->Name = 'Ride'; 11 $this->Version = '1.0'; 12 $this->Creator = 'Chronos'; 13 $this->License = 'GNU/GPL'; 14 $this->Description = 'Ride management'; 15 $this->Dependencies = array('User', 'Map'); 16 } 17 18 function DoStart() 19 { 20 $this->System->RegisterPage('', 'PageMain'); 21 $this->System->RegisterPage('nova-jizda', 'PageNewRide'); 22 $this->System->RegisterPage('jizda', 'PageRideDetail'); 23 $this->System->RegisterPage('jizdy', 'PageRideList'); 24 $this->System->RegisterPageBarItem('TopLeft', 'Logo', array($this, 'ShowLogo')); 25 } 26 27 function DoInstall() 28 { 29 $this->Database->query('CREATE TABLE `CarManufacturer` ( 30 `Id` int(11) NOT NULL AUTO_INCREMENT, 31 `Name` varchar(255) NOT NULL, 32 PRIMARY KEY (`Id`) 33 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 34 $this->Database->query('CREATE TABLE `CarModel` ( 35 `Id` int(11) NOT NULL AUTO_INCREMENT, 36 `Name` varchar(255) NOT NULL, 37 `Manufacturer` int(11) NOT NULL, 38 PRIMARY KEY (`Id`), 39 KEY `Manufacturer` (`Manufacturer`) 40 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 41 $this->Database->query('ALTER TABLE `CarModel` 42 ADD CONSTRAINT `CarModel_ibfk_1` FOREIGN KEY (`Manufacturer`) REFERENCES `CarManufacturer` (`Id`);'); 43 $this->Database->query('CREATE TABLE `Car` ( 44 `Id` int(11) NOT NULL AUTO_INCREMENT, 45 `Owner` int(11) NOT NULL, 46 `Photo` int(11) DEFAULT NULL, 47 `Model` int(11) NOT NULL, 48 PRIMARY KEY (`Id`), 49 KEY `Owner` (`Owner`), 50 KEY `Model` (`Model`) 51 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 52 $this->Database->query('ALTER TABLE `Car` 53 ADD CONSTRAINT `Car_ibfk_1` FOREIGN KEY (`Owner`) REFERENCES `User` (`Id`), 54 ADD CONSTRAINT `Car_ibfk_2` FOREIGN KEY (`Model`) REFERENCES `CarModel` (`Id`);'); 55 $this->Database->query('CREATE TABLE `Ride` ( 56 `Id` int(11) NOT NULL AUTO_INCREMENT, 57 `Driver` int(11) NOT NULL, 58 `SeatCount` int(11) NOT NULL, 59 `Car` int(11) NOT NULL, 60 `Details` text NOT NULL, 61 PRIMARY KEY (`Id`), 62 KEY `Driver` (`Driver`), 63 KEY `Car` (`Car`) 64 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 65 $this->Database->query('ALTER TABLE `Ride` 66 ADD CONSTRAINT `Ride_ibfk_1` FOREIGN KEY (`Driver`) REFERENCES `User` (`Id`), 67 ADD CONSTRAINT `Ride_ibfk_2` FOREIGN KEY (`Car`) REFERENCES `Car` (`Id`);'); 68 $this->Database->query('CREATE TABLE `RideStop` ( 69 `Id` int(11) NOT NULL AUTO_INCREMENT, 70 `Ride` int(11) NOT NULL, 71 `Time` datetime NOT NULL, 72 `Place` varchar(255) NOT NULL, 73 `Sequence` int(11) NOT NULL, 74 `Price` int(11) NOT NULL, 75 `PassengerCount` int(11) NOT NULL, 76 PRIMARY KEY (`Id`), 77 KEY `Ride` (`Ride`) 78 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 79 $this->Database->query('ALTER TABLE `RideStop` 80 ADD CONSTRAINT `RideStop_ibfk_1` FOREIGN KEY (`Ride`) REFERENCES `Ride` (`Id`);'); 81 $this->Database->query('CREATE TABLE `Passenger` ( 82 `Id` int(11) NOT NULL AUTO_INCREMENT, 83 `Ride` int(11) NOT NULL, 84 `User` int(11) NOT NULL, 85 `SeatCount` int(11) NOT NULL, 86 `RideStopFrom` int(11) NOT NULL, 87 `RideStopTo` int(11) NOT NULL, 88 PRIMARY KEY (`Id`), 89 KEY `User` (`User`), 90 KEY `Ride` (`Ride`), 91 KEY `RideStopFrom` (`RideStopFrom`), 92 KEY `RideStopTo` (`RideStopTo`) 93 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); 94 $this->Database->query('ALTER TABLE `Passenger` 95 ADD CONSTRAINT `Passenger_ibfk_1` FOREIGN KEY (`Ride`) REFERENCES `Ride` (`Id`), 96 ADD CONSTRAINT `Passenger_ibfk_2` FOREIGN KEY (`User`) REFERENCES `User` (`Id`), 97 ADD CONSTRAINT `Passenger_ibfk_3` FOREIGN KEY (`RideStopFrom`) REFERENCES `RideStop` (`Id`), 98 ADD CONSTRAINT `Passenger_ibfk_4` FOREIGN KEY (`RideStopTo`) REFERENCES `RideStop` (`Id`);'); 99 $this->InsertData(); 100 } 101 102 function InsertData() 103 { 104 $this->Database->query('INSERT INTO `CarManufacturer` (`Id`, `Name`) VALUES '. 105 '(NULL, "Škoda"), (NULL, "Nissan"), (NULL, "Mitsubishi"), (NULL, "Fiat"), '. 106 '(NULL, "Dacia"), (NULL, "KIA"), (NULL, "Hyundai"), (NULL, "Ford"), '. 107 '(NULL, "Opel"), (NULL, "Volkswagen"), (NULL, "Citroen"), (NULL, "Peugeot"), '. 108 '(NULL, "Tesla"), (NULL, "Audi"), (NULL, "BMW"), (NULL, "Chevrolet"), '. 109 '(NULL, "Suzuki"), (NULL, "Toyota"), (NULL, "Mercedes-benz"), (NULL, "Seat"),'. 110 '(NULL, "Volvo"), (NULL, "Renault"), (NULL, "Mazda");'); 111 $this->Database->query('INSERT INTO `CarModel` (`Id`, `Name`, `Manufacturer`) VALUES '. 112 '(NULL, "Rapid", 1), (NULL, "Octavia", 1), (NULL, "Fabia", 1), (NULL, "Felicia", 1), '. 113 '(NULL, "Superb", 1);'); 114 } 115 116 function DoUninstall() 117 { 118 $this->Database->query('DROP TABLE IF EXISTS `Passenger`'); 119 $this->Database->query('DROP TABLE IF EXISTS `RideStop`'); 120 $this->Database->query('DROP TABLE IF EXISTS `Ride`'); 121 $this->Database->query('DROP TABLE IF EXISTS `Car`'); 122 $this->Database->query('DROP TABLE IF EXISTS `CarModel`'); 123 $this->Database->query('DROP TABLE IF EXISTS `CarManufacturer`'); 124 } 125 126 function DoUpgrade() 127 { 128 129 } 130 131 function InsertSampleData() 132 { 133 $Cities = array('Praha', 'Brno', 'Ostrava', 'Olomouc', 'Liberec', 'Plzeň', 134 'Humpolec', 'Zlín', 'Přerov', 'České Budějovice', 'Jihlava', 'Ústí nad Labem', 135 'Hradec Králové', 'Pardubice', 'Mohelnice', 'Břeclav', 'Znojmo', 'Semily', 136 'Tábor', 'Opava', 'Karviná', 'Pelhřimov', 'Osoblaha', 'Broumov', 'Jirkov', 137 'Aš', 'Kutná Hora', 'Kolín', 'Strakonice', 'Tachov', 'Domažlice', 'Beroun', 138 'Most', 'Chomutov', 'Mělník', 'Mladá Boleslav', 'Svitavy', 'Šumperk', 139 'Litomyšl', 'Chrudim', 'Blansko', 'Hodonín', 'Rosice', 'Uherský Brod', 140 'Vsetín', 'Nový Jičín', 'Prostějov', 'Vyškov', 'Mohelnice', 'Ústí nad Orlicí'); 141 142 for ($I = 0; $I < 100; $I++) 11 foreach($_SESSION['Track'] as $Index => $TrackItem) 143 12 { 144 $ Stops = array_fill(0, random(5), '');145 for ($J = 0; $J < count($Stops); $J++)146 $Stops[$J] = $Cities[random(count($Cities))];147 148 $Ride = new Ride();149 $StartTime = time() - random(60*60*24*365);150 $StopCount = random(5);151 $Ride->Add($Stops, $StartTime, $SeatCount);13 $this->Database->insert('RideStop', array( 14 'Ride' => $RideId, 15 'Place' => $TrackItem['Destination'], 16 'Time' => TimeToMysqlDateTime($TrackItem['Time']), 17 'Price' => $TrackItem['Price'], 18 'Sequence' => $Index, 19 'PassengerCount' => 0, 20 )); 152 21 } 153 22 } 154 23 155 function ShowLogo()24 function GetTrack() 156 25 { 157 $Output = '<img src="" width="200" height="50" alt="Logo"/> '. 158 '<a href="'.$this->System->Link('/jizdy/').'">Hledat jízdu</a> nebo '. 159 '<a href="'.$this->System->Link('/nova-jizda/').'">Nabídnout jízdu</a>'; 160 return $Output; 26 return($Track); 161 27 } 162 28 163 function UpdatePassengerCount($RideId)29 function Remove($Id) 164 30 { 165 $DbResult = $this->System->Database->select('RideStop', 'COUNT(*) AS RideStopCount', 'Ride='.$RideId); 166 $DbRow = $DbResult->fetch_assoc(); 167 168 $Stops = array_fill(0, $DbRow['RideStopCount'], 0); 169 $this->System->Database->update('RideStop', 'Ride='.$RideId, array('PassengerCount' => 0)); 170 $DbResult = $this->System->Database->query('SELECT PassengerRideStopFrom.Sequence AS SequenceFrom, '. 171 'PassengerRideStopTo.Sequence AS SequenceTo, Passenger.SeatCount FROM Passenger '. 172 'LEFT JOIN RideStop AS PassengerRideStopFrom ON PassengerRideStopFrom.Id=Passenger.RideStopFrom '. 173 'LEFT JOIN RideStop AS PassengerRideStopTo ON PassengerRideStopTo.Id=Passenger.RideStopTo '. 174 'WHERE Passenger.Ride='.$RideId); 175 while ($DbRow = $DbResult->fetch_assoc()) 176 { 177 for ($I = $DbRow['SequenceFrom'] + 1; $I <= $DbRow['SequenceTo']; $I++) 178 { 179 $Stops[$I] = $Stops[$I] + $DbRow['SeatCount']; 180 } 181 } 182 foreach ($Stops as $Index => $Stop) 183 { 184 $this->System->Database->update('RideStop', 'Ride='.$RideId.' AND Sequence='.$Index, array('PassengerCount' => $Stop)); 185 } 31 $this->Database->delete('Passenger', 'Ride='.$Id); 32 $this->Database->delete('RideStop', 'Ride='.$Id); 33 $this->Database->delete('Ride', 'Id='.$Id); 186 34 } 187 35 } 188 189 class PageRideDetail extends Page190 {191 function ShowDetail()192 {193 $RideId = $_GET['id'];194 $DbResult = $this->Database->query('SELECT Ride.Details, Ride.Id, Ride.SeatCount, '.195 'RideStopFrom.Id AS RideStopFromId, RideStopTo.Id AS RideStopToId, '.196 '(SELECT Name FROM User WHERE User.Id=Ride.Driver) AS DriverName, '.197 'CONCAT(CarManufacturer.Name, " ", CarModel.Name) AS CarName FROM Ride '.198 'JOIN RideStop AS RideStopFrom ON (RideStopFrom.Ride = Ride.Id) AND (RideStopFrom.Place LIKE "%'.$_GET['from'].'%") '.199 'JOIN RideStop AS RideStopTo ON (RideStopTo.Ride = Ride.Id) AND (RideStopTo.Place LIKE "%'.$_GET['to'].'%") '.200 'LEFT JOIN Car ON Car.Id = Ride.Car '.201 'LEFT JOIN CarModel ON CarModel.Id = Car.Model '.202 'LEFT JOIN CarManufacturer ON CarManufacturer.Id = CarModel.Manufacturer '.203 'WHERE Ride.Id='.$RideId);204 $DbRow = $DbResult->fetch_assoc();205 $Track = array();206 $Stops = array();207 $DbResult2 = $this->Database->query('SELECT * FROM RideStop WHERE Ride='.$DbRow['Id'].' ORDER BY Sequence');208 while ($DbRow2 = $DbResult2->fetch_assoc())209 {210 $Track[] = $DbRow2;211 $Stops[] = $DbRow2['Place'];212 }213 214 $Output = '<h3>Detail jízdy</h3><table>'.215 '<tr><td>Trasa:</td><td>'.implode(' → ', $Stops).'</td></tr>'.216 '<tr><td>Odjezd z:</td><td>'.$Track[0]['Place'].'</td></tr>'.217 '<tr><td>Příjezd do:</td><td>'.$Track[count($Track) - 1]['Place'].'</td></tr>'.218 '<tr><td>Čas odjezdu:</td><td>'.$Track[0]['Time'].'</td></tr>'.219 '<tr><td>Podrobnosti:</td><td>'.$DbRow['Details'].'</td></tr>';220 $Output .= '</table>';221 $Output .= '<form action="?step=2" method="post">'.222 'Počet míst: <input type="text" name="seats" value="1"/>'.223 '<input type="hidden" name="id" value="'.$RideId.'"/>'.224 '<input type="hidden" name="fromid" value="'.$DbRow['RideStopFromId'].'"/>'.225 '<input type="hidden" name="toid" value="'.$DbRow['RideStopToId'].'"/>'.226 '<input type="submit" value="Rezervovat"/>'.227 '</form>';228 229 $Output .= '<h3>Cestující</h3>'.230 '<table class="WideTable">';231 232 // Load passengers table233 $Table = array_fill(0, count($Track), array_fill(0, $DbRow['SeatCount'], NULL));234 $Passengers = array();235 $DbResult = $this->System->Database->query('SELECT User.Name AS UserName, PassengerRideStopFrom.Sequence AS SequenceFrom, '.236 'PassengerRideStopTo.Sequence AS SequenceTo FROM Passenger '.237 'LEFT JOIN RideStop AS PassengerRideStopFrom ON PassengerRideStopFrom.Id=Passenger.RideStopFrom '.238 'LEFT JOIN RideStop AS PassengerRideStopTo ON PassengerRideStopTo.Id=Passenger.RideStopTo '.239 'LEFT JOIN User ON User.Id=Passenger.User '.240 'WHERE Passenger.Ride='.$RideId);241 while ($Passenger = $DbResult->fetch_assoc())242 {243 $Passengers[] = $Passenger;244 $Seat = 0;245 do {246 $Check = true;247 for ($I = $Passenger['SequenceFrom']; $I < $Passenger['SequenceTo']; $I++)248 {249 if ($Table[$I][$Seat] != 0) $Check = false;250 }251 if (!$Check) $Seat++;252 } while (!$Check);253 for ($I = $Passenger['SequenceFrom']; $I < $Passenger['SequenceTo']; $I++)254 $Table[$I][$Seat] = count($Passengers) - 1;255 }256 257 $Output .= '<tr><th>Zastávka / Čas</th><th style="width: 80px">Řidič</th>';258 for ($I = 0; $I < $DbRow['SeatCount']; $I++)259 $Output .= '<th style="width: 80px">Cestující</th>';260 $Output .= '</tr>';261 foreach ($Track as $Index => $TrackItem)262 {263 $Output .= '<tr><td style="height: 100px">'.$TrackItem['Place'].'<br/>'.$TrackItem['Time'].'</td>';264 if ($Index == 0) $Output .= '<td rowspan="'.count($Track).'">Řidič</td>';265 for ($I = 0; $I < $DbRow['SeatCount']; $I++)266 {267 if (!is_null($Table[$Index][$I])) {268 $Passenger = $Passengers[$Table[$Index][$I]];269 if ($Index == $Passenger['SequenceFrom'])270 $Output .= '<td rowspan="'.($Passenger['SequenceTo'] - $Passenger['SequenceFrom']).'">'.$Passenger['UserName'].'</td>';271 } else {272 // Show unused space273 if (($Index == 0) or ((($Index - 1) >= 0) and (!is_null($Table[$Index - 1][$I]))))274 {275 $J = 1;276 while ((($Index + $J) < count($Table)) and is_null($Table[$Index + $J][$I])) $J++;277 $Output .= '<td rowspan="'.$J.'"> </td>';278 }279 }280 }281 $Output .= '</tr>';282 }283 $Output .= '</table>';284 285 286 return $Output;287 }288 289 function Show()290 {291 if (!array_key_exists('step', $_GET)) $Output = $this->ShowDetail();292 else {293 if ($_GET['step'] == 2) {294 $this->System->Database->insert('Passenger', array(295 'Ride' => $_POST['id'],296 'User' => $this->System->User->User['Id'],297 'SeatCount' => $_POST['seats'],298 'RideStopFrom' => $_POST['fromid'],299 'RideStopTo' => $_POST['toid'],300 ));301 $this->System->ModuleManager->Modules['Ride']->UpdatePassengerCount($_POST['id']);302 $Output = 'Rezervace dokončena';303 }304 }305 return $Output;306 }307 }308 309 class PageMain extends Page310 {311 function Show()312 {313 if (array_key_exists('from', $_GET)) $PlaceFrom = $_GET['from'];314 else $PlaceFrom = '';315 if (array_key_exists('to', $_GET)) $PlaceTo = $_GET['to'];316 else $PlaceTo = '';317 if (array_key_exists('time', $_GET)) $Time = $_GET['time'];318 else $Time = '';319 $Output = '<table style="width: 100%; margin-top: 100px; margin-bottom: 100px;"><tr><td style="text-align: center">'.320 '<div><h3>Vyhledat jízdu</h3>'.321 '<form style="display: inline;" method="get" action="'.$this->System->Link('/jizdy/').'">'.322 'Odkud: <input type="text" name="from" value="'.$PlaceFrom.'"/> '.323 'Kam: <input type="text" name="to" value="'.$PlaceTo.'"/> '.324 'Čas: <input type="text" name="time" value="'.$Time.'"/> '.325 '<input type="submit" value="Hledat"/>'.326 '</form></div></td></tr></table>';327 return $Output;328 }329 }330 331 class PageRideList extends Page332 {333 function Show()334 {335 if (array_key_exists('from', $_GET)) $PlaceFrom = $_GET['from'];336 else $PlaceFrom = '';337 if (array_key_exists('to', $_GET)) $PlaceTo = $_GET['to'];338 else $PlaceTo = '';339 if (array_key_exists('time', $_GET)) $Time = $_GET['time'];340 else $Time = '';341 $Output = '<table style="width: 100%"><tr><td style="text-align: center;">'.342 '<form style="display: inline;" method="get" action="'.$this->System->Link('/').'">'.343 'Odkud: <input type="text" name="from" value="'.$PlaceFrom.'"/> '.344 'Kam: <input type="text" name="to" value="'.$PlaceTo.'"/> '.345 'Čas: <input type="text" name="time" value="'.$Time.'"/> '.346 '<input type="submit" value="Hledat"/>'.347 '</form></td></tr></table>';348 if (array_key_exists('from', $_GET) and array_key_exists('to', $_GET)) {349 $Output .= $this->ShowRides($_GET['from'], $_GET['to']);350 } else $Output .= $this->ShowRides('', '');351 return $Output;352 }353 354 function ShowRides($PlaceFrom, $PlaceTo)355 {356 $Output = '<h3>Jízdy:</h3>';357 $Output .= '<table>';358 $Query = 'SELECT Ride.Id, Ride.SeatCount, User.Name AS DriverName, User.BirthDate, '.359 'CONCAT(CarManufacturer.Name, " ", CarModel.Name) AS CarName ';360 if ((trim($PlaceFrom) != '') and (trim($PlaceTo != '')))361 $Query .= ', (SELECT COALESCE(MAX(RideStop.PassengerCount), 0) FROM RideStop '.362 'WHERE (RideStop.Ride=Ride.Id) AND (RideStop.Sequence > RideStopFrom.Sequence) AND '.363 '(RideStop.Sequence <= RideStopTo.Sequence)) AS PassengerCount ';364 else365 $Query .= ', (SELECT COALESCE(MAX(RideStop.PassengerCount), 0) FROM RideStop '.366 'WHERE (RideStop.Ride=Ride.Id)) AS PassengerCount ';367 368 $Query .= 'FROM Ride '.369 'LEFT JOIN Car ON Car.Id = Ride.Car '.370 'LEFT JOIN CarModel ON CarModel.Id = Car.Model '.371 'LEFT JOIN CarManufacturer ON CarManufacturer.Id = CarModel.Manufacturer '.372 'LEFT JOIN User ON User.Id=Ride.Driver ';373 if ((trim($PlaceFrom) != '') and (trim($PlaceTo != '')))374 $Query .= 'JOIN RideStop AS RideStopFrom ON (RideStopFrom.Ride = Ride.Id) AND (RideStopFrom.Place LIKE "%'.$PlaceFrom.'%") '.375 'JOIN RideStop AS RideStopTo ON (RideStopTo.Ride = Ride.Id) AND (RideStopTo.Place LIKE "%'.$PlaceTo.'%") '.376 'WHERE (RideStopFrom.Sequence < RideStopTo.Sequence)';377 $Query .= 'LIMIT 10';378 $DbResult = $this->Database->query($Query);379 while ($DbRow = $DbResult->fetch_assoc())380 {381 $Stops = array();382 $Price = 0;383 $DbResult2 = $this->Database->query('SELECT * FROM RideStop WHERE Ride='.$DbRow['Id'].' ORDER BY Sequence');384 while ($DbRow2 = $DbResult2->fetch_assoc())385 {386 $Stops[] = $DbRow2['Place'];387 $Price += $DbRow2['Price'];388 }389 390 if ($DbRow['BirthDate'] != '') $Age = ' ('.round((time() - MysqlDateToTime($DbRow['BirthDate'])) / (3600*24*364.25)).' let)';391 else $Age = '';392 $Output .= '<tr><td>Řidič:</td><td>'.$DbRow['DriverName'].$Age.'</td>'.393 '<td colspan="4"><a href="'.$this->System->Link('/jizda/?id='.$DbRow['Id'].'&from='.$PlaceFrom.'&to='.$PlaceTo).'">Ukázat</a></td></tr>'.394 '<tr><td>Trasa:</td><td>'.implode(' → ', $Stops).'</td></tr>'.395 '<tr><td>Cena:</td><td>'.$Price.' Kč</td></tr>'.396 '<tr><td>Volných míst:</td><td>'.($DbRow['SeatCount'] - $DbRow['PassengerCount']).'</td></tr>'.397 '<tr><td>Auto:</td><td>'.$DbRow['CarName'].'</td></tr>'.398 '<tr><td> </td></tr>';399 }400 $Output .= '</table>';401 402 return $Output;403 }404 }405 406 function time_elapsed($secs)407 {408 $bit = array(409 'y' => $secs / 31556926 % 12,410 'w' => $secs / 604800 % 52,411 'd' => $secs / 86400 % 7,412 'h' => $secs / 3600 % 24,413 'm' => $secs / 60 % 60,414 's' => $secs % 60415 );416 417 $ret = array();418 foreach ($bit as $k => $v)419 if ($v > 0)$ret[] = $v . $k;420 421 return join(' ', $ret);422 }423 424 class PageNewRide extends Page425 {426 function Show()427 {428 if (!array_key_exists('step', $_GET))429 {430 $Output = '<script>431 function insertAfter(referenceNode, newNode)432 {433 referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);434 }435 436 function add_before(name)437 {438 var objTo = document.getElementById(name)439 var divtest = document.createElement("div");440 divtest.innerHTML = \'<tr><td>Zastávka:</td><td><input type="text" name="ridestop1"/></td></tr>\';441 442 objTo.parentNode.insertBefore(divtest, objTo.childNodes[0])443 }444 445 function add_after(name)446 {447 var objTo = document.getElementById(name)448 var divtest = document.createElement("div");449 divtest.innerHTML = \'<tr><td>Zastávka:</td><td><input type="text" name="ridestop1"/></td></tr>\';450 451 insertAfter(objTo, divtest)452 }453 </script>'.454 '<form method="get" action="'.$this->System->Link('/nova-jizda/').'">'.455 '<table>'.456 '<tr><td colspan="2"><strong>Trasa:</strong></td></tr>'.457 458 '<tr><td>Počátek:</td><td><input type="text" name="from"/></td></tr>'.459 '<tr><td>Zastávka:</td><td><input type="text" name="middle"/></td></tr>'.460 '<tr><td>Konec:</td><td><input type="text" name="to"/></td></tr>'.461 462 '<tr><td colspan="2"><br><strong>Parametry jízdy:</strong></td></tr>'.463 '<tr><td>Čas odjezdu:</td><td><input type="text" name="time-from"/></td></tr>'.464 '<tr><td>Počet míst pro cestující:</td><td><input type="text" name="seats"/></td></tr>'.465 '</table>'.466 '<input type="hidden" name="step" value="2"/><br/>'.467 '<input type="submit" value="Pokračovat"/>'.468 '</form>';469 } else {470 if ($_GET['step'] == '2') {471 $TimeFrom = strtotime($_GET['time-from']);472 $Output = '<table style="width: 100%"><tr><td>';473 $Output .= '<form method="post" action="'.$this->System->Link('/nova-jizda/?step=3').'">'.474 '<input type="hidden" name="from" value="'.$_GET['from'].'"/><br/>'.475 '<input type="hidden" name="to" value="'.$_GET['to'].'"/><br/>'.476 '<input type="hidden" name="time-from" value="'.$_GET['time-from'].'"/><br/>'.477 '<input type="hidden" name="seats" value="'.$_GET['seats'].'"/><br/>'.478 '<input type="hidden" name="step" value="3"/><br/>'.479 'Popis:<br/><textarea name="desc"></textarea><br/>'.480 'Auto: <select name="car">';481 $DbResult = $this->Database->query('SELECT Car.Id, CONCAT(CarManufacturer.Name, " ", CarModel.Name) AS ModelName FROM Car '.482 'LEFT JOIN CarModel ON CarModel.Id=Car.Model '.483 'LEFT JOIN CarManufacturer ON CarManufacturer.Id = CarModel.Manufacturer '.484 'WHERE Car.Owner='.$this->System->User->User['Id']);485 while ($DbRow = $DbResult->fetch_assoc())486 {487 $Output .= '<option value="'.$DbRow['Id'].'"/>'.$DbRow['ModelName'].'</option>';488 }489 $Output .= '</select>'.490 '<input type="submit" value="Vytvořit"/>'.491 '</form>';492 $Map = new MapGoogle($this->System);493 $Map->Key = 'AIzaSyDQ-tOjP9mO8ZpSEuBc5_oCRg30rpQZiBI';494 $Map->Width = 400;495 $Map->Height = 300;496 $Map->Path = array($_GET['from'], $_GET['to']);497 //$Map->Path = array('Praha', 'Brno', 'Zlín', 'Vsetín');498 $Track = $Map->Route();499 $Output .= '<h3>Trasa</h3>';500 $PricePerKm = 0.8;501 $Output .= '<table class="WideTable"><tr><th>Úsek</th><th>Odjezd</th><th>Trvání</th><th>Vzdálenost [km]</th><th>Cena [Kč]</th></tr>';502 foreach ($Track as $Index => $TrackItem)503 {504 if ($Index > 0)505 {506 $Track[$Index]['Time'] = $TimeFrom + $Track[$Index - 1]['Duration'];507 $RelDistance = $TrackItem['Distance'] - $Track[$Index - 1]['Distance'];508 $RelDuration = $TrackItem['Duration'] - $Track[$Index - 1]['Duration'];509 $Track[$Index]['Price'] = round($PricePerKm * $RelDistance / 1000);510 $Output .= '<tr><td>'.$Map->Path[$Index - 1].' → '.$TrackItem['Destination'].'</td>'.511 '<td>'.TimeToMysqlDateTime($Track[$Index]['Time']).'</td>'.512 '<td>'.time_elapsed($RelDuration).'</td>'.513 '<td>'.round($RelDistance / 1000).'</td>'.514 '<td>'.$Track[$Index]['Price'].'</td></tr>';515 516 } else {517 $Track[$Index]['Time'] = $TimeFrom;518 $Track[$Index]['Price'] = 0;519 }520 }521 $Output .= '<tr><td>'.$Map->Path[0].' → '.$Map->Path[count($Map->Path) - 1].'</td>'.522 '<td>'.TimeToMysqlDateTime($Track[0]['Time']).'</td>'.523 '<td>'.time_elapsed($Track[count($Track) - 1]['Duration']).'</td>'.524 '<td>'.round($Track[count($Track) - 1]['Distance'] / 1000).'</td>'.525 '<td>'.round($PricePerKm * $Track[count($Track) - 1]['Distance'] / 1000).'</td></tr>';526 $Output .= '</table><br/>';527 $Output .= 'Vzdálenost: '.round($Track[count($Track) - 1]['Distance'] / 1000, 1).' km<br/>';528 $Output .= 'Délka jízdy: '.time_elapsed($Track[count($Track) - 1]['Duration']).'<br/>';529 $Output .= '</td><td>';530 $Map->Key = 'AIzaSyDwKYuEdkXAl9Y2RyDLf5m03n-ItHaqdKs';531 $Output .= $Map->Show();532 $Output .= '</td></tr></table>';533 $_SESSION['Track'] = $Track;534 $_SESSION['SeatCount'] = $_GET['seats'];535 } else536 if ($_GET['step'] == '3') {537 $this->Database->insert('Ride', array(538 'Driver' => $this->System->User->User['Id'],539 'SeatCount' => $_POST['seats'],540 'Car' => $_POST['car'],541 'Details' => $_POST['desc'],542 ));543 $RideId = $this->Database->insert_id;544 foreach ($_SESSION['Track'] as $Index => $TrackItem)545 {546 $this->Database->insert('RideStop', array(547 'Ride' => $RideId,548 'Place' => $TrackItem['Destination'],549 'Time' => TimeToMysqlDateTime($TrackItem['Time']),550 'Price' => $TrackItem['Price'],551 'Sequence' => $Index,552 'PassengerCount' => 0,553 ));554 }555 $Output = 'Nová jízda přidána.';556 }557 }558 return $Output;559 }560 }561 -
trunk/Modules/User/ModuleUser.php
r7 r8 1 1 <?php 2 2 3 include_once(dirname(__FILE__).'/User Model.php');4 include_once(dirname(__FILE__).'/ UserList.php');5 include_once(dirname(__FILE__).'/ UserPage.php');6 7 class ModuleUser extends AppModule3 include_once(dirname(__FILE__).'/User.php'); 4 include_once(dirname(__FILE__).'/PageUserList.php'); 5 include_once(dirname(__FILE__).'/PageUser.php'); 6 7 class ModuleUser extends Module 8 8 { 9 9 var $UserPanel; … … 21 21 } 22 22 23 function DoInstall() 23 function DoInstall(): void 24 24 { 25 25 $this->Database->query('CREATE TABLE IF NOT EXISTS `User` ('. … … 107 107 } 108 108 109 function DoUninstall() 109 function DoUninstall(): void 110 110 { 111 111 $this->Database->query('DROP TABLE `PermissionUserAssignment`'); … … 117 117 } 118 118 119 function DoUpgrade() 119 function DoUpgrade(): string 120 120 { 121 121 /* … … 126 126 } 127 127 */ 128 } 129 130 function DoStart() 128 return ''; 129 } 130 131 function DoStart(): void 131 132 { 132 133 $this->System->User = new User($this->System); … … 281 282 } 282 283 283 function DoStop() 284 function DoStop(): void 284 285 { 285 286 } -
trunk/Modules/User/PageUser.php
r7 r8 3 3 class PageUser extends Page 4 4 { 5 var $FullTitle = 'Uživatel'; 6 var $ShortTitle = 'Uživatel'; 7 var $ParentClass = 'PagePortal'; 5 function __construct(System $System) 6 { 7 parent::__construct($System); 8 $this->Title = 'Uživatel'; 9 $this->Description = 'Uživatel'; 10 $this->ParentClass = 'PagePortal'; 11 } 8 12 9 13 function Panel($Title, $Content, $Menu = array()) … … 88 92 } 89 93 90 function Show() 94 function Show(): string 91 95 { 92 96 $Output = ''; -
trunk/Modules/User/PageUserList.php
r7 r8 3 3 class PageUserList extends Page 4 4 { 5 var $FullTitle = 'Seznam registrovaných uživatelů'; 6 var $ShortTitle = 'Seznam uživatelů'; 7 var $ParentClass = 'PagePortal'; 5 function __construct(System $System) 6 { 7 parent::__construct($System); 8 $this->Title = 'Seznam uživatelů'; 9 $this->Description = 'Seznam registrovaných uživatelů'; 10 $this->ParentClass = 'PagePortal'; 11 } 8 12 9 function Show() 13 function Show(): string 10 14 { 11 15 if (!$this->System->User->CheckPermission('User', 'ShowList')) -
trunk/Modules/User/User.php
r7 r8 1 1 <?php 2 3 include_once(dirname(__FILE__).'/PasswordHash.php'); 2 4 3 5 define('LOGIN_USED', 'Přihlašovací jméno již použito.'); … … 28 30 define('DEFAULT_GROUP', 1); 29 31 30 class PasswordHash31 {32 function Hash($Password, $Salt)33 {34 return sha1(sha1($Password).$Salt);35 }36 37 function Verify($Password, $Salt, $StoredHash)38 {39 return $this->Hash($Password, $Salt) == $StoredHash;40 }41 42 function GetSalt()43 {44 mt_srand(microtime(true) * 100000 + memory_get_usage(true));45 return sha1(uniqid(mt_rand(), true));46 }47 }48 49 32 // TODO: Make User class more general without dependencies to System, Mail, Log 50 33 -
trunk/Packages/Common/Base.php
r1 r8 1 1 <?php 2 3 class System4 {5 /* @var Database */6 var $Database;7 8 function __construct()9 {10 $this->Database = new Database();11 }12 }13 2 14 3 class Base 15 4 { 16 /** @var Application */ 17 var $System; 18 /* @var Database */ 19 var $Database; 5 public System $System; 6 public Database $Database; 20 7 21 function __construct( Application$System)8 function __construct(System $System) 22 9 { 23 10 $this->System = &$System; 24 11 $this->Database = &$System->Database; 25 12 } 13 14 static function GetClassName() 15 { 16 return get_called_class(); 17 } 26 18 } 27 28 class Model extends Base29 {30 31 }32 33 class View extends Base34 {35 36 }37 38 class Controller extends Base39 {40 41 } -
trunk/Packages/Common/Common.php
r7 r8 11 11 include_once(dirname(__FILE__).'/Error.php'); 12 12 include_once(dirname(__FILE__).'/Base.php'); 13 include_once(dirname(__FILE__).'/Application.php'); 14 include_once(dirname(__FILE__).'/AppModule.php'); 13 include_once(dirname(__FILE__).'/View.php'); 14 include_once(dirname(__FILE__).'/Model.php'); 15 include_once(dirname(__FILE__).'/ModelDesc.php'); 16 include_once(dirname(__FILE__).'/Controller.php'); 17 include_once(dirname(__FILE__).'/System.php'); 18 include_once(dirname(__FILE__).'/Module.php'); 19 include_once(dirname(__FILE__).'/ModuleManager.php'); 20 include_once(dirname(__FILE__).'/ModelDef.php'); 15 21 include_once(dirname(__FILE__).'/Config.php'); 16 22 include_once(dirname(__FILE__).'/Page.php'); 17 23 include_once(dirname(__FILE__).'/Locale.php'); 18 24 include_once(dirname(__FILE__).'/Update.php'); 19 include_once(dirname(__FILE__).'/Setup.php');20 25 include_once(dirname(__FILE__).'/Table.php'); 21 include_once(dirname(__FILE__).'/Form/Form.php'); 26 include_once(dirname(__FILE__).'/Process.php'); 27 include_once(dirname(__FILE__).'/Generics.php'); 28 include_once(dirname(__FILE__).'/BigInt.php'); 29 include_once(dirname(__FILE__).'/Int128.php'); 30 include_once(dirname(__FILE__).'/Pdf.php'); 31 include_once(dirname(__FILE__).'/Paging.php'); 32 include_once(dirname(__FILE__).'/Modules/Setup.php'); 33 include_once(dirname(__FILE__).'/Modules/ModuleManager.php'); 22 34 23 35 class PackageCommon 24 36 { 25 var$Name;26 var$Version;27 var$ReleaseDate;28 var$License;29 var$Creator;30 var$Homepage;37 public string $Name; 38 public string $Version; 39 public int $ReleaseDate; 40 public string $License; 41 public string $Creator; 42 public string $Homepage; 31 43 32 44 function __construct() … … 34 46 $this->Name = 'Common'; 35 47 $this->Version = '1.2'; 36 $this->ReleaseDate = strtotime('20 16-01-22');48 $this->ReleaseDate = strtotime('2023-05-31'); 37 49 $this->Creator = 'Chronos'; 38 $this->License = 'GNU/GPL ';39 $this->Homepage = 'http ://svn.zdechov.net/svn/PHPlib/Common/';50 $this->License = 'GNU/GPLv3'; 51 $this->Homepage = 'https://svn.zdechov.net/PHPlib/Common/'; 40 52 } 41 53 } 42 43 class Paging44 {45 var $TotalCount;46 var $ItemPerPage;47 var $Around;48 var $SQLLimit;49 var $Page;50 51 function __construct(Application $System)52 {53 $this->ItemPerPage = $System->Config['Web']['ItemsPerPage'];54 $this->Around = $System->Config['Web']['VisiblePagingItems'];55 }56 57 function Show()58 {59 $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);60 61 $Result = '';62 if (array_key_exists('all', $QueryItems))63 {64 $PageCount = 1;65 $ItemPerPage = $this->TotalCount;66 } else67 {68 $ItemPerPage = $this->ItemPerPage;69 $Around = round($this->Around / 2);70 $PageCount = floor($this->TotalCount / $ItemPerPage) + 1;71 }72 73 if (!array_key_exists('Page', $_SESSION)) $_SESSION['Page'] = 0;74 if (array_key_exists('page', $_GET)) $_SESSION['Page'] = $_GET['page'] * 1;75 if ($_SESSION['Page'] < 0) $_SESSION['Page'] = 0;76 if ($_SESSION['Page'] >= $PageCount) $_SESSION['Page'] = $PageCount - 1;77 $CurrentPage = $_SESSION['Page'];78 79 $Result .= 'Počet položek: <strong>'.$this->TotalCount.'</strong> Stránky: ';80 81 $Result = '';82 if ($PageCount > 1)83 {84 if ($CurrentPage > 0)85 {86 $QueryItems['page'] = 0;87 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'"><<</a> ';88 $QueryItems['page'] = ($CurrentPage - 1);89 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'"><</a> ';90 }91 $PagesMax = $PageCount - 1;92 $PagesMin = 0;93 if ($PagesMax > ($CurrentPage + $Around)) $PagesMax = $CurrentPage + $Around;94 if ($PagesMin < ($CurrentPage - $Around))95 {96 $Result.= ' ... ';97 $PagesMin = $CurrentPage - $Around;98 }99 for ($i = $PagesMin; $i <= $PagesMax; $i++)100 {101 if ($i == $CurrentPage) $Result.= '<strong>'.($i + 1).'</strong> ';102 else {103 $QueryItems['page'] = $i;104 $Result .= '<a href="?'.SetQueryStringArray($QueryItems).'">'.($i + 1).'</a> ';105 }106 }107 if ($PagesMax < ($PageCount - 1)) $Result .= ' ... ';108 if ($CurrentPage < ($PageCount - 1))109 {110 $QueryItems['page'] = ($CurrentPage + 1);111 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">></a> ';112 $QueryItems['page'] = ($PageCount - 1);113 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">>></a>';114 }115 }116 $QueryItems['all'] = '1';117 if ($PageCount > 1) $Result.= ' <a href="?'.SetQueryStringArray($QueryItems).'">Vše</a>';118 119 $Result = '<div style="text-align: center">'.$Result.'</div>';120 $this->SQLLimit = ' LIMIT '.$CurrentPage * $ItemPerPage.', '.$ItemPerPage;121 $this->Page = $CurrentPage;122 return $Result;123 }124 } -
trunk/Packages/Common/Config.php
r7 r8 3 3 class Config 4 4 { 5 var$Data;5 public array $Data; 6 6 7 7 function __construct() … … 10 10 } 11 11 12 function ReadValue( $Name)12 function ReadValue(string $Name) 13 13 { 14 14 if (!is_array($Name)) $Name = explode('/', $Name); … … 22 22 } 23 23 24 function WriteValue( $Name, $Value)24 function WriteValue(string $Name, $Value) 25 25 { 26 26 if (!is_array($Name)) $Name = explode('/', $Name); … … 34 34 } 35 35 36 function LoadFromFile( $FileName)36 function LoadFromFile(string $FileName): void 37 37 { 38 38 $ConfigData = array(); … … 40 40 foreach ($this->Data as $Index => $Item) 41 41 { 42 if (array_key_exi ts($Index, $ConfigData))42 if (array_key_exists($Index, $ConfigData)) 43 43 $this->Data[$Index] = $ConfigData[$Index]; 44 44 } 45 45 } 46 46 47 function SaveToFile( $FileName)47 function SaveToFile(string $FileName): void 48 48 { 49 49 file_put_contents($FileName, "<?php \n\n\$ConfigData = ".var_export($this->Data, true).";\n"); 50 50 } 51 51 52 function GetAsArray() 52 function GetAsArray(): array 53 53 { 54 54 return $this->Data; -
trunk/Packages/Common/Database.php
r7 r8 2 2 3 3 // Extended database class 4 // Date: 2016-01-11 4 // Date: 2020-11-10 5 6 function microtime_float() 7 { 8 list($usec, $sec) = explode(" ", microtime()); 9 return (float)$usec + (float)$sec; 10 } 5 11 6 12 class DatabaseResult 7 13 { 8 var$PDOStatement;9 var$num_rows = 0;14 public PDOStatement $PDOStatement; 15 public int $num_rows = 0; 10 16 11 17 function fetch_assoc() … … 27 33 class Database 28 34 { 29 var $Prefix; 30 var $Functions; 31 var $Type; 32 var $PDO; 33 var $Error; 34 var $insert_id; 35 var $LastQuery; 36 var $ShowSQLError; 37 var $ShowSQLQuery; 38 var $LogSQLQuery; 39 var $LogFile; 35 public string $Prefix; 36 public array $Functions; 37 public string $Type; 38 public PDO $PDO; 39 public string $Error; 40 public string $insert_id; 41 public string $LastQuery; 42 public bool $ShowSQLError; 43 public bool $ShowSQLQuery; 44 public bool $LogSQLQuery; 45 public string $LogFile; 46 public string $Database; 40 47 41 48 function __construct() 42 49 { 43 50 $this->Prefix = ''; 44 $this->Functions = array('NOW( )', 'CURDATE()', 'CURTIME()', 'UUID()');51 $this->Functions = array('NOW(', 'CURDATE(', 'CURTIME(', 'UUID(', 'SHA1('); 45 52 $this->Type = 'mysql'; // mysql, pgsql 46 53 $this->Error = ''; … … 50 57 $this->LogSQLQuery = false; 51 58 $this->LogFile = dirname(__FILE__).'/../../Query.log'; 52 } 53 54 function Connect($Host, $User, $Password, $Database) 59 $this->Database = ''; 60 } 61 62 function Connect(string $Host, string $User, string $Password, string $Database): void 55 63 { 56 64 if ($this->Type == 'mysql') $ConnectionString = 'mysql:host='.$Host.';dbname='.$Database; 57 65 else if ($this->Type == 'pgsql') $ConnectionString = 'pgsql:dbname='.$Database.';host='.$Host; 58 66 else $ConnectionString = ''; 67 $this->Database = $Database; 59 68 try { 60 69 $this->PDO = new PDO($ConnectionString, $User, $Password); 61 62 70 } catch (Exception $E) 63 71 { … … 67 75 } 68 76 69 function Disconnect() 77 function Disconnect(): void 70 78 { 71 79 unset($this->PDO); 72 80 } 73 81 74 function Connected() 82 function Connected(): bool 75 83 { 76 84 return isset($this->PDO); 77 85 } 78 86 79 function select_db( $Database)87 function select_db(string $Database) 80 88 { 81 89 $this->query('USE `'.$Database.'`'); 82 90 } 83 91 84 function query($Query) 92 function query($Query): DatabaseResult 85 93 { 86 94 if (!$this->Connected()) throw new Exception(T('Not connected to database')); 87 if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true)) $QueryStartTime = microtime ();95 if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true)) $QueryStartTime = microtime_float(); 88 96 $this->LastQuery = $Query; 89 97 if (($this->ShowSQLQuery == true) or ($this->LogSQLQuery == true)) 90 $Duration = ' ; '.round(microtime() - $QueryStartTime, 4). ' s'; 91 if ($this->LogSQLQuery == true) 98 { 99 $Time = round(microtime_float() - $QueryStartTime, 4); 100 $Duration = ' ; '.$Time. ' s'; 101 } 102 if (($this->LogSQLQuery == true) and ($Time != 0)) 92 103 file_put_contents($this->LogFile, $Query.$Duration."\n", FILE_APPEND); 93 104 if ($this->ShowSQLQuery == true) … … 95 106 'padding-bottom: 3px; padding-top: 3px; font-size: 12px; font-family: Arial;">'.$Query.$Duration.'</div>'."\n"); 96 107 $Result = new DatabaseResult(); 97 $Result->PDOStatement = $this->PDO->query($Query); 98 if ($Result->PDOStatement) 99 { 100 $Result->num_rows = $Result->PDOStatement->rowCount(); 108 $Statement = $this->PDO->query($Query); 109 if ($Statement) 110 { 111 $Result->PDOStatement = $Statement; 112 $Result->num_rows = $Statement->rowCount(); 101 113 $this->insert_id = $this->PDO->lastInsertId(); 102 114 } else 103 115 { 104 $ this->Error = $this->PDO->errorInfo();105 $this->Error = $ this->Error[2];116 $Error = $this->PDO->errorInfo(); 117 $this->Error = $Error[2]; 106 118 if (($this->Error != '') and ($this->ShowSQLError == true)) 107 119 echo('<div><strong>SQL Error: </strong>'.$this->Error.'<br />'.$Query.'</div>'); … … 111 123 } 112 124 113 function select( $Table, $What = '*', $Condition = 1)125 function select(string $Table, string $What = '*', string $Condition = '1'): DatabaseResult 114 126 { 115 127 return $this->query('SELECT '.$What.' FROM `'.$this->Prefix.$Table.'` WHERE '.$Condition); 116 128 } 117 129 118 function delete( $Table, $Condition)130 function delete(string $Table, string $Condition): void 119 131 { 120 132 $this->query('DELETE FROM `'.$this->Prefix.$Table.'` WHERE '.$Condition); 121 133 } 122 134 123 function insert($Table, $Data) 135 function insert(string $Table, array $Data): int 136 { 137 $this->query($this->GetInsert($Table, $Data)); 138 $this->insert_id = $this->PDO->lastInsertId(); 139 return $this->insert_id; 140 } 141 142 function IsFunction(string $Text): bool 143 { 144 $Pos = strpos($Text, '('); 145 return ($Pos !== false) && in_array(substr($Text, 0, $Pos + 1), $this->Functions); 146 } 147 148 function GetInsert(string $Table, array $Data): string 124 149 { 125 150 $Name = ''; … … 128 153 { 129 154 $Name .= ',`'.$Key.'`'; 130 if (!in_array($Value, $this->Functions)) 155 if (is_null($Value)) $Value = 'NULL'; 156 else if (!$this->IsFunction($Value)) 131 157 { 132 if (is_null($Value)) $Value = 'NULL'; 133 else $Value = $this->PDO->quote($Value); 158 $Value = $this->PDO->quote($Value); 134 159 } 135 160 $Values .= ','.$Value; … … 137 162 $Name = substr($Name, 1); 138 163 $Values = substr($Values, 1); 139 $this->query('INSERT INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')'); 140 $this->insert_id = $this->PDO->lastInsertId(); 141 } 142 143 function update($Table, $Condition, $Data) 164 return 'INSERT INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')'; 165 } 166 167 function update(string $Table, string $Condition, array $Data): void 168 { 169 $this->query($this->GetUpdate($Table, $Condition, $Data)); 170 } 171 172 function GetUpdate(string $Table, string $Condition, array $Data): string 144 173 { 145 174 $Values = ''; 146 175 foreach ($Data as $Key => $Value) 147 176 { 148 if (!in_array($Value, $this->Functions)) 177 if (is_null($Value)) $Value = 'NULL'; 178 else if (!$this->IsFunction($Value)) 149 179 { 150 if (is_null($Value)) $Value = 'NULL'; 151 else $Value = $this->PDO->quote($Value); 180 $Value = $this->PDO->quote($Value); 152 181 } 153 182 $Values .= ', `'.$Key.'`='.$Value; 154 183 } 155 184 $Values = substr($Values, 2); 156 $this->query('UPDATE `'.$this->Prefix.$Table.'` SET '.$Values.' WHERE ('.$Condition.')');157 } 158 159 function replace( $Table, $Data)185 return 'UPDATE `'.$this->Prefix.$Table.'` SET '.$Values.' WHERE ('.$Condition.')'; 186 } 187 188 function replace(string $Table, array $Data): void 160 189 { 161 190 $Name = ''; … … 163 192 foreach ($Data as $Key => $Value) 164 193 { 165 if (!in_array($Value, $this->Functions)) 194 if (is_null($Value)) $Value = 'NULL'; 195 else if (!$this->IsFunction($Value)) 166 196 { 167 if (is_null($Value)) $Value = 'NULL'; 168 else $Value = $this->PDO->quote($Value); 197 $Value = $this->PDO->quote($Value); 169 198 } 170 199 $Name .= ',`'.$Key.'`'; … … 173 202 $Name = substr($Name, 1); 174 203 $Values = substr($Values, 1); 175 //echo('REPLACE INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES ('.$Values.')<br />');176 204 $this->query('REPLACE INTO `'.$this->Prefix.$Table.'` ('.$Name.') VALUES('.$Values.')'); 177 //echo($this->error().'<br>'); 178 } 179 180 function charset($Charset) 205 } 206 207 function charset(string $Charset): void 181 208 { 182 209 $this->query('SET NAMES "'.$Charset.'"'); 183 210 } 184 211 185 function real_escape_string( $Text)212 function real_escape_string(string $Text): string 186 213 { 187 214 return addslashes($Text); 188 215 } 189 216 190 function quote( $Text)217 function quote(string $Text): string 191 218 { 192 219 return $this->PDO->quote($Text); 193 220 } 194 221 195 public function __sleep() 222 public function __sleep(): array 196 223 { 197 224 return array('LastQuery'); 198 225 } 199 226 200 public function __wakeup() 201 { 227 public function __wakeup(): void 228 { 229 } 230 231 public function Transaction(array $Queries): void 232 { 233 $this->PDO->beginTransaction(); 234 foreach ($Queries as $Query) 235 { 236 $Statement = $this->PDO->prepare($Query); 237 $Statement->execute(); 238 } 239 $this->PDO->commit(); 240 } 241 242 public function TableExists(string $Name): bool 243 { 244 $DbResult = $this->query('SELECT * FROM information_schema.tables WHERE table_schema = "'.$this->Database. 245 '" AND table_name = "'.$Name.'" LIMIT 1'); 246 return $DbResult->num_rows != 0; 202 247 } 203 248 } -
trunk/Packages/Common/Error.php
r7 r8 3 3 class ErrorHandler 4 4 { 5 var$Encoding;6 var$ShowError;7 var$UserErrors;8 var$OnError;5 public string $Encoding; 6 public bool $ShowError; 7 public int $UserErrors; 8 public $OnError; 9 9 10 10 function __construct() … … 16 16 } 17 17 18 function Start() 18 function Start(): void 19 19 { 20 20 set_error_handler(array($this, 'ErrorHandler')); … … 22 22 } 23 23 24 function Stop() 24 function Stop(): void 25 25 { 26 26 restore_error_handler(); … … 28 28 } 29 29 30 function ErrorHandler( $Number, $Message, $FileName, $LineNumber, $Variables)30 function ErrorHandler(int $Number, string $Message, string $FileName, int $LineNumber, array $Variables = array()): bool 31 31 { 32 32 $ErrorType = array … … 63 63 } 64 64 65 function ExceptionHandler(Throwable $Exception) 65 function ExceptionHandler(Throwable $Exception): void 66 66 { 67 67 $Backtrace = $Exception->getTrace(); … … 75 75 } 76 76 77 function ShowDefaultError( $Message)77 function ShowDefaultError(string $Message): void 78 78 { 79 79 $Output = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>'."\n". … … 88 88 } 89 89 90 function Report( $Backtrace)90 function Report(array $Backtrace): void 91 91 { 92 92 $Date = date('Y-m-d H:i:s'); -
trunk/Packages/Common/Image.php
r7 r8 9 9 class Font 10 10 { 11 var$Size;12 var$FileName;13 var$Color;11 public int $Size; 12 public string $FileName; 13 public int $Color; 14 14 15 15 function __construct() … … 23 23 class Pen 24 24 { 25 var$Color;26 var$X;27 var$Y;25 public int $Color; 26 public int $X; 27 public int $Y; 28 28 29 29 function __construct() … … 38 38 class Brush 39 39 { 40 var$Color;40 public int $Color; 41 41 42 42 function __construct() … … 49 49 class Image 50 50 { 51 var $Image; 52 var $Type; 53 var $Font; 54 var $Pen; 51 public $Image; 52 public int $Type; 53 public Font $Font; 54 public Pen $Pen; 55 public Brush $Brush; 55 56 56 57 function __construct() … … 63 64 } 64 65 65 function SaveToFile( $FileName)66 function SaveToFile(string $FileName): void 66 67 { 67 68 if ($this->Type == IMAGETYPE_JPEG) … … 79 80 } 80 81 81 function LoadFromFile( $FileName)82 function LoadFromFile(string $FileName): void 82 83 { 83 84 $ImageInfo = getimagesize($FileName); … … 89 90 if ($this->Type == IMAGETYPE_GIF) 90 91 { 91 $this->Image = imagecreatefromgif ($FileName);92 $this->Image = imagecreatefromgif ($FileName); 92 93 } else 93 94 if ( $this->Type == IMAGETYPE_PNG) … … 97 98 } 98 99 99 function Output() 100 { 101 $this->SaveToFile(NULL); 102 } 103 104 function SetSize($Width, $Height) 100 function SetSize(int $Width, int $Height): void 105 101 { 106 102 $NewImage = imagecreatetruecolor($Width, $Height); … … 110 106 } 111 107 112 function GetWidth() 108 function GetWidth(): int 113 109 { 114 110 return imagesx($this->Image); 115 111 } 116 112 117 function GetHeight() 113 function GetHeight(): int 118 114 { 119 115 return imagesy($this->Image); 120 116 } 121 117 122 function TextOut( $X, $Y, $Text)118 function TextOut(int $X, int $Y, string $Text): void 123 119 { 124 120 imagettftext($this->Image, $this->Font->Size, 0, $X, $Y, $this->ConvertColor($this->Font->Color), $this->Font->FileName, $Text); 125 121 } 126 122 127 function ConvertColor( $Color)123 function ConvertColor(int $Color): int 128 124 { 129 125 return imagecolorallocate($this->Image, ($Color >> 16) & 0xff, ($Color >> 8) & 0xff, $Color & 0xff); 130 126 } 131 127 132 function FillRect( $X1, $Y1, $X2, $Y2)128 function FillRect(int $X1, int $Y1, int $X2, int $Y2): void 133 129 { 134 130 imagefilledrectangle($this->Image, $X1, $Y1, $X2, $Y2, $this->ConvertColor($this->Brush->Color)); 135 131 } 136 132 137 function Line( $X1, $Y1, $X2, $Y2)133 function Line(int $X1, int $Y1, int $X2, int $Y2): void 138 134 { 139 135 imageline($this->Image, $X1, $Y1, $X2, $Y2, $this->ConvertColor($this->Pen->Color)); -
trunk/Packages/Common/Locale.php
r7 r8 3 3 class LocaleText 4 4 { 5 var$Data;6 var$Code;7 var$Title;5 public array $Data; 6 public string $Code; 7 public string $Title; 8 8 9 9 function __construct() … … 14 14 } 15 15 16 function Load() 17 { 18 } 19 20 function Translate( $Text, $Group = '')16 function Load(): void 17 { 18 } 19 20 function Translate(string $Text, string $Group = ''): string 21 21 { 22 22 if (array_key_exists($Text, $this->Data[$Group]) and ($this->Data[$Group][$Text] != '')) … … 25 25 } 26 26 27 function TranslateReverse( $Text, $Group = '')27 function TranslateReverse(string $Text, string $Group = ''): string 28 28 { 29 29 $Key = array_search($Text, $this->Data[$Group]); … … 35 35 class LocaleFile extends Model 36 36 { 37 var$Texts;38 var$Dir;37 public LocaleText $Texts; 38 public string $Dir; 39 39 40 40 function __construct(System $System) … … 44 44 } 45 45 46 function Load( $Language)46 function Load(string $Language): void 47 47 { 48 48 $FileName = $this->Dir.'/'.$Language.'.php'; … … 55 55 } 56 56 57 function AnalyzeCode( $Path)57 function AnalyzeCode(string $Path): void 58 58 { 59 59 // Search for php files … … 75 75 $Previous = strtolower(substr($Content, strpos($Content, 'T(') - 1, 1)); 76 76 $Content = substr($Content, strpos($Content, 'T(') + 2); 77 $Ord = ord($Previous); 78 //echo($Ord.','); 77 $Ord = ord($Previous); 79 78 if (!(($Ord >= ord('a')) and ($Ord <= ord('z')))) 80 79 { … … 98 97 } 99 98 100 function SaveToFile( $FileName)99 function SaveToFile(string $FileName): void 101 100 { 102 101 $Content = '<?php'."\n". … … 119 118 } 120 119 121 function LoadFromDatabase( $Database, $LangCode)120 function LoadFromDatabase(Database $Database, string $LangCode): void 122 121 { 123 122 $DbResult = $Database->select('Language', '*', 'Code='.$Database->quote($LangCode)); … … 132 131 } 133 132 134 function SaveToDatabase( Database $Database, $LangCode)135 { 136 $DbResult = $ Database->select('Language', '*', 'Code='.$Database->quote($LangCode));133 function SaveToDatabase(string $LangCode): void 134 { 135 $DbResult = $this->Database->select('Language', '*', 'Code='.$this->Database->quote($LangCode)); 137 136 if ($DbResult->num_rows > 0) 138 137 { 139 138 $Language = $DbResult->fetch_assoc(); 140 $ Database->delete('Locale', '`Language`='.$Language['Id']);139 $this->Database->delete('Locale', '`Language`='.$Language['Id']); 141 140 foreach ($this->Texts->Data as $Index => $Item) 142 $ Database->query('INSERT INTO `Locale` (`Language`,`Original`,`Translated`) '.143 'VALUES('.$Language['Id'].','.$ Database->quote($Index).','.$Database->quote($Item).')');144 } 145 } 146 147 function UpdateToDatabase( Database $Database, $LangCode)148 { 149 $DbResult = $ Database->select('Language', '*', '`Code`='.$Database->quote($LangCode));141 $this->Database->query('INSERT INTO `Locale` (`Language`,`Original`,`Translated`) '. 142 'VALUES('.$Language['Id'].','.$this->Database->quote($Index).','.$this->Database->quote($Item).')'); 143 } 144 } 145 146 function UpdateToDatabase(string $LangCode): void 147 { 148 $DbResult = $this->Database->select('Language', '*', '`Code`='.$this->Database->quote($LangCode)); 150 149 if ($DbResult->num_rows > 0) 151 150 { … … 153 152 foreach ($this->Texts->Data as $Index => $Item) 154 153 { 155 $DbResult = $ Database->select('Locale', '*', '(`Original` ='.$Database->quote($Index).154 $DbResult = $this->Database->select('Locale', '*', '(`Original` ='.$this->Database->quote($Index). 156 155 ') AND (`Language`='.($Language['Id']).')'); 157 156 if ($DbResult->num_rows > 0) 158 $ Database->update('Locale', '(`Language`='.($Language['Id']).') AND '.159 '(`Original` ='.$ Database->quote($Index).')', array('Translated' => $Item));160 else $ Database->insert('Locale', array('Language' => $Language['Id'],157 $this->Database->update('Locale', '(`Language`='.($Language['Id']).') AND '. 158 '(`Original` ='.$this->Database->quote($Index).')', array('Translated' => $Item)); 159 else $this->Database->insert('Locale', array('Language' => $Language['Id'], 161 160 'Original' => $Index, 'Translated' => $Item)); 162 161 } … … 167 166 class LocaleManager extends Model 168 167 { 169 var$CurrentLocale;170 var$Codes;171 var$Dir;172 var$LangCode;173 var$DefaultLangCode;174 var$Available;168 public LocaleFile $CurrentLocale; 169 public array $Codes; 170 public string $Dir; 171 public string $LangCode; 172 public string $DefaultLangCode; 173 public array $Available; 175 174 176 175 function __construct(System $System) … … 182 181 $this->DefaultLangCode = 'en'; 183 182 $this->Available = array(); 184 } 185 186 function LoadAvailable() 183 $this->Dir = ''; 184 } 185 186 function LoadAvailable(): void 187 187 { 188 188 $this->Available = array(); … … 201 201 } 202 202 203 function UpdateAll( $Directory)203 function UpdateAll(string $Directory): void 204 204 { 205 205 $Locale = new LocaleFile($this->System); … … 222 222 if (!array_key_exists($Index, $Locale->Texts->Data)) 223 223 unset($FileLocale->Texts->Data[$Index]); 224 $FileLocale->UpdateToDatabase($ this->System->Database, $FileLocale->Texts->Code);224 $FileLocale->UpdateToDatabase($FileLocale->Texts->Code); 225 225 $FileName = $this->Dir.'/'.$FileLocale->Texts->Code.'.php'; 226 226 $FileLocale->SaveToFile($FileName); … … 230 230 } 231 231 232 function LoadLocale( $Code)232 function LoadLocale(string $Code): void 233 233 { 234 234 if (array_key_exists($Code, $this->Available)) … … 241 241 242 242 // Short named global translation function 243 function T( $Text, $Group = '')243 function T(string $Text, string $Group = ''): string 244 244 { 245 245 global $GlobalLocaleManager; -
trunk/Packages/Common/Mail.php
r7 r8 9 9 class Mail 10 10 { 11 var $Priorities; 12 var $Subject; 13 var $From; 14 var $Recipients; 15 var $Bodies; 16 var $Attachments; 17 var $AgentIdent; 18 var $Organization; 19 var $ReplyTo; 20 var $Headers; 11 public string $Subject; 12 public string $From; 13 public array $Recipients; 14 public array $Bodies; 15 public array $Attachments; 16 public string $AgentIdent; 17 public string $Organization; 18 public string $ReplyTo; 19 public array $Headers; 20 private array $Priorities; 21 private string $Boundary; 22 public bool $TestMode; 23 public string $SenderAddress; 24 public string $SenderName; 21 25 22 26 function __construct() … … 25 29 $this->Boundary = md5(date('r', time())); 26 30 $this->AgentIdent = 'PHP/Mail'; 31 $this->TestMode = false; 27 32 $this->Clear(); 28 33 } 29 34 30 function Clear() 35 function Clear(): void 31 36 { 32 37 $this->Bodies = array(); … … 41 46 } 42 47 43 function AddToCombined( $Address)48 function AddToCombined(string $Address): void 44 49 { 45 50 $this->Recipients[] = array('Address' => $Address, 'Type' => 'SendCombined'); 46 51 } 47 52 48 function AddTo( $Address, $Name)53 function AddTo(string $Address, string $Name): void 49 54 { 50 55 $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'Send'); 51 56 } 52 57 53 function AddCc( $Address, $Name)58 function AddCc(string $Address, string $Name): void 54 59 { 55 60 $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'Copy'); 56 61 } 57 62 58 function AddBcc( $Address, $Name)63 function AddBcc(string $Address, string $Name): void 59 64 { 60 65 $this->Recipients[] = array('Address' => $Address, 'Name' => $Name, 'Type' => 'HiddenCopy'); 61 66 } 62 67 63 function AddBody( $Content, $MimeType = 'text/plain', $Charset = 'utf-8')68 function AddBody(string $Content, string $MimeType = 'text/plain', string $Charset = 'utf-8'): void 64 69 { 65 70 $this->Bodies[] = array('Content' => $Content, 'Type' => strtolower($MimeType), … … 67 72 } 68 73 69 function Organization( $org)70 { 71 if (trim($org != '')) $this-> xheaders['Organization'] = $org;72 } 73 74 function Priority( $Priority)74 function Organization(string $org): void 75 { 76 if (trim($org != '')) $this->Headers['Organization'] = $org; 77 } 78 79 function Priority(int $Priority): bool 75 80 { 76 81 if (!intval($Priority)) return false; 77 82 78 if (!isset($this-> priorities[$Priority - 1])) return false;79 80 $this-> xheaders['X-Priority'] = $this->priorities[$Priority - 1];83 if (!isset($this->Priorities[$Priority - 1])) return false; 84 85 $this->Headers['X-Priority'] = $this->Priorities[$Priority - 1]; 81 86 return true; 82 87 } 83 88 84 function AttachFile($FileName, $FileType, $Disposition = DISPOSITION_ATTACHMENT) 89 function AttachFile($FileName, $FileType, $Disposition = DISPOSITION_ATTACHMENT): void 85 90 { 86 91 $this->Attachments[] = array('FileName' => $FileName, 'FileType' => $FileType, … … 88 93 } 89 94 90 function AttachData($FileName, $FileType, $Data, $Disposition = DISPOSITION_ATTACHMENT) 95 function AttachData($FileName, $FileType, $Data, $Disposition = DISPOSITION_ATTACHMENT): void 91 96 { 92 97 $this->Attachments[] = array('FileName' => $FileName, 'FileType' => $FileType, … … 94 99 } 95 100 96 function Send() 101 function Send(): bool 97 102 { 98 103 if (count($this->Bodies) == 0) throw new Exception(T('Mail message need at least one text body')); … … 132 137 if ($this->AgentIdent != '') $this->Headers['X-Mailer'] = $this->AgentIdent; 133 138 if ($this->ReplyTo != '') $this->Headers['Reply-To'] = $this->ReplyTo; 134 if ($this->From != '') $this->Headers['From'] = $this->From; 139 if ($this->From != '') 140 { 141 $IndexStart = strpos($this->From, '<'); 142 if ($IndexStart !== false) 143 { 144 $this->Headers['From'] = '=?utf-8?Q?'.quoted_printable_encode(trim(substr($this->From, 0, $IndexStart))).'?= '.substr($this->From, $IndexStart); 145 } else 146 { 147 $this->Headers['From'] = $this->From; 148 } 149 } 135 150 136 151 $Headers = ''; … … 144 159 if ($this->Subject == '') throw new Exception(T('Mail message missing Subject')); 145 160 146 147 $res = mail($To, $this->Subject, $Body, $Headers); 161 if ($this->TestMode) 162 { 163 echo('to: '.$To.', subject: '.$this->Subject.', body: '.$Body.', headers: '.$Headers); 164 $res = true; 165 } else 166 { 167 $res = mail($To, $this->Subject, $Body, $Headers); 168 } 148 169 return $res; 149 170 } 150 171 151 function ValidEmail( $Address)152 { 153 if ( ereg(".*<(.+)>", $Address, $regs)) $Address = $regs[1];154 if ( ereg("^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$", $Address))172 function ValidEmail(string $Address): bool 173 { 174 if (preg_match(".*<(.+)>", $Address, $regs)) $Address = $regs[1]; 175 if (preg_match("^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$", $Address)) 155 176 return true; 156 177 else return false; 157 178 } 158 179 159 function CheckAdresses( $Addresses)180 function CheckAdresses(array $Addresses): void 160 181 { 161 182 foreach ($Addresses as $Address) 162 183 { 163 184 if (!$this->ValidEmail($Address)) 164 throw new Exception(sprintf(T('Mail message invalid address %s'), $Address)); 165 } 166 } 167 168 private function ContentEncoding($Charset) 185 { 186 throw new Exception(sprintf(T('Mail message invalid address %s'), $Address)); 187 } 188 } 189 } 190 191 private function ContentEncoding($Charset): string 169 192 { 170 193 if ($Charset != CHARSET_ASCII) return '8bit'; … … 172 195 } 173 196 174 private function BuildAttachment($Body) 197 private function BuildAttachment($Body): string 175 198 { 176 199 if (count($this->Attachments) > 0) … … 206 229 } 207 230 208 private function BuildBody() 231 private function BuildBody(): string 209 232 { 210 233 $Result = ''; … … 219 242 $this->Headers['Content-Transfer-Encoding'] = $this->ContentEncoding($this->Bodies[0]['Charset']); 220 243 } 221 222 244 223 245 foreach ($this->Bodies as $Body) -
trunk/Packages/Common/NetworkAddress.php
r7 r8 1 1 <?php 2 3 define('IPV4_BIT_WIDTH', 32); 2 4 3 5 class NetworkAddressIPv4 4 6 { 5 var$Address;6 var$Prefix;7 public int $Address; 8 public int $Prefix; 7 9 8 10 function __construct() … … 12 14 } 13 15 14 function GetNetMask() 16 function GetNetMask(): int 15 17 { 16 return 0xffffffff ^ ((1 << (32- $this->Prefix)) - 1);18 return ((1 << IPV4_BIT_WIDTH) - 1) ^ ((1 << (IPV4_BIT_WIDTH - $this->Prefix)) - 1); 17 19 } 18 20 19 function AddressToString() 21 function AddressToString(): string 20 22 { 21 23 return implode('.', array(($this->Address >> 24) & 255, ($this->Address >> 16) & 255, ($this->Address >> 8) & 255, ($this->Address & 255))); 22 24 } 23 25 24 function AddressFromString( $Value)26 function AddressFromString(string $Value): void 25 27 { 26 28 $Parts = explode('.', $Value); … … 28 30 } 29 31 30 function GetRange() 32 function GetRange(): array 31 33 { 32 34 $From = new NetworkAddressIPv4(); 33 35 $From->Address = $this->Address; 34 $From->Prefix = 32;36 $From->Prefix = IPV4_BIT_WIDTH; 35 37 $HostMask = 0xffffffff ^ $this->GetNetMask(); 36 38 $To = new NetworkAddressIPv4(); 37 39 $To->Address = $From->Address + $HostMask; 38 $To->Prefix = 32;40 $To->Prefix = IPV4_BIT_WIDTH; 39 41 return array('From' => $From, 'To' => $To); 40 42 } 41 43 42 function ChangePrefix( $NewPrefix)44 function ChangePrefix(int $NewPrefix): void 43 45 { 44 46 $this->Prefix = $NewPrefix; 45 if ($this->Prefix > 32) $this->Prefix = 32;47 if ($this->Prefix > IPV4_BIT_WIDTH) $this->Prefix = IPV4_BIT_WIDTH; 46 48 if ($this->Prefix < 0) $this->Prefix = 0; 47 49 $this->Address = $this->Address & $this->GetNetMask(); 48 50 } 49 51 50 function Contain( $Address)52 function Contain(NetworkAddressIPv4 $Address): bool 51 53 { 52 54 $UpperNetmask = $this->GetNetMask(); 53 55 if (($this->Prefix < $Address->Prefix) and (($Address->Address & $UpperNetmask) == ($this->Address & $UpperNetmask))) $Result = true; 54 56 else $Result = false; 55 //echo($Address->AddressToString().'/'.$Address->Prefix.' in '.$this->AddressToString().'/'.$this->Prefix.' '.$Result."\n");56 57 return $Result; 57 58 } 58 59 } 59 60 61 define('IPV6_BIT_WIDTH', 128); 62 60 63 class NetworkAddressIPv6 61 64 { 62 var$Address;63 var$Prefix;65 public string $Address; 66 public int $Prefix; 64 67 65 68 function __construct() … … 69 72 } 70 73 71 function AddressToString() 74 function GetNetMask(): string 75 { 76 return Int128Xor(Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH)), IntToInt128(1)), 77 Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH - $this->Prefix)), IntToInt128(1))); 78 } 79 80 function AddressToString(): string 72 81 { 73 82 return inet_ntop($this->Address); 74 83 } 75 84 76 function AddressFromString( $Value)85 function AddressFromString(string $Value) 77 86 { 78 87 $this->Address = inet_pton($Value); 79 88 } 80 89 81 function GetOctets() 90 function ChangePrefix(int $NewPrefix): void 91 { 92 $this->Prefix = $NewPrefix; 93 if ($this->Prefix > IPV6_BIT_WIDTH) $this->Prefix = IPV6_BIT_WIDTH; 94 if ($this->Prefix < 0) $this->Prefix = 0; 95 $this->Address = Int128And($this->Address, $this->GetNetMask()); 96 } 97 98 function GetOctets(): array 82 99 { 83 100 $Result = array(); … … 85 102 foreach ($Data as $Item) 86 103 { 87 88 104 $Result[] = dechex($Item & 15); 89 105 $Result[] = dechex(($Item >> 4) & 15); … … 92 108 } 93 109 94 function EncodeMAC( $MAC)110 function EncodeMAC(string $MAC): void 95 111 { 96 112 $MAC = explode(':', $MAC); … … 107 123 } 108 124 125 function Contain(NetworkAddressIPv6 $Address): bool 126 { 127 $UpperNetmask = $this->GetNetMask(); 128 if (($this->Prefix < $Address->Prefix) and ((Int128Equal(Int128And($Address->Address, $UpperNetmask), Int128And($this->Address, $UpperNetmask))))) $Result = true; 129 else $Result = false; 130 return $Result; 131 } 109 132 } -
trunk/Packages/Common/Page.php
r7 r8 3 3 class Page extends View 4 4 { 5 var $Title; 6 var $ParentClass; 7 var $RawPage; 8 var $OnSystemMessage; 5 public string $Title; 6 public string $Description; 7 public string $ParentClass; 8 public bool $RawPage; 9 public $OnSystemMessage; 10 public string $Load; 11 public string $Unload; 9 12 10 13 function __construct(System $System) … … 13 16 $this->RawPage = false; 14 17 $this->OnSystemMessage = array(); 18 $this->Title = ""; 19 $this->Description = ""; 20 $this->ParentClass = ""; 15 21 } 16 22 17 function Show() 23 function Show(): string 18 24 { 19 25 return ''; 20 26 } 21 27 22 function GetOutput() 28 function GetOutput(): string 23 29 { 24 30 $Output = $this->Show(); … … 26 32 } 27 33 28 function SystemMessage( $Title, $Text)34 function SystemMessage(string $Title, string $Text): string 29 35 { 30 36 return call_user_func_array($this->OnSystemMessage, array($Title, $Text)); -
trunk/Packages/Common/PrefixMultiplier.php
r7 r8 72 72 class PrefixMultiplier 73 73 { 74 function TruncateDigits($Value, $Digits = 4) 74 function TruncateDigits($Value, $Digits = 4): string 75 75 { 76 76 for ($II = 2; $II > -6; $II--) … … 87 87 } 88 88 89 function Add($Value, $Unit, $Digits = 4, $PrefixType = 'Decimal') 89 function Add($Value, $Unit, $Digits = 4, $PrefixType = 'Decimal'): string 90 90 { 91 91 global $PrefixMultipliers; -
trunk/Packages/Common/RSS.php
r7 r8 3 3 class RSS 4 4 { 5 var$Charset;6 var$Title;7 var$Link;8 var$Description;9 var$WebmasterEmail;10 var$Items;5 public string $Charset; 6 public string $Title; 7 public string $Link; 8 public string $Description; 9 public string $WebmasterEmail; 10 public array $Items; 11 11 12 12 function __construct() 13 13 { 14 14 $this->Charset = 'utf8'; 15 $this->Title = ''; 16 $this->Link = ''; 17 $this->Description = ''; 18 $this->WebmasterEmail = ''; 15 19 $this->Items = array(); 16 20 } 17 21 18 function Generate() 22 function Generate(): string 19 23 { 20 24 $Result = '<?xml version="1.0" encoding="'.$this->Charset.'" ?>'."\n". //<? -
trunk/Packages/Common/Table.php
r7 r8 3 3 class Control 4 4 { 5 var$Name;5 public string $Name; 6 6 7 function Show() 7 function Show(): string 8 8 { 9 9 return ''; … … 13 13 class Table 14 14 { 15 function GetCell($Y, $X) 15 function GetCell($Y, $X): string 16 16 { 17 17 return ''; … … 26 26 } 27 27 28 function RowsCount() 28 function RowsCount(): int 29 29 { 30 30 return 0; … … 34 34 class TableMemory extends Table 35 35 { 36 var$Cells;36 public array $Cells; 37 37 38 function GetCell($Y, $X) 38 function GetCell($Y, $X): string 39 39 { 40 40 return $this->Cells[$Y][$X]; 41 41 } 42 42 43 function RowsCount() 43 function RowsCount(): int 44 44 { 45 45 return count($this->Cells); … … 49 49 class TableSQL extends Table 50 50 { 51 var$Query;52 var$Database;53 var$Cells;51 public string $Query; 52 public Database $Database; 53 public array $Cells; 54 54 55 function GetCell($Y, $X) 55 function GetCell($Y, $X): string 56 56 { 57 57 return $this->Cells[$Y][$X]; … … 73 73 } 74 74 75 function RowsCount() 75 function RowsCount(): int 76 76 { 77 77 return count($this->Cells); … … 81 81 class TableColumn 82 82 { 83 var$Name;84 var$Title;83 public string $Name; 84 public string $Title; 85 85 } 86 86 87 87 class VisualTable extends Control 88 88 { 89 var $Cells; 90 var $Columns; 91 var $OrderSQL; 92 var $OrderColumn; 93 var $OrderDirection; 94 var $OrderArrowImage; 95 var $DefaultColumn; 96 var $DefaultOrder; 97 var $Table; 98 var $Style; 89 public array $Cells; 90 public array $Columns; 91 public string $OrderSQL; 92 public string $OrderColumn; 93 public int $OrderDirection; 94 public array $OrderArrowImage; 95 public string $DefaultColumn; 96 public int $DefaultOrder; 97 public TableMemory $Table; 98 public string $Style; 99 private array $OrderDirSQL; 99 100 100 function __construct( Application $System)101 function __construct() 101 102 { 103 global $System; 104 102 105 $this->Columns = array(); 103 106 $this->Table = new TableMemory(); … … 124 127 } 125 128 126 function Show() 129 function Show(): string 127 130 { 128 131 $Output = '<table class="'.$this->Style.'">'; … … 146 149 } 147 150 148 function GetOrderHeader() 151 function GetOrderHeader(): string 149 152 { 150 153 if (array_key_exists('OrderCol', $_GET)) $_SESSION['OrderCol'] = $_GET['OrderCol']; -
trunk/Packages/Common/UTF8.php
r7 r8 526 526 } 527 527 528 function ToUTF8( $String, $Charset = 'iso2')528 function ToUTF8(string $String, string $Charset = 'iso2'): string 529 529 { 530 530 $Result = ''; … … 540 540 } 541 541 542 function FromUTF8( $String, $Charset = 'iso2')542 function FromUTF8(string $String, string $Charset = 'iso2'): string 543 543 { 544 544 $Result = ''; … … 546 546 for ($I = 0; $I < strlen($String); $I++) 547 547 { 548 if (ord($String {$I}) & 0x80) // UTF control character548 if (ord($String[$I]) & 0x80) // UTF control character 549 549 { 550 if (ord($String {$I}) & 0x40) // First550 if (ord($String[$I]) & 0x40) // First 551 551 { 552 552 if ($UTFPrefix != '') $Result .= chr(array_search($UTFPrefix, $this->CharTable[$Charset])); 553 $UTFPrefix = $String {$I};553 $UTFPrefix = $String[$I]; 554 554 } 555 else $UTFPrefix .= $String {$I}; // Next555 else $UTFPrefix .= $String[$I]; // Next 556 556 } else 557 557 { 558 558 if ($UTFPrefix != '') $Result .= chr(array_search($UTFPrefix, $this->CharTable[$Charset])); 559 559 $UTFPrefix = ''; 560 $Result .= $String {$I};560 $Result .= $String[$I]; 561 561 } 562 562 } -
trunk/Packages/Common/Update.php
r7 r8 3 3 class UpdateManager 4 4 { 5 var$Revision;6 var$Trace;7 var$VersionTable;8 /* @var Database */9 var $Database;10 var $InstallMethod;5 public int $Revision; 6 public array $Trace; 7 public string $VersionTable; 8 public Database $Database; 9 public string $InstallMethod; 10 public $InsertSampleDataMethod; 11 11 12 12 function __construct() … … 19 19 } 20 20 21 function GetDbVersion() 21 function GetDbVersion(): ?int 22 22 { 23 23 $DbResult = $this->Database->select($this->VersionTable, '*', 'Id=1'); … … 26 26 } 27 27 28 function IsInstalled() 28 function IsInstalled(): bool 29 29 { 30 30 $DbResult = $this->Database->query('SHOW TABLES LIKE "'.$this->VersionTable.'"'); … … 32 32 } 33 33 34 function IsUpToDate() 34 function IsUpToDate(): bool 35 35 { 36 36 return $this->Revision <= $this->GetDbVersion(); 37 37 } 38 38 39 function Upgrade() 39 function Upgrade(): string 40 40 { 41 41 $DbRevision = $this->GetDbVersion(); … … 43 43 while ($this->Revision > $DbRevision) 44 44 { 45 if (!array_key_exists($DbRevision, $this->Trace)) 46 die('Missing upgrade trace for revision '.$DbRevision); 45 47 $TraceItem = $this->Trace[$DbRevision]; 46 48 $Output .= 'Aktualizace na verzi '.$TraceItem['Revision'].':<br/>'; … … 57 59 } 58 60 59 function Install() 61 function Install(): void 60 62 { 61 63 $InstallMethod = $this->InstallMethod; 62 64 $InstallMethod($this); 63 $this->Update();64 65 } 65 66 66 function Uninstall() 67 function Uninstall(): void 67 68 { 68 69 69 } 70 70 71 function InsertSampleData() 71 function InsertSampleData(): void 72 72 { 73 73 $InstallMethod = $this->InsertSampleDataMethod; … … 75 75 } 76 76 77 function Execute( $Query)77 function Execute(string $Query): DatabaseResult 78 78 { 79 79 echo($Query.';<br/>');
Note:
See TracChangeset
for help on using the changeset viewer.