Я использую следующий код для генерации запроса ajax:
echo CHtml::dropDownList('teamA', '', EnumController::getTeamOption(), array( 'empty' => '(Team / Single)', 'ajax' => array( 'type'=>'POST', 'url'=> $url, 'update'=>"#resultA", //'data'=>"js:$('#teamA').hide().fadeIn()" ) ) );
В моем основном макете у меня есть следующее:
<?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 загружает копию jQuery из активов, а затем – другую копию, непосредственно из Google. Я хочу использовать только копию Google и заставить Yii не загружать собственную копию из активов. Как я могу это сделать?
В Yii вы никогда не должны жестко кодировать информацию javascript в основном макете.
Yii может определить, был ли уже включен клиентский скрипт (javascript), но для основных сценариев (например, jquery или jqueryui) вы должны изменить эти пакеты в своем файле конфигурации.
Откройте main.php
конфигурации main.php
и добавьте все пакеты js, которые вам нужны в компоненте CClientScript
(вы должны добавить его внутри components
), например:
'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 ) ), ),
от'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 ) ), ),
Затем каждый раз, когда вам нужен jquery, просто добавьте это перед кодом:
$cs = Yii::app()->getClientScript(); $cs->registerCoreScript('jquery');
Затем Yii будет включать jquery (или любой другой скрипт) только один раз, даже если вы вызываете его несколько раз в своем коде.
Следуя инструкциям от Yii Special Topics Performance , я сделал быстрый тест, и это сработало:
В верхней части основного макета:
<?php $cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>false, 'jquery.ui.js' => false, );?>
В разделе <head>
основного макета:
<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>
или
<?php echo CGoogleApi::init(); ?> <?php echo CHtml::script( CGoogleApi::load('jquery','1.7.2') . "\n" . CGoogleApi::load('jqueryui','1.8.17') ); ?>
Я бы действительно использовал помощник CGoogleApi, но jsapi, по-видимому, не может загружать версии jquery выше, чем в моем примере! Думаю, это медленное обновление со стороны Google, потому что оно тоже не работает в обычном файле.
Или, может быть, файл js все еще находится в вашем кеше?
Это будет работать
<?php $cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>false, 'jquery.ui.js' => false, ); ?>