【问题标题】:Define global array constant for using in view定义在视图中使用的全局数组常量
【发布时间】:2025-12-22 04:15:11
【问题描述】:

我要定义全局数组常量

bootstrap.php 中的代码

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

视图文件中的代码

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

但是 cakephp 报错:

“未定义变量:adv_types”

【问题讨论】:

标签: cakephp constants


【解决方案1】:

不幸的是,bootstrap.php 的作用域是bootstrap.php,所以一旦 PHP 完成对 bootstrap.php 的解析,$adv_types 变量就会超出作用域。

您可以采取多种方法,具体取决于您的实际需求。

解决方案 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' => 'Нижнее');

在这样做之前,请考虑这是否是绝对必要的。全局变量是一件非常麻烦的事情,您应该有一个明确且当前的需求来证明它的合理性。


编辑/更新!

谷歌翻译中的 30 秒让我发现您的数组包含与键对应的翻译。您可能想使用 CakePHP 的 Internationalization & Localization 功能进行调查,以抽象出英语和俄语术语在 top/left/right/bottom(以及其他所有内容)之间的区别。

【讨论】:

  • 感谢丹尼尔的解决方案,但这不是翻译,它只是定义广告地点的类型。
【解决方案2】:

这些需要在你的app_controller.php中设置,然后传递给你的views

// 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 不是这个常量的正确文件

【讨论】:

  • 如果这个数组是来自数据库的动态数组,我有什么办法可以从 AppModel 制作这个数组?