【问题标题】:codeigniter pass data to nested viewcodeigniter 将数据传递给嵌套视图
【发布时间】:2013-02-17 11:05:19
【问题描述】:

我已经对此主题进行了很多研究,但我找不到如何做到这一点。我正在尝试将数据添加到从另一个视图的控制器调用的视图中的$data 参数。但是,我通过subcontroller 添加到subview 的任何数据都不能被subview 访问。但是,当我尝试通过客户端视图将数据传递给子视图时,它工作得很好。 SO 上的大多数修复似乎只是引用了 $key in $data['key'] 而不是 $data 所以这在这里似乎并不真正相关......

我有两个班级:

  • welcome.php - 一个页面
  • welcomemenu.php - 一组控件,旨在 加载到welcome.php中

这是我的客户端控制器(它所在的页面,welcome.php),它将来自子视图 $welcomemenu 的返回值存储在它自己的 $data 数组中...:

<?php

class Welcome extends CI_Controller {

    function __construct() {
        parent::__construct();      
    }

    function index() {
        //echo 'this is the Welcome index function';
        $data['clienttestdata'] = 'data from welcome.php!';
        $data['welcomemenu'] = $this->load->view('welcome/welcomemenu', $data, true);

        $this->load->helper('url');
        $this->load->view('templates/header');
        $this->load->view('pages/welcome', $data);
        $this->load->view('templates/footer');

    }
}

这是客户端视图(“welcome_view.php” - 看起来很简单。$welcomemenu var 是我放置组件类返回的地方...):

    <section id="allWelcomeContent" class="mainBody">
        <header id="mainPageHdr" class=mainPageHdr>
            <!-- other stuff from my header -->
        </header>
        <!-- this is where i want to put the welcome menu... -->
        <section id="mainWelcomeContent" class="mainContent">
            <div>
                <?php echo $welcomemenu;?>
            </div>
        </section>
    </section>

这是我的子组件welcomemenu.php的控制器:

<?php

class Welcomemenu extends CI_Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {
        $data['menu_items'] = array('About', 'Portfolio', 'Resume', 'Fun', 'Blog'); 
        $data['testdata'] = 'data from welcomemenu.php!';

        $this->load->view('welcome/welcomemenu', $data);
    }
}

最后:这是应该从自己的控制器获取数据的子视图,但不能,即使它可以从调用客户端获取数据(即,$clienttestdata 显示正常,但 $testdata 没有t)!

<section>
<!-- TODO:  make this element repeatable so content can load from controller and/or model. -->
<div id="divMenuItems">
    <?php echo $clienttestdata;?>
    <?php echo $testdata;?>
</div>
</section>

我仍然找不到任何合适的解决方案。如果有人请给我

【问题讨论】:

    标签: php codeigniter views


    【解决方案1】:

    当您在 Welcome/index 方法中包含 Welcomemenu 部分时,您必须记住视图不会通过其自己的控制器。相反,它的内容作为字符串返回并存储为参数。它通过您通过$data 发送给它的参数获取它自己的所有参数:

    $data['welcomemenu'] = $this->load->view('welcome/welcomemenu', $data, true);
    

    因此,到目前为止,此视图将可以访问 $data 中的所有内容 - 没有通过 Welcomemenu 控制器添加任何额外内容。因此,在上述情况下,它将具有:

    array
    (
       'clienttestdata' => 'data from welcome.php!'
    )
    

    如果你把你需要的参数添加到$data(如$data['testdata']),你的子视图就会有它需要的。

    【讨论】:

    • 好的,谢谢;我想我遵循这个逻辑。但是,这是最佳实践吗(即,让子控制器的数据由客户端控制器控制)?我应该考虑重构以便子控制器可以真正将数据放入子视图中,还是应该遵循我当前的开发过程?
    • 您目前的做法很好 - 因为您将它包含在 Welcome 类中,而不是任何其他类中。您只需要记住通过$data 或另一个名为$sub_data 的参数来传递您需要的内容。
    • 好的,谢谢。我认为我的问题是我将 CI/php 类的 index() 函数与该类的构造函数混淆了。
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多