Php 如何在控制器中处理多步骤表单?(当用户单击“转到步骤2”时,表单未在控制器中处理)
我有一个使用引导和jQuery的多步骤表单。多步骤表单用于用户购买产品。有4个步骤:步骤1为用户插入信息(姓名、电子邮件等),步骤2为用户选择付款方式,步骤3为用户介绍付款数据,步骤4为用户提供发票。因此,我试图将表单分为4个步骤,每个步骤在控制器中使用各自的方法 问题是,当用户单击提交输入“转到步骤2”时,jquery代码显示步骤2的部分,供用户选择付款方式,但步骤1未在PaymentController中处理,即请求未到达PaymentController 你知道问题在哪里吗 我对此问题的处理流程: 我创建了一个PaymentController来处理付款过程 用户单击产品并转到产品详细信息页面。在“产品详细信息”页面中,用户选择数量。因此,表单中有一个选择菜单,该菜单包含此操作“Php 如何在控制器中处理多步骤表单?(当用户单击“转到步骤2”时,表单未在控制器中处理),php,jquery,laravel,Php,Jquery,Laravel,我有一个使用引导和jQuery的多步骤表单。多步骤表单用于用户购买产品。有4个步骤:步骤1为用户插入信息(姓名、电子邮件等),步骤2为用户选择付款方式,步骤3为用户介绍付款数据,步骤4为用户提供发票。因此,我试图将表单分为4个步骤,每个步骤在控制器中使用各自的方法 问题是,当用户单击提交输入“转到步骤2”时,jquery代码显示步骤2的部分,供用户选择付款方式,但步骤1未在PaymentController中处理,即请求未到达PaymentController 你知道问题在哪里吗 我对此问题的处
”
此表单的路径为:
Route::post('/product/{id}/{slug?}/payment', [
'uses' => 'PaymentController@storeProduct',
'as' =>'products.storeProduct'
]);
storeProduct方法存储产品,从db获取一些信息,然后将用户重定向到products.payment route以显示付款页面:
class PaymentController extends Controller
{
public function storeProduct(Request $request, $id, $slug = null){
...
return redirect(route('products.payment',['id' => $id, 'slug' => $slug]));
}
public function presentPaymentPage(Request $request, $id, $slug=null){
...
return view('products.payment',
['product' => $product, 'id' => $id, 'slug' => $slug]);
}
}
presentPaymentPage()的路由:
然后,对于步骤2,我在PaymentController中创建了以下两个方法,并在web.php中创建了两个路由:
PaymentController中添加了两种方法(目前没有任何内容):
以及方法的路线:
Route::post('/product/{id}/{slug?}/payment/storeUserInfo', [
'uses' => 'PaymentController@storeUserInfo',
'as' =>'products.storeUserInfo'
]);
Route::get('/product/{id}/{slug?}/payment/paymentMethods', [
'uses' => 'PaymentController@presentPaymentMethods',
'as' => 'products.presentPaymentMethods'
]);
在payment.blade.php中,我有如下表单步骤:
<div class="tab-content id="myTabContent">
<div class="tab-pane fade show active clearfix" id="step1" role="tabpanel" aria-labelledby="home-tab">
<form method="post" action="{{route('products.storeUserInfo', ['id' => $id, 'slug' => $slug])}}">
<!-- form fields -->
<input type="submit" href="#step2" data-toggle="tab" role="tab" class="next-step" value="Go to step 2"/>
</form>
</div>
<div class="tab-pane fade clearfix" id="step2" role="tabpanel" aria-labelledby="profile-tab">
<form method="post" class="clearfix">
<!-- form fields -->
<input type="submit" href="#step3" data-toggle="tab" role="tab" class="next-step" value="Go To step 3"/>
</form>
</div>
...
</div>
$id,'slug'=>$slug])}>
...
因此,似乎多部分表单只在客户端处理,不会返回到服务器。我相信这是引导中选项卡的预期行为
按照设置代码的方式,这里有两个选项
选项1:在客户端处理多部分表单
您可以将所有必需的信息存储在页面上,可以是JS对象,也可以是隐藏的表单字段(甚至是常规表单字段)。在最后一步,
按钮将提交到后端PaymentController
优点:不必在后端管理多部分状态
缺点:您需要某种方法来检查产品是否仍然可用。例如,如果我在一两小时后单击“提交”按钮,产品是否仍然可用?此外,将支付信息存储在客户端的某个位置可能不是一种好做法,因为客户可能正在使用公共PC
选项2:在后端处理多部分表单
修改视图文件,这样您就不会试图在JS中仅在客户端处理多步骤功能。这似乎更符合您的尝试,因为您在PaymentController
上有多个与每个步骤对应的操作
为此,只需删除引导属性,即角色
,数据切换
等,然后在视图中使用好的'olif/else
语句切换要显示的页面部分
优点:看起来工作量少了,因为你已经做好了一切准备(除了你的视图文件)
缺点:每次用户单击按钮进入下一步时都需要回发帖子
希望这有帮助
Route::post('/product/{id}/{slug?}/payment/storeUserInfo', [
'uses' => 'PaymentController@storeUserInfo',
'as' =>'products.storeUserInfo'
]);
Route::get('/product/{id}/{slug?}/payment/paymentMethods', [
'uses' => 'PaymentController@presentPaymentMethods',
'as' => 'products.presentPaymentMethods'
]);
<div class="tab-content id="myTabContent">
<div class="tab-pane fade show active clearfix" id="step1" role="tabpanel" aria-labelledby="home-tab">
<form method="post" action="{{route('products.storeUserInfo', ['id' => $id, 'slug' => $slug])}}">
<!-- form fields -->
<input type="submit" href="#step2" data-toggle="tab" role="tab" class="next-step" value="Go to step 2"/>
</form>
</div>
<div class="tab-pane fade clearfix" id="step2" role="tabpanel" aria-labelledby="profile-tab">
<form method="post" class="clearfix">
<!-- form fields -->
<input type="submit" href="#step3" data-toggle="tab" role="tab" class="next-step" value="Go To step 3"/>
</form>
</div>
...
</div>