cssの動的生成 for Cakephp

大規模サイトの開発にもCakephp

Cakephpでは、サイトの多言語化や多部門化にも一つのcakephpシステムで対応できる仕組みを用意している。一つのcakephpとは、たとえば日本語版サイトを英語化しようとした時に新規にcakephpをダウンロードしてコードをコピーして翻訳するのではなく、既存の日本語サイトを動的に英語化する仕組みを持つという意味です。

多部門化とは、一般商品を扱うサイトを運営していて新規に成人向け商品を扱うサイトを展開することを指すが、これは私の中の表現である。

成人向けの商品を扱うサイトと一般部門のサイトでサイトカラーを変えたい場合はどうしたらよいか?もしくは、日本語と英語サイト間でcssを変えたい場合はどのように行えばよいか。すでに述べたようにサイトを丸ごとコピーしてcssだけ新規に作成する方法は以下の理由でNGと考えている。

・規模が小さい間は問題ないが、規模が大きくなると手に負えなくなる

サイトは成長していくものなので、運用の負担は徐々に増してくる。常に動的に生成したり処理される仕組みづくりが必要になる。

cssは編集用原本を作成しサイト毎に動的に生成

cssも動的に生成し、サイト間の色分けを開発者が意識せずにすむ仕組みを導入するのは有効な手段。では、具体的にどのような方法で対応すればよいのか?

最初にcssの共通原本となるファイルを読み込んでおく

if( !($fp_read = fopen(APP."controllers".DS."components".DS."cake-generic-css.txt", "r" )) ) {

}

上の例は配置するパスが相応しくないかもしれないがシステムが読める位置に共通原本を置いておけばよい。なお、記述ファイルはcakephpのbootstrap.phpである。cssで色分け処理を行う部分は以下のようにしてはどうか。

if( strpos(DOMAIN, "adult-") !== false )
{
	$first_color = "#DC6D8D";
	$second_color = "#ff0066";
	$third_color = "#C01742";
}
		
else
{
	$first_color = "#003d4c";
	$second_color = "#e32";
	$third_color = "#993";
}

上のようにカラーコードをサイトのURLに応じて異なるコードを変数に格納しておく。カラーコードを格納したらそのコードで置き換える処理を行う。

while( !feof($fp_read) ) {
	$ld = fgets($fp_read, 4096);

	if( strpos($ld, "{first_color}") !== false )
	{
		$ld = str_replace("{first_color}", $first_color, $ld);
	}
	if( strpos($ld, "{second_color}") !== false )
	{
		$ld = str_replace("{second_color}", $second_color, $ld);
	}
	if( strpos($ld, "{third_color}") !== false )
	{
		$ld = str_replace("{third_color}", $third_color, $ld);
	}
		
	$load = $load.$ld;
}
		
fclose($fp_read);

cssの共通原本を確認しておこうと思う。

body {
	background: {first_color};
	color: #fff;
	font-family:'lucida grande',verdana,helvetica,arial,sans-serif;
}

共通原本は上のように用意しておき、{first_color}の部分をphpで置き換え処理を行っている。置き換え処理をしたら適切なパスに実際のcssを生成する処理を行えばよい。

$body = $load;

if( strpos(DOMAIN, "adult-") !== false )
{
	$target = WWW_ROOT."css".DS."cake.generic.pink.css";
}
		
else
{
	$target = WWW_ROOT."css".DS."cake.generic.css";
}

if (!($fp = @fopen($target,"w"))) {

}

if (!@flock($fp, LOCK_EX)) {

}

fputs($fp, $body);
		
if (!@flock($fp, LOCK_UN)) {

}
fclose($fp);
unset($load);
unset($body);

上のようなコードで静的な実cssファイルをアクセスの度に生成することができる。

※ 実際にはWWW_ROOTの定数をサイト間で書き換えているが、その部分については省略した。

実際には上の一連のコードを開発環境でのみ有効にしておき、適切にcssが適用されることを確認したのち、実cssのみを本番環境にコピーして配置するという運用を行っている。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

cssの動的生成 for Cakephpの記事にコメントを投稿