web-dev-qa-db-fra.com

Suppression de javascript ajouté aux données de tête par -> addScriptDeclaration () dans le modèle

J'essaie de supprimer toutes les déclarations javascript dans la tête du document.

J'entends par là le javascript intégré ajouté par des extensions tierces à l'aide de -> addScriptDeclaration (), et non les fichiers javascript ajoutés à l'aide de -> addScript ().

Si je décharge

$doc = JFactory::getDocument();
var_dump($doc->_scripts);

ensuite, tous les fichiers Javascript ajoutés par les extensions Joomla core et tierce sont affichés.

Si je décharge

$doc = JFactory::getDocument();
var_dump($doc->_script['text/javascript']);

Ensuite, seul le code JavaScript principal est affiché, par exemple:

string(79) "jQuery(window).on('load',  function() {
            new JCaption('img.caption');
        });"

Tout ce qui est ajouté par des extensions tierces n'est pas inclus et est toujours envoyé à la tête.

Est-il possible d'intercepter un script tiers dans le modèle ou est-il ajouté à une date ultérieure et ne peut être effectué que par un plugin lors d'un événement donné?

5
Robert Went

Cette réponse est très longue et comporte de nombreuses méthodes, le mieux est en bas

unset($doc->_scripts[JUri::base(true)'/path/to/file.js'])

la plupart du temps, certains scripts peuvent ajouter l’URL complète et d’autres pas.

Il existe donc une meilleure façon de procéder si vous souhaitez que tout soit supprimé.

$doc->_scripts = array();
//if you need to re include libraries
JHtml::_('jquery.framework');
JHtml::_('behavior.framework');

//if the array trick does not work you could do
for($i=0;$i<count($doc->_scripts);$i++){
   //in here you could stop it from removing specific files by looking for specific file names
   $get_file = explode('/',$doc->_scripts[$i]);
   $get_file = end($get_file);

   //many more ways to do this, chains of if statements can get messy
   switch($get_file){
      case 'jquery.js':
      case 'boostrap.js';
         break;
      default:
         unset($doc->_scripts[$i]);
         break;
   }
}

MODIFIER:

Pour la déclaration de script, il combine la plupart des scripts en un plutôt que de les séparer. De plus, le modèle n'est pas le dernier endroit à exécuter avant le rendu de la page. Il est donc possible d'en ajouter davantage au tableau de scripts. Je ne suis pas à 100% à ce sujet, mais je crois que les modules sont rendus après le modèle, puis insérés. Les composants se chargent en fonction de l'élément de menu afin d'être chargés avant. Aussi les plugins peuvent ajouter plus de scripts après les mots.

Ainsi, le seul moyen de garantir que vous puissiez ajuster les scripts à vos besoins consiste à utiliser un plugin. Il existe un événement système appelé onBeforeCompileHead qui peut le faire.

http://docs.joomla.org/Plugin/Events/System#onBeforeCompileHead

Vous devez créer un plugin mais ce sont les extensions les plus faciles à créer, voici une bonne référence.

http://docs.joomla.org/J3.x:Creating_a_Plugin_for_Joomla

Dans Résumé, selon le lieu où il est ajouté, il peut ne pas être possible d'utiliser le modèle, les plugins pourraient être le seul moyen.

MISE À JOUR Comme je l'ai dit, cela ne peut pas être fait uniquement avec des modèles, mais j'ai trouvé un moyen de contourner cela avec un simple plug-in système qui peut être utilisé pour le permettre sur n'importe quel site. C’est quelque chose qui serait utile dans le noyau et je pourrais essayer de faire une demande de tirage pour l’obtenir ajoutée, bien que tout le monde soit le bienvenu. Cependant, il est peu probable qu'il soit ajouté à la prochaine version

class PlgSystemHooks extends JPlugin
{
    public function onAfterDispatch(){
        $app = JFactory::getApplication();
        $template = $app->getTemplate();

        if ($app->isSite())
        {
            if (file_exists(JPATH_THEMES.DIRECTORY_SEPARATOR.$template.DIRECTORY_SEPARATOR.'functions.php'))
            {
                $dispatcher = JDispatcher::getInstance();
                require_once JPATH_THEMES.DIRECTORY_SEPARATOR.$template.DIRECTORY_SEPARATOR.'functions.php';
            }
        }
    }
}

Ceci est en quelque sorte inspiré par wordpress mais j’ai été épaté quand, en regardant le code source, j’ai découvert qu’il était fondamentalement complètement supporté par le noyau, la dernière étape de la définition d’un fichier dans le modèle était: manqué. Une telle fonctionnalité utile!

Voici comment l'utiliser.

Créez d'abord un functions.php fichier dans votre modèle.

Ensuite, utilisez quelque chose comme ça dans ce fichier.

$dispatcher->register('onBeforeCompileHead',function(){
   //your code to remove the unneeded scripts.
});

Remarque: je l'ai fait de mémoire. Cela pourrait donc ne pas être correct à 100%. Il pourrait être judicieux d'examiner la classe JDispatcher si cela ne fonctionne pas. Cela peut être très utile dans de nombreux projets qui ont besoin de quelques fonctionnalités simples de plug-in spécifiques à ce site, mais créer un plug-in personnalisé est bien plus fastidieux qu'il ne le devrait.

5
Jordan Ramstad

L'autre façon de le faire, et la méthode que je préfère, consiste simplement à créer un remplacement pour l'extension et à commenter l'appel du script.

Je le fais tout le temps, pour presque toutes les extensions que j'utilise, en supprimant les appels script et css. Le seul truc possible est que si le développeur de l'extension n'a pas placé les appels dans le fichier d'affichage, vous ne pouvez pas créer de remplacement de modèle et vous devez pirater l'extension à la place.

3
Seth Warburton