Dreamweaver のテンプレートによるパスの書き換え対策 Smarty Plugin
今の職場でプログラム組み始めてから、長らく私を悩ませていた問題が、Dreamweaverのテンプレートによるパスの書き換えでした。
Smartyを使用する場合、tplファイルを格納するためのフォルダを作る必要があります。そのフォルダにあるファイルを、デザイナーさんがDreamweaverで直接編集してしまうと、テンプレートに記述されているCSSなどのパスを、編集したファイルを起点とした相対パスに書き換えてしまいます。そうなると実際アクセスするphpファイルに記述してあるパスと食い違いが発生し、CSSなどのリンク切れが起ってしまうのです。
これは絶対多くの人が悩んでいると思うのですが、ネットで調べても全然解決策が見つからない。
それともこんなことで悩んでるのは私だけ・・・。
しかし8ヶ月も悩み続けたこの問題も、やっと解決策を思いつきました。
$_SERVER["REQUEST_URI"]から階層の深さを判断し、Smartyのprefilter pluginを用いて、tpl内に記述されているパスの書き換えるという力技。
これがコードです。
function smarty_prefilter_url($_src, &$smarty)
{
$base_url = '/app/';//http://www.example.com/appがサイトトップの場合
$escape_base_url = '/^' . str_replace('/', '\/', $base_url) . '/';
$site_path = preg_replace($escape_base_url, "",$_SERVER["REQUEST_URI"]);
$slash_count = substr_count($site_path, '/');
$src = preg_replace('/<link href="(..\/)+/', '<link href="' . str_repeat('../', $slash_count),$_src);
$src = preg_replace('/src="(..\/)+/', 'src="' . str_repeat('../', $slash_count),$src);
return $src;
}
css、img、javascriptを格納するフォルダが、サイトのトップに有るとの前提で作っております。
ひよっこプログラマーが作った物なので穴が有るかもしれないですが、使ってやって下さい!私が喜びます!(このコードは問題有りで修正しました、使ってもらっても私は喜びません!!)それから、おかしなところに気付いた時はコメントしていただきたい!私が喜びます!
8ヶ月も悩んだ割にはこんな短いコードで解決なんですよね・・・。とにかく心のモヤモヤが一つ無くなりました。