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

残念ながら、Joomla は私のテンプレート ドキュメントを解析し、すべての を読み取り、すべてjdoc:includeのモジュールの出力を保存してからrequire_once、カスタム ライブラリのこれらの呼び出しを実行しているようです。常に false を返します。

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

何か (特にモジュール) がレンダリングされる前に、すべてのカスタム クラスをロードするにはどうすればよいですか? 可能であれば、コアを変更したくありません。

更新: を通じて含まれているモジュール<jdoc:include type="modules />が、実際に自分のクラスが存在することを確認していることがわかりました。ただし、 の場合はこの限りではありません<jdoc:include type="component" />。この場合、{loadposition}宣言を使用してモジュールをロードしてレンダリングする com_content 記事があります。これを行うと、私のクラスは存在しなくなります。

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 以降、オートローダーがクラス プレフィックスに基づいて検索する場所を登録する機能があります (以前は、/libraries/joomla フォルダーにバインドされた "J" プレフィックスのみがサポートされていました) ...

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

Discovering Classes : ネーミング規則に従っているが、オートローダーがすぐに認識しないフォルダー内のクラスは、JLoader の discover メソッドを使用してまとめて登録できます。Discover メソッドは、フォルダー内のファイル名を調べ、それらの名前に基づいてクラスを登録します。追加の引数を使用して、クラス レジスタを更新し、サブフォルダーに再帰することができます。

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

FROM: http://developer.joomla.org/manual/ch01s04.html

于 2013-12-20T19:34:33.640 に答える