Files
objects/inc/Main.php

171 lines
4.8 KiB
PHP
Executable File

<?php
namespace Franzz\Objects;
use \Settings;
/**
* Main Class
* @author franzz
* @version 2.4
*/
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;
/**
* DB Handle
* @var Db
*/
protected Db $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 $asContext;
/**
* Language Translator
* @var Translator
*/
protected Translator $oLang;
/**
* Main constructor
*/
public function __construct($sProcessPage, $bDb=true, $sTimeZone='', $sLogPath='')
{
parent::__construct(get_class($this), Settings::DEBUG, PhpObject::MODE_FILE, $sLogPath);
$this->setContext($sProcessPage, $sTimeZone);
//Init objects
if($bDb) {
$asConf = array(
'server' => Settings::DB_SERVER,
'database' => Settings::DB_NAME,
'user' => Settings::DB_LOGIN,
'pass' => Settings::DB_PASS,
'encoding' => Settings::DB_ENC
);
$this->oDb = new Db($asConf, $this->getSqlOptions());
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, $sTimeZone='')
{
//Browser <> PHP <> MySql synchronization
if($sTimeZone=='') $sTimeZone = Settings::TIMEZONE;
date_default_timezone_set($sTimeZone);
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_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'];
$sScheme = $_SERVER['HTTP_X_FORWARDED_PROTO'] ?? $_SERVER['REQUEST_SCHEME'] ?? 'https';
$sAppPath = $sScheme.'://'.str_replace(array('http://', 'https://'), '', $sServerName.dirname($_SERVER['SCRIPT_NAME']));
$this->asContext['serv_name'] = $sAppPath.(mb_substr($sAppPath, -1)!='/'?'/':'');
}
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 */
/**
* Build the main page
* @param array $asGlobalVars
* @param string $sMainPage Main page HTML file name
* @param array $asMainPageInfo array with 2 entries: tags & instances
* @param array $asCachePages Pages to cache in constants
* @return string HTML Mask
*/
public function getMainPage($asGlobalVars=array(), $sMainPage='index', $asMainPageInfo=array())
{
$asDefaultConsts = array(
'success' => self::SUCCESS,
'error' => self::ERROR,
'process_page' => $this->asContext['process_page'],
'server' => $this->asContext['serv_name']
);
$asGlobalVars['consts'] = array_merge($asDefaultConsts, array_key_exists('consts', $asGlobalVars)?$asGlobalVars['consts']:array());
if(!is_null($this->oLang)) {
$asGlobalVars['consts']['lang_prefix'] = Mask::LANG_PREFIX;
$asGlobalVars['consts']['lang'] = $this->oLang->getTranslations();
}
$oMainMask = new Mask($sMainPage, $this->oLang);
$oMainMask->setTag('app_config', json_encode($asGlobalVars));
$oMainMask->setTags($asDefaultConsts);
$oMainMask->setTags($asMainPageInfo['tags'] ?? []);
$asMainMaskInstances = $asMainPageInfo['instances'] ?? [] ;
foreach($asMainMaskInstances as $sPartName => $asInstances) {
foreach($asInstances as $asInstanceTags) {
$oMainMask->addInstance($sPartName, $asInstanceTags);
}
}
return $oMainMask->getMask();
}
/* DB structure. See Db::__construct */
protected abstract function getSqlOptions();
public static function getJsonResult($bSuccess, $sDesc, $asVars=array())
{
header('Content-type: application/json');
$asResult = self::getResult($bSuccess, $sDesc, $asVars);
$asResult['result'] = $asResult['result']?self::SUCCESS:self::ERROR;
return json_encode($asResult);
}
public static function getResult($bSuccess, $sDesc, $asVars=array()) {
return array('result'=>$bSuccess, 'desc'=>$sDesc, 'data'=>$asVars);
}
public static function goTo403() {
http_response_code(403);
exit;
}
public static function goTo404() {
http_response_code(404);
exit;
}
}