Archives by date

You are browsing the site archives by date.

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

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

 

【CakePHP2.3】FormHelper::create()の引数設定値まとめ。

自分用。

■関数定義

$this->Form->create($model, $options)

 

■引数詳細

引数 初期値 詳細
$model null モデル名を指定する。配列を渡した場合$optionsと見なされる
$options array() フォームのオプションを指定。詳細は下記。※下記に存在しないプロパティはformタグのアトリビューション(属性)として扱われる。

 

■$optionsに渡せるプロパティ一覧

キー 初期値 詳細
action null formタグのactionに設定する値。指定しなかった場合は現在のアクションが設定される。
default true falseを指定すると、Ajax通信が許可される。
encoding App.encodingの値 formタグのaccept-charsetに設定する値
enctype unll formタグのenctypeに設定する値。「type」を「file」に設定した場合は自動的に「multipart/form-data」が設定される
inputDefaults array() FormHelper::input()で用いるオプションのデフォルト値
type post フォームのタイプを指定。formタグのmethodに設定される。「put」「post」「get」「delete」「file」が設定可能
url null フォームのサブミット先URLを指定。Router::url()の引数形式が利用でき、actionの設定値よりもこちらが優先される

 

【HTTP】POSTとPUTの違い。

フォームのメソッドを指定する際、基本的にGETとPOSTのいずれかを用いれば困ることはない。しかしこの二つ以外にもHTTP/1.1では様々なメソッドが定義されており、その数はなんと10種類にも及ぶ。

ざっと並べてみると以下の通り。

・GET
・HEAD
・POST
・PUT
・DELETE
・OPTIONS
・TRACE
・CONNECT
・PATCH
・LINK
・UNLINK

今回はこの中でも最も用いられるであろうPOSTメソッドと、それに良く似た挙動をするPUTメソッドの違いはどこにあるのかを調べてみた。
が、リソースがどうだ、とか、プロトコルがこうだ、とか言っても正直よくわからないので(自分が)めちゃくちゃシンプルにまとめてみた。

■POST

HTTP/1.0からサポートされたメソッド。
エンティティ(データの実体)を転送する際に用いる。
リクエスト先のURIは「リクエストを処理する場所」を指す。

■PUT

HTTP/1.0からサポートされたメソッド。
ローカルにあるファイルをサーバに転送する際に用いる。
リクエスト先のURIは「リソースが生成される場所」を指す。

 

ということで自分がわかる単語のみを使ってどうにかこうにか違う部分を比較しようと頑張ってみたが、結局のところ実務においてどう使い分ければいいのか全然ピンと来ない。

更なる詳細は以下参考URLを参照されたし。

ハイパーテキスト転送プロトコル — HTTP/1.1

 

【CakePHP2.3】CakeRequest::is()で判定可能なリクエストタイプまとめ。

自分用。

タイプ 詳細
get GET形式のリクエストであるかを判定
post POST形式のリクエストであるかを判定
put PUT形式のリクエストであるかを判定
delete DELETE形式のリクエストであるかを判定
head HEAD形式のリクエストであるかを判定
options OPTIONS形式のリクエストであるかを判定
ssl SSLを用いたリクエストであるかを判定
ajax Ajaxからのリクエストであるかを判定
flash Flash(swf)からのリクエストであるかを判定
mobile モバイル端末からのリクエストであるかを判定
requested $params[‘requested’]に1がセットされているか否かを判定

 

【CakePHP2.3】FormHelper::input()の全type一覧。

メモ。

$this->Form->input()でフォームを出力する際、第二引数のtypeに渡せる値のまとめ。

■text
改行無しテキスト入力欄

■password
パスワード入力欄

■textarea
複数行テキスト入力欄

■file
ファイルアップロードフォーム

■select
セレクトボックス

■radio
ラジオボタン

■checkbox
チェックボックス

■date
日付入力欄

■time
時間入力欄

■datetime
日時入力欄

■hidden
非表示項目

■url
URL入力欄

 

ちなみに最後の「type=’url’」を指定すると、ブラウザ側で正しいURLかどうかのバリデーションを行ってくれる。
以下例。

84d40c9b2de7d79b8e5397aa552f8f0d

 

【CakePHP2.3】コアグローバル関数まとめ。

自分用。

■am()

配列を結合する

am($value[, ...])

 

■cache()

ファイルキャッシュの読み書きを行う

cache($path, $data, $expires, $target)

 

■clearCache()

ファイルキャッシュを削除する

clearCache($params, $type, $ext)

 

■config()

コンフィグファイルの読み込み

config($filename[, ...])

 

■convertSlash()

スラッシュを変換する

convertSlash($string)

 

■debug()

デバッグ情報の生成

debug($var, $showHtml, $showFrom)

 

■env()

環境変数を取得する

env($key)

 

■fileExistsInPath()

指定ファイルがパス内に存在するかをチェックする

fileExistsInPath($file)

 

■h()

特殊文字をHTMLエンティティに変換する

h($text, $double, $charset)

 

■LogError()

エラーログを出力する

LogError($message)

 

■sortByKey()

配列をソートする

sortByKey($array, $sortby, $order, $type)

 

■pluginSplit()

文字列をプラグイン名とクラス名に分割する

pluginSplit($name, $dotAppend, $plugin)

 

■pr()

変数をダンプする

pr($var)

 

■stripslashes_deep()

クオートされた文字列のクオートを再帰的に取り除く

stripslashes_deep($values)

 

【CakePHP2.3】Modelクラスのアソシエーション設定値まとめ。

■$hasMany

$className 関連付けるモデルクラス名
$foreignKey 自分の外部キーを格納する相手側モデルのフィールド名
$conditions 追加の検索条件
$fields 該当フィールド名
$type JOINの形式。デフォルトは「LEFT」
$order ソート順を指定
$limit 取得レコードの最大値
$offset スキップするレコード数
$dependent 自分のレコードを削除した際、相手側のレコードも削除するか否か。「true」で削除
$exclusive deleteAll()で一括削除を行いたい場合はtrueを指定
$finderQuery find()時に独自のSQLを発行したい場合に指定

 

■$belongsTo

$className 関連付けるモデルクラス名
$foreignKey 相手の外部キーを格納する自分側モデルのフィールド名
$conditions 追加の検索条件
$fields 該当フィールド名
$type JOINの形式。デフォルトは「LEFT」
$dependent 自分のレコードを削除した際、相手側のレコードも削除するか否か。「true」で削除
$counterCache 相手側のモデルで使用されるテーブル内に自分自身のレコード数を格納したい場合はtrue。格納するフィールド名を指定したい場合はフィールド名を指定

 

■$hasAndBelongsToMany

$className 関連付けるモデルクラス名
$joinTable 中間テーブル名
$with 関連付けたい中間テーブルに対するモデル名。中間テーブルにも値を保持しモデルとして利用したい場合に指定
$foreignKey 自分に対する外部キーを格納する中間テーブル内のフィールド名
$associationForeignKey 相手側の外部キーを格納する中間テーブル内のフィールド名
$unique 相手側に重複した値を許可しない場合はtrue
$conditions 追加の検索条件
$fields 該当フィールド名
$type JOINの形式。デフォルトは「LEFT」
$order ソート順を指定
$limit 取得レコードの最大値
$offset スキップするレコード数
$finderQuery find()時に独自のSQLを発行したい場合に指定
$deleteQuery delete()時に独自のSQLを発行したい場合に指定
$insertQuery save()時に独自のSQLを発行したい場合に指定