$ содержания дается его содержанием, когда контроллер вызов $this->render()
в конце его действия.
public function actionIndex() {
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
[some code...]
$this->render('index');
}
Процесс включал немного запутанным, но вы можете легко отслеживать его вниз, установив точку останова и, глядя на стек в вашем отладчике.
Вы также можете прочитать код:
визуализации() является метод CController класса:
public function render($view, $data = null, $return = false) {
if ($this->beforeRender($view)) {
$output = $this->renderPartial($view, $data, true); // (1)
if (($layoutFile = $this->getLayoutFile($this->layout)) !== false)
$output = $this->renderFile($layoutFile, array('content' => $output), true); // (2)
[snip...]
}
}
(1) Если ошибка не возникнет перед визуализацией, то view и его код HTML присвоен $ output: $output = $this->renderPartial($view, $data, true);
(2) Тогда, если не указано в своем действии, что вид не должен быть украшен раскладку, Colling $this->setLayout(false)
, то Decorator pattern применяется и внутренний вид устанавливается в макете:
$output = $this->renderFile($layoutFile, array('content' => $output), true)
Здесь вы должны заметить, что второй аргумент является массивом: array('content' => $output)
RenderFile() является метод CBaseController, которые в какой-то момент, будем называть
public function renderInternal($_viewFile_, $_data_ = null, $_return_ = false) {
// we use special variable names here to avoid conflict when extracting data
if (is_array($_data_))
extract($_data_, EXTR_PREFIX_SAME, 'data'); // (1)
else
$data = $_data_;
if ($_return_) {
ob_start();
ob_implicit_flush(false);
require($_viewFile_); // (2)
return ob_get_clean();
}
else
require($_viewFile_);
}
И вот где ваш ответ лежит:
(1)данные $ еще наш array('content' => $output)
. Функция extract будет строить и инициализировать переменные из этого массива, а именно вашу переменную $ content.
(2) Файл макета теперь требуется. $ content существует в своем объеме, а также, конечно, как ваш контроллер, который находится за $ this
Отличный ответ, спасибо Herode! – DaveyLaser