8
votes

Vérifiez si JQuery est inclus dans l'en-tête (Joomla)

Y a-t-il un moyen de vérifier si JQuery est chargé à l'aide de PHP?

J'ai deux plug-ins différents dans Joomla qui chargent le JQUERY JS, mais lorsqu'il est inclus plus d'une fois qu'il ne fonctionne pas correctement.

Pour expliquer le processus un peu plus: Joomla offre une capacité à intercepter la source HTML avant qu'elle ne soit rendue, essentiellement travaillant sur le code source lui-même.

Ceci utilise la fonction: xxx

$ Row est le contenu HTML de la page qui peut être analysé.

Je pensais que peut-être qu'un preg_match pourrait fonctionner mais n'a pas beaucoup d'expérience avec elle.


1 commentaires

Vous voudrez peut-être reformuler cette question comme «Vérifiez si JQuery est inclus dans l'en-tête avec Joomla».


6 Réponses :


1
votes

devrait d'abord faire le chèque en JavaScript. Par exemple: xxx

alors, vous pouvez envoyer un message par AJAX au serveur.


0 commentaires

0
votes

Sauf si Joomla fournit un moyen de vous dire quels scripts y compris? (Zend Framework a une telle liste)


0 commentaires

1
votes

Ce n'est pas possible. PHP est le côté serveur, tandis que JavaScript (la langue jQuery est écrit) est le côté du client. Code PHP doit être exécuté avant le prochain texte qui inclut JavaScript même être envoyé à l'utilisateur et tenté d'être chargé.

Votre meilleur pari est de ne pas inclure JQuery plus d'une fois. Vous pouvez le faire en remplaçant tout votre inclus avec quelque chose comme: xxx

Ceci est un peu piraté, et il pourrait y avoir une meilleure façon.

Edit: Après un peu de pensée: cela ne peut même pas fonctionner à cause de l'asynchronicité de chargement de la bibliothèque JQuery du serveur. Il semble que la meilleure façon de le faire serait avec un gestionnaire d'événements au script include, mais le DOM ne prend pas en charge cela.

EDIT 2: D'accord, Maintenant, je pense que votre meilleur pari serait de simplement l'inclure une fois dans la page en utilisant une seule étiquette de script par page. Vous pouvez le faire en l'ajoutant à un en-tête global de quelque sorte, puis de le retirer partout ailleurs. Ensuite, peu importe quoi, ne pas l'inclure à nouveau. Cela pourrait signifier que vous le charriez sur certaines pages qui n'en ont pas besoin, mais en raison du cache sur les navigateurs modernes, cela ne devrait pas être un problème.


0 commentaires

3
votes

Je suppose que vous utilisez joomla1.0?

Contenu des tampons Joomla utilisant le tampon de sortie PHP. IE: ob_start (). p>

Vous pouvez obtenir le contenu à l'aide de: ob_get_contents (); p>

Ainsi, vous pouvez avoir une expression régulière qui vérifie la jQuery. Quelque chose comme: p> xxx pré>

devrait être assez bon. (Je n'ai pas testé cela). P>

Utiliser ob_get_contents () peut ne pas fonctionner dans des situations car le tampon de sortie PHP peut être imbriqué. Vous pouvez commencer autant de tampons dans des tampons. P>

pour Joomla1.5, vous pouvez obtenir le tampon via l'API qui vous assure que vous obtenez toujours une sortie Joomla. p> xxx pré>

si joomla1.0 ou 1.5 Vous devez noter que Joomla peut ajouter au tampon à tout moment avant de rendre la sortie (appels OB_FLUSH () ou équivalent). Ainsi, votre chèque pour JQuery doit prendre en compte que JQuery peut être chargée après le chèque. P>

Notez que la mémoire tampon Joomla est créée non seulement pour HTML, mais peut être CSS, JavaScript, XML, JSON, etc., de sorte que vous souhaitiez vérifier le code HTML avant de faire vos tests JQuery. Vous pouvez également tester le panneau d'administration. P>

<?php
/**
 * MooTools1.2 w/ 1.1 compat for AjaxChat
 * @copyright www.fijiwebdesign.com
 * @author gabe@fijiwebdesign.com
 * @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 gabe@fijiwebdesign.com
 */
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 commentaires

1
votes

Vous pouvez essayer d'utiliser l'objet jdocument code> pour obtenir les en-têtes, rechercher JQuery, puis réinitialiser si nécessaire. Le getheaddata () code> et SetHeadData () code> Les méthodes devraient vous aider à partir de là. Vous pouvez obtenir l'objet actuel jdocument code> avec ce code:

$document =& JFactory::getDocument();


1 commentaires

Je ne suis pas sûr, depuis que je suis novice dans le développement de Joomla, mais j'ai essayé d'imprimer_r the Getheaddata () et j'ai trouvé que vous ne présentez que les scripts ajoutés par les plugins mais pas par les modules. Je pense que puisqu'ils sont chargés après, ils impriment simplement leurs étiquettes de script directement sur la joomla contournant HTML. Dis-moi si je me trompe.



15
votes

Mieux encore, vous pouvez le vérifier avec JavaScript, puis l'ajouter à la tête s'il manque.

   if (typeof jQuery == 'undefined') { 
   var head = document.getElementsByTagName("head")[0];
   script = document.createElement('script');
   script.id = 'jQuery';
   script.type = 'text/javascript';
   script.src = 'js/jquery.js';
   head.appendChild(script); 
}


2 commentaires

Mais cela ne résoudra pas le problème si d'autres modules écrits médiocres chargent jQuery.


Cela ne répond pas à la question.