Tags

Recent Entries

Recent Comments

Recent Trackback

Feeds

More Links


タグ:「php」の記事一覧

PHPのURLマッピング

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]

.htaccess


Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

index.php


base = parse_url($_SERVER['SCRIPT_NAME']);
$uri = parse_url($_SERVER['REQUEST_URI']);
$base = split('/', $base['path']);
$uri = split('/', $uri['path']);
$params = array_values(array_diff_assoc($uri, $base));


これでおk?
Posted by: simpraight at 2007/04/04 22:22:18 | Tags: [php] [tips] | Comments:106 | Trackbacks:0

ローカルホストのCookie

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
localhostでcookie使おうとしたときに正常に保存されない。

cookieのdomainの値に通常は許可するアクセス元ドメインを設定するワケですが、localhostの場合素直にdomain=localhostにしちゃうとダメらしい。しりませんでした。

PHPのsetcookieの場合、
setcookie(
'cookiename',
'cookievalue',
strtotime("+1 hour"),
'/',
'localhost'
);

とかしちゃうとだめで、
setcookie(
'cookiename',
'cookievalue',
strtotime("+1 hour"),
'/',
false
);

と書けばおk。
Posted by: simpraight at 2007/02/21 20:54:24 | Tags: [php] | Comments:2,535 | Trackbacks:1

複数のJavascriptファイルを圧縮して出力するSmartyプラグイン

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
つくりました。

とりあえずプラグインのソース。
<?php
/*
* Smaryプラグイン # JavaScriptファイルを圧縮してファイルを生成しファイルを出力
*
* @params array $params パラメータ
* @params object $smarty 親Smartyオブジェクト
* @return string scriptタグ
*/
function smarty_function_build_javascript($params, &$smarty)
{
if(!is_array(($smarty->_file_js))) return "<!-- No input files. -->";
$output = '';
foreach($smarty->_file_js as $js){ $output .= "\n".file_get_contents($js); }
$outfile = "script/build/".md5($output).".js";
if($params['output']=='file' && is_file($outfile))
return "<script type='text/javascript' src='{$outfile}'></script>";
// compress
$p = array(
"/[\r\n]+/", "/^[\s\t]*\/\/.+$/m", "/\/\*.+?\*\//s",
"/([\{\(\[,;=\?:\-\+\/\*])\n+/", "/[\s\t]*([\{\(\[,;=\+\*-<>\|\&\?\:!])[\s\t]*/", "/\n\}/","/(\})\n(return)/",
"/^[\s\t]+/m", "/[\s\t]+$/m", "/[\s\t]{2,}/",
);
$r = array (
"\n", "", "",
"$1", "$1", "}","$1$2",
"", "", "",
);
do{$output=preg_replace($p,$r,$output);}while($output!=preg_replace($p,$r,$output));
if($params['output']=='file') {
$fp = @fopen($outfile, "w+");
if(!$fp || !fwrite($fp, $output)) return "<!-- Error -->";
fclose($fp);
return "<script type='text/javascript' src='{$outfile}'></script>";
} else{
return "<script type='text/javascript'>".$output."</script>";
}
}

使い方は以下のような感じでSmartyのクラスを作成した上で、
<?php
class extSmarty extends Smarty{
var $_file_js;
function extSmarty (){
$this->_file_js = array();
// 以下は環境設定。説明は省略
$this->template_dir = SMARTY_TEMPLATE_DIR;
$this->config_dir = SMARTY_CONFIG_DIR;
$this->compile_dir = SMARTY_COMPILE_DIR;
$this->cache_dir = SMARTY_CACHE_DIR;
$this->left_delimiter = SMARTY_LEFT_DELIM;
$this->right_delimiter = SMARTY_RIGHT_DELIM;
// プラグインを登録
$this->register_function('build_javascript' ,'smarty_function_build_javascript');
}
/**
* Javascriptファイルを追加
*
* @param string $script SCRIPTファイル名
*/
function addJs($js){
if(is_array($js)) foreach($js as $v) $this->addJs($v);
if(is_file($js)) $this->_file_js[] = $js;
}
}

