CakePHPでTwitter Bootstrapを使うとなかなか難しい部分もあって、結局ベタにHTMLを書くのかという風に思う時もありますが、CakePHPは懐が深いよという事でどうにかうまく繋ぎ合わせる事もできる(時もあります)。SQLもベタに書いた方が早い時もありますが、意外に如何様にもなります。ViewもElementを利用すればもっとメンテナンス性や拡張性をもたせる事もできます。そんなお話。
でも、クラスを指定しても、親のタグとの兼ね合いでうまくスタイルが適用されずにイライラする時も多いです。
Paginatorは簡単なコードでHTMLのパーツがすぐに出てくるので便利だけれど、このBootstrap特有の親子関係でうまく行かずに諦めるパターンも多かったけれど、ようやく正解パターンが見つかった気がしたので晒してみます。
我ながら強烈だなと思うけれど、これで一応共存する事ができました。
Paginatorは先頭のページにいる時は$this->Paginator->prev()の出力HTMLがaタグに囲まれていないってのが一つ目の大きな壁。
これは先頭ページの時とそうでない時の2種類の設定が持てるので対応できました。
$this->Paginator->next()も同じです。
$this->Paginator->numbers()の出力HTMLも同じですが、currentTagオプションで現在のページの番号に適用するタグが設定できたのでaタグで囲んでおく適用されます。
一番の使いどころは、フォームの使い回しかと思います。
データ登録のフォームとアップデートのフォームなど同じ項目の箇所が多い時は、コードを一箇所にまとまるので非常にメンテナンスが楽です。入力項目が増える時も、DBのカラムを増やしてElementのフォームを追加すればとりあえず完了です。
バリデーションなどの手の込んだロジックが必要な場合は、モデルに処理を追加します。
View直下のElementsフォルダにhoge.ctpというファイルを作って以下のコードを入力します。
Viewから上のファイルを呼び出します。
呼び出し方は簡単で、$this->Element('hoge')とするだけです。
$this->Form->create()と$this->Form->end()はデータ登録や更新などの場合によって設定したい時もあるので都度書くのがいいと思います。
各国語対応するようなシステムを作ったことがないのであまり関係なかったようでした。
'div'=> falseとするとinputタグについてくるdivタグを除去できます。
だいたいそれでいいですが、検索フォームなどを作る時は、OR検索が必要な時もあります。
いくつかSQLと配列をセットで見てみます。
SQLの構造が目に見える分、設定しやすいかも知れません。
書き方に困ったら検索して方法を探すのもいいですが、CakePHP自体のソースコードを追ってみると面白い発見が色々できました。
また小ネタがたまったらまとめたいと思います。
see also:
[PHP]今更のCakePHPまとめ
paginatorとbootstrapをうまく使う
Twitter Bootstrapはよくできていて、業務で使う簡単なシステムとかとにかく素早さが求められる分にはどんどん利用すべきだと思います。でも、クラスを指定しても、親のタグとの兼ね合いでうまくスタイルが適用されずにイライラする時も多いです。
Paginatorは簡単なコードでHTMLのパーツがすぐに出てくるので便利だけれど、このBootstrap特有の親子関係でうまく行かずに諦めるパターンも多かったけれど、ようやく正解パターンが見つかった気がしたので晒してみます。
echo $this->Paginator->prev("<<", array('tag'=>'li', 'class'=> false), "<a><<</a>", array('tag'=>"li", 'class'=> "disabled", 'escape'=>false)); echo $this->Paginator->numbers(array('tag'=>'li', 'separator'=> "\n", 'currentClass'=> 'disabled', 'currentTag'=> "a")); echo $this->Paginator->next(">>", array('tag'=>'li', 'class'=> false), "<a>>></a>", array('tag'=>'li', 'class'=> "disabled", 'escape'=>false));
我ながら強烈だなと思うけれど、これで一応共存する事ができました。
Paginatorは先頭のページにいる時は$this->Paginator->prev()の出力HTMLがaタグに囲まれていないってのが一つ目の大きな壁。
これは先頭ページの時とそうでない時の2種類の設定が持てるので対応できました。
$this->Paginator->next()も同じです。
$this->Paginator->numbers()の出力HTMLも同じですが、currentTagオプションで現在のページの番号に適用するタグが設定できたのでaタグで囲んでおく適用されます。
elementでviewの再利用
ElementはViewのある部分を抜き出して再利用するための仕組みです。一番の使いどころは、フォームの使い回しかと思います。
データ登録のフォームとアップデートのフォームなど同じ項目の箇所が多い時は、コードを一箇所にまとまるので非常にメンテナンスが楽です。入力項目が増える時も、DBのカラムを増やしてElementのフォームを追加すればとりあえず完了です。
バリデーションなどの手の込んだロジックが必要な場合は、モデルに処理を追加します。
View直下のElementsフォルダにhoge.ctpというファイルを作って以下のコードを入力します。
<?php echo $this->Form->input('hoge', array("label"=>"hoge", 'class'=> "input-xxlarge")); echo $this->Form->input('fuga', array("label"=>"fuga", 'class'=> "input-xlarge")); echo $this->Form->input('fizz', array("label"=>"fizz", 'class'=> "input-xlarge")); echo $this->Form->input('buzz', array("label"=>"buzz", 'class'=> "input-xlarge"));
Viewから上のファイルを呼び出します。
呼び出し方は簡単で、$this->Element('hoge')とするだけです。
<?php echo $this->Form->create('test'); ?> <?php echo $this->element('hoge'); ?> <?php echo $this->Form->end('submit'); ?>
$this->Form->create()と$this->Form->end()はデータ登録や更新などの場合によって設定したい時もあるので都度書くのがいいと思います。
__()を使って幸せになる人
cakephpのCookbookなんかを見ているとちょくちょく出てくる__()は、国際化する時のpotファイルが楽に作られるための関数のようです。echoのエイリアスか何かかと思ってましたが、そういう意味だったんですね。各国語対応するようなシステムを作ったことがないのであまり関係なかったようでした。
formの設定 inputDefaults
$this->Form->create()の引数で設定できるinputDefaultsオプションは、フォームの中の$this->Form->input()のデフォルト値を一括設定するオプションです。'div'=> falseとするとinputタグについてくるdivタグを除去できます。
<?php echo $this->Form->create('test', array('inputDefaults'=> array('div'=> false))); ?>
findでorを使う
DBをSelectする時に使うfindですが、何も考えずにArrayを登録するとAND検索するようになっています。だいたいそれでいいですが、検索フォームなどを作る時は、OR検索が必要な時もあります。
いくつかSQLと配列をセットで見てみます。
//SQL /* SELECT `test`.`id`, `test`.`hoge`, `test`.`fuga`, `test`.`fizz`, `test`.`buzz` FROM `hoge`.`hoges` AS `hoge` WHERE ( (`hoge` LIKE '%test%') OR (`fuga` LIKE '%test%') OR (`fizz` LIKE '%test%') OR (`buzz` LIKE '%test%') ); */ // PHP $conditions = array( 'or'=> array( array('hoge LIKE'=> '%test%'), array('fuga LIKE'=> '%test%'), array('fizz LIKE'=> '%test%'), array('buzz LIKE'=> '%test%') ) ); $this->find('all', array('conditions'=> $conditions)); // AND検索とOR検索の組み合わせ /* SELECT `test`.`id`, `test`.`hoge`, `test`.`fuga`, `test`.`fizz`, `test`.`buzz` FROM `hoge`.`hoges` AS `hoge` WHERE ( (`hoge` LIKE '%test%') OR (`fuga` LIKE '%test%') OR (`fizz` LIKE '%test%') OR (`buzz` LIKE '%test%') ) AND `flg` = '1'; */ $conditions = array( 'or'=> array( array('hoge LIKE'=> '%test%'), array('fuga LIKE'=> '%test%'), array('fizz LIKE'=> '%test%'), array('buzz LIKE'=> '%test%') ), array('flg'=> true) ); $this->find('all', array('conditions'=> $conditions));
SQLの構造が目に見える分、設定しやすいかも知れません。
書き方に困ったら検索して方法を探すのもいいですが、CakePHP自体のソースコードを追ってみると面白い発見が色々できました。
また小ネタがたまったらまとめたいと思います。
see also:
[PHP]今更のCakePHPまとめ
コメント
コメントを投稿