self::MODE_PREVIZ, 'blog'=>self::MODE_BLOG, 'histo'=>self::MODE_HISTO); //DB Tables const PROJ_TABLE = 'projects'; /** * Database Handle * @var Db */ private $oDb; private $iProjectId; private $sMode; private $sName; private $sCodeName; private $asActive; private $asGeo; public function __construct(Db &$oDb) { parent::__construct(__CLASS__, Settings::DEBUG); $this->oDb = &$oDb; } public function getProjectId() { return $this->iProjectId; } public function setProjectId($iProjectId=0) { if($iProjectId > 0) { $this->iProjectId = $iProjectId; } else { /** * Project 1 [-----------------] * Project 2 [---------------------------] * Project 3 [-----------] * Selected Project [-------Project 1-------][------------Project 2-------------][---------------Project 3------------------ * Mode --P--][--------B--------][--P--][-----------B---------------][---P---][-----B-----][---------H---------- */ $sQuery = "SELECT MAX(id_project) FROM projects WHERE active_to = (SELECT MIN(active_to) FROM projects WHERE active_to > NOW() OR active_to = (SELECT MAX(active_to) FROM projects))"; $asResult = $this->oDb->getArrayQuery($sQuery, true); $this->iProjectId = array_shift($asResult); } $this->setProjectInfo(); } public function getMode() { return $this->sMode; } public function getProjectCodeName() { return $this->sCodeName; } public function setProjectCodeName($sCodeName) { return $this->updateField('codename', $sCodeName); } public function getActivePeriod($sFromTo='') { return ($sFromTo=='')?$this->asActive:$this->asActive[$sFromTo]; } public function setActivePeriod($oValue, $sFromTo='') { if($sFromTo=='') { $this->updateField('active_from', $oValue['from']); return $this->updateField('active_to', $oValue['to']); } else { return $this->updateField('active_'.$sFromTo, $oValue); } } public function getTimeZone() { return $this->asGeo['timezone']; } public function setTimeZone($sTimeZone) { return $this->updateField('timezone', $sTimeZone); } public function getGeoFile() { return $this->asGeo['file']; } public function getFeedIds() { return $this->oDb->selectColumn( Feed::FEED_TABLE, Db::getId(Feed::FEED_TABLE), array(Db::getId(self::PROJ_TABLE) => $this->getProjectId()) ); } public function getProjects($iProjectId=0) { $bSpecificProj = ($iProjectId > 0); $asInfo = array( 'select'=> array( Db::getId(self::PROJ_TABLE)." AS id", 'codename', 'name', 'active_from', 'active_to', "IF(NOW() BETWEEN active_from AND active_to, 1, IF(NOW() < active_from, 0, 2)) AS mode", 'geofile', 'timezone' ), 'from' => self::PROJ_TABLE ); if($bSpecificProj) $asInfo['constraint'] = array(Db::getId(self::PROJ_TABLE)=>$iProjectId); $asProjects = $this->oDb->selectRows($asInfo, 'codename'); foreach($asProjects as $sCodeName=>&$asProject) { switch($asProject['mode']) { case 0: $asProject['mode'] = self::MODE_PREVIZ; break; case 1: $asProject['mode'] = self::MODE_BLOG; break; case 2: $asProject['mode'] = self::MODE_HISTO; break; } if(!Converter::isGeoJsonValid($asProject['geofile'])) Converter::convertToGeoJson($asProject['geofile']); $asProject['geofile'] = Spot::addTimestampToFilePath(Geo::getFilePath($asProject['geofile'], GeoJson::EXT)); $asProject['codename'] = $sCodeName; } return $bSpecificProj?$asProject:$asProjects; } public function getProject() { return $this->getProjects($this->getProjectId()); } private function setProjectInfo() { if($this->getProjectId() > 0) { $asProject = $this->getProject(); $this->sMode = $asProject['mode']; $this->asActive = array('from'=>$asProject['active_from'], 'to'=>$asProject['active_to']); $this->sCodeName = $asProject['codename']; $this->sName = $asProject['name']; $this->asGeo = array('file'=>$asProject['geofile'], 'timezone'=>$asProject['timezone']); } else $this->addError('Error while setting project: no project ID'); } private function updateField($sField, $oValue) { $bResult = ($this->oDb->updateRow(self::PROJ_TABLE, $this->getProjectId(), array($sField=>$oValue)) > 0); $this->setProjectInfo(); return $bResult; } }