メインプログラムからは以下のように記述し、
<?php
$tpl = new extSmarty();
$tpl->addJs('script/prototype.js');
$tpl->addJs('script/moo.fx.js');

$tpl->display('example.tpl');

テンプレートファイルに以下のように書けばおk。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-script-type" content="text/javascript; charset=UTF-8" />
<meta http-equiv="content-style-type" content="text/css; charset=UTF-8" />
<base href="http://.../" />・・・①
<title>example</title>
<{build_javascript output=file}>・・・②
</head>
<body>
...
</body>
</html>

①・・・「<base href="~">」を設定しておいた方が階層深くなっても対応できて無難です。
②・・・Smartyのデリミタは基本的に「<{~}>」に設定して使っています。「output=file」をのけるとファイルを生成せずに<script>~</script>に出力します。


とりあえず取得した内容のmd5を取り、変更がある場合だけファイルを再生成するようにしています。
この方法だと、「script/build」内に古いファイルがどんどん溜まっていくわけですが・・・なんとかなりませんかね。
Posted by: simpraight at 2006/12/04 12:36:13 | Tags: [php] [javascript] [tips] | Comments:17 | Trackbacks:0

PHPでJavascriptを圧縮する

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
簡単な関数でJavascriptの圧縮をします。
ネットワーク負荷の気になる環境下では基本的にmod_deflate使ってる場合が多いのでgzip圧縮は既に導入済み。であれば、あとは正規表現使って不要な改行や空白などを除去し少しでも元のスクリプトファイルを軽量化するくらいのものです。

軽量化したものは同時に難読化されてしまうので開発環境下では元のファイルを使用して、本番環境では圧縮したファイルを使えるようにSmartyプラグインを作成しておくと結構嬉しいです。(あとで作る)

サンプル→PHPでJavascriptを圧縮する

function jsCompresser($js){
$p = array(
"/[\r\n]+/",
"/^[\s\t]*\/\/.+$/m",
"/\/\*.+?\*\//s",
"/([\{\(\[,;=])\n+/",
"/[\s\t]*([\{\(\[,;=\+\*-<>\|\&\?\:!])[\s\t]*/",
"/\n\}/",
"/^[\s\t]+/m",
"/[\s\t]+$/m",
"/[\s\t]{2,}/",
);
$r = array (
"\n",
"",
"",
"$1",
"$1",
"}",
"",
"",
"",
);
do{$js=preg_replace($p,$r,$js);}while($js!=preg_replace($p,$r,$js));
return $js;
}
Posted by: simpraight at 2006/12/02 17:16:36 | Tags: [php] [javascript] [tips] | Comments:1,162 | Trackbacks:1

配列から値のない要素を取り除く

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
・値のない要素を除いた配列を作りたい。
・連想配列の場合はキーは維持し、普通の配列の場合は詰める。

function array_tidy ($array, $unique=false)
{
if(!is_array($array)) return $array;
$assoc = (array_keys($array)!==range(0, count($array)-1)) ? true : false;
$array = ($unique) ? array_unique($array) : $array;
$array = array_diff($array, array('',null)) ;
return ($assoc) ? $array : array_values($array);
}


という感じ。以下テスト
array1 = array('blue', '', 'red', null, 'green', 0);
$array2 = array(
'red' => 'apple' ,
'none' => '' ,
'yellow' => 'banana' ,
'green' => null
);

print_r(array_tidy($array1));
print_r(array_tidy($array2));

出力結果:
Array ( [0] => blue [1] => red [2] => green [3] => 0 )
Array ( [red] => apple [yellow] => banana )
Posted by: simpraight at 2006/11/08 18:14:51 | Tags: [php] | Comments:1 | Trackbacks:0