2009-08-26 18 views
7

¿Hay alguna manera de verificar si jQuery se carga utilizando PHP?Compruebe si jQuery está incluido en el encabezado (Joomla)

Tengo dos complementos diferentes en Joomla que cargan el jQuery JS, pero cuando se incluye más de una vez, no funciona correctamente.

Para explicar el proceso un poco más: Joomla ofrece la capacidad de interceptar la fuente HTML antes de que se represente, esencialmente trabajando en el código fuente en sí.

Se trata de utilizar la función:

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

$ fila es el contenido HTML de la página que se puede analizar.

Estaba pensando que tal vez un preg_match podría funcionar pero no tiene mucha experiencia con él.

+3

Es posible que desee reformular esta pregunta como "Compruebe si jQuery está incluido en el encabezado con Joomla". – deceze

Respuesta

14

Mejor aún, puede verificarlo con JavaScript y luego agregarlo a la cabeza si falta.

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); 
} 
+3

Pero esto no resolverá el problema si otros módulos escritos pobres cargan jQuery. – Bakaburg

+0

Esto no responde la pregunta. – Cheeso

1

Primero debe hacer el control en javascript. por ejemplo:

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

Luego, podría enviar un mensaje por ajax al servidor.

0

¿A menos que Joomla proporcione una forma de decirle qué scripts incluye? (Zend Framework tiene dicha lista)

1

Eso no es posible. PHP es del lado del servidor, mientras que Javascript (el idioma en el que está escrito JQuery) es del lado del cliente. El código PHP tiene que ejecutarse inherentemente antes de que el texto que incluye el Javascript se envíe incluso al usuario e intente cargarlo.

Su mejor opción es no incluir jQuery más de una vez. Usted puede hacer esto mediante la sustitución de la totalidad de su incluye con algo como:

<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> 

cierto que esto es un poco de un truco, y puede haber una mejor manera.

EDITAR: Después de pensarlo un poco: esto puede que ni siquiera funcione debido a la asincronía de cargar la biblioteca jQuery desde el servidor. Parece que la mejor manera de hacerlo sería con un controlador de eventos onload adjunto al script, pero el DOM no es compatible.

EDIT 2: Bien, ahora creo que su mejor opción sería simplemente incluirla una vez en la página usando solo una etiqueta de script por página. Puede hacer esto agregándolo a un encabezado global de algún tipo y luego eliminarlo en cualquier otro lugar. Entonces, no importa qué, no lo incluyas nuevamente. Esto puede significar que lo cargue en algunas páginas que no lo necesitan, pero debido a la caché en los navegadores modernos no debería ser un problema.

3

Supongo que está utilizando Joomla1.0?

Joomla almacena contenido mediante el búfer de salida de PHP. es decir: ob_start().

Puede obtener los contenidos usando: ob_get_contents();

Por lo tanto, puede tener una expresión regular que busque JQuery. Algo como:

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

debería ser lo suficientemente bueno. (No lo he probado).

El uso de ob_get_contents() puede no funcionar en situaciones ya que el búfer de salida de PHP se puede anidar. Puede iniciar tantos búferes dentro de búferes.

Para Joomla1.5, puede obtener el búfer a través de la API, lo que garantiza que siempre obtenga la salida de Joomla.

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

Si Joomla1.0 o 1,5 que tienen que señalar que Joomla puede agregar a la memoria intermedia en cualquier momento antes de que se hace que la salida (llamadas ob_flush() o equivalente). Por lo tanto, su verificación de JQuery debe tener en cuenta que JQuery se puede cargar después de la verificación.

Tenga en cuenta que el búfer de Joomla se crea no solo para HTML, sino también para CSS, JavaScript, XML, JSON, etc. Por lo tanto, es posible que desee comprobar el código HTML antes de realizar las pruebas de JQuery. También puede probar para el panel de administración.

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

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

Como referencia aquí es un plugin de sistema de ejemplo que en parte hace las cosas que quiere. Es un complemento de compatibilidad para 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

Esta es la única buena respuesta del grupo. – Cheeso

1

Es posible que desee probar a usar el objeto JDocument para obtener los encabezados, buscar jQuery, restablezca si es necesario. Los métodos getHeadData() y setHeadData() deberían ayudarlo desde allí. Usted puede obtener la corriente JDocument objeto con este código:

$document =& JFactory::getDocument(); 

También puede ser que desee ver en esta respuesta a una pregunta similar: Joomla, jQuery modules conflicting

En ese, en realidad estás excluyendo la redundancia jQuery cargas.

+0

No estoy seguro, dado que soy un principiante en el desarrollo de Joomla, pero traté de imprimir_el getHeadData() y encontré que solo están presentes los scripts agregados por los complementos pero no por los módulos. Creo que como están cargados después, simplemente imprimen sus etiquetas de script directamente en html sin pasar por joomla. Dime si estoy equivocado. – Bakaburg

Cuestiones relacionadas