2009-08-26 8 views
7

Gibt es eine Möglichkeit zu überprüfen, ob jQuery mit PHP geladen wird?Überprüfen, ob jQuery in Header (Joomla) enthalten ist

Ich habe zwei verschiedene Plugins in Joomla, die die jQuery JS laden, aber wenn es mehr als einmal enthalten ist, funktioniert es nicht richtig.

Um den Prozess ein wenig mehr zu erklären: Joomla bietet eine Möglichkeit, die HTML-Quelle abzufangen, bevor es gerendert wird, im Wesentlichen arbeiten an den Quellcode selbst.

Dies wird mit der Funktion:

onPrepareContent(&$row, &$params, $limitstart) 

$ row ist der HTML-Inhalt der Seite, die analysiert werden kann.

Ich dachte, dass vielleicht ein preg_match funktionieren könnte, aber nicht viel Erfahrung damit hat.

+3

Sie können diese Frage als "Überprüfen Sie, ob jQuery im Header mit Joomla enthalten ist" neu formulieren. – deceze

Antwort

14

Besser noch, Sie können es mit JavaScript überprüfen und es dann zum Kopf hinzufügen, wenn es fehlt.

+3

Aber das wird das Problem nicht lösen, wenn andere schlecht geschriebene Module jQuery laden. – Bakaburg

+0

Dies beantwortet die Frage nicht. – Cheeso

1

Sollte zuerst die Überprüfung in Javascript. zum Beispiel:

window.onload = function() 
{ 
    if (typeof(window.jQuery)=="undefined") 
     alert('jQuery no load'); 
    else 
     alert('jQuery Ok'); 
} 

dann könnten Sie eine Nachricht von Ajax an den Server senden.

0

Es sei denn, Joomla bietet eine Möglichkeit, Ihnen zu sagen, welche Skripte es enthält? (Zend Framework hat eine solche Liste)

1

Das ist nicht möglich. PHP ist serverseitig, während Javascript (die Sprache, in der JQuery geschrieben wird) clientseitig ist. PHP-Code muss inhärent ausgeführt werden, bevor der Text, der das Javascript enthält, sogar an den Benutzer gesendet und versucht wird, geladen zu werden.

Ihre beste Wette ist, jQuery nicht mehr als einmal einzuschließen. Sie können dies tun, indem Sie alle Ihre schließt mit so etwas wie zu ersetzen:

<script type='text/javascript'> 
    if($) { } // test to see if the jQuery function is defined 
    else document.write("<script type='text/javascript' src='jquery.js'></script>"); 
</script> 

Zwar ist dies ein bisschen wie ein Hack, und es könnte einen besseren Weg geben.

EDIT: Nach ein wenig Überlegung: Dies funktioniert möglicherweise nicht einmal wegen der Asynchronität des Ladens der jQuery-Bibliothek vom Server. Es scheint, als wäre der beste Weg, dies zu tun, mit einem Event-Handler onload an das Skript-Include angefügt, aber das DOM unterstützt das nicht.

EDIT 2: Okay, jetzt denke ich, dass Ihre beste Wette wäre, es einfach einmal in die Seite mit nur einem Skript-Tag pro Seite aufzunehmen. Sie könnten dies tun, indem Sie es zu einem globalen Header irgendeiner Art hinzufügen und dann überallhin entfernen. Dann, egal was, nicht wieder einbeziehen. Dies kann bedeuten, dass Sie es auf einigen Seiten laden, die es nicht brauchen, aber aufgrund des Cache in modernen Browsern sollte es kein Problem sein.

3

Ich nehme an, Sie verwenden Joomla1.0?

Joomla puffert Inhalt mit dem PHP-Ausgabepuffer. zB: ob_start().

Sie können den Inhalt abrufen: ob_get_contents();

Sie können also einen regulären Ausdruck haben, der nach JQuery sucht. Etwas wie:

$jquery_loaded = preg_match("/<script.*?src=[\"']jquery[^\"']\"/i", ob_get_contents()); 

sollte gut genug sein. (Ich habe das nicht getestet).

Die Verwendung von ob_get_contents() funktioniert möglicherweise nicht in Situationen, da der PHP-Ausgabepuffer geschachtelt werden kann. Sie können so viele Puffer innerhalb von Puffern starten.

Für Joomla1.5 können Sie den Puffer über die API erhalten, die sicherstellt, dass Sie immer Joomla-Ausgabe erhalten.

$Document =& JFactory::getDocument(); 
$buffer = $Document->getBuffer(); 

