質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

2回答

498閲覧

cakephp 画像再投稿時に画像データをhiddenで持たせたい

zinna

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/10/29 13:35

前提・実現したいこと

現在、投稿サイトを作ってます。
画像を複数投稿できるのですが、編集するときに画像フォームを空にするとそのまま上書きされてしまい、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 ); }

足りない情報ありましたら追記していきます!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんばんは。
web.phpにuseでcontrollerを呼び出す必要があるかと思います!
既存のuseの下に以下コードを追加して試してみてください。

php

1<?php 2use App\Http\Middleware\HelloMiddleware; //既存のコード 3use App\Http\Controllers\HelloController; //追加のコード

投稿2022/01/26 14:02

yama__ddc

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

hiddenで持たせたい、ということは編集時も画像は編集できないということですよね?
であれば、編集時は画像テーブルに対して何もしなければいいのではないでしょうか。

投稿2020/10/30 00:38

tabuu

総合スコア2480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zinna

2020/10/30 00:55

ご返答ありがとうございます! 画像は任意で編集したいと考えております。 なので画像は編集できるようにしたいです。
tabuu

2020/10/30 01:28

画像は最大3つで、編集時も事前に登録した画像は削除はできないという仕様で大丈夫でしょうか?
zinna

2020/10/30 03:39

はい!そうです! ですが、上書きの時は新しい画像を更新させるようにしたいです。 未入力時は更新なしというイメージです。
tabuu

2020/10/30 05:08

<?php echo $this->Form->hidden( 'image_path.0', [ 'value' => $score['score_images'][0]['image_path']] ); ?> このコードで正常にhiddenタグが出力されているのであれば image_path.1とimage_path.2のhiddenタグも作成して、 saveScoreImagesDataメソッドで$val['image_path']がemptyやnullの場合は hiddenタグの値を使うようにするのではいかがでしょうか。
zinna

2020/10/30 07:49

$images = []; foreach( $data['image_path'] as $key => $val ) {         if($val['image_path']) === null { $val['image_path'] = $data['image_path']; } $images = [ 'score_id' => $score_id ,'image_path' => $val['image_path'] // TODO //,'user_id' => ]; parent::saveData( $images ); } のようなコードを書いてるのですが、 これでif文を増やしても代入が重複してしまい三枚目の画像を読み込んでくれなかったりします。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問