控制器设计 - 多子视图 - 尝试添加一个主控

Kav*_*aft 12 php codeigniter codeigniter-3

问候我不太确定如何在我的项目中实现我的愿景.

首先,让我们专注于Order控制器.

所以我的订单包含很多子视图.例如,详细信息,历史记录,地址,附加文件,注释等.我将它们放在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>
Run Code Online (Sandbox Code Playgroud)

在我的示例中,$ 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

可以想象,我为每个链接提供了9个这些视图函数.问题开始的时候我想要一些数据,即客户数据全部来自这9个子视图 - 只调用一次而不是每个页面点击[tab].我不太确定我的设计尝试是否很好.你有什么建议吗?

Phi*_*lip 2

如果您的选项卡菜单正常工作,您可以将所有视图缓冲到一个视图中。我假设您正在使用示例代码中的引导程序。以下是他们建议您编写选项卡标记的方式。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>
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

要构建一个主模板来包装所有视图,您需要扩展 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
    }
}
Run Code Online (Sandbox Code Playgroud)

views/template/index.php 这是我们通过扩展 CI_Controller 创建的主视图

<html>
  <head></head>
  <body>
    <?php
      // load "view" variable ANY controller sends us
      $this->load->view($view);
    ?>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)
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)
       ));
   }
}
Run Code Online (Sandbox Code Playgroud)