/** * 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; }