Я знаю, как передать переменную из контроллера в представление:
$this->render('view_name', array('variable_name'=>'variable_value'));
однако я хотел бы передать некоторые переменные в макет. Единственное соединение между контроллером и макетом, по-видимому, является атрибутом public $ layout в классе контроллера, например:
public $layout='//layouts/column2';
Однако я не вижу способа передать ему переменную?
С вашего контроллера вы можете сделать что-то вроде этого:
$this->render('/mail/registration',array('url'=>$url, 'description'=>'some description'));
и получить доступ к переменным из вашего вида следующим образом:
<h3><?php echo $url; ?></h3>
и вот ваш ответ; вы можете получить доступ к этим же переменным из макета, как это:
<h3><?php echo $data['url']; ?></h3>
Кроме того, вы можете добавить свойство в контроллер, например
class SiteController extends CController { public $myvar; //...
И затем выведите его в макете (// layouts / column2)
echo isset($this->myvar) ? $this->myvar : '';
На самом деле это не похоже на то, чтобы сделать это легко из того, что я могу сказать, поэтому, если вы полагаетесь на это, чтобы передать много данных, вам может потребоваться другой способ настроить ваше приложение.
Пара способов, которыми вы могли бы это сделать, – использовать параметры Yii через
Yii::app()->params['myvar'] = $mixed;
которые вы можете установить в контроллере и получить доступ к макету. В противном случае вы можете использовать обычные глобальные VAR PHP, при этом все возникающие проблемы влекут за собой.
В вашем контроллере вы бы сделали что-то вроде:
global $testvar; $testvar = 'hello';
и в макете:
echo $GLOBALS['testvar'];
(Даже если это не функция, вам все равно нужно получить ее через GLOBALS.)
Вы можете передать объект таким образом для более структурированных данных, но вы по-прежнему используете глобальный var. Другой, возможно, еще менее желательный метод – через сеансовый var, например Yii::app()->session['myvar']
или флэш-сообщение Yii.
в контроллере передайте переменную, затем в VIEW (а не в макете) создайте
$this->params['myvar'] = 'hello';
Теперь в макете вы можете получить доступ к массиву всего
echo $this->params['myvar'];
Надеюсь, это поможет вам.
После набора отладки в Yii2 я обнаружил, что единственными переменными (исключая глобальные переменные), которые доступны внутри файла макета, являются _file_ (путь к текущему файлу макета) и _params_ (массив, содержащий переменное содержимое, которое является выходным кодом HTML, буферизированным из файл, переданный для рендеринга с контроллера). Кроме ответов, предоставленных @ldg (которые я считаю наиболее полезными и информативными, но расходными ресурсами) и @Petra Barus .
Я также получил хорошее решение для разделения макета в явные файлы и вызова их внутри визуализированного файла:
echo $this->renderPhpFile(Yii::getAlias('@app/views/layouts/somelayout.php'), [ 'var' => $variableThatIsAccessibleInRenderedFile, ]);