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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

285閲覧

[laravel]Todoリストにてカラムごとに表示されているボタンの表示内容を変更したい

twinparadox

総合スコア42

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/01/13 07:53

編集2020/01/13 08:39

#実現したいこと
下記イメージのように作業中ボタンを押した時に完了ボタンになり、完了ボタンを押した時に作業中になるような機能追加を考えています。
完成イメージ

#やったこと
単純に画面遷移だけの実装で可能かと考えましたが、私の実装した内容では「作業ボタンを押したら全てのidカラムが完了ボタンになってしまい」上手く行きませんでした。

web.php

<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/Todo', 'TodoController@index'); Route::post('/Todo', 'TodoController@create'); Route::group(['middleware' => ['web']], function () { Route::post('/Todo', 'TodoController@create'); }); Route::post('/Todo/{table}', 'TodoController@delete'); Route::post('/done', 'TodoController@done');

TodoController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests\CreateTaskRequest; use Illuminate\Support\Facades\DB; use App\Todo; class TodoController extends Controller { public function index(Request $request) { $items = Todo::all(); return view('Todos.index', ['items' => $items]); } public function create(CreateTaskRequest $request) { $todo = new Todo; $form = $request->all(); unset($form['_token']); $todo->timestamps = false; $todo->fill($form)->save(); return redirect('/Todo'); } public function delete(Request $request) { Todo::find($request->table)->delete(); $items = Todo::all(); $items = DB::table('Todos')->orderBy('todo_id', 'asc')->get(); return redirect('/Todo'); } public function done(Request $request) { $items = Todo::all(); return view('Todos.done', ['items' => $items]); } }

views/layouts/index.blade.php

