Laravel(Laravelに限ったことではなくフレームワーク)とckeditor+kcfinderのURLとディレクトリの設定が
URLに依存しまくりで非常に汎用性に乏しい。。。
つまり、そのまま使おうとすると
URLとディレクトリをベタ書きし
開発環境、本番環境、あるいは別のサイトを構築するたびに
環境ごとにURLとディレクトリの文字列を変更しなくてはならない。
絶対忘れるし、ソース管理も面倒くさいので改善してみた。
まず、ckeditor側
ckeditorを配置したフォルダにあるconfig.js。
jsである時点でphpの関数使えず、相対的な指定ができない。
なので、config.jsに記述をするのではなく
view側で以下のような記述をしてURL変更時も対処しなくて良いようにする。
filebrowserImageBrowseUrl: '<?= url('') ?>/assets/js/kcfinder/browse.php?type=images',
filebrowserImageUploadUrl: '<?= url('') ?>/assets/js/kcfinder/upload.php?type=images',
filebrowserBrowseUrl: '<?= url('') ?>/assets/js/kcfinder/browse.php?type=files',
filebrowserUploadUrl: '<?= url('') ?>/assets/js/kcfinder/upload.php?type=files',
そして、kcfinder側
kcfinderを配置したフォルダのconf/config.php。
問題は以下の2つの項目
'uploadURL' // 画像アップロード先URL
'uploadDir' // 画像アップロード先ディレクトリ
‘uploadURL’はこうすれば良い?
'uploadURL' => 'https://'.$_SERVER['HTTP_HOST']."/assets/js/kcfinder/upload/"
確かにドキュメントルート直下に配置する場合はこれで問題ない。
でも、開発環境の場合、ドキュメントルート直下に複数のプロジェクトのディレクトリがあってとか
本番環境など、URLに下駄を履かせるとずれてくる。
それで、プログラムでどうにかしようにも
return array(
'uploadURL' => ''
);
配列なのでif文とか書けない。。。
と思ったら、こういう時にクロージャなんだ!!
例えばこんな感じ。
'uploadURL' => (function(){
$uri = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$pos = strpos($uri, '/kcfinder/');
$url = substr($uri, 0, $pos + strlen('/kcfinder/') - 1).'/upload/';
return $url;
})(),
‘uploadDir’の方は
'uploadDir' => __DIR__.'/../upload',
として、カレントディレクトリから求めるようにした。
一応、これで環境ごとにckeditorとkcfinderの設定は触らなくてよくなった。
※実際の設定値は、ご自身のディレクトリ構造に沿って設定して下さい。