/** * Automatically locates the ViewModel for the configured template, unless a response has already been generated. * * @access public * @return Response */ public function after($response) { // If a response has been provided, just go with it if (!is_null($response)) { return $response; } if ($this->status == 404) { return $this->show404(); } // Get the model - this will have previously been found if (is_null($this->model)) { $this->model = \CMF::currentModel(); } if (!isset($this->template)) { // Try and find the template from the CMF... $this->template = \CMF::$template; } if (is_null($this->template)) { return $this->show404(); } // Determine whether the ViewModel class exists... if ($viewClass = \CMF::hasViewModel($this->template)) { $viewModel = new $viewClass('view', false, $this->template); $this->bindData($viewModel); return \Response::forge($viewModel, $this->status, $this->headers); } try { $viewClass = ucfirst(\CMF::$module) . '\\View_Base'; if (!class_exists($viewClass)) { $viewClass = '\\View_Base'; } $viewModel = new $viewClass('view', false, $this->template); $this->bindData($viewModel); return \Response::forge($viewModel, $this->status, $this->headers); } catch (\Exception $e) { return $this->show404("The template '" . $this->template . "' couldn't be found!"); } }
/** * Tries to render an error response from a custom template, falling back to the default one */ public static function getCustomErrorResponse($message = null, $code = 500, $default_template = 'errors/http.twig') { $view = null; $template = 'errors/' . $code . '.twig'; $status = \Arr::get(\Response::$statuses, $code, 'Internal Server Error'); $data = array('code' => $code, 'status' => $status, 'model' => null, 'message' => $message ? $message : \Lang::get("site.errors.http.{$code}", array('resource' => 'page'), \Lang::get("site.errors.http.default", array('resource' => 'page'), $status))); // First try the specific error page try { if ($viewClass = \CMF::hasViewModel($template)) { $view = new $viewClass('view', false, $template); } else { $viewClass = ucfirst(\CMF::$module) . '\\View_Base'; if (!class_exists($viewClass)) { $viewClass = '\\View_Base'; } $view = new $viewClass('view', false, $template); } $view->set($data); $view = $view->render(); } catch (\Exception $e) { $view = null; } // Then try the provided default template if (!$view) { try { if ($viewClass = \CMF::hasViewModel($default_template)) { $view = new $viewClass('view', false, $default_template); } else { $viewClass = ucfirst(\CMF::$module) . '\\View_Base'; if (!class_exists($viewClass)) { $viewClass = '\\View_Base'; } $view = new $viewClass('view', false, $default_template); } $view->set($data); $view = $view->render(); } catch (\Exception $e) { $view = null; } } // Then try the above, without the view models if (!$view) { try { $view = \View::forge($template, $data); } catch (\Exception $e) { $view = null; } } if (!$view) { try { $view = \View::forge($default_template, $data); } catch (\Exception $e) { $view = null; } } // If all the above hasn't worked, we can always fall back to the system template! if (!$view) { $view = \View::forge('errors/http', $data); } return new \Response($view, $code); }
/** * Loops through the provided nocache names and injects their executed values * into the content * */ public static function addNoCacheAreas($names, $content, $context) { if (count($names) === 0 || !$names) { return $content; } static::$modified = true; // Set up the twig environment for rendering the non-cached parts \View_Twig::initLoader(); $env = \View_Twig::parser(); $template = new \CMF\Twig\TemplateInclude($env); if (empty($context)) { $context = array(); } if (!empty($context['template'])) { $module = @$context['module']; // Determine whether the ViewModel class exists... if ($viewClass = \CMF::hasViewModel($context['template'])) { $context['view'] = new $viewClass('view', false, $context['template']); } else { try { $viewClass = ucfirst($module) . '\\View_Base'; if (!class_exists($viewClass)) { $viewClass = '\\View_Base'; } $context['view'] = new $viewClass('view', false, $context['template']); } catch (\Exception $e) { } } } foreach ($names as $name => $include) { $content = preg_replace('/<!-- nocache_' . $name . ' .*<!-- endnocache_' . $name . ' -->/sU', $template->renderInclude($include, $context), $content); } return $content; }