定义全局数组常量以在视图中使用

时间:2010-11-23 19:39:01

标签: cakephp constants

我想定义全局数组常量

bootstrap.php中的代码

$adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');

视图文件中的代码

echo $form->input('Adv.type', array('type' => 'select', 'option' => $adv_types, 'label' => 'Место рекламы'));

但是cakephp给出错误:

  

“未定义的变量:adv_types”

2 个答案:

答案 0 :(得分:8)

不幸的是,bootstrap.php的范围是bootstrap.php,因此只要PHP完成解析$adv_typesbootstrap.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不是此常量的正确文件