我想知道实现这个目标的正确方法是什么?我对控制器的“视图”文件中的产品和其他东西进行了“概述”。我想在概述页面的列表中显示产品项目,但也在其他模板中显示(相同的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代码远不止于此,我只是想描述一下我的问题。如果您需要更多,请告诉我:-)
答案 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可以获得进一步的教程。