【问题标题】:Consistent theme and content in CodeIgniterCodeIgniter 中一致的主题和内容
【发布时间】:2011-01-23 16:06:08
【问题描述】:

我正在使用 CodeIgniter 开发一个基本网站,以更好地理解框架并提高我目前有限的 Web 开发技能。我一直在搜索和阅读大量文档,但没有找到我正在寻找的确切内容(或者至少我不认为)。

我的网站将具有一致的页眉、导航和页脚。本质上,将通过子导航更改的唯一内容是页眉和页脚之间的一些文本和/或图像。这是一个非常典型的简单网站,但我试图弄清楚如何在视图/控制器的上下文中解决这个问题。

根据我对这种情况的理解,您希望在视图中创建一个“主题”文件夹,其中包含随每个页面加载的“主”视图。我的印象也是,由于能够在单个控制器中加载多个视图,我真的只需要一个“主”控制器来加载“主”视图以及与导航关联的任何视图。例如,导航:主页 |关于 |接触。我单击“关于”并通过适当的主控制器方法加载主视图 + 关于视图。

这是我目前正在尝试采用的方法,但我认为在尝试此方法时我会得到一些反馈。

我不一定要寻找分步教程,但更多的是公认的或最常见的方法。非常感谢,如果这在 2 个帖子下盯着我看,我提前道歉。

