目前我正在使用Yii Framework处理网站CMS,用户可以在其中编辑网站中使用的主要背景颜色。当我加载页面时,我需要从数据库中查询CSS值(背景颜色),将结果放到Cookies中,然后在我的CSS文件中使用这些值。
要在CSS文件中使用PHP变量和Cookie,我将CSS文件从main.css
重命名为main.php
,并在顶部添加:header("Content-type: text/css; charset: UTF-8");
。
问题是,当我第一次打开页面时,我没有加载从数据库中获取的颜色。我使用inspect元素并检查CSS文件,并且不存在背景颜色定义。它只在我刷新页面一次后出现。
请告诉我,我做错了什么?任何帮助表示赞赏。相关代码如下。
protected/components/Controller.php
中的查询和Cookie插入:
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action))
{
$prog = Programs::model()->find(array(
'condition'=>'id_program = :program',
'params'=>array(
':program'=>Yii::app()->params->programCode,
),
));
Yii::app()->request->cookies['color1'] = new CHttpCookie('color1', $prog->main_color1);
}
}
CSS文件:
<?php
header("Content-type: text/css; charset: UTF-8");
$color1 = $_COOKIE['color1'];
?>
#header
{
background-color: <?php echo $color1; ?>;
}
答案 0 :(得分:2)
根据你所说的,有两个概率
<强> 1。您的cookie值是在请求main.php之后设置的
您应该在设置cookie后加载css文件main.php
。
为此,您可以使用Controller::beforeRender
。在protected/components/Controller.php
中,您可以拥有此
public function beforeRender($action)
{
$color = Yii::app()->request->cookies['color1'];
$prog = Programs::model()->find(array(
'condition'=>'id_program = :program',
'params'=>array(
':program'=>Yii::app()->params->programCode,
),
));
Yii::app()->request->cookies['color1'] = new CHttpCookie('color1', $prog->main_color1);
return true;
}
确保没有任何不好(如加载CSS)发生在find
。如果是覆盖。
<强> 2。您的css已缓存
为了让您的css动态加载到您加载main.php
的位置(可能是您的布局),您应该添加如下内容:
<link rel="stylesheet" type="text/css"
href="<?php echo Yii::app()->request->baseUrl; ?>/css/main.php?q=<?php echo microtime(1);?>">
通过这种方式,您可以确保动态加载css。但是这种方式就像内联<style>
一样。您的代码更有条理,更耗时。