スキップしてメイン コンテンツに移動

CakePHPの細かいTIPS Twitter Bootstrapとの絡みとか

CakePHPでTwitter Bootstrapを使うとなかなか難しい部分もあって、結局ベタにHTMLを書くのかという風に思う時もありますが、CakePHPは懐が深いよという事でどうにかうまく繋ぎ合わせる事もできる(時もあります)。SQLもベタに書いた方が早い時もありますが、意外に如何様にもなります。ViewもElementを利用すればもっとメンテナンス性や拡張性をもたせる事もできます。そんなお話。



paginatorとbootstrapをうまく使う

Twitter Bootstrapはよくできていて、業務で使う簡単なシステムとかとにかく素早さが求められる分にはどんどん利用すべきだと思います。
でも、クラスを指定しても、親のタグとの兼ね合いでうまくスタイルが適用されずにイライラする時も多いです。
Paginatorは簡単なコードでHTMLのパーツがすぐに出てくるので便利だけれど、このBootstrap特有の親子関係でうまく行かずに諦めるパターンも多かったけれど、ようやく正解パターンが見つかった気がしたので晒してみます。

echo $this->Paginator->prev("<<", array('tag'=>'li', 'class'=> false), "<a>&lt;&lt;</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>&gt;&gt;</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まとめ


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。