我想定义全局数组常量
bootstrap.php中的代码
$adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');
视图文件中的代码
echo $form->input('Adv.type', array('type' => 'select', 'option' => $adv_types, 'label' => 'Место рекламы'));
但是cakephp给出错误:
“未定义的变量:adv_types”
答案 0 :(得分:8)
不幸的是,bootstrap.php
的范围是bootstrap.php
,因此只要PHP完成解析$adv_types
,bootstrap.php
变量就会超出范围。
根据您的实际要求,您可以采取多种方法。
解决方案1:您在许多观看中都需要此变量
如果您需要在所有视图中使用该变量,则应在AppController::beforeRender()
中定义并设置该变量。
在app/app_controller.php
:
class AppController extends Controller
{
function beforeRender()
{
parent::beforeRender();
$adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');
$this->set(compact('adv_types'));
}
}
这将允许您的任何视图访问$adv_types
数组。
解决方案2:您可能需要在CakePHP应用中的任何位置访问此变量
如果您必须访问应用中其他位置的$adv_types
变量,则可以将其添加到Configure
集合中。在bootstrap.php
:
Configure::write('NameOfYourAppAsNamespace.adv_types', array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее'));
我建议使用项目名称作为伪命名空间; adv_types
不太可能与其他标识符发生冲突,但如果您更频繁地开始使用此方法,则会增加创建冲突的可能性。此外,这允许您将存储在Configure
集合中的数据分组到一个名称空间下,这对于调试非常方便。
无论如何,这种方法允许您通过调用Configure::read()
来访问CakePHP伞下任何范围内的变量。因此:
$adv_types = Configure::read('NameOfYourAppAsNamespace.adv_types');
解决方案3:您绝对必须将此变量用作全局变量
如果绝对必须将此作为标准PHP全局变量,您可以执行以下操作:
$GLOBALS['adv_types'] = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');
在此之前,请考虑是否严格必要。全局变量是一个非常混乱的业务,你应该有一个明确和现在的需求来证明它。
修改/更新!
Google翻译中的30秒让我发现您的阵列包含与键对应的翻译。您可能希望调查使用CakePHP的Internationalization & Localization功能来抽象出顶部/左侧/右侧/底部(以及其他所有内容)的英语和俄语术语之间的区别。
答案 1 :(得分:5)
这些需要在app_controller.php中设置,然后传递给您的视图
// app_controller.php
class AppController extends Controller {
var $adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');
function beforeFilter() {
$this->set('adv_types', $this->adv_types);
}
}
对我而言,bootstrap.php不是此常量的正确文件