【问题标题】:Loading css value from database从数据库加载css值
【发布时间】:2015-07-16 12:01:31
【问题描述】:

目前我正在使用 Yii 框架开发网站 CMS,用户可以在其中编辑网站中使用的主要背景颜色。当我加载页面时,我需要从数据库中查询 CSS 值(背景颜色),将结果放到 Cookies 中,然后在我的 CSS 文件中使用这些值。

为了在 CSS 文件中使用 PHP 变量和 Cookie,我将 CSS 文件从 main.css 重命名为 main.php 并在顶部添加:header("Content-type: text/css; charset: UTF-8");

问题是,当我第一次打开页面时,我从数据库中获取的颜色没有加载。我使用检查元素并检查了 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; ?>;
}

【问题讨论】:

  • 任何相关代码表示赞赏
  • 这只是一个想法,我还没有尝试过,但你为什么不从 main.php 文件中删除你的标题并通过 STYLE 标签定义样式。我想我在某处看到过类似的解决方案。您遇到的问题可能是浏览器缓存。

标签: php html css cookies yii


【解决方案1】:

根据你所说的,有两个概率

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;
}

只要确保find 上没有发生任何不好的事情(比如加载 css)。在覆盖的情况下。

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 是动态加载的。然而,这种方式就像内联 &lt;style&gt;s 一样。您的代码更有条理,也更耗时。

【讨论】:

  • 我使用了 beforeRender() 并且成功了!谢谢大家的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多