Как передать переменные в макет?

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

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

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

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

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

Ответ 1

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

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

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

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

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

<h3><?php echo $data['url']; ?></h3>

Ответ 2

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

class SiteController extends CController {

    public $myvar;
//...

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

echo isset($this->myvar) ? $this->myvar : '';

Ответ 3

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

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

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

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

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

global $testvar;
$testvar = 'hello';

и в макете:

echo $GLOBALS['testvar'];

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

echo $this->renderPhpFile(Yii::getAlias('@app/views/layouts/somelayout.php'), [
    'var' => $variableThatIsAccessibleInRenderedFile,
]);