JQuery Başlık (Joomla) dahil olup olmadığını kontrol edin

6 Cevap php

JQuery PHP kullanarak yüklenir olmadığını denetlemek için bir yolu var mı?

Ben jQuery JS yüklemek Joomla iki farklı eklentileri var, ama o dahil edildiğinde birden fazla düzgün çalışmıyor.

To explain the process a bit more: Joomla offers an ability to intercept the HTML source before it is rendered, essentially working on the source code itself.

Bu fonksiyon kullanıyor:

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

$ Satır çözümlenebilir sayfanın HTML içeriği.

Ben belki preg_match işe yarayabilir diye düşünüyordum ama onunla çok fazla deneyimim yok.

6 Cevap

Daha da iyisi, JavaScript ile bunu doğrulamak ve eksik eğer kafasına ekleyin.

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

Ben Joomla1.0 kullanarak varsayarak yaşıyorum?

Joomla PHP çıktı tamponunu kullanarak içerik tamponlar. yani: ob_start ().

) Ob_get_contents (;: Kullandığınız içeriğini alabilirsiniz

Böylece JQuery için denetler normal bir ifade olabilir. Gibi bir şey:

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

yeterince iyi olmalıdır. (Ben test değil).

PHP çıktı tamponu iç içe olabilir beri ob_get_contents Kullanma () durumlarda çalışmayabilir. Sen tamponlar içinde birçok tamponlar başlayabilirsiniz.

Joomla1.5 için, size her zaman Joomla çıktı alıyoruz sağlayan API aracılığıyla tampon alabilirsiniz.

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

İster Joomla1.0 veya 1.5 bunu (eşdeğer ob_flush () çağırır veya) çıktı işler önce Joomla herhangi bir noktada tampon ekleyebilirsiniz dikkat etmelisiniz. Böylece JQuery için onay JQuery kontrolünden sonra yüklenebilecek dikkate almak zorundadır.

Joomla tampon HTML için değil, sadece oluşturulan unutmayın, ancak CSS olabilir, JavaScript, XML, JSON vb sizin JQuery testleri yapmadan önce HTML için kontrol etmek isteyebilirsiniz yüzden. Ayrıca admin panelinde için test edebilirsiniz.

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

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


Burada referans için kısmen istediğiniz şeyler yapar bir örnek sistem eklentisi. Bu MooTools1.2 için bir uyumluluk eklenti.

<?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);
    }

}

?>

İlk javascript kontrol yapmak gerekir. örneğin:

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

sonra, sunucuya ajax tarafından bir mesaj gönderebilirsiniz.

Bu mümkün değil. Javascript (dil JQuery yazılmıştır) istemci tarafında ise PHP, sunucu tarafı. PHP kodu doğal Javascript bile kullanıcıya gönderilen ve yüklenecek teşebbüs içeren metne önce çalıştırmak zorundadır.

Yapabileceğiniz en iyi şey bir kereden fazla jQuery dahil etmektir. Eğer senin gibi bir şey ile dahil tüm değiştirerek bunu yapabilirsiniz:

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

Kuşkusuz bu bir hack biraz, ve daha iyi bir yolu olabilir.

DÜZENLEME: düşünce biraz sonra: Bu bile çünkü sunucudan jQuery kitaplığı yükleme asynchronicity nedeniyle çalışmayabilir. Bunu yapmanın en iyi yolu, komut dosyasına dahil bağlı bir onload olay işleyicisi ile olacak gibi görünüyor, ama DOM bu desteklemiyor.

EDIT 2: Tamam, şimdi ben senin en iyi bahis sadece sayfa başına sadece tek bir komut dosyası etiketini kullanarak bir kez sayfası dahil olacağını düşünüyorum. Bazı tür bir genel başlık ekleyerek ve daha sonra başka bir yerde onu kaldırarak bu yapamadı. Sonra, ne olursa olsun, tekrar dahil değildir. Bu İhtiyacınız olmayan bazı sayfalarda yük anlamına gelebilir, fakat modern tarayıcılarda önbelleğine bir sorun olmamalı.

Gerektiği gibi sıfırlamak sonra, başlıkları almak için JDocument nesnesini kullanmayı deneyin jQuery aramak isteyebilirsiniz. getHeadData() ve setHeadData() yöntemler oradan size yardımcı olacaktır. Bu kod ile geçerli JDocument nesneyi alabilirsiniz:

$document =& JFactory::getDocument();

http://stackoverflow.com/questions/1329981/joomla-jquery-modules-conflicting/1333301#1333301: Siz de benzer bir soruya bu yanıtı bakmak isteyebilirsiniz

O biri, aslında gereksiz jQuery yükleri dışarı sıyırma ediyoruz.

Joomla seni o dahil olduğu komut anlatan bir yol sağlar sürece? (Zend Framework böyle bir liste var)