web-dev-qa-db-ja.com

レイアウトファイルを適切に上書きする方法

Joomla 3.xでは、JLayoutクラスを使用して、ROOT/layoutsフォルダーにあるファイルをオーバーライドできます

このドキュメントによると http://docs.joomla.org/J3.x:JLayout_Improvements_for_Joomla

必要なのは、このようなものを追加することだけです。

        $layout = new JLayoutFile('joomla.edit.frontediting_modules'); 
        $layout->addIncludePaths(YJSGPATH .'includes/html/layouts');

        print_r($layout);

このスニペットは、onAfterRoute関数のシステムプラグインに追加されます。

これで、配列は正常に見え、正しい方向を指しています

JLayoutFile Object
(
    [layoutId:protected] => joomla.edit.frontediting_modules
    [basePath:protected] => 
    [fullPath:protected] => 
    [includePaths:protected] => Array
        (
            [0] => D:\wamp\www\Development\Yjsgv2-DEV\3x\plugins\system\yjsg\includes/html/layouts
            [1] => D:\wamp\www\Development\Yjsgv2-DEV\3x/templates/creatus/html/layouts
            [2] => D:\wamp\www\Development\Yjsgv2-DEV\3x/layouts
        )

    [options:protected] => Joomla\Registry\Registry Object
        (
            [data:protected] => stdClass Object
                (
                    [component] => 
                    [client] => 0
                )

        )

    [debugMessages:protected] => Array
        (
        )

)

そしてファイルfrontediting_modules.phpは私のフォルダにあります http://prntscr.com/4lijlf

しかし、オーバーライドは行われていません。

bootstrap popover and tooltips http://prntscr.com/4lijz の呼び出しを削除しましたが、テストするだけで機能しません

オーバーライドフォルダーをテンプレートのhtmlフォルダーに移動すると、オーバーライドが機能します。

誰か教えてください。

ありがとうございました!

3
Dan

addIncludePaths呼び出しは、_$layout_変数の特定のインスタンスにのみ影響します。プラグインでレイアウトもレンダリングしない限り、コードは実際のレンダリングに影響を与えません。

ドキュメントレンダラーからこの行に影響を与えようとしているようです:

_JLayoutHelper::render('joomla.edit.frontediting_modules', $displayData);
_

これは、JLayoutHelperのrenderメソッドを使用して、JLayoutFileの新しいインスタンスをインスタンス化します。

_public static function render($layoutFile, $displayData = null, $basePath = '', $options = null)
{
    $basePath = empty($basePath) ? self::$defaultBasePath : $basePath;

    // Make sure we send null to JLayoutFile if no path set
    $basePath = empty($basePath) ? null : $basePath;
    $layout = new JLayoutFile($layoutFile, $basePath, $options);
    $renderedLayout = $layout->render($displayData);

    return $renderedLayout;
}
_

実行しようとしていることを行うには、_$layout_設定とこのメソッド内のレンダーコールの間に行($layout->addIncludePaths(YJSGPATH .'includes/html/layouts');)を挿入する必要があります。

それにはコアコードの編集が含まれるため、おそらくそれを避けたいでしょう。ただし、CMSで実行しようとしていることを実行する方法はまだありません(まだ!)。

これはCMSの非常に新しい部分であるため、将来的にはオプションになる可能性がありますが、まだありません。

5
David Fritsch

OK、JLayoutFileクラスを拡張し、レイアウトとtemplate/html/layoutの間にパスを追加するために管理したいくつかのクラスをすでに拡張しているので、回避策を見つけました

このメソッド経由 コアクラスをオーバーライドする方法?

http://prntscr.com/4ln5dt

だから配列は今読む

JLayoutFile Object
(
    [layoutId:protected] => joomla.edit.frontediting_modules
    [basePath:protected] => 
    [fullPath:protected] => 
    [includePaths:protected] => Array
        (
            [0] => D:\wamp\www\Development\Yjsgv2-DEV\3x/templates/creatus/html/layouts
            [1] => D:\wamp\www\Development\Yjsgv2-DEV\3x\plugins\system\yjsg\includes/html/layouts
            [2] => D:\wamp\www\Development\Yjsgv2-DEV\3x/layouts
        )

    [options:protected] => Joomla\Registry\Registry Object
        (
            [data:protected] => stdClass Object
                (
                    [component] => 
                    [client] => 0
                )

        )

    [debugMessages:protected] => Array
        (
        )

)

そしてチェック

  • レイアウト
  • my_plugin/layouts
  • template/html/layouts

できればいいのに

jimport('cms.layout.file');
JLayoutFile::addIncludePath(YJSGPATH .'includes/html/layouts');

addIncludePathメソッドがすでに存在するため、将来的には。

2
Dan

ちょうどこれにつまずいた。一番上の答えは正しくなく、提供されている回避策は必要ありません。彼らはずっと前に投稿されたので、情報はおそらく当時はあまり知られていないでしょう。

JLayoutがオーバーライド可能であることが主な目的であるため、1日目(Joomla 3.0.0)からそうでした。

オーバーライドするために必要なことはすべてjoomla.edit.frontediting_modulesは、元のレイアウトファイルをテンプレートの上書きフォルダーに追加することです。その例では、次のようにコピーします。

/layouts/joomla/edit/frontediting_modules.php

/templates/{your_templates}/html/layouts/joomla/edit/frontediting_modules.php

他のタイプのオーバーライドについては、通常どおり変更を加えます。

これが 対応するJoomlaドキュメントページ です(「テンプレートのオーバーライド」の段落をご覧ください。

RGDS

1
Weeblr