#php #cakephp
#php #cakephp
Вопрос:
У меня есть частная функция, в которой много переменных, скажем, таких: $foo
, $bar
, $baz
.
Внутри функции я вызываю parent::_setViewVars(array('foo','bar','baz'));
Это _setViewVars
выглядит так:
protected function _setViewVars($a){
foreach($a as $v){
global $$v;
$this->set($v, $$v);
}
}
Я просто хочу избавиться от дерьма cakephp, например, 80 строк $this->set('selected_areas',$selected_areas);
, для этого и предназначена эта функция.
_setViewVars
невозможно получить доступ $$v
, потому что это не глобальная переменная. Учитывая, что эта функция вызывается из контекста, в котором есть эти переменные, могу ли я как-то их получить?
(кстати, если есть cakephp способ массовой настройки переменных просмотра с одинаковыми именами, скажите мне, как — я его не нашел)
PS: упаковка всего в массив НЕ является решением, мы говорим здесь о тысячах ненужных квадратных скобок.
Комментарии:
1. Взгляните на compact , который создает массив, полезный для вашего сценария.
2. Я пробовал это:
compact
также не достигает этих переменных.3. Можете ли вы переопределить
parent::_setViewVars
? Или вообще пропустить ее вызов в пользу вашего собственного цикла, в котором вы вызываете->set()
, имея дело с выводомcompact
?4.
global
? Серьезно? Просто используйтеcompact()
в своих действиях контроллера (не в избыточном отдельном методе):$this->set(compact('foo', 'bar', 'baz'));
Это, кстати, именно то, что делает CakePHP при запуске контроллеров…
Ответ №1:
То, что вы ищете, на самом деле довольно стандартный PHP:
compact()
— Создать массив, содержащий переменные и их значения
Пример, показывающий его использование в действии CakePHP:
$var1 = "I";
$var2 = "love";
$var3 = "pizza!";
$this->set(compact('var1', 'var2', 'var3'));
(возможно, стоит попытаться немного смягчить ненависть — таким образом у вас больше шансов получить помощь)