web-dev-qa-db-fra.com

Est-il possible de remplacer les scripts js?

J'utilise un remplacement de présentation pour modifier le module de panier pour Virtuemart, mais la demande ajax supprime une partie de mon code lors de la mise à jour. Pour cette raison, je voudrais changer non seulement le modèle, mais également la routine javascript que le module appelle.

Je pouvais avoir le comportement que je voulais rapidement en modifiant le module lui-même, mais je me demandais si je pouvais cloner le code (qui se trouve dans un fichier js, il ne fait pas partie de default.php) et le placer dans le remplacement, que je n'ai pas à le réparer à chaque fois que je mets à jour Virtuemart.

C'est possible? Des idées?

1
mattosmat

Oui et non...

Commençons par le "non" - Les développeurs Joomla ont créé un moyen d’injecter des scripts, mais aucun moyen (API) de les supprimer.

Et "oui", mais c'est compliqué ...

Vous devrez créer un plugin système Joomla pour affecter la suppression.

Si vous le faites plus tôt que onBeforeCompileHead, vous pourriez vous retrouver avec un autre script qui l'injectera à nouveau.

Cet exemple supprime simplement un script - car j'en injecte un nouveau ailleurs. Vous pouvez modifier cela pour supprimer et remplacer en même temps - mais c'est à vous de décider.

Voici comment je l'ai fait pour un modèle BS3 que j'ai écrit. J'avais vraiment besoin d'abandonner javascript BS 2.3 et de le remplacer par javascript BS3. Le plugin a été écrit pour permettre la suppression de plusieurs javascripts, bien que cet exemple n'en montre qu'un.

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