web-dev-qa-db-ja.com

jsスクリプトをオーバーライドすることは可能ですか?

Virtuemartのカートモジュールを変更するためにレイアウトオーバーライドを使用していますが、ajaxリクエストは更新時にコードの一部を削除します。このため、テンプレートだけでなく、モジュールが呼び出すJavaScriptルーチンも変更したいと思います。

モジュール自体を変更することで必要な動作をすばやく取得できましたが、コード(jsファイル内にあり、default.phpの一部ではありません)を複製してオーバーライド内に配置できるかどうか疑問に思っていました。 Virtuemartを更新するたびに修正する必要はありません。

出来ますか?何か案は?

1
mattosmat

はいといいえ...

「いいえ」から始めましょう-Joomlaコア開発者はスクリプトを挿入する方法を作成しましたが、スクリプトを削除する(API)方法はありません。

そして、「はい」ですが、複雑です。

削除に影響を与えるには、Joomlaシステムプラグインを作成する必要があります。

OnBeforeCompileHeadよりも早く実行すると、別のスクリプトで再度挿入される可能性があります。

この例では、スクリプトを削除するだけです。私は別の場所に新しいスクリプトを挿入しているためです。これを変更して、削除と交換を同時に行うこともできますが、それはあなたが決めることです。

これは私が書いたBS3テンプレートに対して私が行った方法です。私は本当にBS 2.3 javascriptを捨て、それをBS3 javascriptに置き換える必要がありました。この例は1つしか示していませんが、プラグインは複数のJavaScriptの削除に対応するように作成されています。

class PlgSystemRWBS3 extends JPlugin {

function onBeforeCompileHead() {
    $doc = JFactory::getDocument();
    $cfg = JFactory::getConfig();
    $min = $cfg->get('debug', 0, 'INTEGER') ? '' : '.min';
    $remove = array(
        '/media/jui/js/bootstrap'.$min.'.js'
    );
    $this->_removeScript($doc, $remove);
}

private function _removeScript($o, $remove) {
    $removed = false;
    foreach($remove as $r) {
        $found = preg_grep('/'.preg_quote($r,'/').'$/', array_keys($o->_scripts));
            if(count($found) > 0) {
                unset($o->_scripts[array_shift($found)]);
            }
    }
}
}
1
Michael