protected function prepare()
 {
     $this->assign('wa_url', $this->system->getRootUrl());
     $this->assign('wa_backend_url', waSystem::getInstance()->getConfig()->getBackendUrl(true));
     $this->assign('wa_app', $this->system->getApp());
     $this->assign('wa_app_url', $this->system->getAppUrl(null, true));
     $this->assign('wa_app_static_url', $this->system->getAppStaticUrl());
     if (!$this->helper) {
         $this->helper = new waViewHelper($this);
     }
     $this->assign('wa', $this->helper);
 }
 public function getUrl($path, $params = array(), $absolute = false)
 {
     if (is_bool($params)) {
         $absolute = $params;
         $params = array();
     }
     $parts = explode('/', $path);
     $app = $parts[0];
     if (!$app) {
         $app = $this->system->getApp();
     }
     if (isset($parts[1])) {
         $params['module'] = $parts[1];
     }
     if (isset($parts[2])) {
         $params['action'] = $parts[2];
     }
     $routes = array();
     if (!$this->route || $this->route['app'] != $app || !isset($this->route['module']) && isset($params['module']) && $params['module'] != 'frontend' || isset($this->route['module']) && isset($params['module']) && $this->route['module'] != $params['module']) {
         // find base route
         if (isset($params['domain'])) {
             $routes[$params['domain']] = $this->getRoutes($params['domain']);
             unset($params['domain']);
         } else {
             $routes = $this->routes;
         }
         // filter by app and module
         foreach ($routes as $domain => $domain_routes) {
             foreach ($domain_routes as $r_id => $r) {
                 if (!isset($r['app']) || $r['app'] != $app || isset($params['module']) && isset($r['module']) && $r['module'] != $params['module']) {
                     unset($routes[$domain][$r_id]);
                 }
             }
             if (!$routes[$domain]) {
                 unset($routes[$domain]);
             }
         }
     } else {
         $routes[$this->getDomain()] = array($this->route);
     }
     $max = -1;
     $result = null;
     foreach ($routes as $domain => $domain_routes) {
         foreach ($domain_routes as $r) {
             $i = $this->countParams($r, $params);
             if (isset($params['module']) && isset($r['module'])) {
                 $i++;
             }
             if ($absolute || $this->getDomain() != $domain) {
                 $root_url = self::getUrlByRoute($r, $domain);
             } else {
                 $root_url = $this->system->getRootUrl(false, true) . self::clearUrl($r['url']);
             }
             if ($i > $max) {
                 $max = $i;
                 $result = $root_url;
             }
             $app_routes = $this->getAppRoutes($r['app'], $r);
             foreach ($app_routes as $app_r) {
                 $j = $i + $this->countParams($app_r, $params);
                 if (!isset($params['action']) && !isset($app_r['action'])) {
                     $j++;
                 }
                 $u = $app_r['url'];
                 if (preg_match_all('/<([a-z_]+):?([^>]*)?>/ui', $u, $match, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
                     $offset = 0;
                     foreach ($match as $m) {
                         $v = $m[1][0];
                         if (isset($params[$v])) {
                             $u = substr($u, 0, $m[0][1] + $offset) . $params[$v] . substr($u, $m[0][1] + $offset + strlen($m[0][0]));
                             $offset += strlen($params[$v]) - strlen($m[0][0]);
                             $j++;
                         } else {
                             if (substr($u, $m[0][1] - 1, 1) === '(' && substr($u, $m[0][1] + strlen($m[0][0]), 3) === '/)?') {
                                 $u = substr($u, 0, $m[0][1] - 1) . substr($u, $m[0][1] + strlen($m[0][0]) + 3);
                             } else {
                                 continue 2;
                             }
                         }
                     }
                 }
                 if ($j >= $max || $result === null) {
                     if ($j == $max && $this->getDomain() && $domain != $this->getDomain() && $result) {
                     } else {
                         $max = $j;
                         $result = $root_url . self::clearUrl($u);
                     }
                 }
             }
         }
     }
     return $result;
 }
 /** Execute appropriate controller and return it's result.
  * Throw 404 exception if no controller found. */
 public function execute($plugin = null, $module = null, $action = null, $default = false)
 {
     if (!$this->system->getConfig()->checkRights($module, $action)) {
         throw new waRightsException(_ws("Access denied."));
     }
     // current app prefix
     $prefix = $this->system->getConfig()->getPrefix();
     // Load plugin locale and set plugin as active
     if ($plugin) {
         $plugin_path = $this->system->getAppPath('plugins/' . $plugin, $this->system->getApp());
         if (!file_exists($plugin_path . '/lib/config/plugin.php')) {
             $plugin = null;
         } else {
             $plugin_info = (include $plugin_path . '/lib/config/plugin.php');
             // check rights
             if (isset($plugin_info['rights']) && $plugin_info['rights']) {
                 if (!$this->system->getUser()->getRights($this->system->getConfig()->getApplication(), 'plugin.' . $plugin)) {
                     throw new waRightsException(_ws("Access denied"), 403);
                 }
             }
             waSystem::pushActivePlugin($plugin, $prefix);
             if (is_dir($plugin_path . '/locale')) {
                 waLocale::load($this->system->getLocale(), $plugin_path . '/locale', waSystem::getActiveLocaleDomain(), false);
             }
         }
     }
     // custom login and signup
     if (wa()->getEnv() == 'frontend') {
         if (!$plugin && !$action && $module == 'login') {
             $login_action = $this->system->getConfig()->getFactory('login_action');
             if ($login_action) {
                 $controller = $this->system->getDefaultController();
                 $controller->setAction($login_action);
                 $r = $controller->run();
                 return $r;
             }
         } elseif (!$plugin && !$action && $module == 'signup') {
             $signup_action = $this->system->getConfig()->getFactory('signup_action');
             if ($signup_action) {
                 $controller = $this->system->getDefaultController();
                 $controller->setAction($signup_action);
                 $r = $controller->run();
                 return $r;
             }
         }
     }
     //
     // Check possible ways to handle the request one by one
     //
     // list of failed class names (for debugging)
     $class_names = array();
     // Single Controller (recomended)
     $class_name = $prefix . ($plugin ? ucfirst($plugin) . 'Plugin' : '') . ucfirst($module) . ($action ? ucfirst($action) : '') . 'Controller';
     if (class_exists($class_name, true)) {
         /**
          * @var $controller waController
          */
         $controller = new $class_name();
         $r = $controller->run();
         if ($plugin) {
             waSystem::popActivePlugin();
         }
         return $r;
     }
     $class_names[] = $class_name;
     // Single Action
     $class_name = $prefix . ($plugin ? ucfirst($plugin) . 'Plugin' : '') . ucfirst($module) . ($action ? ucfirst($action) : '') . 'Action';
     if (class_exists($class_name)) {
         // get default view controller
         /**
          * @var $controller waDefaultViewController
          */
         $controller = $this->system->getDefaultController();
         $controller->setAction($class_name);
         $r = $controller->run();
         if ($plugin) {
             waSystem::popActivePlugin();
         }
         return $r;
     }
     $class_names[] = $class_name;
     // Controller Multi Actions, Zend/Symfony style
     $class_name = $prefix . ($plugin ? ucfirst($plugin) . 'Plugin' : '') . ucfirst($module) . 'Actions';
     if (class_exists($class_name, true)) {
         $controller = new $class_name();
         $r = $controller->run($action);
         if ($plugin) {
             waSystem::popActivePlugin();
         }
         return $r;
     }
     $class_names[] = $class_name;
     // Plugin is no longer active
     if ($plugin) {
         waSystem::popActivePlugin();
     }
     // Last chance: default action for this module
     if ($action && $default) {
         return $this->execute($plugin, $module);
     }
     // Too bad. 404.
     throw new waException(sprintf('Empty module and/or action after parsing the URL "%s" (%s/%s).<br />Not found classes: %s', $this->system->getConfig()->getCurrentUrl(), $module, $action, implode(', ', $class_names)), 404);
 }
Example #4
0
    public function __toString()
    {
        try {
            $wa = wa();
            $additional_info = '';
        } catch (Exception $e) {
            $wa = null;
            $additional_info = $e->getMessage();
        }
        $message = nl2br($this->getMessage());
        if ($wa && waSystem::getApp()) {
            $app = $wa->getAppInfo();
            $backend_url = $wa->getConfig()->getBackendUrl(true);
        } else {
            $app = array();
        }
        if (!waSystemConfig::isDebug() && $wa) {
            $env = $wa->getEnv();
            $file = $code = $this->getCode();
            if (!$code || !file_exists(dirname(__FILE__) . '/data/' . $code . '.php')) {
                $file = 'error';
            }
            include dirname(__FILE__) . '/data/' . $file . '.php';
            exit;
        }
        if ($wa && $wa->getEnv() == 'cli' || !$wa && php_sapi_name() == 'cli') {
            return date("Y-m-d H:i:s") . " php " . implode(" ", waRequest::server('argv')) . "\n" . "Error: {$this->getMessage()}\nwith code {$this->getCode()} in '{$this->getFile()}' around line {$this->getLine()}:{$this->getFileContext()}\n" . $this->getTraceAsString() . "\n" . ($additional_info ? "Error while initializing waSystem during error generation: " . $additional_info . "\n" : '');
        } elseif ($this->code == 404) {
            $response = new waResponse();
            $response->setStatus(404);
            $response->sendHeaders();
        }
        $request = htmlentities(var_export($_REQUEST, true), ENT_NOQUOTES, 'utf-8');
        $params = htmlentities(var_export(waRequest::param(), true), ENT_NOQUOTES, 'utf-8');
        $context = htmlentities($this->getFileContext(), ENT_NOQUOTES, 'utf-8');
        $trace = htmlentities($this->getTraceAsString(), ENT_NOQUOTES, 'utf-8');
        $result = <<<HTML
<div style="width:99%; position:relative; text-align: left;">
\t<h2 id='Title'>{$message}</h2>
\t<div id="Context" style="display: block;">
\t\t<h3>Error with code {$this->getCode()} in '{$this->getFile()}' around line {$this->getLine()}:</h3>
\t\t<pre>{$context}</pre>
\t</div>
\t<div id="Trace">
\t\t<h2>Call stack</h2>
\t\t<pre>{$trace}</pre>
\t</div>
\t<div id="Request">
\t\t<h2>Request</h2>
\t\t<pre>{$request}</pre>
    </div>
</div>
<div style="text-align: left;">
    <h2>Params</h2>
    <pre>{$params}</pre>
</div>
HTML;
        if ($additional_info) {
            $additional_info = htmlentities($additional_info, ENT_NOQUOTES, 'utf-8');
            $result .= <<<HTML

<div style="text-align: left;">
    <h2>Error while initializing waSystem during error generation</h2>
    <pre>{$additional_info}</pre>
</div>
HTML;
        }
        return $result;
    }
 public function userRights($name)
 {
     return $this->wa->getUser()->getRights($this->wa->getApp(), $name);
 }
 protected function prepare()
 {
     $this->smarty->compile_id = isset($this->options['compile_id']) ? $this->system->getApp() . "_" . $this->options['compile_id'] : $this->system->getApp() . "_" . $this->system->getLocale();
     parent::prepare();
 }
 public function app()
 {
     return $this->wa->getApp();
 }
 /**
  * @return waPageModel
  */
 protected function getPageModel()
 {
     $class = $this->wa->getApp() . 'PageModel';
     return new $class();
 }