Reputation: 13511
I create a custom application, and I like to pass some PHP variables into CSS.
The approach I use, is a style.php file that serving CSS headers, so the HTTP request it addresses the request as a normal CSS file.
The problem with this approach is that on every request, I have to load some large PHP files in memory.
What I like to do is to check the expiration date of the file and if the file is no yet expired then do not run the script, and instead to send a cached file.
So, is there any solution for that problem ?
My php file I like to looks like something like that:
<?php
// Enter here several headers to cache the file and other operations
// Check here if the file must be re-executed or load a cached version instead
// Enter here the inclution of my application scripts with include_once(....)
?>
body
{
background-color: <?php echo $options->css['bg_color']; ?>
}
Kind regards Merianos Nikos
Upvotes: 1
Views: 300
Reputation: 76880
I had to do something similar to what you are doing and solved the problem parsing the CSS files server side. Here is a link to a simple class that does just that (it's what i use right now). Basically it parses all the files in a directory and uses strtr() to replace values in the css file
class Css {
//this is an associative array that's used when replacing
private $settings;
//This is the path (relative to this file) to the dir that holds the css files to parse
private $cssDir = "css/";
//private varray to store the files
private $cssFiles = array();
//This is the path (relative to this file) to the dir where the parsed css files wil be written
private $outCssDir = "../css/";
/**
* the class thake only one parameters, an associative array of keys to replace with their respective values
*/
function __construct($settings) {
$this -> settings = $settings;
$this -> readFiles();
$this -> replaceValuesInCssStrings();
}
private function readFiles() {
$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $this -> cssDir;
if (file_exists($dir)) {
if ($handle = opendir($dir)) {
/* This is the correct way to loop over the directory. */
while (false !== ($entry = readdir($handle))) {
//filter out .. and .
if ($entry !== "." && $entry !== "..") {
$cssFiles[$entry] = file_get_contents($dir . $entry);
}
}
closedir($handle);
}
}
$this -> cssFiles = $cssFiles;
}
private function replaceValuesInCssStrings() {
foreach ($this->cssFiles as $fileName => $fileContent) {
$this->cssFiles[$fileName] = strtr($fileContent, $this-> settings);
}
}
/**
* renders the parsed css files in a <style> tag
*/
public function render() {
$css = "<style>\n";
foreach ($this -> cssFiles as $fileContent) {
$css .= $fileContent;
}
$css .= "</style>";
echo($css);
}
/**
* writes the parsed css files to the $outCssDir (keeping their names intact)
*/
public function renderToFile() {
$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $this -> outCssDir;
if (file_exists($dir)) {
foreach($this->cssFiles as $fileName => $fileContent){
file_put_contents($dir . $fileName, $fileContent);
}
}
}
/**
* this is just in case you want to call echo ($css)
*/
public function __toString() {
$this -> render();
}
}
Upvotes: 1