1

我正在制作自定义库以扩展 Joomla 框架核心的功能,并且我将所有类放在自定义库文件夹中,如下所示:

- libraries
   - joomla
   - my_custom_library

我希望在执行任何模块渲染之前我的所有类都存在,以便我可以将它们用于我的自定义模块代码。现在,我能想到的唯一加载我的类的地方是在我的模板文件中:

<?php
// index.php in template folder
require_once(JPATH_LIBRARIES . DS . 'my_custom_library' . DS . 'Page.php';
require_once(JPATH_LIBRARIES . DS . 'my_custom_library' . DS . 'User.php';
// and so on...
// and then the HTML document follows with <jdoc:include type="modules" /> syntax

jdoc:include不幸的是,在为我的自定义库执行这些调用之前,Joomla 似乎解析了我的模板文档,读取了我的所有s,并存储了我所有模块的输出require_once,因为当我创建一个新模块并检查我的类是否存在时,它总是返回假。

<?php
// mod_something_custom.php in something_custom module folder
echo (bool) class_exists('MyCustomPageClass');  // false

如何在渲染任何内容(特别是我的模块)之前加载所有自定义类?如果可能的话,我不想改变核心。

更新:我刚刚发现通过<jdoc:include type="modules />确实包含的模块确实看到我的类存在。但是,情况并非如此<jdoc:include type="component" />。在这种情况下,我有 com_content 文章使用{loadposition}声明来加载模块并呈现它。当我这样做时,我的课程就不复存在了!

4

2 回答 2

4

您可以通过使用系统插件来添加此功能以包含文件。这样的事情应该这样做:

<?php

// no direct access
defined('_JEXEC') or die;

class plgSystemIncludeFiles extends JPlugin {

    public function __construct(&$subject, $config = array()) {
        parent::__construct($subject, $config);
    }

    public function onAfterRoute() {
        require_once(JPATH_LIBRARIES . DS . 'my_custom_library' . DS . 'Page.php';
        require_once(JPATH_LIBRARIES . DS . 'my_custom_library' . DS . 'User.php';
    }

}
于 2012-12-18T09:10:21.790 回答
1

标准化的方法,以及比之前提出的更简单的解决方案,是在 Joomla 2.5、3.x 中加载新库,使用以下任一方法:

注册类前缀:从 12.1 开始,可以根据类前缀注册自动加载器的外观(以前只支持“J”前缀,绑定到 /libraries/joomla 文件夹)...

 // Tell the auto-loader to look for classes starting with "Foo" in a specific folder.
 JLoader::registerPrefix('Foo', '/path/to/custom/packages');

发现类:文件夹中遵循命名约定的类,但不是自动加载器立即识别的类,可以使用 JLoader 的发现方法共同注册。discover 方法查看文件夹中的文件名并根据这些名称注册类。附加参数可用于更新类寄存器并递归到子文件夹。

 // Register all files in the /the/path/ folder as classes with a name like:
 // Prefix<Filename>
 JLoader::discover('Prefix', '/the/path/');

来自:http : //developer.joomla.org/manual/ch01s04.html

于 2013-12-20T19:34:33.640 回答