2013年7月23日火曜日

[CakePHP] 1ページのフォームで複数レコード登録と、inputフィールドの数でひっかかったこと

CakePHPで、1ページ内のフォームで、複数レコードの登録画面を作成しました。
一括でテーブルを編集したいことがありますよね。
ASP.NETだとRepeaterとか使えば簡単に出来ますが、CakePHPでもちょっとしたコツで簡単に実装できます。

メニューテーブルを全部表示して登録する例です。
ビューはこのようになります。

<?php echo $this->Form->create('Menu'); ?>
<?php echo $this->Form->submit('店舗メニューを登録する');
?>
<table>
<thead>
<tr>
 <th>ID</th>
 <th>メニュー名</th>
</tr>
</thead>
<?php foreach($data as $key => $menu):?>
<tr>
 <td><?php echo $this->Form->input("{$key}.id", array('type' => 'text', 'value' => $menu['Menu']['id'])); ?></td>
 <td><?php echo $this->Form->input("{$key}.name", array('value' => $menu['Menu']['subname'], 'label' => false)); ?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo $this->Form->end(); ?>
これで結局、idなどがMenu0Idみたいな形になって、複数レコードの表示ができます。
コントローラーは以下としました。

function multiregist() {
  //登録
  if($this->request->isPost()){
   if($this->Menu->saveAll($this->request->data['Menu'])) {
    $this->Session->setFlash('メニューを登録しました', 'default', array('class' => 'alert alert-success'));
   } else {
    $this->Session->setFlash('登録に失敗しました', 'default', array('class' => 'alert alert-error'));
   }
  }
  //データ取得
  $data = $this->Menu->find('all');
  $this->set('data', $data);
}

これだけです。
saveAll一発で登録できてしまうので便利です!

実際に作成したものはもっと項目が多かったのですが、なぜか登録時に一定レコードまでしかPOSTされず、かなり悩みました。
CakePHPのrequestとかでデフォルト値が決まってるのか?とか思ったのですがCakePHP関係では一向に情報が出て来ません。
でもさらに調べてみると、PHPのほうでフォームのinputの数に制限がかかっていることがわかりました。
php.iniにmax_input_varsを設定します。
初期値は1000になっているようでした。

max_input_vars = 10000

大きめの数にしてみるとすんなりPOSTできました!
数時間程度悩んでたのですが、見つかってよかったです、ほんと。。
まだまだPHPやCakePHPは初心者だなぁと感じました。

参考になれば幸いです。

0 件のコメント:

コメントを投稿