谢谢 -杰

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    您可以尝试使用模板库。它是我在我所做的每个 codeigniter 项目中使用的,我喜欢它。

    Template

    【讨论】:

    • 谢谢 Kory,一定会调查的。为了在不引入任何额外库的情况下学习框架,我将尝试 tgriesser 的方法,即使创建模板库是为了解决我的特定问题。一定会牢记您的建议继续前进。如果我也可以将这篇文章标记为正确,我会:/
    【解决方案2】:

    因此,您需要确保了解路由,以确保所有内容都映射到 URL 的第一段,因为您实际上只需要一个控制器。这是在名为 routes.php 的文件中的 application/config 文件夹中

    你会想要这样设置:

    $route['(:any)'] = "home/$1";
    $route['default_controller'] = "home";
    

    所以它匹配第一段中的任何内容(:any)并将其路由到 home/$1(控制器/函数)......然后如果第一段中没有任何内容,则将其映射到 home/(索引函数这是暗示的)。查看 routes 文件的文档,以便了解您可以使用它做什么(您可以运行正则表达式、高级路由等),了解这一点非常重要。

    通过这种方式,在您的 home.php 控制器(controllers/home.php 或任何您想调用的名称)中,您可以拥有与您的 url 匹配的函数

    其他帖子中提到的关于扩展基本控制器的内容在这种情况下并不是真正必要的。但是很高兴有一个可以为您加载视图的功能 这样您就不必为每个功能重复$this->load->view(header)$this->load->view(footer) 等。

    我喜欢用我的页眉、页脚、导航等创建一个包含文件夹。创建一个可以做到这一点的函数...具有私有可访问性,如下所示:

     private function viewloader($view, $data) {
             $this->load->view('includes/header', $data);
             $this->load->view('includes/nav', $data);
          $this->load->view($view, $data);
             $this->load->view('includes/footer', $data); 
     }
    

    ...或者在函数之前使用 codeigniter 的内置下划线,使其无法通过 URL 访问

     function _viewloader($view, $data) {
             $this->load->view('includes/header', $data);
          $this->load->view($view, $data);
             $this->load->view('includes/footer', $data); 
     }
    

    然后你的每个页面的函数看起来像这样:

     function about()
     {
      /* put any application logic here */
      $this->viewloader('about', $data);
            /* or $this->_viewloader('about', $data); 
               if you went with CI's style visibility */
     }
    
     function contact()
     {
      /* put any application logic here */
      $this->viewloader('contact', $data);
            /* or $this->_viewloader('contact', $data); 
               if you went with CI's style visibility */
     }
    

    所以现在你可以看到,viewloader 函数现在加载了页眉、导航、任何 $view 的视图,然后一次加载页脚......非常好。

    您还可以记住,可以在视图文件本身(嵌套视图)中加载您需要的任何视图,它们并不总是必须从控制器加载,尽管保持这种方式很好如果要进行重大更改,则不必编辑单个视图文件。

    这可能是最后的样子:

    <?php 
    if (! defined('BASEPATH')) exit('No direct script access');
    
    class home extends CI_Controller {
    
     //php 5 constructor
     function __construct() {
      parent::__construct();
     }
    
     function index() {
      $data['title'] = "Welcome To Our Site"  
      $this->viewloader('home', $data);
     }
    
     function contact() {
      $data['title'] = "Contact Us"
      $this->viewloader('contact', $data);
     }
     function about() {
      $data['title'] = "About Us"
      $this->viewloader('about', $data);
     }
    
     private function viewloader($view, $data) {
      $this->load->view('includes/header', $data);
      $this->load->view('includes/nav', $data);
      $this->load->view($view, $data);
      $this->load->view('includes/footer', $data);
     }
    
    }
    

    【讨论】:

    • 谢谢!我将尝试这种方法。
    • 如果您要复制最后一段代码并且您使用的 codeigniter 版本 bitbucket.org/ellislab/codeigniter
    • 谢谢,我看到了,并认为语法可能来自早期版本。我将首先复制代码,然后对其进行修改以更好地了解发生了什么:)
    【解决方案3】:

    我使用自己的mvc,但概念还是一样的。我开始做的是使用以下方法创建一个基本控制器类。

    class base_controller {
    
        function assemble_display() {
            $this->display_view('head');
            $this->display_main_content();
            $this->display_view('foot');
        }
    
        function display_main_content() {
            $this->display_view('home');
        }
    
    }
    

    然后,在后续扩展这个基类的控制器中,我覆盖了 display_main_content() 方法。

    class search extends base_controller {
    
            function display_main_content() {
                $this->display_view('search');
            }
    
    }
    

    这样我可以在任何控制器中调用 assemble_display(),它会显示基本的头和脚,但主要内容正确。

    【讨论】:

    • 嗯,好的,我知道你在做什么。但是,我不确定这是否可以与 CI 一起使用,因为每个控制器都扩展了框架中的通用类“控制器”。例如,如果我正在创建一个名为“Home”的控制器,它会被写为 Home 类扩展 Controller。也许我可以修改 CI 中的基本 Controller 类?我会看看这个。
    • 或者,你可以只扩展两次,家庭控制器扩展 ci 基本控制器,其他控制器扩展家庭控制器。
    【解决方案4】:

    CodeIgniter 倾向于从您的控制器函数中按顺序包含页面的视图部分。过去,我将自己的基类添加到 CI 中,实现了一组自定义视图函数:

    • show($tab, $body, $data) - 使用页眉/正文/侧边栏/页脚部分显示视图。侧边栏和正文是从当前的$tab 视图文件夹中提取的。
    • _print($tab, $body, $data) - 用于打印的show(); 变体(设置 CSS,删除打印不需要的部分)。这可以单独使用 CSS 完成,但我有客户需要特殊的服务器端 mojo 进行打印。
    • widget($type, $id) - 发送一个视图块(通常用于 js/Ajax)
    • api($type, $template) - 按类型(JSON、XML 等)发送 API 数据。

    这种方法在许多大型项目中效果很好,但还有其他方法。例如,CodeIgniter 的 fork Kohana 会反转模式,并将页面组合逻辑放在 模板 中。这些模板以更自然的方式执行基本控制器的功能,因此您无需为不同类型的页面使用多个控制器功能,而是使用不同的模板。结果是一组视图文件,例如:

    • app/main-template.php
    • app/login-template.php
    • app/print-template.php
    • app/reports/wide-template.php
    • widgets/control-template.php
    • api/soap-template.php
    • 等等。

    Kohana 方法也可以应用于 CodeIgniter,并且在其他框架(如 Rails、Cake、Zend 等)中更为常见。

    【讨论】:

    • 感谢布鲁斯,感谢您的回复。将牢记这种方法。
    猜你喜欢
    • 2020-03-09
    • 2011-06-03
    • 1970-01-01
    • 2019-03-27
    • 2019-02-03
    • 2015-06-05
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多