【问题标题】:Controller Design - multi subview - trying to add one master控制器设计 - 多子视图 - 尝试添加一个主视图
【发布时间】:2023-03-15 14:42:01
【问题描述】:

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

开始,让我们专注于 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>

在我的示例中,$widget 视图是一个子视图,它是一个带有工具的小部件,例如每个 activeTabSub 的不同编辑/添加按钮。 $main_content 是每个人的 html 视图。

现在是控制器 [Order]

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]。我不太确定我的设计尝试是否很好。你有什么建议吗?

【问题讨论】:

  • 你能举个例子说明一下吗?很难理解。
  • 可悲的是,这是我能形容的最好的了
  • 它通常是多个子页面的想法,可以从主要内容中继承数据,而无需在每个子页面上执行主查询我会这么说
  • 我认为您需要创建布局文件,但让我知道确实想为每个视图加载所有功能视图,就像这些视图对于每个视图都是通用的,让我知道然后我会给你解决方案.
  • 您的问题也不清楚,请进行编辑。

标签: php codeigniter codeigniter-3


【解决方案1】:

如果您的标签 menu 工作正常,您可以将所有 视图 缓冲为一个。 我假设您正在使用示例代码中的 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
    }
}

views/template/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)
       ));
   }
}

【讨论】:

  • 这对我来说似乎是最好的解决方案,您可以为此添加更多代码吗?我不知道 $this-> 主题来自哪里。此外,当涉及到查询时,我希望在函数索引中全局访问。假设我点击了#first_link,查询执行,当我点击#second_link 时,它可能也会执行,如果可能,它应该被调用一次
【解决方案2】:

好的 - 以免责声明开头,编码风格是个人的,有些人根本不同意我的建议。

我对您正在做的事情的印象是您正在尝试在控制器或视图中执行所有操作。就在你的控制器中的这段代码

 $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 布局代码)推送到它们自己的文件中。布局模板只是调用布局视图。因此,当您需要进行更改时,很清楚该去哪里,如果您犯了错误,您不会突然关闭您的模板 - 您已将其限制在一个视图文件中,这将更容易处理。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多