CodeIgniter中的主题和内容一致

时间:2011-01-23 16:06:09

标签: php codeigniter

我正在使用CodeIgniter开发一个基本网站,以便更好地理解框架并改进我目前有限的网络开发技能。我一直在寻找和阅读相当多的文档,但没有找到我正在寻找的(或至少我不认为)。

我的网站将有一致的标题,导航和页脚。基本上,唯一会通过subnav改变的内容是页眉和页脚之间的一些文本和/或图像。这是一个非常典型的简单网站,但我想弄清楚如何在视图/控制器的上下文中处理它。

根据我在这种情况下的理解,您希望在视图中创建一个“主题”文件夹,其中包含每个页面加载的“主”视图。我的印象是,由于能够在单个控制器中加载多个视图,我实际上只需要一个“主”控制器来加载“主”视图以及与导航关联的任何视图。例如,Nav:Home |关于|联系。我点击“关于”,然后通过适当的家庭控制器方法加载main + about视图。

这是我目前正在尝试的方法,但我想在尝试这个时我会得到一些反馈。

我不一定在寻找一步一步的教程,但更多的是接受或最常见的方法。非常感谢,如果这是在我面前盯着我的2个帖子,我会提前道歉。

由于 - 杰伊

4 个答案:

答案 0 :(得分:1)

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

Template

答案 1 :(得分:0)

我使用自己的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(),它将显示基本的头部和脚部,但是具有正确的主要内容。

答案 2 :(得分:0)

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反转模式,并将页面组合逻辑放在 templates 中。这些模板以更自然的方式执行基本控制器的功能,因此您可以使用不同的模板来代替不同类型页面的多个控制器功能。结果是一组视图文件,如:

  • 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等)中更常见。

答案 3 :(得分:0)

因此,您需要确保了解路线,以确保所有内容都映射到您网址的第一段,因为您实际上只需要一个控制器。这是在一个名为routes.php

的文件的application / config文件夹中

您需要将其设置为:

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

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

这样在你的home.php控制器(controllers / home.php或任何你想要调用的东西)中,你可以拥有与你的网址相匹配的功能

在这个实例中,在其他帖子中提到的关于扩展基本控制器的内容并不是必需的。但是有一个功能可以为您查看加载是很好的 这样您就不必为每个功能重复$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函数现在加载了header,nav的视图,无论是$ view是什么,然后是footer all ...非常好。

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

以下是最终的结果:

<?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);
 }

}