web-dev-qa-db-ja.com

コアクラスをオーバーライドするには?

コアクラスをオーバーライドして、より多くの機能を取得したり、いくつかのコア機能を別の方法で機能させる必要がある場合があります。コアクラスをオーバーライドする方法はありますか?可能であれば、それらを上書きすることでどのような問題に直面する可能性がありますか?

20
Dmitry Rekun

はい、可能です。

システムプラグインを使用してクラスをオーバーライドできます。これをお読みください link および this および this

直面する2つの問題:

  1. クラスの一部だけでなく、クラス全体をオーバーライドする必要がある

  2. コアが更新され、クラスも更新/変更された場合は、オーバーライドを更新する必要があります(必要な場合)。

16
jackJoe

コアクラスをオーバーライドできるプラグインを少し前に作成しましたが、@ jackJoeが彼の回答で指摘した問題の犠牲になります。ただし、これにより、オーバーライドをきれいに行うことができます。

https://Gist.github.com/dongilbert/323​​7387

10
Don Gilbert
5
cha

私は非常に長い間これに携わっていましたが、ドンは私が終わったらそれについてさらに詳しく説明することを約束しました。

コンポーネントのJoomla MVCをオーバーライドし、テンプレートhtmlフォルダー内だけでなく、プラグインhtmlフォルダーでもオーバーライドを探すようにJoomlaに指示する必要がありました。

開発者が実際にJoomlaのデフォルトクラスを使用してそれをいじくるとき、私が気に入らなかったことは、何かを停止するのではなく、可能であればそのクラスを拡張することです。

私のプロセスは以下の通りです。

  1. オーバーライドする必要があるクラスを取得する
  2. それを読んで、クラス名を置き換え、一時クラスフォルダに新しいファイルを作成してください
  3. クラスの私のバージョンをロードする
  4. Joomlaクラスをロードする
  5. 関数loadTemplateを拡張する拡張メソッドを登録して、joomlaテンプレートおよび最後のjoomlaコンポーネントよりもプラグインでオーバーライドを探します

これはむしろ画像です http://prntscr.com/3d9syq

以下のスニペットの最初の部分は、ユーザーがどこにいるかをチェックしています。Joomlaを更新しようとしている場合は、更新が完了したときに作成された一時クラスファイルを削除して、JackJoe番号を処理します。 2。

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
4
Dan