diff options
Diffstat (limited to 'public/system/engine/loader.php')
-rw-r--r-- | public/system/engine/loader.php | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/public/system/engine/loader.php b/public/system/engine/loader.php new file mode 100644 index 0000000..6c8f93f --- /dev/null +++ b/public/system/engine/loader.php @@ -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($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! + $template = ''; + + // Trigger the pre events + $result = $this->registry->get('event')->trigger('view/' . $trigger . '/before', array(&$route, &$data, &$template)); + + // 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, $this->registry->get('config')->get('template_cache')); + } + + // 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($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($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; + }; + } +}
\ No newline at end of file |