Files
objects/inc/main.php
2019-10-05 00:51:46 +02:00

158 lines
4.5 KiB
PHP
Executable File

<?php
/**
* Main Class
* @author franzz
* @version 2.3
*/
abstract class Main extends PhpObject
{
//Constants
const SUCCESS = 'success';
const ERROR = 'error';
const UNAUTHORIZED = 'unauthorized';
const NOT_FOUND = 'unknown action';
const NO_DATA = 'No Data';
const ACTIVE = 1;
const INACTIVE = 0;
//Folders
const MASKS_FOLDER = 'masks/';
/**
* Class Management
* @var ClassManagement
*/
protected $oClassManagement;
/**
* DB Handle
* @var Db
*/
protected $oDb;
//Dates format
const URL_DATE_FORMAT = 'Ymd';
const LAYOUT_DATE_FORMAT = 'F \t\h\e jS, Y';
const MYSQL_DATE_FORMAT = 'Y-m-d';
const LAYOUT_TIME_FORMAT = 'G:i';
//Variables
protected $asMasks;
protected $asContext;
/**
* Main constructor
* @param ClassManagement $oClassManagement
* @param string $sLang
*/
public function __construct($oClassManagement, $sProcessPage, $asMandatoryClasses=array(), $bDb=true/*, $sLang=''*/)
{
parent::__construct(__CLASS__, Settings::DEBUG);
$this->oClassManagement = $oClassManagement;
//Load classes
$asMandatoryClasses[] = array('name'=>'mask', 'project'=>false);
if($bDb) $asMandatoryClasses[] = array('name'=>'db', 'project'=>false);
foreach($asMandatoryClasses as $asClass) $this->oClassManagement->incClass($asClass['name'], $asClass['project']);
$this->setContext($sProcessPage);
//Init objects
if($bDb) {
$this->oDb = new Db(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, $this->getSqlOptions() , Settings::DB_ENC);
if(in_array($this->oDb->sDbState, array(Db::DB_NO_DATA, Db::DB_NO_TABLE))) $this->install();
}
}
protected abstract function install();
public function getDbBuildScript() {
return $this->oDb->getFullInstallQuery();
}
private function setContext($sProcessPage)
{
//Browser <> PHP <> MySql synchronization
date_default_timezone_set(Settings::TIMEZONE);
ini_set('default_charset', Settings::TEXT_ENC);
header('Content-Type: text/html; charset='.Settings::TEXT_ENC);
mb_internal_encoding(Settings::TEXT_ENC);
mb_http_output(Settings::TEXT_ENC);
mb_http_input(Settings::TEXT_ENC);
mb_language('uni');
mb_regex_encoding(Settings::TEXT_ENC);
$this->asContext['process_page'] = basename($sProcessPage);
$sServerName = array_key_exists('SERVER_NAME', $_SERVER)?$_SERVER['SERVER_NAME']:$_SERVER['PWD'];
$sAppPath = $_SERVER['REQUEST_SCHEME'].'://'.str_replace(array('http://', 'https://'), '', $sServerName.dirname($_SERVER['SCRIPT_NAME']));
$this->asContext['serv_name'] = $sAppPath.(mb_substr($sAppPath, -1)!='/'?'/':'');
$this->setMasks();
}
public static function addTimestampToFilePath($sFilePath)
{
//Remove timestamp
$sCleanedFilePath = preg_replace('/(.*)\?[\d]{14}$/', '$1', $sFilePath);
//Add timestamp
return file_exists($sCleanedFilePath)?$sCleanedFilePath.'?'.date("YmdHis", filemtime($sCleanedFilePath)):$sFilePath;
}
public function addUncaughtError($sError)
{
$this->addError('Uncaught errors:'."\n".$sError);
}
/* Building main pages */
public function getMainPage($asGlobalVars=array(), $sMainPage='index', $asMainPageTags=array())
{
$asDefaultConsts = array('success'=>self::SUCCESS, 'error'=>self::ERROR, 'process_page'=>$this->asContext['process_page']);
$asGlobalVars['consts'] = array_merge($asDefaultConsts, array_key_exists('consts', $asGlobalVars)?$asGlobalVars['consts']:array());
//Masks
$asPages = array_values($this->asMasks);
foreach($asPages as $sPage)
{
$sPageContent = $this->getPageContent($sPage);
if($sPage!=$sMainPage) $asGlobalVars['consts']['pages'][$sPage] = $sPageContent;
}
$oMainMask = new Mask($sMainPage);
$oMainMask->setTag('GLOBAL_VARS', json_encode($asGlobalVars));
$oMainMask->setTags($asMainPageTags);
return $oMainMask->getMask();
}
protected function getPageContent($sPage)
{
return ToolBox::fixEOL(file_get_contents(self::MASKS_FOLDER.$sPage.'.html'));
}
/* DB structure. See Db::__construct */
protected abstract function getSqlOptions();
private function setMasks()
{
//List all available masks
$asMaskPaths = glob(Mask::getMaskFile('*'));
$this->asMasks = array_map('basename', $asMaskPaths, array_fill(1, count($asMaskPaths), Mask::MASK_EXT));
}
public static function getJsonResult($bSuccess, $sDesc, $asVars=array())
{
header('Content-type: application/json');
return json_encode(array('result'=>$bSuccess?self::SUCCESS:self::ERROR, 'desc'=>$sDesc, 'data'=>$asVars));
}
public static function goTo403() {
header('HTTP/1.1 403 Forbidden');
exit;
}
}