編集画面
続けて編集画面もやってしまいます。 edit.ctp を開いて、 以下のフォーム開始を、
<?php echo $this->Form->create('Member');?>
以下のように変更します。
<?php echo $this->Form->create('Member', array('type' => 'file'));?>
<div style="display:none;">
<?php echo $this->Form->input('img1', array('type'=>'hidden')); ?>
<?php echo $this->Form->input('img2', array('type'=>'hidden')); ?>
</div>
以下のフォームのメインの部分は、
<?php
echo $this->Form->input('id');
echo $this->Form->input('email');
echo $this->Form->input('password');
echo $this->Form->input('type_id');
echo $this->Form->input('birthday');
echo $this->Form->input('img1');
echo $this->Form->input('img2');
echo $this->Form->input('Favorite');
?>
add.ctp と同じになるように修正しておきます。
<?php
echo $this->Form->input('email',array('label' => array('text'=>'メールアドレス')));
echo $this->Form->input('password',array('label' => array('text'=>'パスワード')));
echo $this->Form->input('type_id',array('label' => array('text'=>'種別')));
echo $this->Form->input('birthday',array('dateFormat'=>'YMD','maxYear'=>date('Y'),'minYear'=>date('Y')-100,'monthNames'=>false, 'label' => array('text'=>'誕生日')));
echo $this->Form->input('solid1', array('type'=>'file', 'label' => '画像1'));
echo $this->Form->input('solid2', array('type'=>'file', 'label' => '画像2'));
echo $this->Form->input('favorites', array('multiple'=>'checkbox', 'label' => '好きな物'));
?>
次に、
echo $this->Form->input('solid1', array('type'=>'file', 'label' => '画像1'));
となっている画像のところを、以下のようにちょっと変えます。
echo $this->Form->input('solid1', array('type'=>'file', 'label' => '画像1'));
if (!$this->Form->error('solid1')){
if ($this->data['Member']['img1']){
echo '<div class="input img1"><label for="MemberImg1"></label>';
echo $this->Html->image("/files/".$this->data['Member']['img1']);
echo '</div>';
}
}
出力されるソースはこんなになります。
<div class="input file required">
<label for="MemberSolid1">画像1</label>
<input type="file" id="MemberSolid1" name="data[Member][solid1]">
</div>
<div class="input img1">
<label for="MemberImg1"></label>
<img alt="" src="/cake/files/xxxxxxxxxxxxxxxxx.jpg">
</div>
続いてコントローラを修正します。
デフォルトでは、
function edit($id = null) {
if (!$this->Session->check('Member.id')) {
$this->redirect(array('action'=>'login'));
}
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid member', true));
$this->redirect(array('action' => 'index'));
}
if (!empty($this->data)) {
if ($this->Member->save($this->data)) {
$this->Session->setFlash(__('The member has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The member could not be saved. Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Member->read(null, $id);
}
$types = $this->Member->Type->find('list');
$favorites = $this->Member->Favorite->find('list');
$this->set(compact('types', 'favorites'));
}
となっているのを、
function edit() {
if (!$this->Session->check('Member.id')) {
$this->redirect(array('action'=>'login'));
}
if (!empty($this->data)) {
$this->data['Favorite']['Favorite'] = $this->data['Member']['favorites'];
if ($this->data['Member']['solid1']['type']){
$this->data['Member']['img1'] = $this->_imgUpload('solid1');
}
if ($this->data['Member']['solid2']['type']){
$this->data['Member']['img2'] = $this->_imgUpload('solid2');
}
if ($this->Member->save($this->data)) {
$this->Session->setFlash(__('会会員情報を更新しました', true));
$this->redirect(array('action' => 'menu'));
} else {
$this->Session->setFlash(__('エラーがあります', true));
}
}
if (empty($this->data)) {
$this->data = $this->Member->read(null, $this->Session->read('Member.id'));
if ($this->data['Favorite']){
foreach ($this->data['Favorite'] as $k => $v){
$this->data['Member']['favorites'][] = $v['id'];
}
}
}
$types = $this->Member->Type->find('list');
$favorites = $this->Member->Favorite->find('list');
$this->set(compact('types', 'favorites'));
}
と編集します。
セッションで認証するので、
function edit($id = null) {
の引数部分はなしにしてます。その代わりに、$this->Member->read に対して、セッションの Member.id を渡しています。
他は add の方と同じですが、 初期に編集画面へ来た時の、DBからデータを読む処理の後に、その「好きな物」データを変換する処理を入れています。上記20〜24行目。 Favorite を favorites に入れ直しています。 これにより、
echo $this->Form->input('favorites', array('multiple'=>'checkbox', 'label' => '好きな物'));
この書き方のビューに反映されます。
チェックボックスにチェックが入っているを確認します。
