it-swarm.dev

JavaScript disabilitante aggiunto ai dati principali da -> addScriptDeclaration () nel modello

Sto cercando di annullare tutte le dichiarazioni javascript nell'intestazione del documento.

Con questo intendo javascript incorporato che viene aggiunto da estensioni di terze parti usando -> addScriptDeclaration (), e non file javascript che vengono aggiunti usando -> addScript ().

Se scarico

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

quindi vengono visualizzati tutti i file Javascript aggiunti dal core di Joomla e dalle estensioni di terze parti.

Se scarico

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

Quindi viene mostrato solo il javascript principale, ad esempio:

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

Tutto ciò che viene aggiunto da estensioni di terze parti non è incluso e viene comunque emesso alla testa.

È possibile intercettare script di terze parti nel modello o viene aggiunto in un secondo momento e può essere eseguito solo da un plugin in un determinato evento?

5
Robert Went

Questa risposta è molto lunga e ha molti metodi, il migliore è in fondo

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

è principalmente come farlo, alcuni script potrebbero aggiungere l'URL completo e altri no.

Quindi, ecco un modo migliore per farlo se vuoi che tutto sia rimosso.

$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;
   }
}

MODIFICARE:

Per la dichiarazione degli script combina la maggior parte degli script in uno piuttosto che separarli, inoltre il modello non è l'ultimo posto da eseguire prima del rendering della pagina, quindi è possibile aggiungerne altri all'array di script. Non sono al 100% su questo, ma credo che i moduli siano renderizzati dopo il modello e quindi inseriti, i componenti si caricano in base alla voce di menu in modo che vengano caricati prima. Inoltre, i plug-in possono aggiungere ulteriori parole d'ordine agli script.

Quindi l'unico modo per garantire che tu possa adattare completamente gli script alle tue esigenze sarebbe attraverso un plugin. C'è un evento di sistema chiamato onBeforeCompileHead che può farlo.

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

Dovresti creare un plugin ma sono le estensioni più facili da realizzare, ecco un buon riferimento.

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

Nel Riepilogo, a seconda di dove viene aggiunto, potrebbe non essere possibile nel modello, i plugin potrebbero essere l'unico modo.

AGGIORNAMENTO Come ho detto, non può essere fatto solo con modelli, ma ho trovato un modo per aggirare il problema con un semplice plug-in di sistema che può essere utilizzato per consentirlo su qualsiasi sito. Questo è qualcosa che sarebbe utile nel nucleo e potrei provare a fare una richiesta pull per ottenerla aggiunta, sebbene chiunque sia il benvenuto. Tuttavia è improbabile che venga aggiunto "prossima versione"

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';
            }
        }
    }
}

Questo è un po 'ispirato a wordpress ma sono stato spazzato via quando, guardando il codice sorgente ho scoperto che era sostanzialmente completamente supportato nel core, solo il passaggio finale della definizione di un file nel modello era una funzionalità così utile!

Ecco come usarlo.

Innanzitutto crea un functions.php nel tuo modello.

Quindi usa qualcosa del genere in quel file.

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

Nota: l'ho fatto dalla memoria, quindi potrebbe non essere corretto al 100%, esaminare la classe JDispatcher potrebbe essere una buona idea se non funziona. Questo può essere molto utile in molti progetti che richiedono alcune semplici funzionalità di plug-in specifiche per quel sito, ma creare un plug-in personalizzato è molto più lavoro di quanto non debba essere.

5
Jordan Ramstad

L'altro modo per farlo, e il metodo che preferisco, è semplicemente creare una sostituzione per l'estensione e commentare la chiamata per lo script lì.

Lo faccio sempre, per quasi tutti gli interni che utilizzo, rimuovendo sia le chiamate script che css. L'unico possibile gotcha è che se lo sviluppatore dell'estensione non ha inserito le chiamate nel file di visualizzazione, non è possibile creare un override del modello e si dovrebbe invece hackerare l'estensione.

3
Seth Warburton