CakePHPでgenerateList()の結果からモデルデータ形式の配列に戻す

CakePHPでアプリケーションの設定を編集するページを作りたい」で、一画面で複数のレコードを編集するためにモデルクラスのgenerateList()を使ってビューを作成しました。この場合、フォームから送信されたデータをそのままでは保存できないので、これをモデルデータ形式の配列に戻すメソッドを作ってみます。

$data['Config'] = $this->Config->generateList(null, 'Config.name', null, '{n}.Config.name', '{n}.Config.value');

generateList()の結果、$dataはConfigモデルのnameフィールドをキー、valueフィールドを値とした配列になっています。

$dataのvar_dump()
array
  'Config' => 
    array
      'site_name' => string 'サイトの名前' (length=18)
      'site_desc' => string 'サイトの説明' (length=18)

フォームから送信されたデータもこの形式でコントローラに渡されるので、これをモデルデータ形式の配列に戻すためのメソッドをAppModelクラスに追加してみました。

/app/app_model.php
    // 配列のキーと値からモデルデータ形式の配列を作成
    function generateData($list, $keyPath = null, $valuePath = null) {
        // 配列名の指定がない場合はモデル名とプロパティから配列名を作成
        if (empty($keyPath)) {
            $keyPath = $this->name . '.' . $this->primaryKey;
        }

        if (empty($valuePath)) {
            $valuePath = $this->name . '.' . $this->displayField;
        }

        // 配列名をモデル名とフィールド名に分割
        list($keyModel, $keyField) = explode('.', $keyPath);
        list($valueModel, $valueField) = explode('.', $valuePath);

        $data = array();
        $row = 0;

        // モデルデータ形式の配列を作成
        foreach ($list as $key => $value) {
            $data[$row][$keyModel][$keyField] = $key;
            $data[$row][$valueModel][$valueField] = $value;

            $row ++;
        }

        return $data;
    }

generateList()に比べると配列名の処理がいいかげんすぎますが、必要最低限ということでこのままいきます。generateData()には、generateList()で作成される形式の配列と、そのキーと値を保存する配列名をモデル名.フィールド名という形式で渡します。

$data = $this->Config->generateData($data['Config'], 'Config.name', 'Config.value');

この場合、$dataは次のような配列になります。

$dataのvar_dump()
array
  0 => 
    array
      'Config' => 
        array
          'name' => string 'site_name' (length=9)
          'value' => string 'サイトの名前' (length=18)
  1 => 
    array
      'Config' => 
        array
          'name' => string 'site_desc' (length=9)
          'value' => string 'サイトの説明' (length=18)

後はこの配列をループで回して保存してやればよさそうです。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/24/trackback/
この記事のURI
http://dxd8.com/archives/24/