有没有办法在CodeIgniter中的部分视图中包含动态html?

时间:2014-03-31 09:46:34

标签: codeigniter partial-views

我想知道实现这个目标的正确方法是什么?我对控制器的“视图”文件中的产品和其他东西进行了“概述”。我想在概述页面的列表中显示产品项目,但也在其他模板中显示(相同的html元素,但每个产品的值不同)。我不想两次输入相同的东西,并希望轻松维护代码。

我有这个文件(views / profile / overview.php )它基本上是for-each循环列表的产品 - 类似于:

foreach($items as $item) {
    echo $item->name;
    echo $item->creation_date;
}

有没有办法放

 echo $item->name;
 echo $item->creation_date;

在单个部分视图中(如product_item)并动态加载?

我已经尝试过:(因为$ item未在product_item中定义,所以无效)

foreach($items as $item) {
        $this->load->view('/profile/partials/product_item');
}

尝试2:(也没有用。我不知道为什么 - 因为$ item应该传递给那个视图?)

foreach($items as $item) {
       $this->load->view('/profile/partials/product_item', $item);
}

尝试3:(与尝试2相同)

foreach($items as $item) {
       $x = $this->load->view('/profile/partials/product_item', $item);
       echo $x;
}

尝试4 (我试图在控制器中执行此操作(我只是想将$product_item回显到概述模板中)

$this->view_data['product_item'] = $this->load->view('profile/partials/product_item', $this->view_data, true);

我必须提到product_item,它的html代码远不止于此,我只是想描述一下我的问题。如果您需要更多,请告诉我:-)

3 个答案:

答案 0 :(得分:4)

load->view()将关联数组或对象作为参数,因此这应该有效:

foreach($items as $item) {
    $this->load->view('/profile/partials/product_item', array('item' => $item));
}

之后,您可以使用:

echo $item->name;
echo $item->creation_date;

在你看来。


请记住,传递给加载视图函数的数组/对象的每个数组键都将成为视图中的变量。所以,如果你发送:

$data['hey'] = 'there';

在您看来,您的变量$hey的值为'there'

答案 1 :(得分:3)

以@Shomz刚才所说的为基础

主模板

视图/主/的template.php

假设您在产品控制器视图中加载

<section role="content">
    <?php echo $this->load->view($view); ?>
</section>

但是,如果您想从产品控制器中加载更多信息,比如边栏,那该怎么办?


您可以从产品控制器执行此操作,并且可以使用条件来检查变量是否从Controller发回。

<aside role="sidebar">
    <section>
         //Normal sidebar stuff here, nothing to worry about
    </section>

    <?php if($sidebar) : ?> //Did ANY Controller send a Sidebar Variable ?
    <section >
       <?php echo $this->load->view($sidebar); ?>
    </section>
    <?php endif; ?>
</aside>

控制器

public function someMethod()
{
    $this->template = 'master/template'; //views/master/template

    return $this->load->view($this->template, array(
          'view'   =>  'products/index' // the $view var
          'sidebar' => $this->load->view('partials/sidebar', array('product_data'=>$model), true) //$sidebar var buffered with dynamic data
    ));
}

答案 2 :(得分:0)

我意识到这可能是对过时问题的回应;但除了@ Philip的回答之外,CodeIgniter Template Parser Class可以用来防止PHP代码对视图文件的“污染”。

使用视图片段在控制器中控制迭代的示例:

$temp = '';
$template1 = '<li><a href="{link}">{title}</a></li>';
$data1 = array(
        array('title' => 'First Link', 'link' => '/first'),
        array('title' => 'Second Link', 'link' => '/second'),
);

foreach ($data1 as $menuitem)
{
        $temp .= $this->parser->parse_string($template1, $menuitem, TRUE);
}

$template = '<ul>{menuitems}</ul>';
$data = array(
        'menuitems' => $temp
);
$this->parser->parse_string($template, $data);

结果:

<ul>
        <li><a href="/first">First Link</a></li>
        <li><a href="/second">Second Link</a></li>
</ul>

Introduction to Templating and Dynamic Views with Codeigniter可以获得进一步的教程。