前提・実現したいこと
現在、投稿サイトを作ってます。
画像を複数投稿できるのですが、編集するときに画像フォームを空にするとそのまま上書きされてしまい、nullになってしまい
画像が削除されてしまいます。
なのでcakephpのフォームヘルパーで値をhiddenで持たせて
空の時はその値を送信させたいです。
画像は別テーブルで専用のを用意しています。
該当のソースコード
View <?php echo $this->Form->create( $score, ['enctype' => 'multipart/form-data', 'autocomplete' => 'nope'] ); ?> <?php if( $score->id ) echo $this->Form->hidden( 'id' ); ?> <?php echo $this->Form->hidden( 'item_id', [ 'value' => $item->id, 'id' => 'item_id' ] ); ?> <?php echo $this->Form->hidden( 'image_path.0', [ 'value' => $score['score_images'][0]['image_path']] ); ?> <div class="review-image"> <label>画像を選択</label> <p><?php echo $this->Form->file( 'image_path.0', [ 'type' => 'file', 'label' => false, 'accept' => 'image/*', 'multiple' => true]); ?></p> <p><?php echo $this->Form->file( 'image_path.1', [ 'type' => 'file', 'label' => false, 'accept' => 'image/*', 'multiple' => true]); ?></p> <p><?php echo $this->Form->file( 'image_path.2', [ 'type' => 'file', 'label' => false, 'accept' => 'image/*', 'multiple' => true]); ?></p> </div> <div class="review-display-bottun"> <?php echo $this->Form->button( '公開する', ['id' => 'review', 'name' => 'display_flg', 'class' => 'btn btn-primary', 'id' => 'datepicker', 'value' => 1] ); ?> <?php echo $this->Form->button( '下書きに入れる', [ 'id' => 'review', 'name' => 'display_flg', 'class' => 'btn btn-primary', 'id' => 'datepicker', 'value' => 0 ] ); ?> </div>
Controller public function review( $item_id=null ) { if( $this->request->is(['post', 'put']) && isset( $this->request->data['display_flg'])) { $data = $this->request->data; $this->Image->saveFile( $data, 'image_path' ); //$this->Scores->validate( $data ); $error = $this->Scores->err; if( count( $error ) > 0 ) { $this->set( compact( 'error' ) ); } else { $data['item_id'] = $item_id; $data['user_id'] = $this->_user_login_data['id']; $score_id = $data['id']; $ave = array( $data['smell_point'], $data['design_point'], $data['aftertaste_point'], $data['easy_drink_point'], $data['flavor_point'], $data['crisp_taste_point'], $data['rich_taste_point'], $data['sweet_point'], $data['dry_point'], $data['unique_point'], $data['mellow_point'], $data['refreshing_jpoint'], $data['tannic_point'], $data['fruit_point'], $data['bitter_point'] ); foreach($ave as $key => $value) { $ave = array_filter($ave); if(!empty($ave)) { $count_val = array_sum($ave)/count($ave); } else { $data['score_point'] = 0; } } $data['score_point']= round($count_val, 1); $this->Scores->saveReviewData( $data ); $this->ScoreImages->saveScoreImagesData( $data, $score_id ); $this->Flash->success( '登録が完了しました!'); $this->redirect(['action' => 'detail', $item_id ]); } }
Model public function saveScoreImagesData( $data, $score_id) { // score_idを使って削除する $this->updateAll( [ 'deleted' => date( 'Y-m-d H:i:s' ) ] ,[ 'score_id' => $score_id ] ); // or $this->deleteAll( [ 'score_id' => $score_id ] ); $images = []; foreach( $data['image_path'] as $key => $val ) { $images = [ 'score_id' => $score_id ,'image_path' => $val['image_path'] // TODO //,'user_id' => ]; parent::saveData( $images ); }
足りない情報ありましたら追記していきます!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。