2011-07-22 60 views
7

首先,由于这是我第一次在这里发布问题,我需要更多的时间来适应这个问题,因此对本文引起的任何方便感到抱歉。CodeIgniter和HMVC问题

Q1。我想创建2 “主控制器” 为前端后端这样的:

  • MY_Controller延伸是CI_Controller
  • 前端延伸MY_Controller和所有前端控制器将延长FrontEnd
  • 后端延伸MY_Controller和所有后端控制器将延伸后端

用HMVC(MX)做这件事的最好方法是什么?

感谢@韦斯利默奇给出的想法把MY_Controller,前端,后端到MY_Controller.php 3个类的想法,但我认为把每个类放在一个PHP文件更好(更清洁)。或者我错了?我想创造这样的结构:

  • ./core/MY_Controller.php(扩展MX_Controller)
  • ./libraries/Backend.php(扩展MY_Controller)
  • ./libraries/Frontend。 PHP(延伸MY_Controller)
  • 自动负载后端前端autoload.php
  • 所有前端控制器将延伸前端(如:class Blog extends Frontend
  • 所有后端控制器将延伸后端(如:class Admin extends Backend

将在不把的一行代码在后端/前端控制器include_once该工作require_once./libraries/Backend.php./libraries/Backend.php


Q2。如何用HMVC实现多个主题? 例如,在MVC中,我们可以有2个主题strutured这样的:

  • ./application/views/ THEME1 /view_files.php
  • 。/应用/视图/ THEME2 /view_files.php

但在HMVC,视图文件夹内的文件夹分开,如果我想要实现多个主题,通常我必须这样做:

  • ./application/modules/ 模块1 /视图/ THEME1 /view_files.php
  • ./application/modules/ 模块1 /视图/ 主题2 /view_files.php
  • ./application/modules/ 模块2 /视图/ THEME1 /view_files.php
  • ./application/modules/ 模块2 /视图/ THEME2 /view_files.php

这不是我想要的,因为我想提出一个主题的所有视图文件放到一个文件夹以后,如果我想创建一个新的主题,我将只需要复制一个主题文件夹。但是我想知道如何在不破坏HMVC模型的情况下做到这一点(因为据我所知,在HMVC模型中,模型,视图,控制器必须位于一个模块文件夹中 - 至少在CI中)。这是我陷入困境的冲突。

回答

9

只需打开或创建core/MY_Controller.php,创建一个类MY_Controller并将其扩展MX_Controller,然后在同一个文件中创建其他基本控制器,让他们延长MY_Controller。这里是你开始你可以复制/粘贴来得到一个例子:

<?php defined('BASEPATH') OR exit('No direct script access.'); 

class MY_Controller extends MX_Controller { 

    public function __construct() 
    { 
     // do some stuff here that affects all controllers 
    } 

} 

class Frontend_Controller extends MY_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

} 

class Backend_Controller extends MY_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
     // Check admin login, etc. 
    } 

} 

/* end file application/core/MY_Controller.php */ 

至于“多个主题”走了,不知道你需要什么。样式表? HTML模板?你需要让用户切换它们还是手动进行切换?你需要检测移动设备并相应地改变主题吗?上述所有的? “最好”的方式将取决于你的实施。

我想创建2个库扩展自MY_Controller.php 并自动加载它们。这会工作吗?

不知道为什么你需要或想要......只是不这样做。您应该只使用其他控制器扩展这些类。

关于主题,我想有 多个主题的看法,如: - /views/theme1/view_files.php - /views/theme2/view_files.php关于JS/CSS /图像,我可以安排 我自己。一开始我会修复主题,但后来我可能会允许 用户选择。使用MVC,我可以把主题放在/ views /上面的 以上,但与HMVC,我必须找到另一种方式来安排它们到 主题,因为视图文件夹是分开的(我想要所有查看文件 相同的主题将是只有1个文件夹)..

由于这是过于宽泛的一个问题在这里解决,而你似乎不具备甚至试图做任何事,我会给你一个最低限度例如:

class MY_Controller extends MX_Controller { 

    public function __construct() 
    { 
     // do some stuff here that affects all controllers 
     $this->theme = 'theme1'; // matches your directory name in /views/themes/ 
    } 

} 

从你的控制器:

$this->load->view('themes/'.$this->theme.'/my_view_file'); 

使用HMVC,该文件看上去永远是对当前模块中,然后回落到默认的应用程序的目录,如果它不存在。如果由于某种原因你需要明确的话,你可以说前面加上了模块名称的路径(就像在模块之间交叉加载资源一样)。例如:

// From "blog" module 
$this->load->view('events/index'); 
// We just loaded `modules/events/views/index` from the blog module 

不管怎么说,这不是一个完整的解决方案,但希望它能让你开始一个想法。现在有成千上万的方法可以做到这一点,这里有两个已经支持主题模板库:

+0

感谢韦斯利,我没有尝试,但应该工作。 –

+0

我想创建2个库从MY_Controller.php扩展并自动加载它们。这会工作吗? 关于主题,我想有多个主题的看法,如: - ** /视图/ THEME1/view_files.php ** - ** /视图/ THEME2/view_files.php ** 关于JS/CSS /图像,我可以安排自己。 一开始我会修复主题,但后来我可能会允许用户选择。使用MVC,我可以将主题放在**/views/**的子文件夹中,但是使用HMVC,我必须找到另一种方式将它们安排到主题中,因为视图文件夹是分开的(我希望所有查看相同主题的文件都将只有一个文件夹).. –

+0

对不起,我忘了提及在1个文件中创建2个类,我想创建2个库Backend和Frontend从MY_Controller扩展并在配置文件中自动加载后端和前端。然后在控制器中,我将扩展为:'class Blog extends Frontend' –