2012-09-16 24 views
9

estoy usando el siguiente código para generar una petición AJAX:Cómo deshabilitar la carga automática de jQuery en la solicitud de Ajax en Yii?

echo CHtml::dropDownList('teamA', '', EnumController::getTeamOption(), array(
     'empty' => '(Team/Single)', 
     'ajax' => array(
      'type'=>'POST', 
      'url'=> $url, 
      'update'=>"#resultA", 
      //'data'=>"js:$('#teamA').hide().fadeIn()" 
     ) 
    ) 
); 

En mi diseño principal, Tengo el siguiente:

<?php Yii::app()->clientScript->scriptMap=array('jquery.js'=>false);?> 
<?php Yii::app()->clientScript->scriptMap=array('jquery.min.js'=>false);?> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script> 

Yii está cargando jQuery copia de los activos y luego - - otra copia, directamente de Google. Solo quiero usar la copia de Google y forzar a Yii a que no cargue copia propia de los activos. ¿Cómo puedo hacer esto?

Respuesta

17

En Yii nunca debe codificar ninguna información de javascript en el diseño principal.

Yii puede determinar si ya se había incluido un script de cliente (JavaScript), pero para las secuencias de comandos básicos (como jQuery o jqueryui) tiene que modificar esos paquetes en el archivo de configuración.

Abrir el archivo de configuración main.php y añadir todos los paquetes de js que necesita dentro del componente CClientScript (se debe añadir que en el interior components), así:

'clientScript'=>array(
    'packages'=>array(
    'jquery'=>array(
     'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jquery/1.8/', 
     'js'=>array('jquery.min.js'), 
     'coreScriptPosition'=>CClientScript::POS_HEAD 
    ), 
    'jquery.ui'=>array(
     'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jqueryui/1.8/', 
     'js'=>array('jquery-ui.min.js'), 
     'depends'=>array('jquery'), 
     'coreScriptPosition'=>CClientScript::POS_BEGIN 
    ) 
), 
), 

Entonces, cada vez que necesita jQuery sólo tiene que añadir este antes de su código:

$cs = Yii::app()->getClientScript(); 
$cs->registerCoreScript('jquery'); 

Yii incluirá entonces jQuery (o cualquier otro script) sólo una vez, incluso si usted lo llama varias veces en el código.

+0

¡guau! gracias un millón ... y aquí pensé que ya sabía algo sobre Yii :) –

+0

Para otros archivos JS (no aquellos definidos como 'core scripts' en la configuración) puede usar isScriptFileRegistered() Ver: http: // www .yiiframework.com/doc/api/1.1/CClientScript # isScriptFileRegistered-detail – taseenb

+1

Si usa registerScript (File) con POS_READY, no tiene que registrar jquery manualmente, se registra automáticamente. Sin embargo, debe registrar jquery-ui manualmente. – Narretz

6

Siguiendo las instrucciones de Yii Special Topics Performance, hice una prueba rápida, y esto funcionó:

En la parte superior de la disposición principal:

<?php 
$cs=Yii::app()->clientScript; 
$cs->scriptMap=array(
    'jquery.js'=>false, 
    'jquery.ui.js' => false, 
);?> 

En la sección <head> del trazado principal:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script> 

o

<?php echo CGoogleApi::init(); ?> 

<?php echo CHtml::script(
    CGoogleApi::load('jquery','1.7.2') . "\n" . 
    CGoogleApi::load('jqueryui','1.8.17') 
); ?> 

De hecho, utilizaría el helper de CGoogleApi, ¡pero aparentemente el jsapi no puede cargar versiones de jquery más altas que las de mi ejemplo! Supongo que es una actualización lenta por parte de Google, porque tampoco funciona en un archivo simple.

¿O tal vez el archivo js todavía estaba en su caché?

+0

gracias! no es exactamente lo que estaba buscando pero es bueno saber sobre CGoogleApi, ¿dónde lo viste en la documentación? –

+0

Tengo el enlace incluido en mi respuesta, simplemente desplácese un poco hacia abajo. Son documentos oficiales, así que creo que hay más formas de hacerlo, aunque la respuesta de e.a. es más clara, porque funciona con la función de registro. – Narretz

+0

'CGoogleApi :: load ('jquery', '1.7.2'). "\ n" .' no existe. ¿cómo cargarías el último jquery? – shorif2000

2

Esto funcionará

<?php  
     $cs=Yii::app()->clientScript; 
     $cs->scriptMap=array(
     'jquery.js'=>false, 
     'jquery.ui.js' => false, 
); ?> 
Cuestiones relacionadas