Adding template engine
Adding error handling Adding basic SMTP class core routing is working
This commit is contained in:
		@@ -1,63 +1,235 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
include "system/engine/controller.php";
 | 
			
		||||
include "system/engine/SMTP.php";
 | 
			
		||||
include "system/engine/exceptions.php";
 | 
			
		||||
 | 
			
		||||
class HF_Core
 | 
			
		||||
{
 | 
			
		||||
	private $class;
 | 
			
		||||
	private $method;
 | 
			
		||||
	private $classname;
 | 
			
		||||
	private $args = array();
 | 
			
		||||
    private $config = array();
 | 
			
		||||
    private $tpl;
 | 
			
		||||
	
 | 
			
		||||
	public function __construct()
 | 
			
		||||
	{
 | 
			
		||||
		$this->findController();
 | 
			
		||||
        $config = include("system/engine/config-default.php");
 | 
			
		||||
        if (is_file("application/config.php"))
 | 
			
		||||
        {
 | 
			
		||||
            $newconfig = include("application/config.php");
 | 
			
		||||
        }
 | 
			
		||||
        $this->config = array_merge($config, $newconfig);
 | 
			
		||||
        if ($this->config["USE_H20_TPL"])
 | 
			
		||||
            $this->tpl = new H2o(null, array(
 | 
			
		||||
                "searchpath" => getcwd() . "/application/views/", "cache_dir" => "application/tmp/",
 | 
			
		||||
            ));
 | 
			
		||||
        set_error_handler("HF_Core::error_handler");
 | 
			
		||||
        $this->findController();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private function findController()
 | 
			
		||||
	{
 | 
			
		||||
		$request = $_SERVER["REQUEST_URI"];
 | 
			
		||||
		if ($request == "" || $request == "/")
 | 
			
		||||
		{
 | 
			
		||||
			require("../../application/controllers/main.php");
 | 
			
		||||
			$this->$class = new main();
 | 
			
		||||
			$this->$method = "index";
 | 
			
		||||
			$this->$classname = "main";
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		$arr = explode("/", $request);
 | 
			
		||||
		$path = "../../application/controllers/";
 | 
			
		||||
		for($i = 0; $i < count($arr); $i++)
 | 
			
		||||
		{
 | 
			
		||||
			if ($is_file($path . $arr[$i] . ".php")) // found the controller
 | 
			
		||||
			{
 | 
			
		||||
				include($path . $arr[$i] . ".php");
 | 
			
		||||
				$this->$class = new $arr[$i];
 | 
			
		||||
				
 | 
			
		||||
				if ($i + 1 != count($arr)) // if there is a define after the controller name - this would be the method name
 | 
			
		||||
				{
 | 
			
		||||
					$this->$method = $arr[$i+1];
 | 
			
		||||
					$this->$args = array_slice ($arr, 2);
 | 
			
		||||
					$this->$classname = $arr[$i];
 | 
			
		||||
				} else { // call index
 | 
			
		||||
					$this->$method = "index";
 | 
			
		||||
					$this->$classname = $arr[$i];
 | 
			
		||||
				}
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (is_dir($path . $arr[$i])) // controller is hidden deeper
 | 
			
		||||
			{
 | 
			
		||||
				$path = $path . $arr[$i] . "/";
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			// throw exception controller not found
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            $request = $_SERVER["PHP_SELF"];
 | 
			
		||||
            $splitreq = explode("/", $request);
 | 
			
		||||
            $request = "";
 | 
			
		||||
            for($i = 0; $i < count($splitreq); $i++)
 | 
			
		||||
            {
 | 
			
		||||
                if ($splitreq[$i] == "index.php")
 | 
			
		||||
                {
 | 
			
		||||
                    $request = implode("/", array_splice($splitreq, $i+1));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ($request == "" || $request == "/")
 | 
			
		||||
            {
 | 
			
		||||
                require("application/controllers/" . $this->config["DEFAULT_ROUTE"] . ".php");
 | 
			
		||||
                $this->loadController(new $this->config["DEFAULT_ROUTE"]($this->config, $this, $this->tpl), $this->config["DEFAULT_ROUTE"], "index");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if ($request[strlen($request)-1] == "/")
 | 
			
		||||
                $request = substr($request, 0, -1);
 | 
			
		||||
            $arr = explode("/", $request);
 | 
			
		||||
            $path = "application/controllers/";
 | 
			
		||||
            for($i = 0; $i < count($arr); $i++)
 | 
			
		||||
            {
 | 
			
		||||
                if (is_file($path . $arr[$i] . ".php")) // found the controller
 | 
			
		||||
                {
 | 
			
		||||
                    include($path . $arr[$i] . ".php");
 | 
			
		||||
                    if ($i + 1 < count($arr)) // if there is a define after the controller name - this would be the method name
 | 
			
		||||
                    {
 | 
			
		||||
                        $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], $arr[$i+1], array_slice ($arr, 2));
 | 
			
		||||
                    } else { // call index
 | 
			
		||||
                        $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], "index");
 | 
			
		||||
                    }
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (is_dir($path . $arr[$i])) // controller is hidden deeper
 | 
			
		||||
                {
 | 
			
		||||
                    $path = $path . $arr[$i] . "/";
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                $this->load404Controller();
 | 
			
		||||
                break;
 | 
			
		||||
                // throw exception controller not found
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            if ($this->config["DEBUG"])
 | 
			
		||||
                echo vdump($e, $this);
 | 
			
		||||
            else
 | 
			
		||||
                $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    private function load404Controller()
 | 
			
		||||
    {
 | 
			
		||||
        if (is_file(getcwd() . "/application/status.php"))
 | 
			
		||||
        {
 | 
			
		||||
            include_once (getcwd() . "/application/status.php");
 | 
			
		||||
            $this->loadController(new status($this->config, $this, $this->tpl), "status", "Status404");
 | 
			
		||||
        } else {
 | 
			
		||||
            include_once(getcwd() . "/system/engine/status.php");
 | 
			
		||||
            $this->loadController(new HF_Status($this->config, $this, $this->tpl), "HF_Status", "Status404");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function load500Controller()
 | 
			
		||||
    {
 | 
			
		||||
        if (is_file(getcwd() . "/application/status.php"))
 | 
			
		||||
        {
 | 
			
		||||
            include_once (getcwd() . "/application/status.php");
 | 
			
		||||
            $this->loadController(new status($this->config, $this, $this->tpl), "status", "Status500");
 | 
			
		||||
        } else {
 | 
			
		||||
            include_once (getcwd() . "/system/engine/status.php");
 | 
			
		||||
            $this->loadController(new HF_Status($this->config, $this, $this->tpl), "HF_Status", "Status500");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function loadController($class, $classname, $method, $args = array())
 | 
			
		||||
    {
 | 
			
		||||
        $this->class = $class;
 | 
			
		||||
        $this->classname = $classname;
 | 
			
		||||
        $this->method = $method;
 | 
			
		||||
        $this->args = $args;
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
	public function run()
 | 
			
		||||
	public function run($err=false)
 | 
			
		||||
	{
 | 
			
		||||
		$call = new ReflectionFunction($this->$classname, $this->$method);
 | 
			
		||||
		$call->invokeArgs($this->$class, $this->$args);
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            $call = new ReflectionMethod($this->classname, $this->method);
 | 
			
		||||
            if ($err)
 | 
			
		||||
            {
 | 
			
		||||
                $call->invokeArgs($this->class, $this->args);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $numOfReqPara = $call->getNumberOfRequiredParameters();
 | 
			
		||||
            $numOfOptPara = $call->getNumberOfParameters() - $numOfReqPara;
 | 
			
		||||
            $remainparas = count($this->args) - $numOfReqPara;
 | 
			
		||||
            if ($remainparas >= 0 && $remainparas <= $numOfOptPara)
 | 
			
		||||
            {
 | 
			
		||||
                $call->invokeArgs($this->class, $this->args);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                $this->load404Controller();
 | 
			
		||||
                $this->run(true);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } catch (ReflectionException $e)
 | 
			
		||||
        {
 | 
			
		||||
            if (strstr($e->getMessage(), "does not exist") !== false)
 | 
			
		||||
            {
 | 
			
		||||
                $this->load404Controller();
 | 
			
		||||
            } else {
 | 
			
		||||
                $this->load500Controller();
 | 
			
		||||
            }
 | 
			
		||||
            $this->run(true);
 | 
			
		||||
            if ($this->config["DEBUG"])
 | 
			
		||||
                echo vdump($e, $this);
 | 
			
		||||
            else
 | 
			
		||||
                $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        } catch (Exception $e) {
 | 
			
		||||
            $this->load500Controller();
 | 
			
		||||
            $this->run(true);
 | 
			
		||||
            if ($this->config["DEBUG"])
 | 
			
		||||
                echo vdump($e, $this);
 | 
			
		||||
            else
 | 
			
		||||
                $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    public function mail_admins($subject, $msg, $html = false)
 | 
			
		||||
    {
 | 
			
		||||
        if (array_key_exists("ADMINS", $this->config))
 | 
			
		||||
        {
 | 
			
		||||
            foreach($this->config["ADMINS"] as $email)
 | 
			
		||||
            {
 | 
			
		||||
                $this->mail_user($email, $subject, $msg, $html);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function mail_user($to, $subject, $msg, $html = false)
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->config["USE_HF_SMTP"])
 | 
			
		||||
        {
 | 
			
		||||
            $smtp = new HF_SMTP($this->config["SMTP_FROM"], $to, $subject, $msg, $this->config["SMTP_SERVER"], $this->config["SMTP_USER"], $this->config["SMTP_PASS"], $this->config["SMTP_PORT"]);
 | 
			
		||||
            $smtp->send($html);
 | 
			
		||||
        } else {
 | 
			
		||||
            require_once "Mail.php";
 | 
			
		||||
            $smtp = null;
 | 
			
		||||
            if ($this->$this->config["SMTP_USER"] && $this->config["SMTP_PASS"])
 | 
			
		||||
                $smtp = Mail::factory('smtp', array(
 | 
			
		||||
                    "host" => $this->config["SMTP_SERVER"],
 | 
			
		||||
                    "port" => $this->config["SMTP_PORT"],
 | 
			
		||||
                    "auth" => true,
 | 
			
		||||
                    'username' => $this->config["SMTP_USER"],
 | 
			
		||||
                    'password' => $this->config["SMTP_PASS"]
 | 
			
		||||
                ));
 | 
			
		||||
            else
 | 
			
		||||
                $smtp = Mail::factory('smtp', array(
 | 
			
		||||
                    "host" => $this->config["SMTP_SERVER"],
 | 
			
		||||
                    "port" => $this->config["SMTP_PORT"]
 | 
			
		||||
                ));
 | 
			
		||||
            $headers = array ('From' => $this->config["SMTP_FROM"],
 | 
			
		||||
                'To' => $to,
 | 
			
		||||
                'Subject' => $subject);
 | 
			
		||||
            $smtp->send($to, $headers, $msg);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function error_handler($err_severity, $err_msg, $err_file, $err_line, array $err_context)
 | 
			
		||||
    {
 | 
			
		||||
        if (0 === error_reporting()) { return false;}
 | 
			
		||||
        switch($err_severity)
 | 
			
		||||
        {
 | 
			
		||||
            case E_ERROR:               throw new ErrorException            ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_WARNING:             throw new WarningException          ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_PARSE:               throw new ParseException            ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_NOTICE:              throw new NoticeException           ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_CORE_ERROR:          throw new CoreErrorException        ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_CORE_WARNING:        throw new CoreWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_COMPILE_ERROR:       throw new CompileErrorException     ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_COMPILE_WARNING:     throw new CoreWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_USER_ERROR:          throw new UserErrorException        ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_USER_WARNING:        throw new UserWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_USER_NOTICE:         throw new UserNoticeException       ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_STRICT:              throw new StrictException           ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_RECOVERABLE_ERROR:   throw new RecoverableErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_DEPRECATED:          throw new DeprecatedException       ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
            case E_USER_DEPRECATED:     throw new UserDeprecatedException   ($err_msg, 0, $err_severity, $err_file, $err_line);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user