【问题标题】:"User control" with MVC PHP使用 MVC PHP 的“用户控制”
【发布时间】:2011-02-17 16:27:39
【问题描述】:

我想知道如何在 MVC 框架(特别是 CodeIgniter)中使用 PHP 实现类似 asp.net“用户控件”的功能。

为了更好地解释我想要什么,这里有一些指导:

  • .net 用户控件是一个文件,包含 aspx 和代码 (c#/vb),它为实现它的每个页面(例如,购物车)提供功能。它很容易添加到母版页中,母版页是网站中所有其他页面的容器。

  • 在 MVC 结构中,页面由控制器加载,控制器加载视图。我知道我可以在视图中加载视图,但是如何在不重复每个主控制器的情况下为“跨站点视图”提供控制器代码?

示例:我有一个视图,可以将数据库中的类别加载到选择列表中,并且该视图位于每个页面的顶部。因为我不应该(而且我不确定它是否可能)从视图中访问我的 Category 模型,所以我应该将代码放在哪里来加载这些数据,而不必在每个控制器的每个函数中重复它?

【问题讨论】:

    标签: php model-view-controller codeigniter


    【解决方案1】:

    如果您想避免在每个控制器中重复代码,那么只需扩展 CI_Controller 类并在实例化时在新的 Controller 类中进行所有设置......并让所有普通控制器继承自 New_Controller .

    【讨论】:

    • 感谢您的评论。我一直在这样做,但似乎不是正确的方法。我最终会得到一个巨大的 New_Controller 文件,来自各处的代码都混合在一起,并从所有其他控制器类继承。看起来真的很笨拙。
    • @nosuchnick - 没有规定你应该只拥有 一个 这样的控制器——你可以拥有一个包含一些通用代码的 Base_Controller,然后是一个 @987654324 @ 专门处理常见的购物车功能和数据,另一个 Shopping_Specials_Controller 添加了一些专门的功能......所有这些都与 Admin_Controller (它也继承自 Base_Controller)分开 - 所以你是只加载你需要的。
    【解决方案2】:

    正如 Sean 所说,如果功能处于控制器级别,您应该扩展 CI_Controller。 可能某些功能应该在视图级别,因此可以使用加载器视图来帮助您保持每个页面的全局布局并包含通用功能。是这样的:

    [查看] layout.php:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
    <head>
            <?php
                $this->load->view('meta', $data);
            ?>
    </head>
        <body>
            <div id="wrapper">
    
                <?php
                $this->load->view('header', $data);
                ?>
                <div id="contents">
    
                    <?php include ('menu_izq.php'); ?>
    
                    <div id="page">
                        <?php $this->load->view($page, $data); ?>
                        <div class="clear"></div>
                    </div> 
                </div>
                <div style="clear: both;"></div>
                <?php $this->load->view('footer');?>
            </div>
        </body>
    </html> 
    

    在您的控制器中,您应该始终加载此视图并在参数数组中传递内容真实视图的值,如

        $data['page'] = 'incidents'; // this is the real contents
        $stylesheets[] = '/scripts/jscalendar-1.0/skins/aqua/theme.css';
        $data['stylesheets'] = $stylesheets;
        $scripts[] = '/scripts/jscalendar-1.0/calendar.js';
        $scripts[] = 'https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js';
        $scripts[] = '/scripts/autoNumeric-1.4.1.js';
        $scripts[] = '/scripts/autoLoader.js';
        $data['scripts'] = $scripts;
        $this->load->view('container',$data);
    

    【讨论】:

      【解决方案3】:

      我很少使用母版页,主要是在 Sharepoint 中,但如果你想要一个 front.master 页面,可以这么说,然后在该上下文中加载所有其他页面,你最好的选择是创建一个新库作为你的视图处理程序并以编程方式将其设计为在主视图中加载辅助视图。

      一个简单的类包括:

      class MasterViewTemplate
      {
          public $master = "v1.php";
          private $data = array();
      
          public function __set($key,$value)
          {
              $this->data[$key] = $value;
          }
      
          public function __get($key)
          {
              return $this->data[$key];
          }
      
          public function setMaster($master)
          {
              $this->master = $master;
          }
      
          public function display($page)
          {
              //Load the master file
              //Load the inner $page file
              //Inject the page contents into the master
          }
      }
      

      这就是你要找的东西吗?

      【讨论】:

      • 不是。但是既然我们已经了解了,为什么 set 和 get 函数的名称前有 __?
      • 有特殊功能,__get 允许您执行$this-&gt;something 传递something 作为参数。并且该设置允许您$this-&gt;something = 'value' php.net/manual/en/language.oop5.magic.php
      • 啊,好吧,就像 .net 属性上的 get/set 方法一样。谢谢。
      【解决方案4】:

      回答我自己的问题:我发现了一些值得检查的东西。它提供了多个MVC三元组:https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 2015-10-08
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多