1

我正在尝试在 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(),它将向标题输出预定义的资源。但是我不能说哪些模块将在页面中使用,因此系统需要检查该页面中使用了哪些模块,如果使用了,则需要将其依赖项添加到页眉中。

4

2 回答 2

2

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

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

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

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

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

我不认为这正是您所希望的,但可能会让您走上寻找解决方案的正确轨道。

于 2013-09-17T01:35:55.717 回答
0

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

        # Register 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();

这将返回一组可以根据情况进行处理的资产。

于 2013-09-18T04:39:31.883 回答