目前我处于两难境地。我想在我的网站上实现一个登录按钮,该按钮在没有用户登录时显示。但是,如果有人已登录,我希望该按钮更改为用户个人资料的链接。
我不知道这样做的正确方法是在视图中放置一个if语句,根据从Controller传递的数据呈现不同的HTML,或者Controller是否需要确定用户是否已记录in or not,并将适当的数据结构传递给View。在CodeIgniter中执行此操作的正确方法是什么?
答案 0 :(得分:4)
控制器用于计算和操作数据并将结果传递给视图,视图获取结果并将其呈现为HTML。
如果您在视图中使用if
语句来显示或隐藏某些标记,则允许您使用!
但如果更改部分包含大量信息,我建议使用部分视图并将其内容作为变量传递给主视图。并在控制器中完成所有这些。
在CodeIgniter中执行此操作:
<强>控制器:强>
class Foo extends CI_Controller {
public function bar()
{
// prevent getting error.
$data['partial'] = '';
// check if user is logged in.
if ($this->session->userdata('user_id') == TRUE) {
$data['partial'] = $this->load->view('partial/baz', '', TRUE);
} else {
$data['partial'] = $this->load->view('partial/qux', '', TRUE);
}
$this->load->view('my_view', $data);
}
}
假设: user_id
在用户登录时在CI会话中设置。
查看:强>
<?php echo $partial; ?>
答案 1 :(得分:4)
在Codeigniter中,您可以将if和else语句放在视图中。
if($this->session->userdata('your_session_variable'))
{
?>
<a href="profile_page_link">Profile</a>
<?php
}
else
{
?>
<a href="login_page_link">Login</a>
<?php
}
答案 2 :(得分:2)
显然可以将逻辑嵌入到View中,但MVC上的想法是拥有Controller中的所有逻辑,所以我猜你会破坏使用Codeigniter的目的。通常,视图用于呈现控制器传递的内容。
答案 3 :(得分:1)
这适用于任何基于MVC的应用程序,而不仅仅是CI。
由于您正在更改向用户显示view
的方式,因此在view
中添加条件没有任何问题。但是,应该在controller
内执行此逻辑。例如,您的控制器可能类似于:
class x
{
public function index()
{
if($session->get('logged_in') === true){
// send a variable to the view
}
}
}
然后在你的视野中,
<?php if(isset($logged_in)): ?>
Hey User! <a href="">logout</a>
<?php else: ?>
<a href="">login here</a>
<?php endif; ?>
显然在每个控制器方法中都会很烦人,所以请查看this问题,这样可以避免重复代码。