it-swarm.com.de

Ist es möglich, js-Skripte zu überschreiben?

Ich verwende eine Layoutüberschreibung, um das Warenkorbmodul für Virtuemart zu ändern, aber die Ajax-Anforderung löscht einen Teil meines Codes, wenn er aktualisiert wird. Aus diesem Grund möchte ich nicht nur die Vorlage ändern, sondern auch die JavaScript-Routine, die das Modul aufruft.

Ich konnte das gewünschte Verhalten schnell erreichen, indem ich das Modul selbst änderte. Ich fragte mich jedoch, ob ich den Code (der sich in einer js-Datei befindet und nicht Teil der Datei default.php ist) klonen und in die Überschreibung einfügen könnte dass ich es nicht jedes Mal reparieren muss, wenn ich Virtuemart aktualisiere.

Ist es möglich? Irgendwelche Ideen?

1
mattosmat

Ja und nein...

Beginnen wir mit dem "Nein" - Die Joomla-Core-Entwickler haben eine Möglichkeit geschaffen, Skripte einzufügen, aber keine (API-) Möglichkeit, sie zu entfernen.

Und "Ja", aber es ist kompliziert ...

Sie müssen ein Joomla-System-Plugin erstellen, um das Entfernen zu beeinflussen.

Wenn Sie dies früher als onBeforeCompileHead tun, wird es möglicherweise von einem anderen Skript erneut injiziert.

In diesem Beispiel wird nur ein Skript entfernt, da ich ein neues an einer anderen Stelle einfüge. Sie können dies ändern, um es gleichzeitig zu entfernen und zu ersetzen - aber es liegt an Ihnen, zu entscheiden.

So habe ich es für ein BS3-Template gemacht, das ich geschrieben habe. Ich musste wirklich das Javascript BS 2.3 loswerden und es durch Javascript BS3 ersetzen. Das Plugin wurde geschrieben, um das Entfernen mehrerer Javascripts zu ermöglichen, obwohl in diesem Beispiel nur eines gezeigt wird.

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