Подключение css в контролере

Каким образом лучше подключать css, если каждый контролер использует свои дополнительные стили?

Думаю лучше будет так:

В каждом из контроллеров прописать:


function beforeAction() {

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

 $cs->registerCssFile('');

}

http://www.yiiframework.com/doc/api/CController#beforeAction-detail

http://www.yiiframework.com/doc/api/CClientScript#registerCssFile-detail

  1. Либо расширить Controller что будет более универсально.

class Controller extends CController

{

   public $cssFile;


   public function beforeAction()

   {

     if($this->cssFile)

        Yii::app()->getClientScript()->registerCssFile($this->cssFile);

   }

}

ну соот-но в любом контроллере выставляем


class AController extends Controller {

 public $cssFile = 'style_a.css';



У меня по умолчанию в layouts подключены стили main.css и forms.css. А gis.css, я подключаю в Yii, почему - то вставляется выше в HTML коде, чем main.css и forms.css.

Каким образом переопределить место, в HTML, куда вставляется ссылка на css?

А вообще логичнее подключать css в шаблонах, т.к. это относится к отображению.

Представим ситуацию, когда шаблоны лабает верстальщик и ему надо добавить файл со стилями. Нафига ему лезть для этого в контроллеры, когда он может его прописать в самом шаблоне? Ну собственно тоже и с JavaScript-ами.

CClientScript подключает css внутри head прямо перед title

пиши title в самом низу head

Основные стили внутри шаблона подключай через clientScript, они установятся после тех, что были в контроллере добавлены.

В главном шаблоне:




Yii::app()->getClientScript()->registerCssFile('main.css');

Yii::app()->getClientScript()->registerCssFile('forms.css');



А в контроллере как написал someone.

А если нужно для IE?

Ручками писать свой метод :) Но у меня обычно для ИЕ глобальные стили, которые подключаются в layout’е.

Если подключаешь стили в контроллере, лучше делать это в beforeRender(), а не в beforeAction(). Экшн ведь может и не рендерить ничего, зачем тогда стиль подключать? Плюс, желательно проверять, какой mime-тип рендерится - если это XML или JSON, например, то подключенные стили вообще разметку отображения порушат. Проверять можно, скажем, на уровне layout’ов:




components/

    Controller.php

controllers/

    FoobarController.php

views/

    layouts/

        /html

            base.php

            column1.php

            column2.php

        /xml

            base.php

        /json

            base.php

    foobar/

        foo.php

        bar.php



Базовый контроллер:




class Controller extends CController {


    public $layout = '//layouts/html/base'; // HTML представление - дефолтное.

    public $cssFile = null;                 // Для базового контроллера - NULL, для потомков - определяем в реализациях.


    protected function beforeRender($view) {

        // Подключаем стиль, если выводится HTML и если этот ваш стиль вообще задан.

        if (!is_null($this->cssFile) && strstr($this->layout, '/html/')) {

            Yii::app()->getClientScript()->registerCssFile('/path/to/static/css/'.$this->cssFile);

        }

        return parent::beforeRender($view);

    }

}



Потомок:




class FoobarController extends Controller {


    public $cssFile = 'foobar.css';


    public function actionDoSomeHTML() {

        . . .

        $this->render('foo', array(

            // Параметры

        ));

    }


    public function actionDoSomeXML() {

        . . .

        $this->layout = '//layouts/xml/base'; // Теперь стиль не подключится, потому что layout уже не торт.

        $this->render('bar', array(

            // Параметры

        ));

    }

}