Ejemplo n.º 1
0
 public static function loader(\Routerunner\BaseRunner $runner, $class, &$output = array())
 {
     $route = $runner->path . $runner->route;
     $version = $runner->version;
     $class = trim($class, '. \\/');
     $model_created = false;
     if ($runner->model && is_object($runner->model) && (isset($runner->model->created) && $runner->model->created) || isset($runner->override["create"]) && $runner->override["create"] < 0) {
         $model_created = true;
     }
     $p = false;
     $f = false;
     $path = self::prepareLoader($route, $class, $version, $p, $f, false, $model_created, $runner->router);
     if (file_exists($path)) {
         //require $path;
         $vars_before = get_defined_vars();
         $sections = explode('.', $class);
         \Routerunner\Routerunner::$context = $route;
         //todo: check for redeclared classes & skip errors?
         if (strpos($path, '.backend.') === false && strpos($path, '.model.') !== false && strpos($path, '.model.params.') === false || strpos($path, '.runner.') !== false || strpos($path, '.function.') !== false) {
             $returned = (include_once $path);
         } elseif (strpos($path, '.return.') !== false) {
             ob_start();
             if ($returned = @(include $path)) {
                 $returned = ob_get_contents();
             } else {
                 $returned = false;
             }
             ob_end_clean();
         } else {
             $returned = @(include $path);
             if (!$returned) {
                 $returned = true;
             }
         }
         if ($returned) {
             $output = array_diff_key(get_defined_vars(), $vars_before);
             unset($output['vars_before'], $output['returned']);
             if (!isset($output) || !is_array($output)) {
                 $output = array();
             }
             if (strpos($class, "external") !== false && (count($output) == 1 && isset($output["sections"]))) {
                 $output["debug"] = true;
             }
             foreach ($output as $key => $val) {
                 if (strpos($class, ".backend") === false && !is_string($val) && is_callable($val)) {
                     $runner->functions[$key] = $val;
                 } elseif (strpos($class, "i18n") !== false && $key == "i18n") {
                     $runner->i18n = $val;
                     $addon_path = \runner::config("SITEROOT") . \runner::config("scaffold") . DIRECTORY_SEPARATOR . 'i18n' . $runner->route . DIRECTORY_SEPARATOR . $f;
                     if (file_exists($addon_path)) {
                         if (($i18n_addon = @(include $addon_path)) && is_array($i18n_addon)) {
                             if (!is_array($runner->i18n)) {
                                 $runner->i18n = array();
                             }
                             $runner->i18n = array_merge($runner->i18n, $i18n_addon);
                         }
                     }
                 } elseif (strpos($class, ".script") !== false) {
                     $runner->script = $returned;
                 } elseif (strpos($class, ".external") !== false) {
                     if (!isset($runner->external)) {
                         $runner->external = array("models" => $returned, "params" => array());
                     }
                     $runner->external["params"][$key] = $val;
                 } elseif (strpos($class, ".backend") !== false && \runner::config('mode') == "backend" && isset($sections[2])) {
                     $key = $sections[2];
                     if (is_callable($returned)) {
                         $runner->backend_context[$key] = $returned;
                     } elseif (is_array($returned)) {
                         $runner->backend_context[$key] = $returned;
                         if (isset($runner->backend_context["global"])) {
                             $runner->backend_context[$key] = array_merge($runner->backend_context["global"], $runner->backend_context[$key]);
                         }
                     } else {
                         $runner->backend_context[$key] = array();
                     }
                 } elseif (substr($class, -13) == ".model.params") {
                     $runner->model_context[$key] = $val;
                 } elseif (substr($class, -20) == ".model.params.extend") {
                     $runner->model_context[$key] = $val;
                 } elseif (substr($class, -6) == ".input") {
                     $runner->form_context[$sections[1]][$key] = $val;
                 } elseif (substr($class, -10) == ".construct") {
                     $flash_var = $route . DIRECTORY_SEPARATOR . 'construct' . DIRECTORY_SEPARATOR . $key;
                     \Routerunner\Routerunner::$slim->flashNow($flash_var, $val);
                 } elseif (substr($class, -9) == ".destruct") {
                     $flash_var = $route . DIRECTORY_SEPARATOR . 'destruct' . DIRECTORY_SEPARATOR . $key;
                     \Routerunner\Routerunner::$slim->flashNow($flash_var, $val);
                 } elseif (is_scalar($val) || is_array($val)) {
                     $runner->context[$key] = $val;
                 } elseif (is_resource($val)) {
                     $runner->resources[$key] = $val;
                 }
             }
             unset($runner->context["sections"]);
             if (substr($class, -6) == ".model" && strpos($class, ".backend") === false) {
                 $pager = array();
                 $override = isset($runner->override) ? $runner->override : array();
                 $namespace = trim(str_replace(DIRECTORY_SEPARATOR, '\\', $runner->path), '\\');
                 $model_class = isset($runner->model_context["model"]) ? $runner->model_context["model"] : trim($runner->route, ' ' . DIRECTORY_SEPARATOR);
                 $table_from = isset($runner->model_context["from"]) ? $runner->model_context["from"] : $model_class;
                 $table_id = isset($runner->override["id"]) ? $runner->override["id"] : null;
                 $blankStdModel = false;
                 $path = false;
                 $file = false;
                 if ($blank_path = self::prepareLoader('/model' . DIRECTORY_SEPARATOR . $model_class, $model_class . '.model', $version, $path, $file, false, false, $runner->router)) {
                     $returned = (include_once $blank_path);
                     $blank_ns = 'model\\' . $model_class;
                     $blankStdModel = new $blank_ns($route, array(), $table_from, $table_id, $override, $runner->model_context);
                     //$blankStdModel = new $blank_ns();
                 }
                 if (class_exists($namespace . '\\' . $model_class)) {
                     $namespace_class = $namespace . '\\' . $model_class;
                     $stdModel = new $namespace_class($route, array(), $table_from, $table_id, $override, $runner->model_context);
                     if ($blankStdModel) {
                         $stdModel->set($blankStdModel);
                     }
                     if (isset($runner->external) && $runner->external) {
                         $runner->model = $namespace_class::set_models($runner->external["models"], $stdModel, isset($runner->external["params"]["pkid"]) ? $runner->external["params"]["pkid"] : "id", isset($runner->external["params"]["from"]) ? $runner->external["params"]["from"] : false, isset($runner->external["params"]["random"]) ? $runner->external["params"]["random"] : false, isset($runner->external["params"]["session"]) ? $runner->external["params"]["session"] : false);
                     } else {
                         $runner->model = $namespace_class::load($runner->model_context, $stdModel, $pager);
                     }
                     if (isset($pager)) {
                         $runner->pager = $pager;
                     }
                 } elseif (class_exists('model\\' . $model_class)) {
                     $namespace_class = 'model\\' . $model_class;
                     $stdModel = new $namespace_class($route, array(), $table_from, $table_id, $override, $runner->model_context);
                     if ($blankStdModel) {
                         $stdModel->set($blankStdModel);
                     }
                     if (isset($runner->external) && $runner->external) {
                         $runner->model = $namespace_class::set_models($runner->external["models"], $stdModel, isset($runner->external["params"]["pkid"]) ? $runner->external["params"]["pkid"] : "id", isset($runner->external["params"]["from"]) ? $runner->external["params"]["from"] : false, isset($runner->external["params"]["random"]) ? $runner->external["params"]["random"] : false, isset($runner->external["params"]["session"]) ? $runner->external["params"]["session"] : false);
                     } else {
                         $runner->model = $namespace_class::load($runner->model_context, $stdModel, $pager);
                     }
                     if (isset($pager)) {
                         $runner->pager = $pager;
                     }
                 } elseif (class_exists($model_class)) {
                     $stdModel = new $model_class($route, array(), $table_from, $table_id, $override, $runner->model_context);
                     //$stdModel = new $model_class();
                     if (isset($runner->external) && $runner->external) {
                         $runner->model = $model_class::set_models($runner->external["models"], $stdModel, isset($runner->external["params"]["pkid"]) ? $runner->external["params"]["pkid"] : "id", isset($runner->external["params"]["from"]) ? $runner->external["params"]["from"] : false, isset($runner->external["params"]["random"]) ? $runner->external["params"]["random"] : false, isset($runner->external["params"]["session"]) ? $runner->external["params"]["session"] : false);
                     } else {
                         $runner->model = $model_class::load($runner->model_context, $stdModel, $pager);
                     }
                     if (isset($pager)) {
                         $runner->pager = $pager;
                     }
                 }
             }
         }
         return $returned;
     } elseif ($version) {
         $p = false;
         $f = false;
         $path = self::prepareLoader($route, $class, false, $p, $f, false, false, $runner->router);
         if (!isset($output) || !is_array($output)) {
             $output = array();
         }
         if (file_exists($path)) {
             require $path;
             return true;
         }
     }
     if (!isset($output) || !is_array($output)) {
         $output = array();
     }
     return false;
 }
 /**
  * Constructor
  * @param  array $arguments Associative array of application settings
  */
 public function __construct($arguments = null, $function = null)
 {
     if (ini_get('xdebug.max_nesting_level')) {
         ini_set('xdebug.max_nesting_level', 200);
     }
     if (!isset($_SESSION["runner"]) && is_array($arguments)) {
         Routerunner::setRunnerParams($arguments);
     }
     if (!self::$loaded) {
         require 'BaseClasses' . DIRECTORY_SEPARATOR . 'BaseRunner.php';
         require 'BaseClasses' . DIRECTORY_SEPARATOR . 'BaseModel.php';
         require 'BaseClasses' . DIRECTORY_SEPARATOR . 'BaseBootstrap.php';
         require 'Tunnel.php';
         require 'Slim' . DIRECTORY_SEPARATOR . 'Slim.php';
         require 'Slim' . DIRECTORY_SEPARATOR . 'RunnerSlim.php';
         \Slim\RunnerSlim::registerAutoloader();
         require 'SlimView.php';
         require_once 'phpquery' . DIRECTORY_SEPARATOR . 'phpQuery.php';
     }
     self::$loaded = true;
     if (isset($arguments) && is_array($arguments)) {
         $this->container['settings'] = array_merge(static::getDefaultSettings(), $arguments);
     } else {
         $this->container['settings'] = static::getDefaultSettings();
     }
     if (isset($_SESSION["routerunner-config"])) {
         $this->container['settings'] = array_merge($_SESSION["routerunner-config"], $this->container['settings']);
     }
     if (isset($this->settings['DOCUMENT_ROOT'])) {
         $site_root = $this->settings['DOCUMENT_ROOT'];
         if (substr($site_root, -1) !== DIRECTORY_SEPARATOR) {
             $site_root .= DIRECTORY_SEPARATOR;
         }
     } else {
         $site_root = rtrim(isset($_SERVER["DOCUMENT_ROOT"]) ? $_SERVER["DOCUMENT_ROOT"] : $this->settings['DOCUMENT_ROOT'], '/\\') . DIRECTORY_SEPARATOR . $this->settings['SITEROOT'];
         if (substr($site_root, -1) !== DIRECTORY_SEPARATOR) {
             $site_root .= DIRECTORY_SEPARATOR;
         }
     }
     $this->container['settings']['SITEROOT'] = $site_root;
     if (!function_exists("backend_mode")) {
         require $site_root . 'runner-config.php';
     }
     Routerunner::$static = $this;
     \Routerunner\Db::initialize($this->settings);
     new \Routerunner\Helper($this);
     \Routerunner\Routerunner::$slim = new \Slim\RunnerSlim(array('view' => new \Routerunner\CustomView(), 'templates.path' => \Routerunner\Helper::$scaffold_class));
     \Routerunner\Routerunner::$slim->notFound(function () {
         return false;
     });
     $method = "get";
     $resource = "/";
     if (!isset($arguments["bootstrap"]) || $arguments["bootstrap"] !== false) {
         \Routerunner\Bootstrap::initialize($this->settings, false);
         $method = \Routerunner\Bootstrap::getMethod();
         $resource = \Routerunner\Bootstrap::getResource();
     }
     if (isset($arguments["method"])) {
         $method = $arguments["method"];
     }
     if (isset($arguments["resource"])) {
         $resource = $arguments["resource"];
     }
     if ($method == "head") {
         $method = "get";
     }
     $routerunner_object = $this;
     \Routerunner\Config::custom_config($this->container['settings']);
     \runner::config("notFound", false);
     if (\Routerunner\Bootstrap::$component) {
         return false;
         exit;
     }
     if (isset($arguments) && isset($function) && !is_string($function) && is_callable($function) && \Routerunner\Routerunner::$slim->now('redirect_url')) {
         $arguments["skip_redirect"] = true;
         $arguments["skip_route"] = true;
         \Routerunner\Routerunner::$slim->{$method}($resource, function () use($routerunner_object, $arguments) {
             $this->middleware($routerunner_object, $arguments);
         }, $function, function () {
             if (\Routerunner\Routerunner::$slim->now('redirect_url')) {
                 \Routerunner\Routerunner::$slim->redirect(\Routerunner\Routerunner::$slim->now('redirect_url'));
             }
         });
         \Routerunner\Routerunner::$slim->run();
     } elseif (isset($arguments) && isset($function) && !is_string($function) && is_callable($function)) {
         $arguments["skip_redirect"] = true;
         $arguments["skip_route"] = true;
         \Routerunner\Routerunner::$slim->{$method}($resource, function () use($routerunner_object, $arguments) {
             $this->middleware($routerunner_object, $arguments);
         }, $function);
         \Routerunner\Routerunner::$slim->notFound(function () use($routerunner_object, $arguments) {
             \runner::config("notFound", true);
             $this->middleware($routerunner_object, $arguments);
         });
         \Routerunner\Routerunner::$slim->run();
     } elseif (isset($arguments) && is_array($arguments) && isset($arguments['root'])) {
         \Routerunner\Routerunner::$slim->{$method}($resource, function () use($routerunner_object, $arguments) {
             $this->middleware($routerunner_object, $arguments);
         });
         \Routerunner\Routerunner::$slim->notFound(function () use($routerunner_object, $arguments) {
             \runner::config("notFound", true);
             $this->middleware($routerunner_object, $arguments);
         });
         \Routerunner\Routerunner::$slim->run();
     } elseif (!is_string($arguments) && is_callable($arguments)) {
         $function = $arguments;
         $arguments = array("skip_redirect" => true, "skip_route" => true);
         \Routerunner\Routerunner::$slim->{$method}($resource, function () use($routerunner_object, $arguments) {
             $this->middleware($routerunner_object, $arguments);
         }, $function, function () {
             if (\Routerunner\Routerunner::$slim->now('redirect_url')) {
                 $this->redirect(\Routerunner\Routerunner::$slim->now('redirect_url'));
             }
         });
         \Routerunner\Routerunner::$slim->notFound(function () use($routerunner_object, $arguments) {
             \runner::config("notFound", true);
             $this->middleware($routerunner_object, $arguments);
         });
         \Routerunner\Routerunner::$slim->run();
     } else {
         $arguments = array("skip_redirect" => true, "skip_route" => true);
         \Routerunner\Routerunner::$slim->{$method}($resource, function () use($routerunner_object, $arguments) {
             $this->middleware($routerunner_object, $arguments);
         });
         \Routerunner\Routerunner::$slim->notFound(function () use($routerunner_object, $arguments) {
             \runner::config("notFound", true);
             $this->middleware($routerunner_object, $arguments);
         });
     }
 }