it-swarm.com.de

Deaktivieren von Javascript, das den Kopfdaten von -> addScriptDeclaration () in der Vorlage hinzugefügt wurde

Ich versuche, alle Javascript-Deklarationen im Dokumentenkopf zu deaktivieren.

Damit meine ich Inline-Javascript, das durch Erweiterungen von Drittanbietern mit -> addScriptDeclaration () hinzugefügt wird, und nicht Javascript-Dateien, die mit -> addScript () hinzugefügt werden.

Wenn ich wegwerfe

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

dann werden alle Javascript-Dateien angezeigt, die vom Joomla-Core und den Erweiterungen von Drittanbietern hinzugefügt wurden.

Wenn ich wegwerfe

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

Dann wird nur das Haupt-Javascript angezeigt, zB:

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

Alles, was durch Erweiterungen von Drittanbietern hinzugefügt wurde, ist nicht enthalten und wird weiterhin auf dem Kopf ausgegeben.

Ist es möglich, Skripte von Drittanbietern in der Vorlage abzufangen oder werden sie zu einem späteren Zeitpunkt hinzugefügt und können nur von einem Plug-in zu einem bestimmten Zeitpunkt ausgeführt werden?

5
Robert Went

Diese Antwort ist sehr lang und hat viele Methoden, am besten am Ende

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

dies ist hauptsächlich die Vorgehensweise. Einige Skripte fügen möglicherweise die vollständige URL hinzu, andere nicht.

Hier ist ein besserer Weg, dies zu tun, wenn Sie möchten, dass alles entfernt wird.

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

BEARBEITEN:

Bei der Skriptdeklaration werden die meisten Skripts zu einem zusammengefasst und nicht getrennt. Außerdem ist die Vorlage nicht der letzte Ausführungsort, bevor die Seite gerendert wird, sodass dem Skriptarray noch weitere hinzugefügt werden können. Ich bin nicht zu 100% davon überzeugt, dass Module nach der Vorlage gerendert und dann eingefügt werden. Die Komponenten werden basierend auf dem Menüelement geladen, sodass sie zuvor geladen werden. Plugins können auch weitere Skripte nach dem Suchbegriff hinzufügen.

Die einzige Möglichkeit, um sicherzustellen, dass Sie die Skripte vollständig an Ihre Bedürfnisse anpassen können, ist ein Plugin. Es gibt ein Systemereignis namens onBeforeCompileHead, das das kann.

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

Sie müssten ein Plugin erstellen, aber diese Erweiterungen sind am einfachsten zu erstellen. Hier finden Sie eine gute Referenz.

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

Je nachdem, wo es hinzugefügt wurde, ist es in der Vorlage möglicherweise nicht möglich, Plugins zu verwenden.

UPDATE Wie gesagt, es kann nicht nur mit Vorlagen gemacht werden, aber ich habe einen Weg gefunden, das mit einem einfachen System-Plugin zu umgehen, das verwendet werden kann, um es auf jeder Site zuzulassen. Dies ist etwas, das im Kern nützlich wäre, und ich könnte versuchen, eine Pull-Anfrage zu machen, um es hinzuzufügen, obwohl jeder willkommen ist. Es ist jedoch unwahrscheinlich, dass "nächste Veröffentlichung" hinzugefügt wird.

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

Dies ist ein bisschen inspiriert von wordpress), aber ich war überwältigt, als ich beim Betrachten des Quellcodes herausfand, dass es im Kern im Grunde vollständig unterstützt wurde, nur der letzte Schritt zum Definieren einer Datei in der Vorlage war verpasst. So eine nützliche Funktionalität!

Hier ist, wie man es benutzt.

Zuerst erstelle ein functions.php Datei in Ihrer Vorlage.

Verwenden Sie als nächstes so etwas in dieser Datei.

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

Hinweis: Ich habe dies aus dem Speicher gemacht, daher ist es möglicherweise nicht 100% korrekt. Wenn dies nicht funktioniert, ist ein Blick in die JDispatcher-Klasse möglicherweise eine gute Idee. Dies kann in vielen Projekten sehr nützlich sein Das erfordert einige einfache Plug-in-Funktionen speziell für diese Site, aber ein benutzerdefiniertes Plug-in zu erstellen ist weitaus arbeitsintensiver als es sein muss.

5
Jordan Ramstad

Die andere Möglichkeit und die von mir bevorzugte Methode besteht darin, einfach eine Außerkraftsetzung für die Erweiterung zu erstellen und den Aufruf für das Skript dort auskommentieren.

Ich mache das die ganze Zeit für fast jede Erweiterung, die ich benutze und entferne sowohl Skript- als auch CSS-Aufrufe. Das einzig mögliche Problem ist, dass Sie, wenn der Erweiterungsentwickler die Aufrufe nicht in die Ansichtsdatei gestellt hat, keine Vorlagenüberschreibung erstellen können und stattdessen die Erweiterung hacken müssen.

3
Seth Warburton