Intereting Posts
Рекурсивная функция PHP Laravel с вложенным массивом PHP – Блокирование загруженных изображений для взрослых Присвоение значения const const ошибке в php mysqli_real_escape_string И подготовленные операторы? Как подсчитать общее количество сообщений из выбранных типов сообщений? Как добавить пользовательский элемент формы fckeditor в zend framework Медленность найдена при выборе и кодировании образа базы 64 из базы данных Twitter OAuth (PHP): нужен хороший, базовый пример для начала Создание текстового файла для загрузки на лету Twig – не бежать '&' Список разделенных запятыми из массива с «и» перед последним элементом Считать элементы по условию с помощью XML и PHP? Предупреждение: mysql_error (): предоставленный аргумент не является допустимым ресурсом MySQL-Link Выходной буферизатор вывода PHP с пустым экраном используя завиток, чтобы перейти с одной веб-страницы на другую, используя javascript

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

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

$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, ]);