Codeigniter HMVC资产管理

时间:2013-09-14 10:39:17

标签: php codeigniter hmvc

我正试着在Codeigniter中向HMVC发号施令。这是我的文件夹结构。

-ROOT
--APPLICATION
---MODULES
----Module_Email
-----Controllers
-----Models
-----Views
-----Assets
------JS
------CSS
------IMG

要渲染模块,我必须使用

Module::run('Module_Email');

此方法将输出渲染输出,下面给出一个示例

<script type="text/javascript" src="PATH/TO/EMAIL_MODULE/JS/JS_FILE.JS"></script>
<div data-module-name="Module_Email" class="Email_wrapper">

  //RENDERED HTML CONTENT 

</div>

现在我的问题开始了。通常我想将所有资源都放到标题中。因此,当我调用任何模块时,需要将其依赖性添加到标头中,而不是从其调用的位置添加。

我搜索了很多,但我找不到任何好的方法。

请帮忙。

更新

目前我在我的标题get_assets()上有一个函数,它会将预定义的资源输出到标题。但是我无法说明哪些模块将在页面中使用,因此系统需要检查在此页面中使用了哪些模块,如果使用了它,则需要在标头上添加其依赖项。

2 个答案:

答案 0 :(得分:2)

似乎你的主要问题是试图弄清楚使用了哪些模块。

不幸的是,据我所知,默认的Wiredesignz模块化扩展无法访问模块名称,除非您编写某种黑客来获取该数据。正在使用的模块存储在MX_Router类的受保护变量$模块中,但是,没有允许您访问它的公共方法。因此,您唯一的选择是扩展类并创建公共函数。

或者你可以使用我所做的forked version Wiredesignz实现,它提供了许多其他功能,包括公共函数来获取$ module变量。使用我编写的分叉版本,您可以使用如下代码:

<?php $module_name = $this->router->fetch_module(); ?>

但是,这只会记录您加载的最后一个模块,因此您仍需要完成存储所有模块的工作,然后让您的函数使用此信息来确定要加载的资产。如果我正在做类似你的事情,我可能会分叉我的版本,然后创建一个额外的数据结构来存储加载的每个模块,然后你可以访问它们。

我不认为这正是您所希望的,但可能会让您找到解决方案的正确方法。

答案 1 :(得分:1)

我在Module类中添加了一个数组来存储资产,并添加了两个函数来存储/检索项目。这是源(更新的Modules.php)

        #Reigister your assets
        public static function register_asset( $asset )
        {
           if( in_array($asset,self::$assets) === FALSE )
           {
              self::$assets[] = $asset;
           }
        }

       public static function assets()
       {
             return self::$assets;
       }

现在您可以在模块中注册这样的资产

Modules::register_asset('myslider.js');

您可以使用

重新计算所有资产
Modules:assets();

这将返回一系列资产,可根据具体情况进行处理。