[PHP] EthnaのimportFormの強化版メソッドを作ってみました

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_namepasswordはForm値が直接セットされ、連想配列になっているzipcodeは、$list['zipcode']の値がセットされます。

これによって、ほとんどの値はActionFormからそのままセットするが、任意のフィールドだけを特別な値にする、といった処理が簡単になります。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(16区分17回 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、Ruby Programmer Gold、AWSソリューションアーキテクト(アソシエイト)、日商簿記2級、漢検準1級などを保有。

babaの書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