基于PHP会话动态加载CSS,更好的方法?

时间:2016-01-18 15:05:37

标签: php html css

我想根据用户的登录状态生成CSS文件。我对PHP会话没有任何问题,我只是很难动态生成CSS而且我不喜欢我的解决方案,即使它有效。

(我希望根据用户的登录状态向用户提供完全不同的CSS文件。)

而不只是指向正确的CSS文件,在文件夹中有各种CSS文件,只需更改指针,例如:

<link rel='stylesheet' type='text/css' href='<?php echo $correctStylePath; ?>'>

我认为实际上允许根据其登录状态访问文件非常简洁。 (我想阻止访问他们无法看到的CSS文件。)

这意味着根本不允许错误的CSS进入公共视图。

我无法找到根据会话呈现不同文件的方法,所以我做了这个看起来相当粗糙的黑客。

我只是将所有CSS加载到HTML文档的头部,而不是提供不同的CSS文件或具有不同内容的相同CSS。

有没有更好的方法可以让我将CSS保存在自己的文件中?

的index.php

<?php
    // Now we can check for user
    if(isset($_SESSION['LoggedIn']) && isset($_SESSION['Username'])){
        $includeMode = "LoggedIn";
?>
<html>
<head>
    <title>Home (Logged In)</title>
<?php
    require_once 'styles.css.php';
?>
</head>
<body>
....
</body>
</html>
<?php
    }else{
        $includeMode = "LoggedOut";
    }
?>
<html>
<head>
    <title>Home (Logged Out)</title>
<?php
    require_once 'styles.css.php';
?>
</head>
<body>
....
</body>
</html>

styles.css.php

<?php

$fileLocation = '';

if($includeMode == 'LoggedIn'){

    $fileLocation = '../css/styles-logged-in.css';

}else if($includeMode == 'LoggedOut'){

    $fileLocation = '../css/styles-logged-out.css';

}else{

    die();
}

$stylesFile = fopen($fileLocation, 'r') or die("Unable to open file!");

print "<style>";
print fread($stylesFile, filesize($fileLocation));
print "</style>";

fclose($stylesFile);

?>

2 个答案:

答案 0 :(得分:1)

您可以创建名为style.php的PHP页面,将标题设置为CSS,然后根据$_SESSION变量输出,然后更改.htaccess文件。

例如,在主页的<head>

<link rel='stylesheet' type='text/css' href='style.css'>

style.php

session_start();
header("Content-type: text/css");

if(isset($_SESSION['LoggedIn']) && isset($_SESSION['Username'])){ ?>

    /* Put your CSS for logged-in users here */

<?php } else { ?>

    /* Other CSS here */

<?php } ?>

然后,在根目录中的 .htaccess 中:

RewriteEngine on
RewriteBase /
RewriteRule ^style\.css$ style.php [L]

这意味着如果您访问/style.css,您会看到/style.php的输出,这将是相关的样式表。

有一点需要注意的是,浏览器缓存会出现问题,因为它会缓存一个样式表或其他,因此除非浏览器缓存关闭,否则样式将不一致(但这会减慢你的速度)位点)。

答案 1 :(得分:1)

PHP是一种动态语言,因此请将其作为一种语言使用。你不必为每个if else语句创建html标签。根据您的条件语句,使PHP填补空白。 CSS文件不是由必需的函数调用,而是使用HTML **<link>**标记包含,并在该标记中调用php所需的CSS文件。

 <?php
    // Now we can check for user
    if(isset($_SESSION['LoggedIn']) && isset($_SESSION['Username'])){
        $includeMode = "LoggedIn";
        $cssFileName = 'LoggedIn.css';
    }else{
        $includeMode = "LoggedOut";
        $cssFileName = 'LoggedOut.css';
    }


<html>
<head>
    <title>Home (<?php echo $includeMode; ?>)</title>
    <link rel="stylesheet" type="text/css" href="style/main.css">
    // below link tag will overrule the above one if same element style has been defined in both files
    <link rel="stylesheet" type="text/css" href="style/<?php echo $cssFileName; ?>">
</head>
<body>
....
</body>
</html>