CakePHP2.0.3でJSファイルやCSSファイルを読み込む

CakePHP2で外部JSファイルとCSSファイルをHEADタグ内で読み込む方法です。
CakePHP1.2やCakePHP1.3と多少変わっています。

最初にwebrootフォルダのフォルダにCSSファイルとJSファイルを入れておきます。
/app/webroot/css → CSSファイル
/app/webroot/js → JSファイル

次に、レイアウトファイルのHEADタグ内で$scripts_for_layout変数を出力します。
/app/View/Layouts/default.ctp





<?php echo $title_for_layout; ?>






次にViewファイルの上辺りで以下の内容を記述します。
以下の例ではscript1.jsとscript2.js、import.css、sub.cssが読み込まれます。
読み込みたいファイル名は合わせて修正してください。
(/app/View/ControllerName/action_name.ctp)

Html->script(array('script1', 'script2'), array('inline'=>false)); ?>
Html->css(array('import', 'sub'), false, array('inline'=>false)); ?>

CakePHP1時代と違ってHTMLヘルパーは$this->Htmlのような参照方法になったので注意します。
また、inlineオプションをfalseにすることによってレイアウトファイル側でスクリプトファイルを読み込んでくれます。
Cookbookのcssメソッドの説明scriptメソッドの説明に以下のように書かれています。

scriptメソッド:

Creates link(s) to a javascript file.
If key inline is set to false in $options,
the link tags are added to the $scripts_for_layout variable
which you can print inside the head tag of the document.

Include a script file into the page.
$options['inline'] controls whether or not a script
should be returned inline or added to $scripts_for_layout.
$options['once'] controls, whether or not you want to
include this script once per request or more than once.

cssメソッド:

Creates a link(s) to a CSS style-sheet.
If key ‘inline’ is set to false in $options parameter,
the link tags are added to the $scripts_for_layout variable which you can print inside the head tag of the document.

最後に、こんな感じでHTMLが出力されます。





ViewからLayoutというちょっとトリッキーなデータの受け渡しなので
最初はちょっとだけ戸惑うかもしれないですね。
いちいちレイアウト側に分岐を書かなくていいので便利。

PHPで二つの時間帯が重複しないかチェックする

数カ月前にをPHPで予約システム制作する機会があったのですが、予約枠どうしが重複しないかチェックしなければならない何度か場面がありました。

よくあるホテルの部屋の予約システムや、座席の予約、病院の予約などのあれです。

例えば新規で新たに予約する際など、予約時間帯が既存の予約枠と衝突しないかをチェックする必要がありました。でも二つの時間がかぶるかどうかを判定するのってどうやるんだと思って結構悩みました…。

恐らく愚直に判定しようとすると &&|| を複数個並べた判定になると思うのですが、最近とても簡潔に書けることを知りました/(^o^)\

実際のコードサンプルは以下です。引数は全て整数のUNIXタイムスタンプを想定しています。

/**
 * 2つの時間帯が重複しているかをチェックする
 *
 * @param int $startTime1 一つ目の時間範囲の開始時間
 * @param int $endTime1 一つ目の時間範囲の終了時間
 * @param int $startTime2 二つ目の時間範囲の開始時間
 * @param int $endTime2 二つ目の時間範囲の終了時間
 * @return bool 重複している場合はtrueを返す
 */
function isTimeDuplication($startTime1, $endTime1, $startTime2, $endTime2) {
	return ($startTime1 < $endTime2 && $startTime2 < $endTime1);
}

$startTime1 = strtotime('2011/11/25 10:00:00');
$endTime1 = strtotime('2011/11/25 11:00:00');
$startTime2 = strtotime('2011/11/25 10:30:00');
$endTime2 = strtotime('2011/11/25 11:30:00');
$isDuplicate = isTimeDuplication($startTime1, $endTime1, $startTime2, $endTime2); //重複しているので真が返る

CakePHPで現在のパスやURLを取得する

CakePHPを使っているときに現在のURLを得る方法が分からなかったのでメモ。
第二引数をtrueにするとURLが、falseにするとスラッシュから始まる絶対パスが返されます。
こんな便利なメソッドがあったとは・・・危うくURL定数を作るところでした。
第一引数をnullにすると現在のパスがそのまま返ってくるのも便利!

$html->url('/controller/action/', true); // ビューのみ
Router::url('/controller/action/', true); // コントローラやモデルなどどこでも可

HTMLヘルパーはViewでしか使えないのに対して、
Routerクラスは静的クラスなのでどこからでもアクセスできます。

2011年12月05日追記:
CakePHP2.2ではHTMLヘルパーの参照方法が変わっていたので追記しておきます。
引数の仕様は同じで第二引数をtrueにするとURLになり、
false(デフォルト値)にすると絶対パスです。

$this->Html->url('/controller/action/', true);
Router::url('/controller/action/', true);

2015年4月2日追記:
CakePHP3でまた使用方法が若干変わっていたので別記事(CakePHP3で現在のパスやURLを取得する)に書きました。