概要
このパッケージでは、ORMからの出力を以下のように簡単に記述できるようになります。
<?php echo ($person->age)? sprintf('%d歳',$person->age):'';?>
↓↓↓
<?php echo $person->formatted_age; ?>
DBに格納している値に単位をつけて出力したいケースは多く、また、値が0やNULLだった場合は単位なしで空文字を出力したいといったケースも多いです。
通常はいちいちif文や三項演算子を使ってViewを書いていくと思いますが、非常に冗長になるため、ORMに機能を追加してViewの記述を簡略化してしまおうというものです。
もちろん、その他のメリットも多々あります。
パッケージ
Fuel-Package-TraitOrmFormat(ver.2.0)
※ブランチ「2.0」が最新版です。(masterは古い)
※PHP5.4からの機能(Trait)を使っていますので、PHP5.4以上の環境が必要です。
インストール
"require": {
"php": ">=5.4",
"trait-orm-format": "1.*"
},
"repositories": [
{
"type":"package",
"package":{
"name":"trait-orm-format",
"type":"fuel-package",
"version":"1.7",
"source":{
"type":"git",
"url":"https://github.com/goosys/Fuel-Package-TraitOrmFormat.git",
"reference":"2.0"
}
}
}
],
always_load => array(
packages => array(
'trait-orm-format'
),
language => array(
'selector',
'trait-orm-format'
)
class Model_Person extends \Orm\Model
{
use Trait_Orm_Format; //この行を追加
機能
今までも便利でしたが、不具合修正と多少の機能追加をした2.0
が更に便利になっています。
まずは基本的な使い方の説明です。
フォーマットを定義
'gender' => array(
'1' => '男性',
'2' => '女性'
),
'country' => array(
'jp' => '日本',
'us' => 'アメリカ',
)
'common' => array(
'people' => '%d人', //文字列の場合はsprintfにかけて出力
'age' => '%d歳',
'jpy' => function($val){ return number_format($val).'円'; }, //関数の場合はreturnされた文字列を出力
'timetodate' => function($val){ return (!empty($val))? date('Y/m/d',$val): ''; }, //created_atなどのタイムスタンプを日付にフォーマットする場合に便利
),
'model' => array(
'person' => array(
'age' => 'common.age', //共通フォーマットから選択
'num_friends' => '%d人', //フォーマットを直接記述
'gender' => 'selector.gender', //選択肢から選択
'full_address'=> 'related.address.full_address' //$person->address->full_address
'local' => 'related.address.formatted_country' //リレーションしたモデルからも再帰的にフォーマット可能
),
'address' => array(
//'full_address' => '%s', //そのまま出力してよいものは省略可
'country' => 'selector.country', //選択肢から選択
)
)
Viewで使用
Viewではこの様に統一的に記述できます。(コメント内は出力結果の例)
<?php echo $person->formatted_age; /* 12歳 */ ?>
<?php echo $person->formatted_num_friends; /* 100人 */ ?>
<?php echo $person->formatted_gender; /* 男性 */ ?>
<?php echo $person->formatted_local; /* 日本 */ ?>
2.0からの新機能
2.0から、以下2機能が追加されました。
リレーション先のモデルも再帰的にフォーマットする機能
<?php echo $person->formatted_full_address; /* 東京都新宿区1-1-1-1 */ ?>
Model_Person has_one Model_Address
とリレーションされていて、$person->address->full_address='東京都新宿区1-1-1-1'
となっていた場合、empty($person->address)
で実際にデータが入っているかをチェックした上で、Model_Address
のfull_address
に定義されたフォーマットで出力を行います。
同名の関数を実行する機能
モデルにformatted_
で始まる関数が定義されていた場合、
public function formatted_full_name(){
return $this->family_name . ' '. $this->first_name;
}
このようにアクセスすることができます。
<?php echo $person->formatted_full_name; /* 田中 太郎 */ ?>
もちろん、$person->formatted_full_name()
でも同様の結果となりますが、書き方を統一でき、また、リレーション先のフォーマットとしても使用することが出来るので便利です。