Каким образом лучше подключать 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
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(
// Параметры
));
}
}