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


20

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


1
質問をより具体的にしたり、明確な問題を説明したりできるように改善できれば素晴らしいと思います。
バレンティンデスパ14

Joomla 3ユーザーの場合-これらを確認してください。それはあなたを助けます。joomla.stackexchange.com/questions/5449/…プラグイン-github.com/ghazal/plg_mvcoverrideありがとうjoomla.stackexchange.com/users/270/ghazal
cha

回答:


16

はい、可能です。

システムプラグインを使用してクラスをオーバーライドできます。このリンクこれこれを読んでください

あなたが直面する2つの問題:

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

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


4
提供されたリンクから適切な手順を貼り付けるか、リンクが移動または変更する場合に備えて、少なくともリンクの説明を入力できると便利です。
コーディングハンド14

10

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

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


7
このソリューションは美しく機能し、ドンはオープンソースの真の同胞精神であると言いたいだけです-彼と彼の仕事に敬意を表します!!!
GDP 14年

単純なスクリプトには、コンポーネントをプリロードしないという大きな問題があります。そのため、コンポーネントをオーバーライドすると、ほとんどのコンポーネント(com_contentコンポーネントなど)で実際には機能しません。うまく機能しますが、コンポーネントをプリロードしてオーバーライドできるようにする必要があります(まだ宣言されていないものはオーバーライドできません)。ああ、コンストラクタですべてを行うのではなく、onAfterRouteを使用する必要があります。このコメントの意味を知りたい場合は、オーバーライドしてくださいcomponents/com_content/models/articles.php
itoctopus


4

私はこれに非常に長い間付き合っていたので、ドンに私が終わったらそれについてさらに詳細を与えると約束した。

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

開発者が実際にJoomlaのデフォルトクラスを取得し、それを台無しにしたとき、私は決して好きではなかったので、何かを制動する代わりに、できればそのクラスを拡張します。

私のプロセスは次のことを行います。

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

こちらが画像です 。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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.