在框架内创建模块系统

问题描述:

我正在寻找将模块系统实现到我的应用程序框架中的方法,模块将是以某种方式更改设计的类文件,以便自动与用户干预集成。在框架内创建模块系统

我的框架是一个定制的框架,但非常类似于codeigniter,只是更轻一点。

我已经是模板文件中的想法是对模块位置打电话,并有模块自动加载和分析

<html> 
    <head> 
     <title>Welcome to my site</title> 
    </head> 
    <body> 

      <header> 
       .... 
       <?php $this->call_modules('header') ?>; 
      </header> 

      <section> 

       <aside> 
        <?php $this->call_modules('sidebar') ?>; 
       </aside> 

      </section> 

    </body> 
</html> 

所以,下面的模块将被调用,其内容将在那里去地点:

/system/applications/admin/modules/header/a.php 
/system/applications/admin/modules/header/b.php 
/system/applications/admin/modules/sidebar/a.php 
/system/applications/admin/modules/sidebar/b.php 

所以这对我来说似乎将工作得很好,但问题是,我从来没有建立一个模块系统,我觉得这些都是钩更入级。

在我的脑子里,我基本上想要一个简单的系统,由1类文件和模板,如果需要,CALSS文件很可能是这样的:

class Module_HelloWorld extends Module 
{ 
    public static function info() 
    { 
     return array(
      'name' => 'Hello Word', 
      'version' => '1.0.0', 
      'description' => 'Dispalys "hello World"', 
      'author' => 'Robert Pitt', 
     ); 
    } 

    public function execute($context,$action) 
    { 
      //$context would be the current view at the point of execution for the view 

      //$action would be header/sidebar 
    } 
} 

所以我概括地说问题会是什么是为我的框架设计一个模块系统的最佳方式,允许3Rd方模块放在一个目录中,然后从管理员安装,而不需要太多的用户干预?

祝你好运,你的mvc和cms。 我前段时间实现了同样的想法,我的方法很简单,第一个出现在我的脑海里。

  1. 将您的系统建立在页面和模块(小部件)上。
  2. 页面信息保存在数据库表中,如“页面”。
  3. 模块(小部件)是一个包含元数据(定义)和业务逻辑的类。
  4. 如果您将一个模块添加到页面,其特定信息将保存在数据库中。
  5. 下一次,如果您希望拥有它的实例,只需将相关参数传递给它的类,然后获得它。
  6. 这样,您可以在不同的地方和不同的实例中使用单个模块定义。
  7. 您可以在数据库中添加尽可能多的页面。
  8. 用户可以在单个页面中添加尽可能多的小部件。
+0

感谢您的回复,稍后我会看看我能想出什么,尽管数据库存储不是我想要关闭的路径。 – RobertPitt 2011-05-13 12:21:44

+0

@RobertPitt,它可能适用于你的场景,在一个类和模块之间有一对一的对应关系,但是数据库对我来说很合适。 – 2011-05-13 19:04:45

我不确定这是否有帮助,但对我来说,我想要一个框架,我可以根据需要扩展模块方面的功能,但最少量的数据库交互在存储有关模块。所以我有一个设置,我有文件夹中的模块与设置,CSS,JS和实际的类,必须遵循非常具体的命名约定。添加模块时,我需要添加该文件夹,然后更新框架基本设置中的模块列表。

其中一个设置指定模块需要加载哪个页面。如果每个页面都需要模块,那么它就是(*)。我的框架基础控制器检查模块列表,然后检查模块的页面设置,看它是否应该加载。

我的框架通过将模板加载到输出缓冲区并存储在公共var中,然后可以通过框架中的任何代码访问来显示页面。因此,我可以简单地使用str_replace来标识需要加载的部分(例如,模板中存在指定页面主要内容的接口标记),然后替换为模块内容。因此,一个图库模块将会替换图库页面上的图库的界面标签,而一篇文章模块将在文章页面的界面标签上生成一篇文章。

虽然我不这样做,但我认为大多数人都会使用smarty标签进行替换。

我认为这适用于您需要一个框架,您正在使用个人向客户提供网站。如果不同的人需要能够使用你的框架,这可能不会奏效。