前提・実現したいこと
プログラミング初心者です。初めて質問します。
書き方に不備があると思いますが、お力になっていただけると嬉しいです。
現在、ProgateのPHP学習コースの内容をLaravelのローカル環境で実践しています。
そのコースの中の「16.注文確認ページを作ろう」のところで苦戦していて、
どなたか教えていただきたいです。
この章の内容は、メニュー一覧ページ(index.php)のフォームから送信されたそれぞれのメニューの注文個数を受け取り、注文確認ページ(confirm.php)で表示させるという内容です。
propgateでは
data.php
<?php require_once('menu.php'); $juice = new Menu('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png'); $coffee = new Menu('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png'); $curry = new Menu('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png'); $pasta = new Menu('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png'); $menus = array($juice, $coffee, $curry, $pasta); ?>
index.php
<?php require_once('data.php') ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Café Progate</title> <link rel="stylesheet" type="text/css" href="stylesheet.css"> <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'> </head> <body> <div class="menu-wrapper container"> <h1 class="logo">Café Progate</h1> <form method="post" action="confirm.php"> <div class="menu-items"> <?php foreach ($menus as $menu): ?> <div class="menu-item"> <img src="<?php echo $menu->getImage() ?>" class="menu-item-image"> <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p> <input type="text" value="0" name="<?php echo $menu->getName() ?>"> <span>個</span> </div> <?php endforeach ?> </div> <input type="submit" value="注文する"> </form> </div> </body> </html>
上記二つのファイルを作成し、index.phpの下記コード
<form method="post" action="confirm.php"> <input type="text" value="0" name="<?php echo $menu->getName() ?>"> <input type="submit" value="注文する"> </form>
でconfirm.phpに値を渡し、
<body> <div class="order-wrapper"> <h2>注文内容確認</h2> <?php foreach ($menus as $menu): ?> <!-- 変数$orderCountに$_POSTで受け取った値を代入してください --> <?php $orderCount=$_POST[$menu -> getName()] ?> <p class="order-amount"> <!-- ここに、$menuのゲッターを用いてnameプロパティを表示してください --> <?php echo $menu-> getName() ?> x <!-- ここに、$orderCountを表示してください --> <?php echo $orderCount ?> 個 </p> <?php endforeach ?> </div> </body>
6行目の<?php $orderCount=$_POST[$menu -> getName()] ?>で
ブラウザから受け取ったデータを連想配列変数$_POSTに入れて
confirm.phpを実行しています。
これをLaravel環境で下記内容のようにやってみました。
resoures/views/data.blade.php
<?php require("/Applications/MAMP/htdocs/Cafe/resources/views/menu.blade.php"); // インスタンスの生成 $curry = new Menu('CURRY', 900, "/images/curry.png"); $pasta = new Menu('PASTA', 1200, "/images/pasta.png"); $juice = new Menu('JUICE', 600, "/images/juice.png"); $coffee = new Menu('COFFEE', 500, "/images/coffee.png"); $juice -> setOrderCount(2); $menus = array($curry, $pasta, $juice, $coffee); ?>
resources/views/cafe/index.blade.php
抜粋 <body> <div class="menu-wrapper container"> <h1 class="logo">Café Progate</h1> <div class="menu-items"> <!-- 配列$menusの要素を変数$menuとするforeach文を書いてください --> <?php require ('/Applications/MAMP/htdocs/Cafe/resources/views/data.blade.php') ?> <?php foreach ($menus as $menu) : ?> <div class="menu-item"> <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> <!-- <p>タグの中に、$menuのpriceプロパティを表示 --> <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p> <form action="/confirm" method="POST"> @csrf <!-- <img>タグのsrc属性に、$menuのimageプロパティを表示 --> <img src='<?php echo $menu->getImage() ?>' width="400" height="300"> <!-- $menuのゲッターを用いてorderCountプロパティを表示 --> <p>注文数:<?php echo $menu -> getOrderCount() ?></p> <!-- <input>タグを用いて入力ボックスを作成 --> <!-- 変更 --> <!-- 変更前: <input type="text" value="0" name="<?php $menu -> getName() ?>"> --> <!-- 変更後: <input type="text" value="0" name="order"> --> <input type="text" value="0" name="order"> <span>個</span> </div> <?php endforeach ?> </div> <!-- <input>タグを用いて送信ボタンを作成 --> <input type="submit" value="注文する"></input> </form> </div> </body>
上記2つのファイルで、値を送信
/routes/web.php
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\CafeController; use Illuminate\Http\Request; /* |-------------------------------------------------------------------------- | 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('/', [CafeController::class, 'showList'])->name('cafes'); // 注文内容を送信 Route::post('/confirm', [CafeController::class, 'confirm'])->name('confirms'); // 注文確認ページを表示 Route::get('/confirm', [CafeController::class, 'confirm'])->name('confirms');
でルーティングを設定
/App/Http/Controllers/CafeController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class CafeController extends Controller { /** * トップ画面一覧を表示する * * @return view */ public function showList() { return view('cafe.top'); } /** * 注文内容を送信し、値をconfirm.blade.phpに返す * * 変更しました */ public function confirm(Request $request) { $orderTotal = $request -> order; return view('confirm', compact('orderTotal')); } }
resources/views/confirm.blade.php
抜粋 <body> <div class="order-wrapper"> <h2>注文内容確認</h2> <!-- 変数$totalPaymentを定義し、数値の0を代入 --> <?php $totalPayment = 0 ?> <?php foreach ($menus as $menu): ?> <?php // 変数$orderCountに$orderTotalで受け取った値を代入してください // CafeController.phpで返された$orderTotalを代入 $orderCount = $orderTotal; // $menuに対して、$orderCountを引数としてsetOrderCountメソッドを呼び出す --> $menu -> setOrderCount($orderCount); // $totalPaymentに、$menuのgetTotalPriceメソッドで得た値を足す $totalPayment += $menu -> getTotalPrice(); ?> <p class="order-amount"> <!-- ここに、$menuのゲッターを用いてnameプロパティを表示してください --> <?php echo $menu-> getName() ?> × <!-- ここに、$orderCountを表示してください --> <?php echo $orderCount ?> 個 </p> <!-- $menuに対してgetTotalPriceメソッドを呼び出して、金額を表示 --> <p class="order-price"> <?php echo $menu -> getTotalPrice() ?>円</p> <?php endforeach ?> <h3>合計金額:<?php echo $totalPayment ?>円</h3> </div> </body> </html>
以上にように書いたところ、
となります。
実現したいことは、0個、0円のところを
resources/views/cafe/index.blade.php
<input type="text" value="0" name="order">
で入力した値にすることです。
試したこと
①top.blade.phpの
<input type="text" value="0" name="<?php $menu -> getName() ?>">
のneme属性を上記のように修正し、
他の箇所もこれに対応するように変更しましたが
/App/Http/Controllers/CafeController.php
でエラーとなります。
補足情報(FW/ツールのバージョンなど)
Laravel Framework 8.37.0