アプリ版:「スタンプのみでお礼する」機能のリリースについて

【View側】
<select id='folder_name' name='folder_name' class="px-6 py-3 w-40 text-center">
@foreach($months as $month)
<option value="{{ $month->id }}">{{ $month->folder_name }}</option>
@endforeach
</select>

【Controller側】
public function store(Request $request)
{
$files = $request->file('file');
foreach($files as $file)
{
$file_name = $file->getClientOriginalName();
$file->storeAs('202207', $file_name);
}          ↑この部分

<操作の流れ>
①ファイルをアップロードするために、storage/appの下に、フォルダを作成します。
②フォルダを作成すると同時に、そのフォルダ名をデーターベースのテーブルに保存します。
③ヴュー画面のセレクトボックスに作成されたフォルダ名が表示されますので、ファイルをアップロードしたいフォルダ名を選択します。
④ファイルアップロード画面で、ファイルを選択し、アップロードします。

<できている事>
フォルダの作成および、テーブルへの保存。
ヴュー画面で、セレクトボックスには、作成したフォルダ名が表示され、選択できます。

<できていない事>
セレクトボックスで、ファイルをアップロードしたいフォルダ名を選択した時に、コントローラーの '202207' の部分が選択された値(フォルダ名)となるようにしたい。

javascriptで、document.getElementById を使ったらいいのかなと思い、検索してみましたが、私の勉強不足でどう応用したらよいかわかりません。
答えは別にあるのかもしれませんが、どなた様がご教授いただけますと幸いです。
記述に不足がございましたら、申し訳ございません。

質問者からの補足コメント

  • ご回答ありがとうございます。
    質問の部分のView画像を添付いたしました。
    このように、異なる<form>担っておりますj。
    再度、考えてみまして、画像の上部分がセレクトされた月で抽出されたデーターベースの一覧になりますので、アップロード時ではなく、月をセレクトして表示ボタンを押したときに、一覧表示される(アップロードがまだの場合は未表示)と当時に、コントローラのアップロード先のフォルダを変更するようにしたらよいのではないかと思いました。
    select部分に<form>を追加し、javascriptで一覧表示させるとの、選択された月をコントローラで使えるようにします。これはいかがでしょうか。

    「セレクトボックスで選択された値をコントロ」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/28 10:55
  • <form method="post" action="" class="">
    @csrf
    <select type="text" id="folder_name" name="folder_name">
    @foreach($months as $month)
    <option value="{{ $month->id }}">{{ $month->folder_name }}</option>
    @endforeach
    </select>
    <div class=" text-3xl font-extrabold px-4">月</div>
    <button type="submit" class="">{{ __('Display') }} </button>
    </form>

    しかし、最初の分もそうですが、これについても、JSイベントの書き方がわかりません、

      補足日時:2022/07/28 11:01

A 回答 (2件)

月を選んで表示ボタンを押した際に、


請求書のアップロード送信フォームを表示する処理を、

サーバー側の Controller&View で行っているならば、
View 内に <input type=hidden> を埋め込みましょう
JS イベント処理は不要です

ブラウザ側の JS イベント処理で AJAX を駆使して行っているならば、
頑張ってイベント処理内のフォーム作成機能を探してください。
そこで以下のように複写すればよいでしょう。
document.forms['複写先formのnameかid']
.elements['inputのname'].value
= document.forms['複写元formのnameかid']
.elements['selectのname'].value;
    • good
    • 0
この回答へのお礼

質問に対し、的確なご指導をいただきありがとうございます。
考え抜いた末に、月(フォルダ)の新規作成をアップロードのViewにもってきて、さらに作っている月(フォルダ)を選択できるように、<select>部分もコピーしました。このほうが、アプロードする時にフォルダを間違えるミスがないと考えました。しかし、最初の設定では、うまくいきませんでした。原因は<option value="{{ $month->id }}">{{ $month->folder_name }}</option>としたままだったので、フォルダ名ではなくidが渡っていました。ddで確認し、idではなくfolder_nameとしたら、すべてうまくいきました。これもヒントをいただけたおかげです。
本当にありがとうございました。

お礼日時:2022/07/29 14:58

<select name=folder_name> が <input type=file> と


同じ <form> 内ならば、
サーバー側にて POST 値の "folder_name" を読み取る。

異なる <form> ならば、
<input type=file> と同じ <form> 内に
<input type=hidden name=folder_name> を用意し、
送信タイミングで値を複写する JS イベント処理を書く。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!