使用 CodeIgniter 在辅助函数中获取全局变量

发布于 2024-12-13 18:52:17 字数 1067 浏览 1 评论 0原文

我正在创建一个函数,它将在我的视图中插入一些简单的 HTML。我已经这样做了好几次了,没有出现任何问题,但是这次我将使用在 Controller-> 中设置的变量,并提取到视图中。

现在,我显然不想放弃我的一行快捷方式: 通过检查变量是否已设置,然后将它们作为参数等发送,因为这完全消除了函数调用的意义。

经过一番尝试和失败后,我最终得到了一个受保护的属性,我想在我的函数中使用它。知道如何解决这个问题吗?

// Outputs success/error messages
function showStatusMessages() {

    $variables = array(
        'success',
        'error'
    );

    foreach ($variables as $variable) {
        // Cannot access protected property CI_Loader::$_ci_cached_vars
        if ($variable = $GLOBALS['CI']->load->_ci_cached_vars[$variable]) ${$variable} = $variable;
        break;
    }

    ob_start();

    // Success message set
    if (isset($success)) :
        echo '<div class="message_box success_color">'.$success.'</div>';
    endif;

    // Error message set
    if (isset($error)) :
        echo '<div class="message_box error_color">'.$error.'</div>';
    endif;

    $msg = ob_get_contents();
    ob_end_clean();

    return $msg;

}

I'm making a function which will insert some simple HTML into my view. I've already done this several times without problems, but this time I'm going to use variables which are set in the Controller->extracted to the view.

Now, I obviously don't want to go away from my one-line shortcut: <?php echo showStatusMessages(); ?> by checking if variables are set, then send them as parameters etc. as this just kills the point of the function call altogether.

After some trying and failing I've ended up with a protected property which I'd like to use in my function. Any idea how I can find a way around this?

// Outputs success/error messages
function showStatusMessages() {

    $variables = array(
        'success',
        'error'
    );

    foreach ($variables as $variable) {
        // Cannot access protected property CI_Loader::$_ci_cached_vars
        if ($variable = $GLOBALS['CI']->load->_ci_cached_vars[$variable]) ${$variable} = $variable;
        break;
    }

    ob_start();

    // Success message set
    if (isset($success)) :
        echo '<div class="message_box success_color">'.$success.'</div>';
    endif;

    // Error message set
    if (isset($error)) :
        echo '<div class="message_box error_color">'.$error.'</div>';
    endif;

    $msg = ob_get_contents();
    ob_end_clean();

    return $msg;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

無心 2024-12-20 18:52:17

您不使用视图有什么原因吗?

<?php if (isset($success)) : ?>
    <div class="message_box success_color"><?php echo $success; ?></div>
<?php endif; ?>
<?php if (isset($error)) : ?>
    <div class="message_box error_color"><?php echo $error; ?></div>
<?php endif; ?>

然后使用单行调用此视图,如下所示(假设您将视图命名为“statusMessage”:

<?php $this->load->view('statusMessage'); ?>

这样做可以完成您的函数正在尝试的任务;您可以从一行中多次调用它。

Is there a reason you aren't using a view?

<?php if (isset($success)) : ?>
    <div class="message_box success_color"><?php echo $success; ?></div>
<?php endif; ?>
<?php if (isset($error)) : ?>
    <div class="message_box error_color"><?php echo $error; ?></div>
<?php endif; ?>

And then calling this view using a one-liner, like this (assumes you named the view 'statusMessage':

<?php $this->load->view('statusMessage'); ?>

Doing it this way accomplishes what you're function is trying to; you can call it multiple times from a single line.

迷路的信 2024-12-20 18:52:17

同意这不是首选方法,但是分配 $GLOBAL 就可以很好地工作,并且可以在层次结构中运行的函数下面进行访问。尝试将其分配给 $GLOBALS['ci'] 时会遇到麻烦。

在你的助手中:

function saveSomething($id){
    $GLOBAL['savedVars'][] = $id;
}

在你的助手被召唤后,你认为:

var_dump($GLOBAL['savedVars']);

Agree that it's not the preferred method however assigning a $GLOBAL will work just fine, and be accessible below the function runs in hierarchy. You will run into troubles attempting to assign it to the $GLOBALS['ci'].

In your helper:

function saveSomething($id){
    $GLOBAL['savedVars'][] = $id;
}

And in your view after your helper has been called:

var_dump($GLOBAL['savedVars']);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文