first commit
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
<?php
|
||||
/**
|
||||
* @package OpenCart
|
||||
* @author Daniel Kerr
|
||||
* @copyright Copyright (c) 2005 - 2017, OpenCart, Ltd. (https://www.opencart.com/)
|
||||
* @license https://opensource.org/licenses/GPL-3.0
|
||||
* @link https://www.opencart.com
|
||||
*/
|
||||
|
||||
/**
|
||||
* Loader class
|
||||
*/
|
||||
final class Loader {
|
||||
protected $registry;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param object $registry
|
||||
*/
|
||||
public function __construct($registry) {
|
||||
$this->registry = $registry;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
* @param array $data
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function controller($route, $data = array()) {
|
||||
// Sanitize the call
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
// Keep the original trigger
|
||||
$trigger = $route;
|
||||
|
||||
// Trigger the pre events
|
||||
$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/before', array(&$route, &$data));
|
||||
|
||||
// Make sure its only the last event that returns an output if required.
|
||||
if ($result != null && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
} else {
|
||||
$action = new Action($route);
|
||||
$output = $action->execute($this->registry, array(&$data));
|
||||
}
|
||||
|
||||
// Trigger the post events
|
||||
$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/after', array(&$route, &$data, &$output));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
}
|
||||
|
||||
if (!$output instanceof Exception) {
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
*/
|
||||
public function model($route) {
|
||||
// Sanitize the call
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
if (!$this->registry->has('model_' . str_replace('/', '_', $route))) {
|
||||
$file = DIR_APPLICATION . 'model/' . $route . '.php';
|
||||
$class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $route);
|
||||
|
||||
if (is_file($file)) {
|
||||
include_once(modification($file));
|
||||
|
||||
$proxy = new Proxy();
|
||||
|
||||
// Overriding models is a little harder so we have to use PHP's magic methods
|
||||
// In future version we can use runkit
|
||||
foreach (get_class_methods($class) as $method) {
|
||||
$proxy->{$method} = $this->callback($this->registry, $route . '/' . $method);
|
||||
}
|
||||
|
||||
$this->registry->set('model_' . str_replace('/', '_', (string)$route), $proxy);
|
||||
} else {
|
||||
throw new \Exception('Error: Could not load model ' . $route . '!');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
* @param array $data
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function view($route, $data = array()) {
|
||||
// Sanitize the call
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
// Keep the original trigger
|
||||
$trigger = $route;
|
||||
|
||||
// Template contents. Not the output!
|
||||
$code = '';
|
||||
|
||||
// Trigger the pre events
|
||||
$result = $this->registry->get('event')->trigger('view/' . $trigger . '/before', array(&$route, &$data, &$code));
|
||||
|
||||
// Make sure its only the last event that returns an output if required.
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
} else {
|
||||
$template = new Template($this->registry->get('config')->get('template_engine'));
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
$template->set($key, $value);
|
||||
}
|
||||
|
||||
$output = $template->render($this->registry->get('config')->get('template_directory') . $route, $code);
|
||||
}
|
||||
|
||||
// Trigger the post events
|
||||
$result = $this->registry->get('event')->trigger('view/' . $trigger . '/after', array(&$route, &$data, &$output));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
*/
|
||||
public function library($route) {
|
||||
// Sanitize the call
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
$file = DIR_SYSTEM . 'library/' . $route . '.php';
|
||||
$class = str_replace('/', '\\', $route);
|
||||
|
||||
if (is_file($file)) {
|
||||
include_once(modification($file));
|
||||
|
||||
$this->registry->set(basename($route), new $class($this->registry));
|
||||
} else {
|
||||
throw new \Exception('Error: Could not load library ' . $route . '!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
*/
|
||||
public function helper($route) {
|
||||
$file = DIR_SYSTEM . 'helper/' . preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route) . '.php';
|
||||
|
||||
if (is_file($file)) {
|
||||
include_once(modification($file));
|
||||
} else {
|
||||
throw new \Exception('Error: Could not load helper ' . $route . '!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
*/
|
||||
public function config($route) {
|
||||
$this->registry->get('event')->trigger('config/' . $route . '/before', array(&$route));
|
||||
|
||||
$this->registry->get('config')->load($route);
|
||||
|
||||
$this->registry->get('event')->trigger('config/' . $route . '/after', array(&$route));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $route
|
||||
* @param string $key
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function language($route, $key = '') {
|
||||
// Sanitize the call
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
// Keep the original trigger
|
||||
$trigger = $route;
|
||||
|
||||
$result = $this->registry->get('event')->trigger('language/' . $trigger . '/before', array(&$route, &$key));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
} else {
|
||||
$output = $this->registry->get('language')->load($route, $key);
|
||||
}
|
||||
|
||||
$result = $this->registry->get('event')->trigger('language/' . $trigger . '/after', array(&$route, &$key, &$output));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
protected function callback($registry, $route) {
|
||||
return function($args) use($registry, $route) {
|
||||
static $model;
|
||||
|
||||
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
|
||||
|
||||
// Keep the original trigger
|
||||
$trigger = $route;
|
||||
|
||||
// Trigger the pre events
|
||||
$result = $registry->get('event')->trigger('model/' . $trigger . '/before', array(&$route, &$args));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
} else {
|
||||
$class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', substr($route, 0, strrpos($route, '/')));
|
||||
|
||||
// Store the model object
|
||||
$key = substr($route, 0, strrpos($route, '/'));
|
||||
|
||||
if (!isset($model[$key])) {
|
||||
$model[$key] = new $class($registry);
|
||||
}
|
||||
|
||||
$method = substr($route, strrpos($route, '/') + 1);
|
||||
|
||||
$callable = array($model[$key], $method);
|
||||
|
||||
if (is_callable($callable)) {
|
||||
$output = call_user_func_array($callable, $args);
|
||||
} else {
|
||||
throw new \Exception('Error: Could not call model/' . $route . '!');
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger the post events
|
||||
$result = $registry->get('event')->trigger('model/' . $trigger . '/after', array(&$route, &$args, &$output));
|
||||
|
||||
if ($result && !$result instanceof Exception) {
|
||||
$output = $result;
|
||||
}
|
||||
|
||||
return $output;
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user