<?php
spl_autoload_register(function ($class) {
$classparts = explode("\\", $class);
$classname = array_pop($classparts);
$controllers_dirpaths = \FApp::get_controllers_dirpaths();
foreach ($controllers_dirpaths as $controllers_dirpath)
{
$controller_filepath = $controllers_dirpath.'/'.$classname.'.php';
if (!file_exists($controller_filepath)) continue;
include_once($controller_filepath);
break;
};
});
class FApp {
private static $mGlobals = null;
private static $mRoutes = null;
private static $mDefaultRoute = null;
private static $mRouteMatches = null;
private static $mControllersDirs = null;
private static $mTemplatesDirs = null;
public static function clrlog () {
@unlink(__DIR__.'/Logs/'.date('Ymd').'.log');
}
public static function log ($theLogLine) {
$line = date('Y-m-d H:i:s').' | '.$theLogLine."\n";
file_put_contents(__DIR__.'/Logs/'.date('Ymd').'.log', $line, FILE_APPEND);
}
public static function get_global ($theGlobalKey) {
if (!isset(self::$mGlobals)) return null;
return isset(self::$mGlobals[$theGlobalKey]) ? self::$mGlobals[$theGlobalKey] : null;
}
public static function set_global ($theGlobalKey, $theGlobalVal) {
if (!isset(self::$mGlobals)) self::$mGlobals = array();
self::$mGlobals[$theGlobalKey] = $theGlobalVal;
}
public static function get_controllers_dirpaths () {
$controllers_dirpaths = array();
$controllers_dirpaths[] = __DIR__;
if (isset(self::$mControllersDirs))
{
$controllers_dirpaths = array_merge($controllers_dirpaths, self::$mControllersDirs);
$controllers_dirpaths = array_reverse($controllers_dirpaths);
};
$controllers_dirpaths[] = dirname($_SERVER['SCRIPT_FILENAME']);
return $controllers_dirpaths;
}
public static function get_templates_dirpaths () {
$templates_dirpaths = array();
$templates_dirpaths[] = __DIR__;
if (isset(self::$mTemplatesDirs))
{
$templates_dirpaths = array_merge($templates_dirpaths, self::$mTemplatesDirs);
$templates_dirpaths = array_reverse($templates_dirpaths);
};
$templates_dirpaths[] = dirname($_SERVER['SCRIPT_FILENAME']);
return $templates_dirpaths;
}
public static function register_controllers_dir ($theControllersDirPath) {
if (!isset(self::$mControllersDirs)) self::$mControllersDirs = array();
self::$mControllersDirs[] = $theControllersDirPath;
}
public static function register_templates_dir ($theTemplatesDirPath) {
if (!isset(self::$mTemplatesDirs)) self::$mTemplatesDirs = array();
self::$mTemplatesDirs[] = $theTemplatesDirPath;
}
public static function get_controller_filepath ($theControllerFileName) {
$controllers_dirpaths = self::get_controllers_dirpaths();
foreach ($controllers_dirpaths as $controllers_dirpath)
{
$controller_filepath = $controllers_dirpath.'/'.$theControllerFileName;
if (!file_exists($controller_filepath)) continue;
return $controller_filepath;
};
return null;
}
public static function get_template_filepath ($theTemplateFileName) {
$templates_dirpaths = self::get_templates_dirpaths();
foreach ($templates_dirpaths as $templates_dirpath)
{
$template_filepath = $templates_dirpath.'/'.$theTemplateFileName;
if (!file_exists($template_filepath)) continue;
return $template_filepath;
};
return null;
}
public static function route ($theRoutePattern, $theControllerMethodSpec) {
list($controller, $method) = explode(':', $theControllerMethodSpec);
if (!isset($theRoutePattern))
{
self::$mDefaultRoute = array('controller' => $controller, 'method' => $method);
return;
};
if (!isset(self::$mRoutes)) self::$mRoutes = array();
self::$mRoutes[] = array('pattern' => $theRoutePattern,
'controller' => $controller, 'method' => $method);
}
public static function route_params () {
$params = array();
foreach (self::$mRouteMatches as $matchnum => $match)
{
if ($matchnum == 0) continue;
$params[$matchnum - 1] = $match[0];
};
return $params;
}
public static function start ()
{
try {
if (isset(self::$mRoutes))
{
foreach (self::$mRoutes as $route)
{
$request_uri = $_SERVER['REQUEST_URI'];
$request_uri = $request_uri == '/' ? $request_uri : rtrim($request_uri, '/');
if (preg_match_all('|^'.$route['pattern'].'$|',
$request_uri, self::$mRouteMatches)) {
$class = "\\".$route['controller'];
$instance = new $class();
call_user_func(array($instance, $route['method']));
exit;
};
};
};
if (isset(self::$mDefaultRoute))
{
$class = "\\".self::$mDefaultRoute['controller'];
$instance = new $class();
call_user_func(array($instance, self::$mDefaultRoute['method']));
exit;
};
}
catch (Throwable $t) // PHP7
{
echo $t->getMessage(), "\n";
echo "<pre>\n".print_r($t, true)."</pre>\n";
}
catch (Exception $e) // PHP5
{
echo $e->getMessage(), "\n";
echo "<pre>\n".print_r($e, true)."</pre>\n";
};
}
};
<?php
class FAppController {
private static $mRenderParams = null;
private static function renderlib_eval_varname ($theVarName) {
$varname_parts = explode('.', $theVarName);
$varname_nbofparts = count($varname_parts);
$varname_lastpartnum = $varname_nbofparts - 1;
$result = self::$mRenderParams;
// $result['env'] = \Fapp::env();
foreach ($varname_parts as $varname_partnum => $varname_part)
{
if ($varname_partnum == 0)
{
$result = self::$mRenderParams[$varname_part] ?? null;
continue;
};
if (is_array($result))
{
$result = $result[$varname_part] ?? null;
continue;
};
$result = null;
break;
};
if (is_array($result))
{
if (isset($result['_val'])) $result = $result['_val'];
};
return $result;
}
private static function renderlib_load_template ($theTemplateFileName)
{
$template_filepath = \FApp::get_template_filepath($theTemplateFileName);
if (isset($template_filepath))
{
$template_text = file_get_contents($template_filepath);
$template_text = preg_replace_callback('|<:include\s+(.*?):>|U', function ($matches)
{
$template_filename = $matches[1];
return self::renderlib_load_template($template_filename);
}, $template_text);
};
return $template_text ?? "";
}
public static function render ($theTemplateFileName, $theVarsList = null) {
self::$mRenderParams = $theVarsList;
$VARS = self::$mRenderParams;
$template_text = self::renderlib_load_template($theTemplateFileName);
/*
$template_text = preg_replace('|<:(.*?)\$:(.+?)\s+(.*):>|',
"<:$1 \$VARS['$2'] $3:>",
$template_text);
*/
$template_text = preg_replace_callback('|<:(.*?)\$:(.+?)\s+(.*):>|',
function ($matches)
{
$varname = $matches[2];
$varname_parts = explode('.', $varname);
$result = '<:'.$matches[1].' $VARS';
foreach ($varname_parts as $varname_part)
{
$result .= "['".$varname_part."']";
};
$result .= ' '.$matches[3].':>';
return $result;
},
$template_text);
$template_text = preg_replace('|<:\s*foreach\s+\(*(.*?)\)*\s*:>|',
'<?php foreach ($1) { ?>',
$template_text);
$template_text = preg_replace('|<:\s*/foreach\s*:>|',
'<?php }; ?>',
$template_text);
$template_text = preg_replace('|<:\s*if\s+(.*?)\s*:>|',
'<?php foreach ($1) { ?>',
$template_text);
$template_text = preg_replace('|<:\s*else\s*:>|',
'<?php } else { ?>',
$template_text);
$template_text = preg_replace('|<:\s*/if\s*:>|',
'<?php }; ?>',
$template_text);
$template_text = preg_replace('|<:\s*(.*?)\s*:>|',
'<?php $1 ?>',
$template_text);
$template_text = preg_replace_callback('|\{\{\s*(.*?)\s*\}\}|', function ($matches)
{
$varname = $matches[1];
return (substr($varname, 0, 1) == '$')
? '<?='.$varname.'?>'
: self::renderlib_eval_varname($varname);
}, $template_text);
return eval('?>'.$template_text);
}
public static function redirect ($theRedirectURL) {
header('Location: '.$theRedirectURL);
exit;
}
}