问候我不太确定如何在我的项目中实现我的愿景。
首先,让我们专注于订单控制器。
所以我的订单包含很多子视图。例如,详细信息,历史记录,地址,附加文件,注释等。我将它们放在jQuery选项卡界面上。
让我们展示一些代码。
layout.php中
<div class="page-content">
<div class="row">
<div class="col-md-12">
<ul class="nav nav-tabs responsive hidden-xs hidden-sm">
<li class="<?php echo ($activeTabSub === "1") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Master details</a>
</li>
<li class="<?php echo ($activeTabSub === "2") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">History</a>
</li>
<li class="<?php echo ($activeTabSub === "wyk") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Address</a>
</li>
<li class="<?php echo ($activeTabSub === "3") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Files</a>
</li>
<li class="<?php echo ($activeTabSub === "4") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">Notes</a>
</li>
<li class="<?php echo ($activeTabSub === "7") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
<li class="<?php echo ($activeTabSub === "8") ? "active" : ""; ?>">
<a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
<li class="<?php echo ($activeTabSub === "9") ? "active" : ""; ?>"><a href="<?PHP echo base_url();?>x/y/<?PHP echo $zgl; ?>">ETC</a>
</li>
</ul>
</div>
</div>
<?PHP $this->load->view($widget,$activeTabSub); ?>
<?PHP $this->load->view($main_content,$activeTabSub); ?>
</div>
在我的示例中,$ widget视图是一个子视图,它是一个带有工具的小部件,就像每个activeTabSub的不同编辑/添加按钮一样。 $ main_content是每个人的html视图。
现在为控制器[订单]
public function functiontolink1()
{
$data['main_content'] = 'x/y';
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
$seg= $this->uri->segment(3);
$data['zgl'] = $seg;
if(isset($seg)){
$data['pracownicy'] = $this->Zlecenia_model->pracownicy($zgloszenie);
switch($this->userGroup){
case 1 :
$data['main_content'] = 'x/y';
break;
case 2 :
$data['main_content'] = 'x/y';
break;
case 3 :
$data['widget'] = 'Client/x/widget';
$data['main_content'] = 'Client/x/y';
break;
default: show_404(); break;
}
$this->load->view('Client/x/layout',$data);
}else{
show_404();
}
}
public function functiontolink2()
{
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
$seg= $this->uri->segment(3);
if(isset($seg)){
$data['zgl'] = $seg;
$data['json'] = $this->Zlecenia_model->getSingle($zgloszenie);
$vvv= json_decode($data['json']);
$data['client'] = $this->Order_model->getclient($vvv[0]->klient);
switch($this->userGroup){
case 1 :
$data['main_content'] = 'x/y';
break;
case 2 :
$data['main_content'] = 'x/y';
break;
case 3 :
$data['widget'] = 'Client/x/widget';
$data['main_content'] = 'Client/x/y';
break;
default: show_404(); break;
}
$this->load->view('Client/x/layout',$data);
$this->load->view('zgloszenie/layout',$data);
}else{
show_404();
}
}
可以想象,我为每个链接提供了9个这些视图函数。 当我希望获得一些数据时会出现问题,即客户数据全部来自这9个子视图 - 只调用一次而不是每次点击[tab]。我不太确定我的设计尝试是否很好。你有什么建议吗?
答案 0 :(得分:2)
如果您的标签菜单正在运行,您可以将所有视图缓冲到一个。 我假设您正在使用示例代码中的 bootstrap 。 以下是他们建议您为选项卡编写标记的方式。 http://getbootstrap.com/javascript/#tabs-examples可能需要一些javascript配置才能使它们正常工作,因此您需要仔细阅读文档。我自己不是一个自助人,所以我可以提供一些帮助。
<ul class="nav nav-tabs" role='tablist'>
<li role="presentation" class='active'>
<a href='#widget1' data-toggle="tab">widget1</a>
</li>
<li role="presentation">
<a href='#widget2' data-toggle="tab">widget2</a>
</li>
</ul>
<section class='tab-content'>
<div class='tab-pane active' id='widget1'>
<?php $this->load->view($widget1); ?>
</div>
<div class='tab-pane' id='widget2'>
<?php $this->load->view($widget2); ?>
</div>
</section>
要构建一个主模板来包装所有视图,您可能希望扩展CI_Controller类并只需设置一个名为template的属性,该属性将指向您的模板
class MY_Controller extends CI_Controller
{
public $template;
public function __construct(){
parent::__construct();
// set the template in the constructor
// as this is where you should assign variables
// If you had an admin controller, you would create an admin controller
// extending this one, and override the $template variable.
$this->template = 'template/index' // views/template/index.php
}
}
<强>视图/模板/ index.php的强> 这是我们通过扩展CI_Controller
创建的主视图
<html>
<head></head>
<body>
<?php
// load "view" variable ANY controller sends us
$this->load->view($view);
?>
</body>
</html>
class Controller extends MY_Controller //extending the MY_Controller
{
public function index()
{
$data = array('username'=>'stackoverflow');
return $this->load->view($this->template, array(
'view' => 'your_main_view_with_tab_menu',
// the next two views are buffered as a string
// so you can easily inject them into your main tab menu view
// by setting the third paramter as true
'widget1' => $this->load->view('widget1_view', array('data' => $data), true),
'widget2' => $this->load->view('widget2_view', array('data' => $data), true)
));
}
}
答案 1 :(得分:2)
ok - 在免责声明的前言,编码风格是个人的,有些人根本不同意我的建议。
我对你正在做的事情的印象 - 是你试图在控制器或视图中做所有事情。就在这里你控制器中的代码
$data['main_content'] = 'x/y';
$data['widget'] = 'x/widget';
$data['heading'] = "";
$data['activeTab'] = 'pzlec';
$data['activeTabSub'] = '2';
$data['strona'] = 'text';
$data['dzial'] = 'text';
这太具体了。控制器应该是一个高级别的老板 - 你不必担心低级别的细节。 “从数据库中取出这个 - 它回来了吗?如果是,那就去做吧。如果你不这样做的话。”
换句话说 - 低级细节将不断变化。你必须计划这些变化。并且您不希望不断更改控制器,因为任何错误都会导致应用程序停机。
这就是模特的用途。再次,人们会争论这个,并说不应该是图书馆或助手或其他什么。关键是你要隔离这些低级细节,并希望将它们放在有意义的地方。所以六个月后你可以查看文件名,并有一个不错的想法,你需要去做更新。最好有10个具有特定名称和特定任务的模型,然后是一些试图做太多的超级模型。
说到尝试做太多 - 重构那些控制器方法,以便他们不会尝试做很多不同的事情。例如,如果要显示404,因为$ seg不存在,为什么要提取大量数据呢?检查$ seg是否有效应该是第一个任务。如果它有效则转到下一个方法。如果它无效则不显示404 - 显示特定于错误的礼貌页面。然后当它发生时你有机会弄清楚问题是什么。
最后我建议 - 让你的布局模板完全中立 - 换句话说没有HTML代码。它只是调用其他视图。那又怎么样?它将低级细节(如html和css布局代码)推送到自己的文件中。布局模板只调用布局视图。所以当你需要进行更改时,它清楚地去哪里,如果你犯了一个错误,你就不会突然把你的模板带下来 - 你把它限制在一个视图文件中,这将更容易处理。