Как передать переменные в макет? - PullRequest
10 голосов
/ 14 августа 2011

Я знаю, как передать переменную из контроллера в представление:

$this->render('view_name', array('variable_name'=>'variable_value'));

, однако я хотел бы передать некоторые переменные в макет.Единственное соединение между контроллером и макетом, по-видимому, является публичным атрибутом $ layout в классе контроллера, например:

public $layout='//layouts/column2';

Однако я не вижу способа передать ему переменную?

Ответы [ 5 ]

13 голосов
/ 15 августа 2011

В качестве альтернативы, вы можете добавить свойство в Controller, например

class SiteController extends CController {

    public $myvar;
//...

, а затем вывести его в макете (// layouts / column2)

echo isset($this->myvar) ? $this->myvar : '';
6 голосов
/ 14 августа 2011

На самом деле, кажется, не так легко сделать это из того, что я могу сказать, поэтому, если вы полагаетесь на него для передачи большого количества данных, вы можете подумать о другом способе настройки вашегоapplication.

Несколько способов сделать это - использовать параметры Yii через

Yii::app()->params['myvar'] = $mixed;

, которые вы можете установить в контроллере и получить доступ к макету.В противном случае вы можете использовать обычные глобальные переменные PHP со всеми вытекающими проблемами:

В вашем контроллере вы должны сделать что-то вроде:

global $testvar;
$testvar = 'hello';

и в макете:

echo $GLOBALS['testvar'];

(Даже если он не находится в функции, вам все равно нужно извлечь его через GLOBALS.)

Вы можете передать объект таким образом для более структурированных данных, но вы все еще используете глобальную переменную,Другой, возможно, даже менее желательный метод, будет через сеансовую переменную, например, Yii::app()->session['myvar'] или флэш-сообщение Yii "*1018*".

4 голосов
/ 06 октября 2014

в контроллере передайте переменную, затем в VIEW (пока не макет) создать

$this->params['myvar'] = 'hello';

Теперь в макете вы можете получить доступ ко всему массиву с помощью

echo $this->params['myvar'];

Надеюсь, это поможет вам.

0 голосов
/ 07 февраля 2015

После наборов отладки в Yii2 я обнаружил, что единственными переменными (исключая глобальные переменные), которые доступны внутри файла макета, являются _file_ (путь к текущему файлу макета) и _params_ (массив, содержащий переменную content , которая является HTML-выводом, буферизованным из файла, переданного для рендеринга из контроллера). За исключением ответов, предоставленных @ ldg (которые я считаю наиболее полезными и информативными, но затратами на ресурсы) и @ Петра Барус .
Я также предложил хорошее решение для разделения макета на явные файлы и вызова их внутри визуализированного файла:

echo $this->renderPhpFile(Yii::getAlias('@app/views/layouts/somelayout.php'), [
    'var' => $variableThatIsAccessibleInRenderedFile,
]);
0 голосов
/ 28 марта 2013

На вашем контроллере вы можете сделать что-то вроде этого:

$this->render('/mail/registration',array('url'=>$url, 'description'=>'some description'));

и получить доступ к переменным из своего представления следующим образом:

<h3><?php echo $url; ?></h3>

и вот ваш ответ;Вы можете получить доступ к этим же переменным из макета следующим образом:

<h3><?php echo $data['url']; ?></h3>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...