@flammerman
Web Developer / И фронт и сервер

Как можно отключать пакеты скриптов ClientScript в Yii?

В конфиге main.php:
'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END,
            'packages'=>array(
                'jquery'=>array(
                    'baseUrl'=>'/themes/classic/js/',
                    'js'=>array('jquery.min.js'),        
                ),
                'bootstrap'=>array(
                    'baseUrl' => '/themes/classic/plugins/bootstrap/',
                    'js'=>array('js/bootstrap.min.js'),
                    'css' => array('css/reset.css','css/bootstrap.css'),
                    'depends'=>array('jquery'),    
                ), 
                'theme'=>array(
                    'baseUrl' => '/themes/classic/',
                    'js'=>array('js/site.js'),
                    'css' => array('css/style.css'),
                    'depends'=>array('jquery','bootstrap'),
                ),


В самом часто-употребляемом контроллере:
public function beforeAction($action) {
        if(parent::beforeAction($action) ) {
            Yii::app()->clientScript->registerPackage('theme');
            return true;     
        }
        return false;       
    }


public function actionQuickview() {
        $this->layout = 'blank';
        $id = Yii::app()->request->getParam('id',0);
        //$this->disableScript(array('quickview')); // В идеале как-то тут отключить подключение THEME package
        $product = Goods::model()->findByPk($id);
        
        if($product) {   
            $this->render('_goods_quickview',array('product'=>$product));    
        } else { 
            throw new CHttpException(404,'Страница ошибки 404'); 
        }          
        Yii::app()->end();        
    }


Подключать основные скрипты сайта в контроллере очень удобно, не надо в каждом layout писать наборы пакетов, которые используются на всем сайте.
1. Можно ли в определенном Action отключить какие-либо пакеты на выбор, указанные в beforeAction ?
2. Если нельзя выполнить 1 пункт, можно ли ограничить использование пакетов в Action того же контроллера, отвечающим за Ajax загрузку данных. Очень не удобно, когда после аджакс загрузки данных подгружаются все пакеты указанные в beforeAction повторно.
  • Вопрос задан
  • 619 просмотров
Пригласить эксперта
Ответы на вопрос 2
vyachin
@vyachin
Ищу работу
Так как вы сделали - делать нельзя. Все пакеты должны подключаться явно!!!! в шапке шаблона и обязательно только те, которые необходимы этому шаблону. Если у вас есть пакет(ы) которые используются в нескольких шаблонах - сделайте для них свой layout, отнаследуйтесь от основного и подключите общие пакеты уже в нем.
Если вы возвращаете результат ajax запроса - используйте renderPartial, последний параметр вам поможет отключить передачу css + js
Ответ написан
Комментировать
@flammerman Автор вопроса
Web Developer / И фронт и сервер
В layout я вообще не подключал никаких дополнительных js/css скриптов/стилей - все скрипты в предыдущем варианте приложения (до использования beforeAction) включал в соответствующий view. В layout подключаю только статику, то что никогда не изменится в процессе работы. Например меню сайта, поисковую строку, подвал сайта и подобное, надеюсь я это делаю правильно?

В теории хотел использовать такую структуру: пакет скриптов "theme" используется на всем сайте кроме ajax подгрузок, пакет "cart" также необходим на всем сайте, работа с корзиной. Остальное подключать по мере необходимости. Но конечно возникают проблемы видимости, например "cart" необходим на списке товаров, и в то же время внутри подгружаемого через ajax контента модального окна, причем, на тойже самой странице. Считай, на элементе списка товаров есть кнопка "в корзину" и в модальном окне есть такаяже по функционалу кнопка. И обе они передают в контроллер данные о продукте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы