EthnaのAppObject::importForm()
は便利ですが、DBの全カラムと同じ名前のform値を取得してしまうため、たとえばzipcode
はハイフン前後で2つのFormを用意して結合した値をセットする、等の処理が少々やりにくいです。
また、どの値がインポートされるのか見えにくいのが何となく気持ち悪い、という人もいると思います。
そこで、AppObjectに下記のようなメソッドを作ってみました。
実際には全AppObjectの基底クラスにすると良いと思います。
class AppId_Hoge extends Ethna_AppObject
{
function setAll($list, $option = null)
{
foreach ($list as $key => $data) {
$name = ”;
$value = ”;
if (is_int($key)) {
//連想配列のキーが数値の場合は、連想配列の値と同名のform値をセットする
$name = $data;
$value = $this->af->get($data);
//値がNULLの場合、オプション指定によって、無視するか空文字列に変換するかを決定する
if (is_null($value)) {
if ($option == OBJECT_IMPORT_IGNORE_NULL) {
//NULLを無視
continue;
} else {
$value = ”;
}
}
} else {
//それ以外の場合、連想配列のキーがそのまま名前に、連想配列の値がそのまま設定すべき値になる
$name = $key;
$value = $data;
}
if (isset($this->prop_def[$name]) == false) {
Ethna::raiseError(“Unknown property $name”);
return null;
}
$this->set($name, $value);
}
}
}
使うときは
$list = array(
‘user_name’,
‘password’,
‘zipcode’ => $this->af->get(‘zipcode1’).$this->af->get(‘zipcode2’)
);
$obj =& $this->backend->getObject(‘Hoge’);
$obj->setAll($list);
のようにすると、単純に配列指定したuser_name
とpassword
はForm値が直接セットされ、連想配列になっているzipcode
は、$list['zipcode']
の値がセットされます。
これによって、ほとんどの値はActionFormからそのままセットするが、任意のフィールドだけを特別な値にする、といった処理が簡単になります。