我正在寻找将模块系统实现到我的应用程序框架中的方法,模块将是以某种方式改变设计的类文件,以便自动与用户干预集成。
我的框架是一个自定义构建的框架,但与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方模块放在目录中然后从管理员安装,而无需太多用户干预?
答案 0 :(得分:3)
祝你的mvc和cms好运。 我前段时间已经实现了相同的想法,我的方法很简单,第一个出现在我脑海中。
答案 1 :(得分:1)
我不确定这是否会有所帮助,但对我来说,我想要一个框架,我可以根据需要在模块方面扩展功能,但在存储有关模块的信息方面具有最少量的数据库交互。所以我有一个设置,我在文件夹中有模块,文件包含设置,css,js和必须遵循非常特定命名约定的实际类。添加模块时,我需要添加文件夹,然后在框架基础设置中更新模块列表。
其中一个设置指定需要加载模块的页面。如果每个页面都需要该模块,则它是(*)。我的框架基础控制器检查模块列表,然后检查模块的页面设置以查看是否应该加载它。
我的框架通过将模板加载到输出缓冲区并存储在公共var中来显示页面,然后可以通过整个框架中的任何代码访问该公共var。那么我就可以简单地使用str_replace来识别需要加载的部分(例如,模板中有一个指定页面主要内容的接口标记),然后用模块内容替换。因此,一个gallery模块将使用gallery页面上的库替换interface标签,而一个文章模块将在文章页面上的interface标签上生成一篇文章。
虽然我没有,但我认为大多数人都会使用智能标签进行替换。
我认为当您需要一个用于向客户提供网站的框架时,这种方法很有效。如果不同的人需要能够使用您的框架,这可能不会有效。