CakePHP

【CakePHP】App::uses()の注意点。

めも。

App::uses()はクラス名とファイル名が一致していないと読み込めない。

TwitterのOauthライブラリを読み込もうとした際に、クラス名とファイル名の命名規則が異なっていたため一向に読み込めないという問題が発生。

大文字、小文字を確りと判別しているため、挙動に違和感を感じたら素直に統一させるべし。

 

【CakePHP2.4】DataSource::update()は常にfalseを返す。

これはほんとに要注意。

DBへのsave()処理時、返り値で成功失敗判定を行っている部分があったため一向に通過しないif文が発生してしまった。

というお話。

今後のトラブルシューティング時に覚えておきたいTips。

 

【CakePHP2.4】SessionComponent::setFlash()でエレメントを使う。

めも。

まず「app/View/Elements/」以下に好きなエレメントを作成する。

そしてコントローラーでsetFlash()をする際、下記のようにエレメントを呼び出す。

// elementFileName.ctpというエレメントを作成したと仮定する
$this->Session->setFlash('メッセージ', 'elementFileName');

これで作成したエレメントが呼び出される。

エレメント内では$messageに第一引数で渡したメッセージが格納されているので、任意の場所でechoしてやればよい。

 

【CakePHP2.3】Configureクラス自分用まとめ。

自分用めも。

■設定値を書き込む

// 'hoge'という名前で'value'という値を書き込む
Configure::write('hoge', 'value');

■設定値を読み込む

// 'hoge'という名前の設定値を読み込む
$conf = Configure::read('hoge');

■設定値をファイルに書き出す

// 'hoge'という名前の設定値をmyConfig.phpとして書き出す
configure::dump('myConfig', 'default', array('hoge'));

※書き出されるディレクトリは「app/Config」なのでConfigフォルダに書き込み権限を与えなければならない
※第3引数を指定しなかった場合は全ての設定値が書き出される

■書き出した設定ファイルを読み込む

// 「app/Config」下の「myConfig.php」を読み込む
Configure::load('myConfig');

// ファイルの読み込みが完了したらread()メソッドで設定値を読み込む
$conf = configure::read('hoge');

 

おまけ。

■CakePHPのバージョンを取得する

$version = Configure::version();

 

【CakePHP2.3】外部クラスをオートロード対象として宣言する。

めも。

「App::uses()」を使用し利用したいクラスを宣言すると、そのクラスを呼び出した際に自動でインポートされるようになる。

■関数定義

App::uses($className, $location);

■引数詳細

引数 初期値 詳細
$className 省略不可 クラス名
$location 省略不可 クラスの所属するパッケージ名

以下例。

App::uses('myExampleClass', 'Lib');
App::uses('myCustomClass', 'Vendor');
App::uses('mySampleClass', 'Controller/Component');

appディレクトリ下のLibやVendorフォルダに外部クラスを置いてやることで、上記のようにオートロード対象として指定してやることが可能。
App::uses()はApp::build()で指定したパスリストと本メソッドで指定したクラス名を結びつけオートロードをするためのものなので、本質的なネームスペースとは異なることに注意されたし。

 

【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>