Jun 24

rhaco 1.4.9, 1.5.0リリース

rhaco other | comment(0)

久しぶりにリリース版が出ました(SourceForgeへ)(svnでは凄い勢いで更新されてるんですけどね)。1.4.0からの主な変更点は


1.4.9
・テスト項目の拡充(ほとんど中の人一人で仕上げてます。大変なことです。)
・セットアップ画面が大幅に変更(ドキュメント、テスト、認証管理もセットアップ画面から行えます)
・DB機能の強化
・Viewsの強化(フォーム→確認→完了を手軽に出来るメソッドなど)
・ソケット通信機能、単位変換機能などライブラリの追加
・各種バグフィックス(fixdapの完了タスク参照)

1.5.0
・@deprecatedの削除(結構大きい)

です。1.4.0から比べるとかなり多いので、書ききれません。逆引きはsvnのtrunkを元にして書いているので、大体今回のバージョンに沿っていると思います。

Jun 6

逆引きrhaco33: CRUDに確認画面を入れる

snippet rhaco | comment(0)

fixdapにtokushimaさんが書いた例をそのまま転載します。

<?php
include("__init__.php");
Rhaco::import("generic.Urls");
Rhaco::import("model.Product");

$redirect = Rhaco::page("index");//$redicect先はindex.phpとなります。
$object = new Product();

$parser = Urls::parser(array(
"^create"=>array("method"=>"confirmedCreate","args"=>array($object,$redirect)),
"^$"=>array("method"=>"read","args"=>$object),
"^update/([\d]+)"=>array("method"=>"confirmedUpdate","args"=>array($object,$redirect)),
"^delete/([\d]+)"=>array("method"=>"drop","args"=>array($object,$redirect)),
"^detail/([\d]+)"=>array("method"=>"detail","args"=>$object),
));
$parser->write();
?>


要はcreate,updateをconfirmedCreate、confirmedUpdateに置き換えるだけです。簡単ですね!

あれ?confirmedDropは無いのか?
と思った方、是非fixdapに要望を書いて下さい。

Jun 5

逆引きrhaco32: CRUDを作る

rhaco snippet | comment(0)

Urlsを使ったものを紹介します。
Flowなどでも同じように出来ます。


と言ってもページャー、ソート、表示項目の選択など様々なことが出来ます。

  • Viewsをextendしたクラスを使う

  • コード量は若干増えますが後で拡張しやすくなります。


index.php
<?php
require_once("./__init__.php");
Rhaco::import("generic.Urls");
Rhaco::import("CRUD");
$pattern = array(
  "^list\/?$"=>array("class"=>"CRUD","method"=>"productList"),
  "^detail\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"productDetail"),
  "^create\/?$"=>array("class"=>"CRUD","method"=>"productCreate"),
  "^update\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"productUpdate"),
  "^delete\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"productDelete")
);
$parser = Urls::parser($pattern);
$parser->write();
?>


library/CRUD.php
<?php
Rhaco::import("generic.Views");
Rhaco::import("model.Product");
class CRUD extends Views {
  function productList(){
    return $this->read(new Product(), new C(Q::like(Product::name(),"hoge","p")));
  }
  function productDetail($id){
    return $this->detail(new Product($id));
  }
  function productCreate(){
    return $this->create('path/to/redirect',$this->toObject(new Product()));
  }
  function productUpdate($id){
    return $this->update('path/to/redirect',$this->toObject(new Product()),new C(Q::eq(Product::columnId(),$id)));
  }
  function productDelete($id){
    return $this->drop('path/to/redirect',new Product($id));
  }
}
?>


  • 独自クラスを使う

  • 柔軟性が高く、この中でViewsを使うことも当然出来るので便利。


index.php
<?php
require_once("./__init__.php");
Rhaco::import("generic.Urls");
Rhaco::import("CRUD");
$pattern = array(
  "^list\/?$"=>array("class"=>"CRUD","method"=>"read"),
  "^detail\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"detail"),
  "^create\/?$"=>array("class"=>"CRUD","method"=>"create"),
  "^update\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"update"),
  "^delete\/([0-9]+?)\/?$"=>array("class"=>"CRUD","method"=>"drop")
);
$parser = Urls::parser($pattern);
$parser->write();
?>


library/CRUD.php
<?php
Rhaco::import("generic.Views");
Rhaco::import("model.Product");
class CRUD {
  var $_view;
  function CRUD(){
    $this->_view = new Views();
  }
  function read(){
    return $this->_view->read(new Product(), new C(Q::like(Product::name(),"hoge","p")));
  }
  function detail($id){
    return $this->_view->detail(new Product($id));
  }
  function create(){
    return $this->_view->create('path/to/redirect',$this->_view->toObject(new Product()));
  }
  function update($id){
    return $this->_view->update('path/to/redirect',$this->_view->toObject(new Product()),new C(Q::eq(Product::columnId(),$id)));
  }
  function productDelete($id){
    return $this->_view->drop('path/to/redirect',new Product($id));
  }
}
?>


※注意点
ViewsやViewsMapperを使用し、リスト読み込み(readメソッド)する場合は必ずQ::fact()が適用されるので、リファレンス先データが無いデータは表示されませんし、少々遅くなります。
速度を気にされる方やリファレンス先のデータが無い場合のある処理の場合はreadを使わないで独自実装した方が良いです。

Jun 3

逆引きrhaco31: テーブルへ入力するデータの検証だけしたい

rhaco snippet | comment(0)

CRUDの確認画面くらいならViewsのconfirmed系メソッドで出来るんですが、そういったものを使わずに検証だけしたい時もあります。特に他のFWと連携するときに必要になったりします。その時はTableObjectVerifyクラスを用いて次のようにします。

$flow = new Flow();
$product = $flow->toObject(new Product());
$result = TableObjectVerify::verify(new DbUtil(Product::connection()),$product);
if($result){
  echo 'true';
}else{
  foreach(ExceptionTrigger::get() as $exception){
    echo $exception->getMessage();
  }  
}


検証が通った場合trueを表示し、通らなかった場合、エラーメッセージを表示します。

May 27

逆引きrhaco30: かっこいいURL(?)を使う(その4:別クラス内のメソッドを呼ぶ)

snippet rhaco | comment(0)

この方法は

別ファイルに表示用のクラスを作りたい。
Viewsを拡張して特殊な処理をしたい。

などの場合に使える方法です。私はこの方法を一番使います。例として「Productテーブルのnameフィールドが"hoge"を含むデータを表示」してみます。

index.php

<?php
require_once("./__init__.php");
Rhaco::import("generic.Urls");
$pattern = array("^hoge\/fuga\/?$"=>array("class"=>"hoge","method"=>"fuga"));
$parser = Urls::parser($pattern);
$parser->write();
?>


library/Hoge.php
<?php
Rhaco::import("generic.Views");
Rhaco::import("model.Product");
class Hoge extends Views {
  function fuga(){
     return $this->read(new Product(), new C(Q::like(Product::name(),"hoge","p")));
  }
}
?>


これだけです。デフォルトのテンプレート(setup画面のテンプレート)で良ければテンプレートを作成、指定する必要もありません。Viewsは便利なので色々使ってみると良いと思います。逆引きでも紹介していきます。

※function抜けてましたorz。修正