Ob Joomla1.0 oder 1,5 Sie müssen beachten, dass Joomla an einer beliebigen Stelle auf den Puffer hinzufügen können, bevor sie den Ausgang macht (ruft ob_flush() oder gleichwertig). Daher muss bei der Prüfung auf JQuery berücksichtigt werden, dass JQuery nach der Prüfung geladen werden kann.

Beachten Sie, dass der Joomla-Puffer nicht nur für HTML, sondern auch für CSS, JavaScript, XML, JSON usw. erstellt werden kann. Sie sollten also vor der JQuery-Prüfung nach HTML suchen. Sie können auch für das Admin-Panel testen.

$mainframe =& JFactory::getApplication(); 
$doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin() || $doctype != 'html') { 
      return false; 
     } 

Denn hier Bezug ist ein Beispiel System-Plugin, das teilweise die Dinge tut, die Sie wollen. Es ist ein Kompatibilitäts-Plugin für MooTools1.2.

<?php 
/** 
* MooTools1.2 w/ 1.1 compat for AjaxChat 
* @copyright www.fijiwebdesign.com 
* @author [email protected] 
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL 
*/ 

// included only 
defined('_JEXEC') or die('Direct Access to this location is not allowed!'); 

jimport('joomla.plugin.plugin'); 

/** 
* Joomla PHP Speedy Integration 
* 
* @author [email protected] 
*/ 
class plgSystemAjaxchat extends JPlugin 
{ 
    /** 
    * Constructor 
    * 
    * For php4 compatability we must not use the __constructor as a constructor for plugins 
    * because func_get_args (void) returns a copy of all passed arguments NOT references. 
    * This causes problems with cross-referencing necessary for the observer design pattern. 
    * 
    * @access protected 
    * @param object $subject The object to observe 
    * @param array $config An array that holds the plugin configuration 
    * @since 1.0 
    */ 
    function plgSystemAjaxchat(& $subject, $config) 
    { 
     parent::__construct($subject, $config); 

     $mainframe =& JFactory::getApplication(); 
     $document =& JFactory::getDocument(); 
     $doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin()) { 
      return false; 
     } 

     // add mootools 1.2 
     if ($doctype == 'html') { 
      $document->addScript('components/com_ajaxchat/js/mootools-1.2-core.js'); 
      $document->addScript('components/com_ajaxchat/js/mootools-1.2-more.js'); 
      $document->addScript('components/com_ajaxchat/js/mootools-1.2-core-compat.js'); 
      $document->addScript('components/com_ajaxchat/js/mootools-1.2-more-compat.js'); 
     } 

    } 

    /** 
    * After Templte output is in buffer 
    */ 
    function onAfterRender() { 

     $mainframe =& JFactory::getApplication(); 
     $document =& JFactory::getDocument(); 
     $doctype = $document->getType(); 

     // deactivate for backend 
     if ($mainframe->isAdmin()) { 
      return false; 
     } 

     // Only render for HTML output 
     if ($doctype !== 'html') { 
      return; 
     } 

     // get the output buffer 
     $body = JResponse::getBody(); 

     // remove mootools if not needed 
     if (stristr($body, 'mootools.js') || stristr($body, 'mootools-uncompressed.js')) { 
      $body = preg_replace("/<script.*?mootools(-uncompressed)?\.js.*?<\/script>/i", '', $body); 
     } else { 
      $body = preg_replace("/<script.*?mootools-1\.2\-.*?\.js.*?<\/script>[\s\t\r\n]*/i", "\n", $body); 
     } 

     JResponse::setBody($body); 
    } 

} 

?> 
+0

Dies ist die einzige gute Antwort des Bündels. – Cheeso

1

Vielleicht möchten Sie für jQuery mit dem JDocument Objekt, um zu versuchen, um die Header zu erhalten, suchen, dann zurückgesetzt, falls erforderlich. Die getHeadData() und setHeadData() Methoden sollten Ihnen von dort helfen. Sie können das aktuelle JDocument Objekt mit diesem Code erhalten:

$document =& JFactory::getDocument(); 

Sie auch bei dieser Antwort auf eine ähnliche Frage suchen möge: Joomla, jQuery modules conflicting

In dieser eine, bist du eigentlich die redundante jQuery Strippen Ladungen.

+0

Ich bin nicht sicher, da ich ein Anfänger in Joomla Entwicklung bin, aber ich habe versucht, die getHeadData() print_r und ich fand, dass nur die Skripte von den Plugins hinzugefügt werden, aber nicht von den Modulen. Ich denke, da sie nachher geladen sind, drucken sie ihre Skript-Tags direkt auf dem HTML-Code, der Joomla umgeht. Sag mir, wenn ich falsch liege. – Bakaburg