Ejemplo n.º 1
0
    /**
     * Render a view. Will use context to call controller method, than load corresponding view. Only one
     * or the other is required.
     * @param mixed $view_name May be string or context array
     * @param array $args Arbitrary data to pass to controller, view
     * @param int $cache_expires Cache life in seconds
     * @return void
     */
    public static function render($view_name = null, $args = array(), $cache_expires = null)
    {
        $context = self::push_context($view_name, $parent);
        \jmvc::trace('render ' . $context['controller'] . '.' . $context['view']);
        if (method_exists('jmvc\\Controller', $context['view'])) {
            \jmvc::do404();
        }
        if (!empty($parent)) {
            $args['parent'] = $parent;
        }
        $controller = false;
        if ($cache_expires !== null) {
            $key = 'view' . self::cache_key($context, $args);
            if (self::cache()->get($key . 'meta', $meta)) {
                foreach ($meta['push'] as $push) {
                    self::push($push[0], $push[1], $push[2]);
                }
                foreach ($meta['set'] as $set) {
                    self::set($set[0], $set[1]);
                }
                foreach ($meta['reset'] as $reset) {
                    self::reset($reset[0], $reset[1]);
                }
            }
            if (self::cache()->get($key, $output)) {
                return $output;
            }
            self::$cacheme[$key] = array('set' => array(), 'push' => array(), 'reset' => array());
        }
        ob_start();
        $controller = Controller::factory($context, $args);
        if ($controller && method_exists($controller, $context['view'])) {
            $controller->{$context}['view']();
            if ($override = $controller->view_override()) {
                $context = self::push_context($override);
            }
        } else {
            $controller = false;
        }
        if ($view_file = self::exists($context)) {
            if ($controller) {
                extract(get_object_vars($controller));
            }
            include $view_file;
        }
        $output = ob_get_clean();
        // must find either a controller method or view file
        if (!$controller && !$view_file) {
            throw new \ErrorException('Can\'t find view. View: ' . $context['view'] . ', Controller: ' . $context['controller'] . ',
				Template: ' . $context['template'] . ', Site: ' . $context['site']);
        }
        if (isset($override) && $override) {
            self::pop_context($override);
        }
        self::pop_context($view_name);
        if ($cache_expires !== null) {
            if ($cache_expires == 'controller') {
                $cache_expires = $controller->cache_expires;
            }
            self::cache()->set($key, $output, $cache_expires);
            self::cache()->set($key . 'meta', self::$cacheme[$key], $cache_expires);
            unset(self::$cacheme[$key]);
        }
        return $output;
    }