PHP

【CakePHP2.3】文字列中の特定のテキストにハイライトをかける。

「TextHelper::highlight()」メソッドを使う。

■関数定義

$this->Text->highlight($text, $phrase, $options);

■引数詳細

プロパティ 初期値 詳細
$text 省略不可 対象のテキスト
$phrase 省略不可 ハイライトしたいフレーズ
$options array() オプション(下記参照)

■$optionsに設定可能なパラメーター

キー 初期値 詳細
format ‘<span class=”highlight”>\1</span>’ ハイライト時のフォーマット
html false HTMLの混在したテキストを渡す場合はtrue、混在しない場合はfalse
regex “|%s|iu” 置換時に用いられる正規表現。%sは$phraseに置き換えられる

以下例。

コントローラー側で以下のような文字列をビューにセットしたとする。

$str = 'あいうえおかきくけこさしすせそたちつてとなにぬねの';
$this->set('str', $str);

次にビュー側で以下のように記述。

<?php echo $this->Text->highlight($str, 'くけこ'); ?>

すると以下のようなHTMLが出力される。

あいうえおかき<span class="highlight">くけこ</span>さしすせそたちつてとなにぬねの

特定のテキストの見せ方が自由自在になるので検索機能周りと連携させるとめちゃくちゃ便利。

 

【CakePHP2.3】文字列内のURLに自動でリンクを付与する。

「TextHelper::autoLinkUrls()」メソッドを使う。

■関数定義

$this->Text->autoLinkUrls($text, $options);

■引数詳細

プロパティ 初期値 詳細
$text 省略不可 URLが含まれているであろう文字列
$options array() リンクタグに不可するオプション

$optionsには「Html::link()」メソッドで与えることの出来るオプションを追加可能。

以下例。

コントローラー側からビューに文字列をセット。

$urlString = 'グーグルはhttp://google.com。ヤフーはhttp://yahoo.co.jp。';
$this->set('urlString', $urlString);

ビューファイル内で下記のようにヘルパーを呼び出す。

<?php echo $this->Text->autoLinkUrls($urlString); ?>

すると以下のようなHTMLを自動で出力してくれる。

グーグルは<a href="http://google.com">http://google.com</a>。ヤフーは<a href="http://yahoo.co.jp">http://yahoo.co.jp</a>。

ちなみに。

TextHelper::autoLinkEmails()でメールアドレスを検出、TextHelper::autoLink()でURL、メールアドレス両方を検出し自動的にリンクを付与してくれる。

 

【CakePHP2.3】ポスト可能なテキストリンクを出力する。

めも。

FormHelper::postLink()メソッドを使用する。
サブミットボタンではなく、あくまでもテキストリンクのクリックをトリガーに値の送信を開始したい場合に便利。

■書式

$this->Form->postLink($title, $url, $options, $confirmMessage);

■引数詳細

プロパティ 初期値 詳細
$title 省略不可 リンクのタイトル
$url null 値のサブミット先URL。Router::url()と同一のフォーマットで指定
$options array() フォームオプションの他、array(‘data’)が使用可能
$confirmMessage false 文字列を指定すると、確認メッセージとして出力してくれる

FormHelper::postButton()と似ているが、こちらはボタンではなくリンクである点が特徴。同時にJavascriptが生成され、ポスト自体はJavascriptによって行われる。postButton()メソッドと同様、$options[‘data’]にフォームからの値を渡すことでhiddenにて値を保持してくれる。

例えば以下のようなコードで。

<?php echo $this->Form->postLink('Submit', array('controller' => 'Hoges', 'action' => 'complete'), array('data' => $data)); ?>

※第三引数array(‘data’)の形式はpostButton()メソッドをまとめた際のエントリを参照されたし。↓

【CakePHP2.3】単独動作するサブミットボタンを出力する。

このようなHTMLが出力される。

<form action="/designs/test" name="post_524bb0f13ae60601421806" id="post_524bb0f13ae60601421806" style="display:none;" method="post">
	<input type="hidden" name="_method" value="POST">
	<input type="hidden" name="data[name]" value="hoge">
	<input type="hidden" name="data[password]" value="fuga">
	<input type="hidden" name="data[url]" value="http://google.com">
</form>
<a href="#" onclick="document.post_524bb0f13ae60601421806.submit(); event.returnValue = false; return false;">Submit</a>

 

【PHP】strtotime()に00日を渡すと、前月最終日の値が返却される。

はまったのでメモ。

たとえば。

$time = strtotime('2013-10-01');
var_dump(date('Y-m-d H:i:s', $time));
↓
string(19) "2013-10-01 00:00:00"

これは当然。
しかしこの状態で日付を00にした場合。

$time = strtotime('2013-10-00');
var_dump(date('Y-m-d H:i:s', $time));
↓
string(19) "2013-09-30 00:00:00"

00を指定した場合、1日前と判定される模様。
すなわち9月30日が返却される。

微妙にはまったので今後は気をつけよう。

 

【PHP】ファイル、及びディレクトリがシンボリックリンクかどうか調べる。

めも。

// ファイル単位の調査
$bool = is_link('/path/to/targetFile.ext');

もしくは。

// ディレクトリがシムリンクかを調査
$bool = is_link('/path/to/targetDir');

 

【PHP】ファイル、及びディレクトリの存在チェック、書き込み可否を同時に行う。

めも。

