Posts tagged helper
CakePHP HTML ヘルパーで出力するラジオボタンにラベルを付ける方法
2CakePHP 1.1 の HTML ヘルパーが出力するラジオボタンにはラベルが付いていないのでラジオボタン以外の文字の部分をクリックしてもチェックができません。そこで CakePHP HTML ヘルパーで出力されるタグを変更する方法 のエントリーの方法を使用してラジオボタンにラベルを付加してみました。
app/config/tags.ini.php
radio = <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>
あとは普通に $html->radio() を使用して出力すればラベルが付加されています。
CakePHP 1.2 ではラジオボタンにラベルがついた状態で出力されていました。
CakePHP HTML ヘルパーで出力されるタグを変更する方法
2ヘルパーで出力されるタグを変更する方法です。
やりたいこと
ビューで
< ?php echo $html->link('Love CakePHP', 'http://www.cakephp.org'); ?>
と書くと
<div class="link"><a href="http://www.cakephp.org" >Love CakePHP</a></div>
と div タグで囲んで表示するようにしたい。
概要
app/config 内に変更したいタグを定義してヘルパーの親クラス(AppHelper) で定義したタグを読み込むという方法です。
CakePHP1.1 と 1.2 で少し方法が違います。
CakePHP1.1
app/config に tags.ini.php というファイルを作成しここにタグを定義すると自動的に反映されます。
app/config/tags.ini.php
link = <div class="link"><a href="%s" %s>%s</a></div>
CakePHP1.2
app/config/tags.php
< ?php
$tags = array(
'link' => '<div class="link"><a href="%s" %s>%s</a></div>'
);
?>
app/app_helper.php
< ?php
class AppHelper extends Helper {
function __construct() {
parent::__construct();
$this->loadConfig();
}
}
?>
CakePHP 1.2 の AppHelper::loadConfig は以下のようになっていてデフォルトでは app/config/tags.php を読み込み $this->tags にマージします。
function loadConfig($name = 'tags') {
if (file_exists(APP . 'config' . DS . $name .'.php')) {
require(APP . 'config' . DS . $name .'.php');
if (isset($tags)) {
$this->tags = array_merge($this->tags, $tags);
}
}
return $this->tags;
}
AppHelper のコンストラクタで
$this->loadConfig("hoge.php");
とすれば hoge.php のように任意のファイルを読み込んでマージすることができます。
HTML ヘルパーが使用するタグは cake/libs/view/helpers/html.php で $tags として定義されています。
この中のフォーム関連のタグは Form ヘルパーでも使用していますので、上記の方法で Formヘルパーで使用するタグも変更できます。
CakePHP 携帯専用サイトを作成する
6CakePHP で携帯用のページを作成する際に CakePHP 携帯用ビューを表示する | Shin x blog のページが大変参考になります。
しかし、/m/ のような URL ではなく携帯専用サイトにしたかったので下記のような方法で実装しました。なお、PC でアクセスしたときには /pc.html という静的なページを表示するようにしてあります。
また、PC、携帯の振り分けはユーザエージェントで行っています。
携帯用コンポーネント
app/controller/component/mobile.php を作成し、PEAR の Net_UserAgent_Mobile を使用しています。このコンポーネントでユーザエージェントを判定して PC だったら pc.html へリダイレクトします。
PEAR の Net_UserAgent_Mobile はサーバにインストールしてもいいのですが、今回は app/vendors/ ディレクトリに入れました。また、app/vendors/ に include_path を通すために、CakePHPガイドブック を参考に include_path_vendors.php を作成しました。
app/controller/component/mobile.php
vendor("include_path_vendors");
vendor("Net/UserAgent/Mobile");
class MobileComponent extends Object {
function startup(&$controller) {
$this->controller = $controller;
$mobile = &Net_UserAgent_Mobile::factory();
if ($mobile->isNonMobile()) {
$this->controller->redirect("/pc.html");
}
}
}
今回は簡単に PC か携帯でアクセス振り分けているだけですが、画面の大きさやキャリアなどによって色々な処理の振り分けが考えられます。
携帯用ヘルパー
app/views/helper/mobile.php を作成して HTML 出力時に文字コードを Shift-JIS へ変換します。ヘルパーの afterRender メソッドを使用しています。
class MobileHelper extends Helper {
function afterRender() {
$out = ob_get_clean();
$out = mb_convert_kana($out, "rak", "UTF-8");
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
ob_start();
echo $out;
}
}
コントローラで携帯用コンポーネント、ヘルパーを使用する
app/app_controller.php で携帯用コンポーネントと携帯用ヘルパーを使用します。
var $components = array('Mobile');
var $helpers = array('Mobile');
app_controller.php で設定しておけば全てのコントローラで共通に読み込むので各コントローラにその都度書く必要がなくなります。DB の管理画面など PC 用のコントローラが必要な場合は各コントローラに書いた方がいいでしょう。今回は完全に携帯用にしています。PC 用の管理画面もあるのですが、サブドメインを変えて app ディレクトリも違うものを使用しています。
また、各コントローラ内で設定するタイトルの文字コードを変換しないといけないので、app_controller.php の beforeRenderメソッドでタイトルの文字コードを変換します。
function beforeRender() {
$this->pageTitle = mb_convert_encoding($this->pageTitle, "SJIS", "UTF-8");
parent::beforeRender();
}
以上で携帯専用のサイトが CakePHP で作成できました。
コントローラの afterFilter で文字コードを変換する方法
コントローラの afterFilter で文字コードを変換することもできます。
app/controller.php
function afterFilter() {
parent::afterFilter();
$out = ob_get_clean();
$out = mb_convert_kana($out, "rak", "UTF-8");
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
ob_start();
echo $out;
}
この場合は、beforeRender でのタイトルの文字コード変換の処理が必要ないのと、携帯用ヘルパーは必要ありません。
PC 用のコントローラも作りたいときは携帯用コンポーネント、携帯用ヘルパーを使用する方法がよいかと思います。
CakePHP JQuery ヘルパー
3JQuery helper for CakePHP ( PQuery port ) at NGCoders
CakePHP から JQuery を簡単に使うことができます。
正確には PQuery ヘルパーかもしれません。PQuery は JQuery を PHP から簡単に使用するライブラリで PQuery ヘルパーと同じ開発者が開発しています。
参考:PQuery – PHP and JQuery at NGCoders
インストール
JQuery helper for CakePHP ( PQuery port ) at NGCoders から JQuery ヘルパーをダウンロードし、解凍した pquery.php を /app/views/helpers にコピーします。
そのほかに jquery.js ファイルも必要になります。こちらもダウンロードして /app/webroot/js にコピーします。
コントローラ
Pquery ヘルパーと Javascritp ヘルパーを使用します
var $helpers = array('Pquery', 'Javascript');
ビュー
jquery.js の読み込み
<?php echo $javascript->link('jquery.js'); ?>
使用例
トグルボタン
<div id='msg'>Message...</div>
<?php echo $pquery->link_to_function('toggle', $pquery->toggle('#msg'));?>
フォームで送信された内容により HTML を更新
入力したテキストを /controller/action/ に GET で送信し、id=idtoupdate に受け取った HTML を表示する
<?php echo $pquery->form_remote_tag(array('url'=>'/controller/action/','update'=>'#idtoupdate'));?>
<input type='text' name='field' />
<input type='submit' />
<div id='idtoupdate'></div>
pquery.php を見ると色々なメソッドがあります。使い方はソースを見ればすぐに分かると思います。
CakePHP Textヘルパーの truncate を全角文字に対応させてみた
5CakePHP の Text ヘルパーに truncate という指定された文字列を任意の長さに省略するメソッドがあります。
しかし、このメソッドは全角文字を考慮していないため全角文字に用いると文字化けすることがあります。
そこでこのメソッドを全角文字に対応させてみました。
function truncate($text, $length, $ending = '…', $exact = true) {
if (strlen($text) < = $length) {
return $text;
} else {
mb_internal_encoding("UTF-8");
if (mb_strlen($text) > $length) {
$length -= mb_strlen($ending);
if (!$exact) {
$text = preg_replace('/\s+?(\S+)?$/', '', mb_substr($text, 0, $length+1));
}
return mb_substr($text, 0, $length).$ending;
} else {
return $text;
}
}
}
直接 Text ヘルパーを修正するとバージョンアップなどのときに困るので、
cake/libs/view/helpers/text.php を app/views/helpers/mb_text.php にコピーしクラス名を
class MbTextHelper extends Helper{
として、truncate メソッドを上記のように修正しました。
使用するときはコントローラ内で、
var $helpers = array("MbText");
view で
echo $mbText->truncate("あいうえおかきくけこ", 5, "…", true);
とすると
あいうえ…
と表示されます。
CakePHP Pagination まとめ
2CakePHP の Pagination に関してまとめてみました。
コントローラでコンポーネント、ヘルパーに Pagination を指定
// 使用コンポーネント名
var $components = array('Pagination');
// 使用ヘルパー名
var $helpers = array('Pagination');
コントローラの一覧表示するアクションでの一覧表示取得方法
$this->Pagination->modelClass = 'Model'; // 使用するモデル $this->Pagination->sortBy = 'created'; // デフォルトのソートするフィールド名 $this->Pagination->direction = 'DESC'; // デフォルトの昇順、降順を指定 $this->Pagination->show = 10; // 1ページに表示する件数 $conditions = array(); // 検索条件 list($order,$limit,$page) = $this->Pagination->init($conditions); $lists = $this->Model->findAll($conditions, $fields, $order, $limit, $page, $recursive);
ビューでのヘルパー使用準備
ビューで Pagination ヘルパーを使用できるようにする
< ?php $pagination->setPaging($paging); ?>
ビューでの総件数と表示している件数の表示
< ?php echo $pagination->result('検索結果:', '/', '?'); ?>件
上記のように指定すると「検索結果:1?10/5253件」と表示されます。
ソートするフィールドを変更するリンクを表示する
< ?php echo $pagination->sortBy('field_name', 'フィールド名', 'ModelName'); ?>
field_name にソートするフィールド名、
フィールド名にリンクに表示する名前、
ModelName にはフィールド名が属するモデル名
を指定します。
モデル名は $this->Pagination->modelClass と同じ場合には省略可能です。
また、sortBy メソッドは
veiws/heplers/pagination.php
function sortBy ($value, $title=NULL, $Model=NULL,$escapeTitle=true,$upText=' ^',$downText=' v')
のように定義されています。見て分かるとおり第5、6引数を指定することにより、ソートしたときのリンクのフィールド名につく「^」「v」の文字を変更することができます。
select タグによってソートを指定したいときは sortBySelect メソッドがあります。
function sortBySelect($sortFields, $t='Sort By: ',$upText=' ^',$downText=' v')
CakePHP HTML ヘルパーで textarea を出力する
1CakePHP の HTML ヘルパーでテキストエリアを出力するには下記のように書きます。
<?php echo $html->textarea("Model/field", array("cols"=>20, "rows"=>5, "value"=>"hoge")); ?>checkbox や radio などと違って第2引数に HTML 属性値がくることに注意が必要です。
array("value"=>"hoge") などと書くことにより初期値を入れることができます。
CakePHP HTMLヘルパーで checkbox を表示する
1HTMLヘルパーで checkbox を表示するには下記のように書きます。
<?php echo $html->checkbox('Model/field', null, array('value'=>1)); ?>
出力される HTML は下記のようになります。
(実際は1行で出力されますが改行入れています)
<input type="hidden" name="data[Model][field]" value="0" id="ModelField_" / <input type="checkbox" name="data[Model][field]" value="1" id="ModelField" />
checkbox と同じ名前の hidden を勝手に作ってくれるのでチェックされていなくても必ず $this->data["Model"]["field"] には値が帰ってくるのでうれしいかも。
ちなみに第2引数は checkbox では使用されていませんでした。
他のメソッドと統一するためにあるのでしょう。
第3引数に
array('checked'=>1) or
array('checked'=>true) or
array('checked'=>'checked')
などとするとデフォルトでチェックが入ります。
ちなみに HTML_QuickForm のように勝手に label タグで囲んではくれないので、チェックボックスの後ろに書かれた項目名などをクリックしてもチェックされるようにしたければ自分で label タグを書く必要があります。checkbox の ID は ModelField のようになるので、
<label for="ModelField"><?php echo $html->checkbox('Model/field', null, array('value'=>1)); ?>項目名</label>
とすれば「項目名」のテキストをクリックしてもチェックすることができるようになります。
CakePHP htmlヘルパーでラジオボタンを離れた場所に分けて書く方法
1html ヘルパーでラジオボタンを書く場合
<?php echo $html->radio('Model/field', array('1'=>'option1','2'=>'option2', '3'=>'option3')); ?>
のように書くと、ラジオボタンを横に並べて表示させることができます。
ただ、デザインによってはテーブルなどを使用していたり縦に並べたりして、ひとつづつ表示させたいときもあると思います。
その場合は
<?php echo $html->radio('Model/field', array('1'=>'option1')); ?>
<?php echo $html->radio('Model/field', array('2'=>'option2')); ?>
<?php echo $html->radio('Model/field', array('3'=>'option3')); ?>
とすれば、それぞれのボタンを希望の位置に表示させることができます。
CakePHP html ヘルパーでラジオボタンの選択状態 (checked) を指定する方法
1html ヘルパーを使用してラジオボタンの選択状態 (checked) を指定する方法です。
下記のようにすると option2 にチェックがつきます。
<?php echo $html->radio('Model/field', array('1'=>'option1','2'=>'option2', '3'=>'option3'), null, array('value'=>'2'), false); ?>
第4パラメータの array(‘value’=>’2′) でチェックするボタンを指定しています。
キーの ‘value’ は固定で、値の’2′ の方をチェックしたいラジオボタンの value 属性の値と同じものを指定すれば、そのボタンがチェックされます。
デフォルトや以前入力された状態を表示するために使用できそうです。