Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在控制器中处理多步骤表单?(当用户单击“转到步骤2”时,表单未在控制器中处理)_Php_Jquery_Laravel - Fatal编程技术网

Php 如何在控制器中处理多步骤表单?(当用户单击“转到步骤2”时,表单未在控制器中处理)

Php 如何在控制器中处理多步骤表单?(当用户单击“转到步骤2”时,表单未在控制器中处理),php,jquery,laravel,Php,Jquery,Laravel,我有一个使用引导和jQuery的多步骤表单。多步骤表单用于用户购买产品。有4个步骤:步骤1为用户插入信息(姓名、电子邮件等),步骤2为用户选择付款方式,步骤3为用户介绍付款数据,步骤4为用户提供发票。因此,我试图将表单分为4个步骤,每个步骤在控制器中使用各自的方法 问题是,当用户单击提交输入“转到步骤2”时,jquery代码显示步骤2的部分,供用户选择付款方式,但步骤1未在PaymentController中处理,即请求未到达PaymentController 你知道问题在哪里吗 我对此问题的处

我有一个使用引导和jQuery的多步骤表单。多步骤表单用于用户购买产品。有4个步骤:步骤1为用户插入信息(姓名、电子邮件等),步骤2为用户选择付款方式,步骤3为用户介绍付款数据,步骤4为用户提供发票。因此,我试图将表单分为4个步骤,每个步骤在控制器中使用各自的方法

问题是,当用户单击提交输入“转到步骤2”时,jquery代码显示步骤2的部分,供用户选择付款方式,但步骤1未在PaymentController中处理,即请求未到达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
上有多个与每个步骤对应的操作

为此,只需删除引导属性,即
角色
数据切换
等,然后在视图中使用好的'ol
if/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>