1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\web;
use Yii;
use yii\base\Action;
use yii\base\InvalidParamException;
/**
* ViewAction represents an action that displays a view according to a user-specified parameter.
*
* By default, the view being displayed is specified via the `view` GET parameter.
* The name of the GET parameter can be customized via [[viewParam]].
*
* Users specify a view in the format of `path/to/view`, which translates to the view name
* `ViewPrefix/path/to/view` where `ViewPrefix` is given by [[viewPrefix]]. The view will then
* be rendered by the [[\yii\base\Controller::render()|render()]] method of the currently active controller.
*
* Note that the user-specified view name must start with a word character and can only contain
* word characters, forward slashes, dots and dashes.
*
* @author Alexander Makarov <sam@rmcreative.ru>
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class ViewAction extends Action
{
/**
* @var string the name of the GET parameter that contains the requested view name.
*/
public $viewParam = 'view';
/**
* @var string the name of the default view when [[\yii\web\ViewAction::$viewParam]] GET parameter is not provided
* by user. Defaults to 'index'. This should be in the format of 'path/to/view', similar to that given in the
* GET parameter.
* @see \yii\web\ViewAction::$viewPrefix
*/
public $defaultView = 'index';
/**
* @var string a string to be prefixed to the user-specified view name to form a complete view name.
* For example, if a user requests for `tutorial/chap1`, the corresponding view name will
* be `pages/tutorial/chap1`, assuming the prefix is `pages`.
* The actual view file is determined by [[\yii\base\View::findViewFile()]].
* @see \yii\base\View::findViewFile()
*/
public $viewPrefix = 'pages';
/**
* @var mixed the name of the layout to be applied to the requested view.
* This will be assigned to [[\yii\base\Controller::$layout]] before the view is rendered.
* Defaults to null, meaning the controller's layout will be used.
* If false, no layout will be applied.
*/
public $layout;
/**
* Runs the action.
* This method displays the view requested by the user.
* @throws NotFoundHttpException if the view file cannot be found
*/
public function run()
{
$viewName = $this->resolveViewName();
$controllerLayout = null;
if ($this->layout !== null) {
$controllerLayout = $this->controller->layout;
$this->controller->layout = $this->layout;
}
try {
$output = $this->render($viewName);
if ($controllerLayout) {
$this->controller->layout = $controllerLayout;
}
} catch (InvalidParamException $e) {
if ($controllerLayout) {
$this->controller->layout = $controllerLayout;
}
if (YII_DEBUG) {
throw new NotFoundHttpException($e->getMessage());
} else {
throw new NotFoundHttpException(
Yii::t('yii', 'The requested view "{name}" was not found.', ['name' => $viewName])
);
}
}
return $output;
}
/**
* Renders a view
*
* @param string $viewName view name
* @return string result of the rendering
*/
protected function render($viewName)
{
return $this->controller->render($viewName);
}
/**
* Resolves the view name currently being requested.
*
* @return string the resolved view name
* @throws NotFoundHttpException if the specified view name is invalid
*/
protected function resolveViewName()
{
$viewName = Yii::$app->request->get($this->viewParam, $this->defaultView);
if (!is_string($viewName) || !preg_match('/^\w[\w\/\-\.]*$/', $viewName)) {
if (YII_DEBUG) {
throw new NotFoundHttpException("The requested view \"$viewName\" must start with a word character and can contain only word characters, forward slashes, dots and dashes.");
} else {
throw new NotFoundHttpException(Yii::t('yii', 'The requested view "{name}" was not found.', ['name' => $viewName]));
}
}
return empty($this->viewPrefix) ? $viewName : $this->viewPrefix . '/' . $viewName;
}
}