// ファイルの書き込みチェック
$bool = is_writable('/path/to/file.ext');

もしくは。

// ディレクトリの書き込みチェック
$bool = is_writable('/path/to/dir');

以前記事にしたfileperms()を用いたやり方よりもお手軽で便利。厳密にパーミッションを判定したい場合を除き、ほぼこれでことたりるかと思われる。

ちなみにis_writeable()はis_writable()のエイリアスなので、全く同じ動作をする。
※「e」が在るか無いかの違い。

 

【CakePHP2.3】単独動作するサブミットボタンを出力する。

FormHelper::postButton()メソッドを使う。
フォーム入力の確認画面やAjaxを用いたサブミットボタンなどを実装したい場合にとても便利。

■関数定義

$this->Form->postButton($title, $url, $options)

■引数詳細

プロパティ 初期値 詳細
$title 省略不可 ボタンに表示する文字列を指定
$url 省略不可 値のサブミット先URLを指定。例の如くRouter::url()形式のフォーマットで指定可能
$options array() オプション値。フォームオプションの他、array(‘data’)に入力データを渡してやることでhiddenタグを吐かせることも可能

 

以下例。

まずは入力欄のビューで以下のようなフォームを生成したと仮定。
※項目は超適当。

<?php echo $this->Form->create('Hoge'); ?>

<?php echo $this->Form->input('name', array('type' => 'text')); ?>

<?php echo $this->Form->input('password', array('type' => 'password')); ?>

<?php echo $this->Form->input('url', array('type' => 'url')); ?>

<?php echo $this->Form->end('Send'); ?>

上記で出力されたフォームより送信された値を処理するアクション内(確認画面を想定)で以下のように値をそのままビューに渡してやる。
※ここでは省略しているが、バリデーション処理をしないと脆弱性の塊なので注意。

$this->set('data', (!isset($this->data['Hoge'])) ? null : $this->data['Hoge']);

そして確認画面のビューでは下記の通り。

<?php echo $this->Form->postButton('Submit', array('controller' => 'Hoges', 'action' => 'confirm'), array('data' => $data)); ?>

すると一気に以下のようなHTMLを吐き出してくれる。
※実際は改行とインデント無しの一行で出力される。

<form action="/Hoges/confirm" method="post" accept-charset="utf-8">
	<div style="display:none;">
		<input type="hidden" name="_method" value="POST">
	</div>
	<input type="hidden" name="data[name]" value="hoge">
	<input type="hidden" name="data[password]" value="fuga">
	<input type="hidden" name="data[url]" value="http://google.com">
	<button type="submit">Submit</button>
</form>

「hidden」属性で入力値を保持してくれているので、出力されたボタンをクリックすれば次のアクションへ値をそのまま送信できるのである。
ユーザーへのプレビューはビューにセットされた$dataを好きに調理して表示してやればよい。

今までは確認画面での値保持をSessionでやっていたが、Sessionの有効期限が切れてしまった場合を考慮するのであればこっちのほうが親切なのかもしれない。hiddenのvalueを悪意ある文字列に直接書き換える輩がいるとも考えられるが、CakePHPを使っていればsave()メソッド前にどうせ自動的にバリデーションがかかるので、モデルさえしっかり設計しておけばなんら問題はないであろう。

 

【CakePHP2.3】パンくずリストを生成する方法。

HtmlHelper::addCrumb()、HtmlHelper::getCrumbs()、HtmlHelper::getCrumbList()を利用すると便利。

■関数定義

$this->Html->addCrumb($name, $link, $options)
$this->Html->getCrumbs($separator, $startText)
$this->Html->getCrumbList($options, $startText)

 

■引数詳細

・addCrumb()

※パンくずリストを追加する

引数 初期値 詳細
$name 省略不可 項目のテキストそ指定
$link null 項目のリンク先を指定。文字列または配列形式。link()メソッドの引数と同じ形式が利用可能
$options null link()メソッドに渡す追加オプション

 

・getCrumbs()

※パンくずリストを生成する

引数 初期値 詳細
$separator ‘&raquo;’ パンくずリストの区切り文字を指定
$startText false パンくずの先頭項目を指定。文字列の場合リンクが「/」になる。連想配列を渡す場合、キー「url」でURL、「startText」でテキストを指定できる。「url」をfalseにするとリンクを無効にでき、「startText」をfalseにすると追加処理を無視することが可能

 

・getCrumbList()

※ul/liタグを用いてパンくずリストを生成する

引数 初期値 詳細
$options array() ul/liタグに含めるオプションを指定する。詳細は下記表を参照
$startText false パンくずの先頭項目を指定。文字列の場合リンクが「/」になる。連想配列を渡す場合、キー「url」でURL、「startText」でテキストを指定できる。「url」をfalseにするとリンクを無効にでき、「startText」をfalseにすると追加処理を無視することが可能

※$optionsで指定可能なプロパティ一覧

キー 初期値 詳細
firstClass ‘first’ 最初の項目に指定するCSSクラス名
lastClass ‘last’ 最後の項目に指定するCSSクラス名
separator パンくずリストの区切り文字

以下例。

■パンくずを追加する際。

$this->Html->addCrumb('hoge', array('controller' => 'piyo', 'action' => 'fuga'));

■パンくずを出力する際

$this->Html->getCrumbList(array(), 'Home')

これめっちゃ便利ですやん。素敵やん。