<html> <head> <title>@yield('title')</title> <style> body { font-size: 16pt; color: #999; margin: 5px; } h1 { font-size: 50pt; text-align: right; color: #f6f6f6; margin: -20px 0px -30px 0px; letter-spacing: -4pt; } ul { font-size: 12pt; } hr { margin: 25px 100px; border-top: 1px dashed #ddd; } .menutitle { font-size: 25pt; font-weight: bold; margin: 0px; } .content { margin: 10px; } .footer { font-size: 20pt; margin: 10px; } th { background-color: #999; color: fff; padding: 5px 10px; } td { border: solid 1px #aaa; color: #999; padding: 5px 10px; } task { font-size: 50pt; width: 70px; height: 70px; } </style> </head> <body> <h1>@yield('title')</h1> @section('menubar') <h2 class="menutitle"> Todoリスト</h2> TASKを追加 <br> @if (count($errors) > 0) <div> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="/Todo" method="post"> {{ csrf_field() }} <input type="text" name="comment" size="70" value="{{old('comment')}}"> <input type="submit" value="追加"> </form> <hr size="1"> <div class="content"> @yield('content') </div> <div class="footer"> @yield('footer') </div> </body> </html>

views/Todos/index.blade.php

@extends('layouts.index') @section('title','Todoリスト') @section('menubar') @parent Todoリスト @endsection @section('content') <table> <tr> <th>ID</th> <th>コメント</th> <th>状態</th> </tr> @foreach ($items as $item) <tr> <td>{{$loop->iteration}}</td> <td>{{$item->comment}}</td> <td> <form action="/done" method="POST"> @csrf <button type="submit"> 作業中 </button> </form> </td> <td> <form action="{{ url('Todo/' . $item->id) }}" method="POST"> @csrf <button type="submit"> 削除 </button> </form> </td> </tr> @endforeach </table> @endsection

views/Todos/done.blade.php

@extends('layouts.index') @section('title','Todoリスト') @section('menubar') @parent Todoリスト @endsection @section('content') <table> <tr> <th>ID</th> <th>コメント</th> <th>状態</th> </tr> @foreach ($items as $item) <tr> <td>{{$loop->iteration}}</td> <td>{{$item->comment}}</td> <td> <form action="/Todo" method="POST"> @csrf <button type="submit"> 完了 </button> </form> </td> <td> <form action="{{ url('Todo/' . $item->id) }}" method="POST"> @csrf <button type="submit"> 削除 </button> </form> </td> </tr> @endforeach </table> @endsection

#質問したいこと
どのように実装していくのが適切なのか教えて頂きたいです。

#環境
laravel 6
MySQL  8

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

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

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

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

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

m.ts10806

2020/01/13 08:07

>view.Controller.Routeだけの実装で可能かと考えましたが上手く行きませんでした。 ほぼフレームワークの全てですけど、一体全体どうやったらできなかったんですか? 正直これだけで答えろって無理な話です。 view.Controller.Routeだけの実装で可能かと考えてできなかった人に考え方だけ伝えても出来るように思いません。 それとも「作ってくれ」という作業依頼ですか?
twinparadox

2020/01/13 08:17

作業依頼かどうかは私には分かりませんが迷惑をかけているのでしたらすみません。 自分で考えれるところは考えて少しづつでも理解を深めていきたいだけなんです。。。
m.ts10806

2020/01/13 08:22 編集

でも、その考えた結果組んだこととか何も提示してないわけですよね。 となると他人は「自分のやり方じゃダメだったから組んでくれ」という風に解釈するわけです。 本当にダメかどうかって見てみないと分かりませんよ。誰にも。 特に「view.Controller.Routeだけの実装で可能か」ってLaravelの根幹部分ほとんど全部出してしまってるじゃないですか。 「これでできない」というのが信じられないので、そこはコードとロジックを見た上で判断する必要があるわけです。 まあ「view.Controller.Routeだけの」って書いてあるだけだとロジックも何もないわけですけど。
guest

回答1

0

ベストアンサー

現在の内容から言えるのは下記のみ。

単純に画面遷移だけの実装で可能かと考えましたが、

可能です。

私の実装した内容では「作業ボタンを押したら全てのidカラムが完了ボタンになってしまい」上手く行きませんでした。

そういう実装をして(しまって)いるからです。
それなのに「view.Controller.Routeだけの実装で可能かと思ったけどできなかった」というのは早計にも程があります。

ロジック見直してください。

追記から

ここにhiddenでID入れてdone()で受け取ってそのIDに対してだけupdateかければ良いのでは。

html

1 <td> 2 <form action="/done" method="POST"> 3 @csrf 4 <button type="submit"> 5 作業中 6 </button> 7 </form> 8 </td>

投稿2020/01/13 08:24

編集2020/01/13 08:48
m.ts10806

総合スコア80850

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

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

twinparadox

2020/01/13 08:52

返信ありがとうございます!考えてみます。
m.ts10806

2020/01/13 08:55

回答には書いてないですけど、実装は統一してください。 URLを作るところ、直に書いていたりurl()で書いていたりバラバラです。 あと、もちろん私が提示したやり方以外にも手法は幾らでもあります。 要件をきちんと整理すると良いです。 どんな情報が必要でそれをどうやって渡して受け取るか? 「どんな情報が必要で」部分を抜かして雑に作ってしまっている気がしてなりません 手書きでも良いので情報の受け渡しなど含めて「図」にして「説明」書いて、「設計」しましょう。 いきなり実装からってあり得ません。
twinparadox

2020/01/13 12:32

おっしゃる通りです。「どんな情報が必要で」から考える必要があるのは分かっているのですが、それが中々出来ないです。。。
m.ts10806

2020/01/13 21:05

「先に」考えるようにすれば良いだけかと。 要件詰めないとコードは書けません。 書きながら要件詰めるのは熟練者ですらやりません。
twinparadox

2020/01/13 21:51

>ここにhiddenでID入れてdone()で受け取ってそのIDに対してだけupdateかければ良いのでは。 この要件を詰める思考に至った経緯を教えてもらえませんか?
m.ts10806

2020/01/13 23:15

要件ではなく手法ですよ。 idを渡せば指定のものだけ更新できるようになるので、その手法のひとつとして提示しただけです。 もちろん、これだけが使える手法ではないですけど。
twinparadox

2020/01/18 17:58

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問